pax_global_header00006660000000000000000000000064126600667150014523gustar00rootroot0000000000000052 comment=e4439162474657363dfd0f4b72fce54fc201644b silverjuke-16.2.3/000077500000000000000000000000001266006671500137775ustar00rootroot00000000000000silverjuke-16.2.3/.gitattributes000066400000000000000000000004611266006671500166730ustar00rootroot00000000000000# normal text files should contain a simple LF lineend, the following settings # ensures this even if the user has not set core.autocrlf. * text=auto # binary files should be detected by git, however, to be sure, you can add them here explictly *.png binary *.jpg binary *.gif binary *.ico binary silverjuke-16.2.3/.gitignore000066400000000000000000000011451266006671500157700ustar00rootroot00000000000000# silverjuke .gitignore file # ignore backup files *~ # ignore build temporary files *.o .deps .dirstamp # ignore codeblocks project files and build directories *.cbp *.depend *.layout /bin/ /obj/ # ignore autotools temporaries autoscan.log cleanup.sh config.log config.status configure.scan Makefile /autom4te.cache/ /config.h /stamp-* /silverjuke silverjuke*.tar.gz silverjuke*.tar.xz # ignore generated files Makefile.in /aclocal.m4 /compile /configure /install-sh /missing po/*\.gmo po/stamp-po po/POTFILES po/remove-potcdate.sed po/*.gmo po/*.insert-header silverjuke.1 # ignore other files .DS_Store silverjuke-16.2.3/ABOUT-NLS000066400000000000000000002721551266006671500152420ustar00rootroot000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of May 2010. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar as ast az be be@latin bg bn_IN bs ca crh +---------------------------------------------------+ a2ps | [] [] | aegis | | ant-phone | | anubis | | aspell | [] [] | bash | | bfd | | bibshelf | [] | binutils | | bison | | bison-runtime | [] | bluez-pin | [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] [] | cpio | | cppi | | cpplib | [] | cryptsetup | | dfarc | | dialog | [] [] | dico | | diffutils | [] | dink | | doodle | | e2fsprogs | [] | enscript | [] | exif | | fetchmail | [] | findutils | [] | flex | [] | freedink | | gas | | gawk | [] [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] | gjay | | gliv | [] | glunarclock | [] [] | gnubiff | | gnucash | [] | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | | gold | | gpe-aerial | | gpe-beam | | gpe-bluetooth | | gpe-calendar | | gpe-clock | [] | gpe-conf | | gpe-contacts | | gpe-edit | | gpe-filemanager | | gpe-go | | gpe-login | | gpe-ownerinfo | [] | gpe-package | | gpe-sketchbook | | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] | gpe-today | [] | gpe-todo | | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | [] [] | gsasl | | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] [] [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] [] | gutenprint | | hello | [] | help2man | | hylafax | | idutils | | indent | [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | | iso_639 | [] [] [] [] [] | iso_639_3 | [] | jwhois | | kbd | | keytouch | [] | keytouch-editor | | keytouch-keyboa... | [] | klavaro | [] | latrine | | ld | [] | leafpad | [] [] | libc | [] [] | libexif | () | libextractor | | libgnutls | | libgpewidget | | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | [] | libidn | | lifelines | | liferea | [] [] | lilypond | | linkdr | [] | lordsawar | | lprng | | lynx | [] | m4 | | mailfromd | | mailutils | | make | | man-db | | man-db-manpages | | minicom | | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | | psmisc | | pspp | [] | pwdutils | | radius | [] | recode | [] [] | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] [] | sed | [] [] | sharutils | [] [] | shishi | | skencil | | solfege | | solfege-manual | | soundtracker | | sp | | sysstat | | tar | [] | texinfo | | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] [] | wyslij-po | | xchat | [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +---------------------------------------------------+ af am ar as ast az be be@latin bg bn_IN bs ca crh 6 0 2 3 19 1 11 3 28 3 1 38 5 cs da de el en en_GB en_ZA eo es et eu fa fi +-------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] () | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] [] [] | bfd | [] [] | bibshelf | [] [] [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] | bombono-dvd | [] [] | buzztard | [] [] [] | cflow | [] [] [] | clisp | [] [] [] [] | coreutils | [] [] [] [] | cpio | [] | cppi | [] | cpplib | [] [] [] | cryptsetup | [] | dfarc | [] [] [] [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] | dink | [] [] [] | doodle | [] | e2fsprogs | [] [] [] | enscript | [] [] [] | exif | () [] [] [] | fetchmail | [] [] () [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | freedink | [] [] [] [] | gas | [] | gawk | [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] | gip | [] [] [] [] [] | gjay | [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] | gnubiff | () | gnucash | [] () () () () () | gnuedu | [] [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] [] | gpe-aerial | [] [] [] [] [] | gpe-beam | [] [] [] [] [] | gpe-bluetooth | [] [] [] | gpe-calendar | [] [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] [] | gpe-go | [] [] [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] [] [] [] | gpe-sketchbook | [] [] [] [] [] | gpe-su | [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] | gpe-today | [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] () [] [] [] [] | gprof | [] [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] [] | grub | [] [] [] | gsasl | [] [] | gss | [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] | gtick | [] () [] [] | gtkam | [] [] () [] [] | gtkorphan | [] [] [] [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] [] [] [] | hello | [] [] [] [] [] | help2man | [] [] | hylafax | [] [] | idutils | [] [] [] | indent | [] [] [] [] [] [] [] [] | iso_15924 | [] () [] [] [] | iso_3166 | [] [] [] () [] [] [] () [] | iso_3166_2 | () | iso_4217 | [] [] [] () [] [] [] | iso_639 | [] [] [] () [] [] [] | iso_639_3 | | jwhois | [] [] | kbd | [] [] [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] | klavaro | [] [] [] [] | latrine | [] () [] | ld | [] [] [] | leafpad | [] [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] [] () | libextractor | | libgnutls | [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] () | libgphoto2_port | [] () [] | libgsasl | [] | libiconv | [] [] [] [] [] [] | libidn | [] [] [] [] | lifelines | [] () | liferea | [] [] [] [] [] | lilypond | [] [] [] [] | linkdr | [] [] [] [] | lordsawar | [] | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] [] [] | man-db | | man-db-manpages | | minicom | [] [] [] [] [] | mkisofs | [] | myserver | | nano | [] [] [] [] | opcodes | [] [] [] | parted | [] [] | pies | | popt | [] [] [] [] [] [] | psmisc | [] [] [] [] | pspp | [] | pwdutils | [] | radius | [] | recode | [] [] [] [] [] [] [] | rosegarden | () () () () | rpm | [] [] [] | rush | | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] | shishi | | skencil | [] () [] | solfege | [] [] [] [] | solfege-manual | [] [] | soundtracker | [] [] [] | sp | [] | sysstat | [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | () () | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] [] | wget | [] [] [] [] | wyslij-po | [] | xchat | [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] | +-------------------------------------------------+ cs da de el en en_GB en_ZA eo es et eu fa fi 64 105 117 18 1 8 0 28 89 18 19 0 104 fr ga gl gu he hi hr hu hy id is it ja ka kn +------------------------------------------------+ a2ps | [] [] [] | aegis | [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] | bash | [] [] [] | bfd | [] [] | bibshelf | [] [] [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] | bombono-dvd | | buzztard | [] | cflow | [] [] | clisp | [] | coreutils | [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] [] | cryptsetup | [] [] [] | dfarc | [] [] | dialog | [] [] [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] [] | dink | [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | exif | [] [] [] [] [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] | freedink | [] [] | gas | [] [] | gawk | [] [] [] [] () [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | () | glunarclock | [] [] [] | gnubiff | () [] () | gnucash | () () () () [] | gnuedu | [] [] | gnulib | [] [] [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] | gpe-aerial | [] [] | gpe-beam | [] [] [] | gpe-bluetooth | [] [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] [] [] | gpe-edit | [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] | gpe-su | [] [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | [] [] [] [] | gtick | [] [] [] [] | gtkam | [] [] [] [] [] | gtkorphan | [] [] [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] [] [] | hello | [] [] | help2man | [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | () [] [] | iso_3166 | () [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | () [] [] [] | iso_4217 | () [] [] [] [] | iso_639 | () [] [] [] [] [] [] [] | iso_639_3 | () [] [] | jwhois | [] [] [] [] | kbd | [] [] | keytouch | [] [] [] [] [] | keytouch-editor | [] [] [] [] | keytouch-keyboa... | [] [] [] [] | klavaro | [] [] | latrine | [] [] | ld | [] [] [] | leafpad | [] [] [] [] [] [] () | libc | [] [] [] [] | libexif | | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] [] | lifelines | () | liferea | [] [] [] [] | lilypond | [] | linkdr | [] [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] [] [] | m4 | [] [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] [] | man-db-manpages | [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] [] | pies | | popt | [] [] [] [] [] [] [] [] | psmisc | [] [] | pspp | | pwdutils | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rosegarden | () () () () | rpm | [] [] | rush | | sarg | [] | screem | [] [] | scrollkeeper | [] [] [] | sed | [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] | shishi | [] | skencil | [] | solfege | [] [] [] | solfege-manual | [] [] | soundtracker | [] [] | sp | [] () | sysstat | [] [] [] [] | tar | [] [] [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux-ng | [] [] [] [] [] | vice | () () () | vmm | [] | vorbis-tools | [] | wastesedge | () () | wdiff | | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] | xchat | [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | +------------------------------------------------+ fr ga gl gu he hi hr hu hy id is it ja ka kn 121 53 20 4 8 2 5 53 2 120 5 83 66 0 4 ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne +-----------------------------------------------+ a2ps | [] | aegis | | ant-phone | | anubis | [] [] | aspell | [] | bash | | bfd | | bibshelf | [] [] | binutils | | bison | [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] | cpio | | cppi | | cpplib | | cryptsetup | | dfarc | [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] | dink | | doodle | | e2fsprogs | | enscript | | exif | [] | fetchmail | | findutils | | flex | | freedink | [] | gas | | gawk | | gcal | | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] | gettext-tools | [] | gip | [] [] | gjay | | gliv | | glunarclock | [] | gnubiff | | gnucash | () () () () | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | [] | gold | | gpe-aerial | [] | gpe-beam | [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] | gpe-timesheet | [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | | gtick | | gtkam | [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | | hello | [] [] [] | help2man | | hylafax | | idutils | | indent | | iso_15924 | [] [] | iso_3166 | [] [] () [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] | iso_639 | [] [] | iso_639_3 | [] | jwhois | [] | kbd | | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | klavaro | [] | latrine | [] | ld | | leafpad | [] [] [] | libc | [] | libexif | | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | | libidn | | lifelines | | liferea | | lilypond | | linkdr | | lordsawar | | lprng | | lynx | | m4 | | mailfromd | | mailutils | | make | [] | man-db | | man-db-manpages | | minicom | [] | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | [] [] [] | psmisc | | pspp | | pwdutils | | radius | | recode | | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] | sed | | sharutils | | shishi | | skencil | | solfege | [] | solfege-manual | | soundtracker | | sp | | sysstat | [] | tar | [] | texinfo | [] | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] | wyslij-po | | xchat | [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +-----------------------------------------------+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne 20 5 10 1 12 48 4 2 2 4 24 10 19 3 1 nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr +---------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] | bfd | [] | bibshelf | [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] () | buzztard | [] [] | cflow | [] | clisp | [] [] | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] | cryptsetup | [] | dfarc | [] | dialog | [] [] [] [] | dico | [] | diffutils | [] [] [] [] [] [] | dink | () | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | exif | [] [] [] () [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] [] | freedink | [] [] | gas | | gawk | [] [] [] [] | gcal | | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] | gnubiff | [] () | gnucash | [] () () () | gnuedu | [] | gnulib | [] [] [] [] | gnunet | | gnunet-gtk | | gnutls | [] [] | gold | | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] [] | gphoto2 | [] [] [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] [] [] | gutenprint | [] [] | hello | [] [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] [] [] [] | iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | iso_3166_2 | [] [] [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] [] | klavaro | [] [] | latrine | [] [] | ld | | leafpad | [] [] [] [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] | libgphoto2_port | [] [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] | lifelines | [] [] | liferea | [] [] [] [] [] () () [] | lilypond | [] | linkdr | [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] | make | [] [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | pies | [] | popt | [] [] [] [] | psmisc | [] [] [] | pspp | [] [] | pwdutils | [] | radius | [] [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () | rpm | [] [] [] | rush | [] [] | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] [] [] [] | solfege-manual | [] [] [] | soundtracker | [] | sp | | sysstat | [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | [] | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] | +---------------------------------------------------+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr 135 10 4 7 105 1 29 61 47 91 3 55 47 8 37 sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW +---------------------------------------------------+ a2ps | [] [] [] [] [] | 27 aegis | [] | 9 ant-phone | [] [] [] [] | 9 anubis | [] [] [] [] | 15 aspell | [] [] [] | 20 bash | [] [] | 11 bfd | [] | 6 bibshelf | [] [] [] | 16 binutils | [] [] | 8 bison | [] [] | 12 bison-runtime | [] [] [] [] [] [] | 29 bluez-pin | [] [] [] [] [] [] [] [] | 37 bombono-dvd | [] | 4 buzztard | [] | 7 cflow | [] [] [] | 9 clisp | | 10 coreutils | [] [] [] [] | 22 cpio | [] [] [] [] [] [] | 13 cppi | [] [] | 5 cpplib | [] [] [] [] [] [] | 13 cryptsetup | [] [] | 7 dfarc | [] | 9 dialog | [] [] [] [] [] [] [] | 30 dico | [] | 2 diffutils | [] [] [] [] [] [] | 30 dink | | 4 doodle | [] [] | 7 e2fsprogs | [] [] [] | 11 enscript | [] [] [] [] | 17 exif | [] [] [] | 16 fetchmail | [] [] [] | 17 findutils | [] [] [] [] [] | 20 flex | [] [] [] [] | 15 freedink | [] | 10 gas | [] | 4 gawk | [] [] [] [] | 18 gcal | [] [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] [] | 34 gettext-runtime | [] [] [] [] [] [] [] | 30 gettext-tools | [] [] [] [] [] [] | 22 gip | [] [] [] [] | 22 gjay | [] | 3 gliv | [] [] [] | 14 glunarclock | [] [] [] [] [] | 19 gnubiff | [] [] | 4 gnucash | () [] () () | 9 gnuedu | [] [] | 7 gnulib | [] [] [] [] | 16 gnunet | [] | 1 gnunet-gtk | [] [] [] | 5 gnutls | [] [] [] | 10 gold | [] | 4 gpe-aerial | [] [] [] | 18 gpe-beam | [] [] [] | 19 gpe-bluetooth | [] [] [] | 13 gpe-calendar | [] [] [] [] | 12 gpe-clock | [] [] [] [] [] | 28 gpe-conf | [] [] [] [] | 20 gpe-contacts | [] [] [] | 17 gpe-edit | [] [] [] | 12 gpe-filemanager | [] [] [] [] | 16 gpe-go | [] [] [] [] [] | 25 gpe-login | [] [] [] | 11 gpe-ownerinfo | [] [] [] [] [] | 25 gpe-package | [] [] [] | 13 gpe-sketchbook | [] [] [] | 20 gpe-su | [] [] [] [] [] | 30 gpe-taskmanager | [] [] [] [] [] | 29 gpe-timesheet | [] [] [] [] [] | 25 gpe-today | [] [] [] [] [] [] | 30 gpe-todo | [] [] [] [] | 17 gphoto2 | [] [] [] [] [] | 24 gprof | [] [] [] | 15 gpsdrive | [] [] [] | 11 gramadoir | [] [] [] | 11 grep | [] [] [] | 10 grub | [] [] [] | 14 gsasl | [] [] [] [] | 14 gss | [] [] [] | 11 gst-plugins-bad | [] [] [] [] | 22 gst-plugins-base | [] [] [] [] [] | 24 gst-plugins-good | [] [] [] [] [] | 25 gst-plugins-ugly | [] [] [] [] [] | 29 gstreamer | [] [] [] [] | 22 gtick | [] [] [] | 13 gtkam | [] [] [] | 20 gtkorphan | [] [] [] | 14 gtkspell | [] [] [] [] [] [] [] [] [] | 45 gutenprint | [] | 10 hello | [] [] [] [] [] [] | 21 help2man | [] [] | 7 hylafax | [] | 5 idutils | [] [] [] [] | 17 indent | [] [] [] [] [] [] | 30 iso_15924 | () [] () [] [] | 16 iso_3166 | [] [] () [] [] () [] [] [] () | 53 iso_3166_2 | () [] () [] | 9 iso_4217 | [] () [] [] () [] [] | 26 iso_639 | [] [] [] () [] () [] [] [] [] | 38 iso_639_3 | [] () | 8 jwhois | [] [] [] [] [] | 16 kbd | [] [] [] [] [] | 15 keytouch | [] [] [] | 16 keytouch-editor | [] [] [] | 14 keytouch-keyboa... | [] [] [] | 14 klavaro | [] | 11 latrine | [] [] [] | 10 ld | [] [] [] [] | 11 leafpad | [] [] [] [] [] [] | 33 libc | [] [] [] [] [] | 21 libexif | [] () | 6 libextractor | [] | 1 libgnutls | [] [] [] | 9 libgpewidget | [] [] [] | 14 libgpg-error | [] [] [] | 9 libgphoto2 | [] [] | 8 libgphoto2_port | [] [] [] [] | 13 libgsasl | [] [] [] | 13 libiconv | [] [] [] [] | 21 libidn | () [] [] | 11 lifelines | [] | 4 liferea | [] [] [] | 21 lilypond | [] | 7 linkdr | [] [] [] [] [] | 17 lordsawar | | 1 lprng | [] | 3 lynx | [] [] [] [] | 17 m4 | [] [] [] [] | 19 mailfromd | [] [] | 3 mailutils | [] | 5 make | [] [] [] [] | 21 man-db | [] [] [] | 8 man-db-manpages | | 4 minicom | [] [] | 16 mkisofs | [] [] | 9 myserver | | 0 nano | [] [] [] [] | 21 opcodes | [] [] [] | 11 parted | [] [] [] [] [] | 15 pies | [] [] | 3 popt | [] [] [] [] [] [] | 27 psmisc | [] [] | 11 pspp | | 4 pwdutils | [] [] | 6 radius | [] [] | 9 recode | [] [] [] [] | 28 rosegarden | () | 0 rpm | [] [] [] | 11 rush | [] [] | 4 sarg | | 1 screem | [] | 3 scrollkeeper | [] [] [] [] [] | 27 sed | [] [] [] [] [] | 30 sharutils | [] [] [] [] [] | 22 shishi | [] | 3 skencil | [] [] | 7 solfege | [] [] [] [] | 16 solfege-manual | [] | 8 soundtracker | [] [] [] | 9 sp | [] | 3 sysstat | [] [] | 15 tar | [] [] [] [] [] [] | 23 texinfo | [] [] [] [] | 16 tin | | 4 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux-ng | [] [] [] [] | 20 vice | () () | 1 vmm | [] | 4 vorbis-tools | [] | 6 wastesedge | | 2 wdiff | [] [] | 7 wget | [] [] [] [] [] | 26 wyslij-po | [] [] | 8 xchat | [] [] [] [] [] [] | 36 xdg-user-dirs | [] [] [] [] [] [] [] [] [] | 60 xkeyboard-config | [] [] [] [] | 25 +---------------------------------------------------+ 84 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW 178 domains 119 1 3 2 0 10 66 50 155 17 97 7 41 2610 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If May 2010 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. silverjuke-16.2.3/CHANGES.md000066400000000000000000001312351266006671500153760ustar00rootroot00000000000000Silverjuke Changes ================================================================================ V16.2 (14.02.2016) ================================================================================ - New: Native support for "projectM", a Milkdrop-esque visualization - New "Video screen" menu with direct access to all relating options - New: Video support for Linux - New: "Crossfading" and "Automatic Volume" for Linux, Mac and Windows - For the linux port, GSteamer is used by default - The video screen is closed if another view is selected or by a simple click - New command line option "--blackrect" to cover unused areas - Bug fixes V16.1 (12.01.2016) ================================================================================ - New: Mac OS X version - New: Scripting and plugin-interface enabled by default - New: Play Opus-files if possible - New: INI-Switch to prepend zeros to track numbers, see file "user-guide" - New: Read Winamp 5.6 genres - New mouse wheel options at "Settings / Advanced" - Show a warning before scripts are executed in Skins or via Drag'n'Drop - All menu entries added by scripts go to the same place in the "Edit" menu - Album view", "Cover view" and "List view" options in view menu - Make "Skip Silence between tracks" work on Mac and Windows - Bug fixes V15.10 (05.12.2015) ================================================================================ - New "Resume" options at "Settings / Playback" - New "Jingle" options at "Settings / Playback" - New: Read and write ratings from MP3, MPC, FLAC and OGG-files - New: "Columns" and "Display" options in view menu - New "Shortcuts" page in the advanced settings - Bug fixes V15.9 (13.11.2015) ================================================================================ - New: "Limit Play Time" option - New: The settings dialog opens with most recent page used - New: INI-Switch "debug", see file "user-guide" - Dialog "Automatic control/Further options" moved to a page in the main dialog - Menu and settings dialog cleanup - Bug fixes V15.8 (27.10.2015) ================================================================================ - Play non-DRM AAC- and ALAC-m4a-files if supported by the operating system - Bug fixes V15.6 (14.10.2015) ================================================================================ - New: Add three more default skins - New: Option to browse the help files locally - Update artist info and cover search URLs - Bug fixes V15.4 (26.06.2015) ================================================================================ - Silverjuke core made open source, see github.com/r10s/silverjuke - Source and feature cleanup, scripting disabled - New: "My music library/Source options/Read hidden folders", defaults to "on" - New: Read/write support for XSPF (pronounced "spiff") playlists - New: Read support for iTunes playlists (*.xml) - New: Read support for Windows Media Player playlists (*.wpl) - New: Scripting: Dialog.show('saveplaylist') - New: Virtual keyboards: "alt" keys may be locked - New: Virtual keyboards: Allowing up to 32 different "alt"-keys - New: The search field allows searching for single words, eg. "Stones Black" will find "Rolling Stones - Paint it Black" - New: "Settings/Advanced/Further options/Search: Search single words" - New: New AutoPlay feature: Ignore tracks from music selection (eg. from "Worst rated") - New: New "Change password" button at "Settings/Kiosk mode/Start" - New: Covers may contain unicode characters - Playlists handling on network drives improved - Using the default font for the Video/Karaoke/Visualization title - Search: No longer searching for genre names by default; please use the context menu for this purpose or enable the feature manually at "Settings/Advanced/ Further options/Search: Lookup genre on simple search" - Fixed a bug with compressed ID3v2 frame headers - Fixed a bug when loading skins - Fixed a bug that prevents timers from unloaded scripts being stopped - Fixed: Memory leak in "Settings/View/Skins/Menu/Update list" - Fixed a problem with bad values assigned to program.repeat V2.75-V3.05 (2009-2011) ================================================================================ - Special and testing versions not belonging to the Silverjuke core V2.74 (09.04.2009) ================================================================================ - New: Allowing the cursor keys to be assigned to any command; same for other basic keys - New: Scripting: prelisten.volume property - encodeURI() handles Unicode strings correctly - Fixed a bug when redrawing skins V2.73 (04.01.2009) ================================================================================ - New: AutoPlay regards the "Avoid boredom" settings - New: Music selection: Playlists can be used for include/exclude rules - New: font-attribute in box-tags - New: Scripting: Program.visMode - New: Scripting: Player.avoidBoredom - New: Scripting: Program.getSelection() can return workspace or display selections independently - New: Display: Tracks moved due to the "Avoid boredom" settings are marked - New: Display: Silverjuke shows the track cover now, see "Settings/Advanced/ Further options/Display: Preferred cover" - New: New Option "Further options/Image cache: Regard file chances": If set, covers will reflect changes made with external applications - New: The command line parameters "--instance" and "--ini" may be combined with other command options - New: Support for UTF-16 encoded karaoke files and playlists andded - Skinning: Different input-items in different layouts can have different font colours and sizes - Skinning: If-Tags: The condition "creditsystem" also works on startup - Music selection: When using the "is set" operator, the unit choice is always hidden - Music selection: No more crashes when using multiple include/exclude rules - List view: Improved handling of the cursor keys - Fixed a bug with shaped skins returning from kiosk mode - Scripting: Calling Player.stopAfterThisTrack or Player.stopAfterEachTrack updates the belonging button states V2.72 (05.10.2008) ================================================================================ - New: Large cover view: Alphanumeric sorting of the cover list V2.71 (29.09.2008) ================================================================================ - New: Karaoke files can be used from within ZIP archives V2.70 (28.09.2008) ================================================================================ - New: New option "Playback/Queue/Remove played tracks from queue" - New: New option "Playback/Queue/Avoid boredom: No artist repetition"; this is also regarded by "Avoid double tracks waiting in queue" - New: New option "Playback/Automatic Control/Further options/Reset view after.. minutes of inactivity to .." - New: "Kiosk mode/Functionality/Toggle elements": This option allows or forbids users to toggle covers, enlarge displays, change columns etc. Replaces "Enlarge display". - New: "Kiosk mode/Functionality/Toggle time mode", "Search for genre", "Unqueue" and "Zoom" - New: "Further options/Kiosk mode: Maintenance password": When using a password to exit the kiosk mode, an additional password can be defined here. Entering this password, only the kiosk mode is ended, without eg. a shutdown. - New: New option "My music library/Add source/Add a server containing music files" - New: New karaoke background option: "Use *.bg.jpg-files" - New option: "Stop after each track", a shortcut can also be defined for this - New: Cover view: Artist and album names can be shown below the covers (use the little triangle in the upper left corner) - New: Large cover view: After a little time, the enlarged cover is updated if "Go to current track after .. minutes of inactivity" is enabled or if the cover belonging to the current track was opened - New: Genres, comments and ratings may be shown in the tracklist, see "Settings/Advanced/Further options/Tracklist: Show genre", "Show comments", "Show rating"; for longer comments, only the first 40 characters are shown - New: New command line and DDE option --execute - New: New option "Kiosk mode/Functionality/Repeat" - New: New skin button-target "removePlayed" - New: A shortcut can be assigned to "Remove played tracks from queue" - New: Support for M3U8-playlists - Tag editor/Split field: Empty destination fields are okay - Large cover view: Sooner update if the cover belonging to the current track was opened - Large cover view: Reproducible sorting order of the cover list - Fixed an issue with disappearing skins - Kiosk mode: Enqueuing multiple tracks from the cover view is only possible if the option "Enqueue multiple tracks" is selected - Kiosk mode/Exit by clicking into two different corners: Only clicks not used by the skin are consumed - Save playlist: Remembering the last playlist format used - Showing more music selections and genres in the search menu - "Goto random" selects tracks in album and cover view - Numpad: The "Cancel" key may be used to correct entered numbers - Larger slider range for "Settings/View/Column width" and for "Settings/View/ Font size" - Preserving manually entered genre names when updating of WAV-files - Scripting: Remembering Program.autoPlay, Program.sleepMode and Program.sleepMinutes between program starts - Scripting: File.pos with negative values work as expected - New: Scripting: Player.removePlayed - Scripting: Scripts can be started by a double click to *.sj-files or by dragging *.sjs-files to the main window - Scripting: Proper order for added menu entries and buttons - Scripting: Shortcuts can be defined for the script's menu entries, see "Settings/Advanced/Further options/Shortcuts: Tools" if scripts are loaded - New: Scripting: HttpRequest object - New Scripting: Program.autoPlay, Program.lastUserInput, Program.layout, Program.onUnload, Program.selectAll(), Program.setSkinText() and Program.zoom - Scripting: Program.refreshWindows() can be used to update the workspace - Scripting: Dialog.setValue() works for static text controls - Scripting: Dialog.addButton() accepts any label for "ok" buttons - Scripting: Dialogs use the virtual keyboard, if needed - New: Scripting: Player.repeat, Player.shuffle, Player.stopAfterThisTrack and Player.stopAfterEachTrack - Scripting: Player.addAtPos() does no longer start playback implicitly; use Player.play() for this purpose. - New: Scripting: Rights.zoom - Scripting: Rights.credits, Rights.editQueue, Rights.unqueue, Rights.multiEnqueue are writable - New skin condition "zoom" - New skin attribute for box-tags: "id" - New skin button-target: "stopAfterEachTrack" - New skin option: h="opposite" assigns the height of a box to its width, also works for w="opposite" - In skin "Silveriness": When showing the display only, the display can still be enlarged - In skin "Silveriness": The transport buttons are available in all layouts - Better support of some VST plugins that do not follow the specification correctly - Menu entries with the character "&" in their names are displayed correctly - Unsupported characters in M3U-files are converted to the question mark - LRC files in the lrcdb-format supported - Spaces in Wikipedia-URLs handled correctly - Fixed a visualization/miniplayer bug - Correcting some details of VU meters etc. displayed by VST plugins - Cover view: Fixed a bug that hides all covers under some circumstances - Fixed a bug when renaming music selections was cancelled - Album view: Fixed a sort order bug - Karaoke background images: Fixed a bug that crashes Silverjuke when selecting a folder without images - Tag editor: Fixed a bug when editing the genre/group of the currently playing FLAC track - When dragging tracks to the display, the correct cursor is shown again (bug introduced in 2.50) - The very first track in shuffle mode becomes "marked as played" - Quotes in music selection rules should work in any case now V2.52 (22.06.2008) ================================================================================ - This is a special version for all c't magazine readers - Congratulations to 25 years of c't from the Silverjuke Team! V2.51 (18.01.2007) ================================================================================ - Kiosk mode monitor settings: Bug fixed for Windows 98 V2.50 (16.12.2006) ================================================================================ - New: New Karaoke options: Silverjuke shows the lyrics from CDG and LRC files - New: New "Open playlist" dialog - New: Dual head options: The karaoke/visualization screen may be shown on a separate display (see "Settings/Kiosk mode/Monitors") - New: Microphone support - New: New option "Kiosk mode/Avoid double tracks waiting in queue" - New: New speaker assignment options, see "Settings/FX/Menu/Setup/Speakers" - New: New console, see "Tools/Console" in the menus - New: New options "Disable screensaver" and "Disable power management" at "Kiosk mode/Monitors/" - New: New option "Kiosk mode/Functionality/Enqueue multiple tracks" - New: New option "Playback/Automatic Control/Manually enqueued tracks interrupt AutoPlay immediately" - New: New option "Read hidden files" in the source options of a folder, defaults to "on"; this is useful eg. for covers saved by the Windows Media Player with the "hidden" attribute - New: New option "Settings/Advanced/Further options/Display: Show AutoPlay" which prepends automatically enqueued tracks in the display by the string "AutoPlay" - New: Separate FX settings for output, prelisten output, microphones and AutoPlay - New: Numpad: A full album can be enqueued using the track number "00" - New: Scripting - New: MP4 tags and embedded covers are read - New: Option "Settings/Advanced/Further options/Menus: Use 'view' font" moved to "Skins/Fonts"; the option affects menus and dialogs - New: New option "Settings/Advanced/Further options/Start playback on enqueue" - New: Scrolling long titles in the default visualization - New: The mouse cursor can be hidden in kiosk mode, see "Kiosk mode/Virtual keyboard" - List view improved - If the mouse is over the "A-Z" buttons, the wheel scrolls one letter up/down; if the mouse is over the scrollbar, the whell scroll one page up/down/left/ right (can both be disabled at "Settings/Advanced/Further options/Mouse wheel: Context-sensitive") - Goto next/prev letter works if no "A-Z" buttons are defined - The default freedb server is "freedb.freedb.org" - Added case-insensitivity for german umlauts and special characters of other languages - Corrected the forwarding of UTF-8-encoded strings to the web services for cover and information search - If not yet done, existing databases are automatically converted to UTF-8 - Fixed a bug that lead to crashes when saving ID3-tags with bad genre data - Different decoders that use the same extensions (eg. AAC and ALAC both use .m4a) can be used at the same time now - Allowing lower case Xiph-comment identifiers in Ogg-tags - Avoid saving covers to themselves - The visualization/karaoke screen may be placed anywhere outside the workspace - Shortcuts can be defined for "Seek Forward" and "Seek backward" - Remembering different zoom settings for the different views by default; this behaviour can be disabled at "Further options/View: Same zoom in all views" - For a better kiosk mode safety, we hide the taskbar and disable the "scroll lock" key - "Use hardware" is no longer enabled by default - "Use system volume" options moved to "Settings/Advanced/Further options" - "Automatic volume control" and "Fading" moved to "Playback/Automatic control" - New skin target: Goto next/prev letter, "currTrack", "currTime", "currCredit" - New skin attributes: "text", "hideCreditInDisplay", "visAutoStart" - New skin condition: "creditsystem" - Skinning: The text size in the search input controls scales to fit the real size of the control - Better recognition of visualization DLLs - Numpad disabled outside kiosk and enable in kiosk works correctly - Fixed a bug in the delay parameter of the effect "Echo 2" - A click on "OK" in the virtual keyboard starts the search if "Settings/ Advanced/Further options/Search while typing" is off V2.03 (31.07.2006) ================================================================================ - Fixed some bugs in the automatic volume detection for erroneous files V2.02 (28.07.2006) ================================================================================ - The "Euro" sign is rendered correctly in the virtual keyboards - The "Select cover" context menu shows all possible covers from all album tracks - Embedded images are read correctly from deprecated ID3 tags - Sometimes the year was read incorrectly for deprecated ID3 tags; fixed now - The "BPM" field is displayed correctly in the list view now - Bug fixed when writing Ogg-Vorbis tags V2.01 (14.06.2006) ================================================================================ - Fixed a little problem with the Unicode stuff - Fixed a bug in the silence detection V2.00 (13.06.2006) ================================================================================ - New: Mac OS X support - New: Unicode support - New: Two new views - please try the new icon below the vertical scrollbar - New: Completely rewritten and improved sound processing: - Native or system-based support for MPx, Ogg-Vorbis, FLAC, Musepack, WAV, WMA, AIFF, Monkey's Audio, WavPack and MOD playback added or improved - For a better sound quality, we now rely on the hardware whereever possible; moreover, all calculations are always 32-bit now - Less latency - New effect section for internal effects and for VST effects added to the settings dialog - Shoutcast and Icecast support added, see "Open playlist or files/Open URL" - New context menu command "Fade to next"; as an alternative, hold the shift key while pressing eg. the "next" button - New crossfading option "Only fade out, start new track with full volume"; dialog "Playback settings/Fading" improved - New: Mouse and keyboard improvements: - The middle mouse button can be configured to edit or prelisten tracks now (see "Settings/Advanced/Further options/Middle mouse button") - Shortcuts defined for the action "Unqueue marked tracks" will work - More options for adding credits by shortcuts (see "Settings/Kiosk mode/Credit system") - All cursor and workspace shortcuts can be changed at "Settings/Advanced/ Further options" now, adding targets for pagination to the skin engine - Less flickering on object dragging and on dialog resizing - The font defined at "Settings/View" can now also be used for the popup-menus; see "Settings/Advanced/Further options/Menus: Use 'view' font" - New: Further changes: - New command line options --volup, --voldown and --togglevis - New command line parameter "--kioskrect"; this can be used to let Silverjuke only use some parts of the screen in kiosk mode - New skin condition: "version" - New option in the playback context menu: "More from current album/artist" - Added amazon.com and jpc.de to the german cover search (thanks to timewind) and lyricwiki.org to the lyrics search - Reading (ID3-)tags can be disabled per source at "My music library/Source options" - Some optimizations make the database about 15% smaller; as the cache is better used for this reason, this also results in some speed improvements, eg. on search - The pages "Buy", "Language" and "Further options" are grouped under "Settings/ Advanced" now; module settings are available at "Further options" - If the tag information is read from the file name, we now allow the character "." there; however, the last point always introduces the file extension - All searches are switched off before changing tag data that may affect the sorting and before a database update V1.22 (01.03.2006) ================================================================================ - New: Prelistening is directly available for tracks in the playlist - New: The action to perform when terminating the kiosk mode can now be predefined or can be queried independently of a password - New: New command line parameter "--update" which will update the index on startup - For display selections, the context menu option "View/Go to marked tracked" is shown in addition to "View/Go to current track" - The kiosk mode password must be entered on exit even if "all functions" is enabled - Fixed a bug that crashes Silverjuke sometimes on exit if the kiosk settings dialog is still open - Track numbers are read correctly from UTF-16 ID3-tags - German umlauts are read correctly from UTF-16 ID3-tags - Fixed a problem if the key to exit the kiosk mode was still hold in the shutdown period - Improved loading of Winamp 5.2 modules - MilkDrop 1.04d that comes with Winamp 5.2 is currently incompatible to Silverjuke due to undocumented API calls and is not loaded therefore V1.20 (01.02.2006) ================================================================================ - New: The AutoPlay function can also play tracks from the current view (see "Playback settings/Automatic control/AutoPlay") - New: Credits may also be added by shortcuts (see "Settings/Kiosk mode/ Credit system") - New: In skin "Silveriness": New button "0-9" - New target for the skin engine: "goto0" which refers all albums not starting with a letter between A to Z - "Go to current track" only ends the simple search if needed - "Play track next" works as expected if the shuffle mode on on - Fix a bug when terminating the kiosk mode when ctrl-alt-del is disabled - No more "beeps" when entering the kiosk mode with ctrl-alt-del disabled - The tag editor is only available in the kiosk mode if the functionality is set to "All functions" V1.18 (09.12.2005) ================================================================================ - New: The location and the max. size of the temporary directory can be defined in "Settings/Advanced/Further options" - New: http-files are cached to the temporary directory - New: Each decoder module may be preferred for local file/http playback independently; by default, Winamp modules are preferred for local file playback and the ACM-MPx module is preferred for http playback - New option "Kiosk mode/Numpad/Also use numpad controls outside the kiosk mode" - Unknown total times are no longer shown as "?:??" in the display - Speed improvements when adding files to the queue - Fixed a bug that avoids removing the last source from the library V1.16 (20.11.2005) ================================================================================ - New: Prelistening - New: Tag editor: Option to query the freedb online database added, see the "Menu" button - New: A balloon with information about the current track can be shown in the system tray, see "Settings/Advanced/System tray" - New: Sleep mode functionality added to "Settings/Playback settings/Automatic control" - New: If the kiosk mode is protected by a password, you have the option to shutdown or to reboot the computer on exit - New: Albums may be created by directories and the album order may be changed, see "Settings/My music library/Combine tracks to albums" - New: Credit system support - Option "Playback settings/Crossfade/Options/No crossfades between subsequent tracks of the same album" added (enabled by default) - Option "Settings/Advanced/Further options/Mouse: Double click on covers" with the settings "Open cover editor" (default) and "Select/play album" added - The cover and the tag editors may also be opened with the middle mouse button - Unused system accessibility features are disabled in kiosk mode to prevent system dialogs coming up; used accessibility features are still available - Shutdown handling for the kiosk mode improved, new option "Settings/Kiosk mode/Start kiosk mode/Disable shutdown" added - New functionality switch for the kiosk mode: "Music selection" - If needed, playing times are corrected after the first continuous playback - For the mouse wheel, Silverjuke now also checks, if the mouse is over the volume slider or over a scrollbar (requires "Further options/Mouse wheel: Scroll display" to be set) - "My rating" and "Artist on the web" are available directly from the system tray icon - The prior searches, music selections and genres are accessible directly from the search menu now (use eg. the little arrow right of the search control) - New command line parameter "--instance=INI-file" - New skin condition: "shaped", else-tag added - The kiosk mode option "Query settings before start" works as expected - Fixed a bug that avoids ID3-tag-reading under some circumstances - Fixed a bug that hides some tracks under some circumstances V1.14 (24.08.2005) ================================================================================ - New: When dragging a cover from an external program to an album row or when using the clipboard, the user has the option to copy it to the album directory now; moreover, a thumbnail of the cover is displayed in the message box - New: Context menu option "Playback/Play now on double click" added; the predefined shortcut for this option is "ctrl-d" - New: Automatically played tracks (see "Settings/Playback/Automatic control") can be skipped by pressing "next" - Tracks may be played directly from the music selection dialog (see the "Menu" button in the dialog) - The display in the kiosk mode may be optionally enlarged, see "Settings/Kiosk mode/Functionality/Enlarge display" - If "Settings/Kiosk mode/Functionality/All functions" is enabled, the music selections work as expected - Some confirmation dialogs (eg. enqueue, clear playlist, rating, exit) can be be disabled (see "Settings/Advanced/Further options" and the dialogs themselves) - If a track is enqueued multiple times, all queue positions are shown in the tooltips and in the "Get info" dialog - The current layout (eg. the size of the display) and all window positions are remembered and reloaded on the next Silverjuke startup - If "search covers on the web" is called for the first time, the online help is displayed and some tips are shown - Better error handling when loading invalid skins - Automatically started and manually stopped visualizations stay stopped in any case - Funny: The tooltip "Exit Silverjuke" was shown for the horizontal scrollbar... fixed V1.10 (31.07.2005) ================================================================================ - New: Added the possibility to control Silverjuke with the numpad or special hardware buttons (see "Settings/Kiosk mode/Numpad") - New: Sources may be excluded from the update process - New: In shuffle mode, already played tracks may be played again by removing the little check mark in front of the title in the display - New: Online help improved - Removing tracks from the queue regards the shuffle, repeat and autoplay states - If the player is stopped because of the end of the queue and kiosk, repeat and autoplay are disabled, the queue is reset to the first position - A double click on an already enqueued track will just enqueue it again (instead of enqueueing it again). To unqueue songs, use the display. - Using the display instead of a message box to show the message "Queue full" in kiosk mode - By default, the built-in visualization shows the oscilloscope and the spectrum - Automatic detection of Nero improved - Language detection improved - If any decoder module cannot find out the correct playing time, it is saved by Silverjuke to the database after the first continuous playback - If the kiosk mode is started, the settings dialog is closed under all circumstances - As ACM cannot play MPEG Layer I/II files by default, decoders other than ACM are preferred (if available); otherwise, a detailed error message is shown when trying to play a MPEG Layer I/II file - If an ID3 copyright message contains quotes, this halted the database update from time to time; fixed (thanks to jobo) - Bug fixed: Files with the character "#" in the path or in the file name can be read - Bug fixed: Sometimes, Winamp modules that do not use the output were loaded - Bug fixed: Sometimes, already unqueued tracks were still marked in the album view V1.05 (07.07.2005) ================================================================================ - Improved the loading strategy for Winamp input modules as, under some circumstances, eg. the WMA plug-in crashed together with Silverjuke V1.04 (04.07.2005) ================================================================================ - New: Added a virtual keyboard which is useful esp. in combination with touchscreens or if no physical keyboard is present (see "Settings/Kiosk mode/ Virtual keyboard") - New: Silverjuke can automatically play songs if the playlist is empty, can follow the playlist or can start/stop the visualization automatically, see "Settings/Playback/Automatic control" - New: French language support added (thanks to Claude Sturzel) - The cover size can be adjusted independently of the column width (see "Settings/View/Font and cover") - After the player is stopped and started again, already played tracks in the playlist are no longer played again if "repeat" is off; please enable the repeat function to get this behaviour - Music selections can be opened directly from the kiosk functionality page - In skin "Silveriness": If wanted, the kiosk mode shows the visualization, play, prev/next and volume controls - Skin outlines are no longer shown when loading an erroneous skin, only an error message is printed - Visualization is stopped if one of the "A-Z" buttons is clicked - In kiosk mode, the visualization is stopped when clicking anywhere into the visualization window V1.01 (04.06.2005) ================================================================================ - New: Added an automatic version check; the version check is disabled by default, use "Settings/Advanced/Further options" to enable it - Fixed a bug that halts playback under some circumstances - Fixed a bug that unloads VST effect modules after a database update - Better support for unusual bitrate/samplerate combinations in the ACM decoder V1.00 (25.04.2005) ================================================================================ - New: First official release of Silverjuke - New: Tracks in the queue may be moved - New: Improved selection handling in queue display (ctrl-click, shift-click) - New: More context menu options for tracks in the queue ("Edit tracks", "Burn CD", "Unqueue marked tracks", "Unqueue all but marked" etc.) - New: Option to switch the screen resolution in kiosk mode - New: Option "Control/Go to current track" added - New: Support for VST modules added - Better output quality: automatically switching to 32-bit float samples if needed by DSP modules; if this is not needed, we work with faster 16-bit integer samples - Better output quality: to avoid clipping when working with 16-bit integers, the automatic volume and the main volume are adjusted in only one step - Resuming DSP buffers on previous/next - Enlarged covers are centered correctly in kiosk mode - Editing covers is no longer possible in kiosk mode - Also matching image names against album names when searching for covers - Removing the correct registry entry when removing a source - Using a popup menu instead of a dialog to select the source type to add - Options "Open cover" and "Search covers on the web" splitted into two menu entries - Enlarging the display cover works if covers in the browser are disabled - The state of the mute button (if present in a skin) is set correctly on volume changes - New kiosk mode icon - No longer showing errors, if non-privileged users don't have access to the default Winamp directory - Vertical scrollbar updated correctly when clicking on "A-Z" - Effect modules are inserted into "effect slots", this also allows to define the order of effects to process - Options for active effects are also available in the main menu at "Playback" - Longer drag'n'drop operations do no longer interrupt the calling application - Public homepage access; from now on, the beta-test forum is available for registered users only V0.32 (08.04.2005) ================================================================================ - New: New default skin "Silveriness" - New: New jingle "Silverjuke is running" (thanks to Chester) - New: Tag editor: options to rename files and to split fields added - Placeholders are surrounded by "<" and ">" - A double click on an item in "Settings/Advanced/Further options" always opens the context menu if there are more than two options present - Optimized the icons to work with non-standard colors - Bug fixed that lead the tag editor confirmation dialog crash in some cases - Bug fixed when selecting tracks using shift-up - The dialog "Automatic volume" shows more details about the current volume - Updated the screenshots on the homepage - Bug fixed for skins using relative positions V0.30 (21.03.2005) ================================================================================ - New: Tag editor: replace dialog added - New: Tag editor: detailed confirmation dialog added - New: Burning CDs simplified and improved - New: Option "Automatic volume control/Play all tracks of an album with the same volume" added - New: Clipboard support for pasting covers, music files or directories - New: When dropping a folder, the user is asked whether to add it to the database - When opening or dropping files that are not in the database, the (ID3-)tags and the playing time for these files are read and shown correctly - Allowing bitmap objects for drag'n'drop and clipboard (in earlier versions only existing bitmap files were supported) - Covers may be copied or moved on drag'n'drop (use the "shift" key); on copy, they're copied to the directory the first track of the album belongs to; copy is the default action when using the clipboard - Avoid loading Winamp modules that say, they use the default audio output but finally don't - Some interface options added to "Advanced/Modules/Load modules" - Oscilloscope: added a spectrum analyzer; some more changes and improvements - Stopping visualization when entering kiosk mode - Better embedding of visualizations - When changing (ID3-)tags of the currently played file, it will be paused for a second to allow the file modification; same if the file is renamed - Option to write (ID3-)tags move from the source options to the tag editor - Handling improved when Silverjuke is about to terminate and started again in these moments - Allowing "short" paths in playlists - Giving volume-adjusted samples to the visualizations - Bug fixes when switching from internal to global drag'n'drop (let to program hang under some circumstances) V0.29 (14.03.2005) ================================================================================ - New: Looking forward when gathering automatic volume information; this leads to less volume adjustments inside a track - New: Automatic volume information are written to the database; so no more volume adjustments inside a track are needed for subsequent playbacks - New: Options dialog added for the automatic volume control - New: Automatic volume may be used as a search criteria for music selections - New: Covers may be added using drag'n'drop from external applications - Improved automatic volume in combination with cross fading - Pressing "Cancel" in the playback settings dialog does no longer restart the automatic volume control - Showing the correct text in the browser for unsuccessful music selections - Using a higher thread priority for the main audio thread, may be configured at "Playback settings/Default audio output/Options" - A database update is initiated automatically when this version is started first; normally, this will only take a few seconds - Cross fading, automatic volume and output dialogs are modeless - Opened menus or modal system dialogs do no longer avoid playing the next title in the queue - Fading some milliseconds on play, pause, stop, previous, next and exit - In prior versions, when clicking previous/next, the first two decoded buffers of the new track were forgotten; fixed - Keeping window size and position when enlarging/shrinking the display; the small player view has a completely independent size and position - "Always on top" can be set individually for every layout; the corresponding button in skin "Silverblue" is now available in the small player view only (makes no sense in the normal view) - If there is much silence skipped at the end of the previous track, we allow cross fades up to half of the desired length - Increasing the playing counter for short tracks - Some bugs fixed in the player for very short or erroneous tracks - Remembering the browser position and the selected tracks when ending or changing a search - Keeping the cover information when editing tags - Default output buffer size changed from 185 ms to 92 ms for a better response to play, pause, volume etc.; on my slow-testing system (450 MHz), there were no buffer underruns - The decoder buffer size is adjusted automatically; this is done by regarding the cross fade and and the automatic volume settings V0.28 (04.03.2005) ================================================================================ - New: "Automatic volume" implemented - New: Seeking implemented for ACM decoders - Corrected erroneous seeking at the end of a track, seeking is only possible within a track - Corrected the title below the search field when switching to/from kiosk mode - Corrected counting the unplayed titles in kiosk mode if shuffle is not enabled; in this case, tracks before the current position will never be played, so we do not count them as being waiting - Remembering the correct browser position after ending a search - Releasing allocated images correctly in the small cover display - "Advanced search" renamed to "Music selection" (thanks to "m") - Partly corrected the english homepage and the help file (thanks to "m") - Updated the screenshots on the homepage - Kiosk mode start/stop buttons shown in bold - Scaling down the drag'n'drop image, if it is very large - More aggressive silence skipping on track end V0.27 (27.02.2005) ================================================================================ - New: Shuffle implemented - New: On program startup, the last music selection is loaded, if any - New: Tracks can be excluded/included to music selections using "del" or "ins" in the main window; drag'n'drop is also supported - New: More "limit by" options for music selections - New: Queue position and file type may be used as criteria in music selections - New: Showing the queue position in "Get info" and in the tooltips, if any - New: Showing the file type in "Get info" - New: If the mouse is over the display, the mouse wheel optionally scrolls it - New: Kiosk mode improved - Display of music selections in the main window improved: no truncating of quotes, hiding the strings "Albums - A" etc. for small results - Menu option "View/Show covers" is available in all context menus - When adding tracks to the queue the tracks are shown in bold and the display scrolls to the adding position; after a moment the normal state is restored - Adding some more options for using colours in skins - For internal drag'n'drop, the images of the selected tracks are optionally moved together with the mouse - Showing the text "no results" in the browser if a search failed; clicking onto it will end the search - Fixed an redrawing error for the vertical text in the browser - Total time given correctly to Winamp modules - Date output in "Edit tags/Get info" and other places corrected - The calender control returns the correct date and time - Mute does no longer pause playback - Memory leak fixed when writing ID3 tags - "Play title now" works in shuffle mode - No more errors as "Image not found. Source tag is..." when loading a correct skin - If there are no columns in the browser, the thumb of the horizontal scrollbar is as wide as scrollbar - Restarting tracks in queue with "repeat" disabled replays all tracks - Moved option "Ask on close if playing" to "Advanced/Further options" - Renamed "Rating" to "My rating" - Renamed "Playback settings/Further options" to "Playback settings/Shuffle" - IDs of deleted tracks are never reused again; future versions may depend on this behavior, so you may want to delete mymusic.db and create it again; however, currently this is not needed - Music selections are stored in the database instead of registry/ini - In skin "Silverblue": Button to start the visualizations moved to the display area - In skin "Silverblue": Removed play/previous/next from the small and from the kiosk layout (you can use the display for these functions) V0.26 (18.02.2005) ================================================================================ - Bug fixed in the error logging system which was not really thread-save and lead to program crashes under some circumstances; hopefully everything is okay now... - Bug fixed when adding user-defined keys (lead to program crashes) - Using negative values for image brightness/contrast is okay now - When enlarging erroneous images the error is displayed V0.25 (16.02.2005) ================================================================================ - New: "Music selections" (former name was "Advanced search") implemented - New: Local and system-wide drag'n'drop support from the browser window eg. to the display - New options for drag'n'drop in "Advanced/Further options" - Command line option "--temp=DIR" added - Hiliting conflicting decoder modules in "Settings/Modules" - Sorting of strings that begin with a number corrected - Tooltips are closed if the mouse is over another window - Moved all keyboard, mouse, expert and minor settings from different dialogs and menus to "Advanced/Further options" - Improved time display - Starting the kiosk mode closes all open dialogs - Using a larger font for the vertical text in the browser - Help updated V0.24 (22.01.2005) ================================================================================ - New: Option to force auto-generated covers (see cover's context menu) - New: Resampling "odd" frequencies as 48 KHz to 44.1 KHz, resampling filter added (see "Playback settings/Audio output/Options") - New: The ACM decoder can play files of all common frequencies - Oscilloscope: Optionally drawing offscreen to avoid flickering; using font from "View settings"; option "Show title" added, "Flash Background" is no longer enabled by default (many people thought, this is a bug) - Auto-generated covers are shown correctly if "Advanced/Further options/Image cache/Disk cache" is enabled - German umlauts and other special characters are shown correctly in auto- generated covers - Added little more space between the options in "Combine tracks to albums" - Reading MPx headers in files without ID3v2 but with ID3v1 is okay (hit shift-F5 to recreate your music library) - Some english strings corrected (thanks to Thorsten) - System-wide shortcuts are no longer enabled by default - The button "My music library/Update music library" now opens a popup menu with the options "Update" and "Recreate" V0.23 (15.01.2005) ================================================================================ - New: Tooltips added - New: Accelerator handling improved - New: Improved selection handling in main window (ctrl-click, shift-click, shift-cursor) - Option to enable/disable tooltips added to "Advanced/Further Settings" - Option "Advanced/Further options/Cursor keys" added - In skin "Silverblue": Button to append files added to large display view - In skin "Silverblue": Button to toggle "always on top" added - In skin "Silverblue": Menu- and minimize-button in small view added - Previous/next works in the track editor, alternatively the page up/down keys may be used (these keys may also be customized in "Advanced/Further options") - Downloading covers from buy.com should work now - "-" and other special characters may be entered into the search control - Bug fixed for hover handling if a click is aborted by moving the mouse outside the button rectangle - English capitalization improved - If errors occur while loading a cover, these errors are printed at the place of the erroneous cover instead of opening a message box. - Using different subdirectories in temp. directory for different configurations/different databases. This is needed as files are stored in temp eg. using IDs from the database. - Initial visualization window position corrected for some visualizations that set their own position even when embedding (eg. Milkdrop) V0.22 (10.12.2004) ================================================================================ - New: First beta release of Silverjuke - silverjuke.net incl. the beta-test forum opened to some selected people V0.01 (23.11.2003) ================================================================================ - New: First prototype of Silverjuke - Start counting the version numbers Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com silverjuke-16.2.3/LICENSE000066400000000000000000000773331266006671500150210ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS silverjuke-16.2.3/Makefile.am000066400000000000000000000217641266006671500160450ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in. # # Copyright © 2015 Björn Petersen # Copyright © 2015 Dr. Tobias Quathamer # # This file is part of silverjuke. # # 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 3 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, see . # This is needed for gettext, it is too much work to rewrite # po/Makefile.in.in for a non-recursive approach. SUBDIRS = po ACLOCAL_AMFLAGS = --install -I m4 # Provide the pkgdatadir variable to cpp files in order to be able # to reliably locate the skins, keyboards and visualizations. silverjuke_CPPFLAGS = -Isrc $(WX_CPPFLAGS) $(GST_CFLAGS) $(GL_CFLAGS) -DPKGDATADIR=\"$(pkgdatadir)\" -DPKGDOCDIR=\"$(docdir)\" silverjuke_CXXFLAGS = \ -Isrc \ -Wall \ -Wno-unused-but-set-variable \ -g \ $(ZLIB_CFLAGS) $(LIBXINE_CFLAGS) $(SQLITE3_CFLAGS) $(WX_CXXFLAGS) silverjuke_LDADD = $(ZLIB_LIBS) $(LIBXINE_LIBS) $(SQLITE3_LIBS) $(WX_LIBS) $(GST_LIBS) -lgstvideo-1.0 $(GL_LIBS) silverjuke_LDFLAGS = $(LDFLAGS) dist_doc_DATA = \ CHANGES.md \ LICENSE \ README.md \ docs/command-line.rst \ docs/dde.md \ docs/localization.md \ docs/plugins.md \ docs/scripting.md \ docs/skinning.md \ docs/user-guide.md \ docs/virtual-keyboards.md desktopdir = $(datadir)/applications dist_desktop_DATA = silverjuke.desktop iconsdatadir = $(datadir)/icons/hicolor icons48dir = $(iconsdatadir)/48x48/apps icons64dir = $(iconsdatadir)/64x64/apps icons128dir = $(iconsdatadir)/128x128/apps dist_icons48_DATA = src/sjdata/icons/48x48/silverjuke.png dist_icons64_DATA = src/sjdata/icons/64x64/silverjuke.png dist_icons128_DATA = src/sjdata/icons/128x128/silverjuke.png # Install keyboard files and skin directories EXTRA_DIST = \ $(top_srcdir)/src/sjdata/skins \ $(top_srcdir)/src/sjdata/keyboards install-data-local: $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/keyboards $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/skins/golden-goal.sjs $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/skins/old-style-jukebox.sjs $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/skins/racky.sjs $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/skins/silveriness-touched.sjs $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/skins/vistact.sjs $(MKDIR_P) $(DESTDIR)$(datadir)/silverjuke/vis $(INSTALL_DATA) $(top_srcdir)/src/sjdata/keyboards/* $(DESTDIR)$(datadir)/silverjuke/keyboards $(INSTALL_DATA) $(top_srcdir)/src/sjdata/skins/golden-goal.sjs/* $(DESTDIR)$(datadir)/silverjuke/skins/golden-goal.sjs $(INSTALL_DATA) $(top_srcdir)/src/sjdata/skins/old-style-jukebox.sjs/* $(DESTDIR)$(datadir)/silverjuke/skins/old-style-jukebox.sjs $(INSTALL_DATA) $(top_srcdir)/src/sjdata/skins/racky.sjs/* $(DESTDIR)$(datadir)/silverjuke/skins/racky.sjs $(INSTALL_DATA) $(top_srcdir)/src/sjdata/skins/silveriness-touched.sjs/* $(DESTDIR)$(datadir)/silverjuke/skins/silveriness-touched.sjs $(INSTALL_DATA) $(top_srcdir)/src/sjdata/skins/vistact.sjs/* $(DESTDIR)$(datadir)/silverjuke/skins/vistact.sjs $(INSTALL_DATA) $(top_srcdir)/src/sjdata/vis/* $(DESTDIR)$(datadir)/silverjuke/vis # Uninstall keyboard files and skin directories uninstall-local: rm -rf $(DESTDIR)$(datadir)/silverjuke/skins rm -rf $(DESTDIR)$(datadir)/silverjuke/keyboards # Create and install manpage man1_MANS = silverjuke.1 CLEANFILES = silverjuke.1 silverjuke.1: $(RST2MAN) $(top_srcdir)/docs/command-line.rst silverjuke.1 bin_PROGRAMS = silverjuke silverjuke_SOURCES = \ src/kiss_fft/kiss_fft.c \ src/kiss_fft/tools/kiss_fftr.c \ src/prjm/amalgation1.cpp \ src/prjm/amalgation2.cpp \ src/see/cfunction.c \ src/see/debug.c \ src/see/dprint.c \ src/see/dtoa.c \ src/see/enumerate.c \ src/see/error.c \ src/see/function.c \ src/see/input_lookahead.c \ src/see/input_string.c \ src/see/intern.c \ src/see/interpreter.c \ src/see/lex.c \ src/see/mem.c \ src/see/module.c \ src/see/native.c \ src/see/no.c \ src/see/obj_Array.c \ src/see/obj_Boolean.c \ src/see/obj_Date.c \ src/see/object.c \ src/see/obj_Error.c \ src/see/obj_Function.c \ src/see/obj_Global.c \ src/see/obj_Math.c \ src/see/obj_Number.c \ src/see/obj_Object.c \ src/see/obj_RegExp.c \ src/see/obj_String.c \ src/see/parse.c \ src/see/platform_posix.c \ src/see/printf.c \ src/see/regex.c \ src/see/scope.c \ src/see/string.c \ src/see/stringdefs.c \ src/see/system.c \ src/see/tokens.c \ src/see/try.c \ src/see/unicase.c \ src/see/unicode.c \ src/see/value.c \ src/see_dom/obj_Database.cpp \ src/see_dom/obj_Dialog.cpp \ src/see_dom/obj_File.cpp \ src/see_dom/obj_HttpRequest.cpp \ src/see_dom/obj_Player.cpp \ src/see_dom/obj_Program.cpp \ src/see_dom/obj_Rights.cpp \ src/see_dom/sj_see.cpp \ src/sjbase/autoctrl.cpp \ src/sjbase/backend.cpp \ src/sjbase/backend_gstreamer.cpp \ src/sjbase/backend_xine.cpp \ src/sjbase/browser.cpp \ src/sjbase/browser_album.cpp \ src/sjbase/browser_cover.cpp \ src/sjbase/browser_list.cpp \ src/sjbase/columnmixer.cpp \ src/sjbase/display.cpp \ src/sjbase/mainapp.cpp \ src/sjbase/mainframe.cpp \ src/sjbase/mainframe_menu.cpp \ src/sjbase/player.cpp \ src/sjbase/playlist.cpp \ src/sjbase/queue.cpp \ src/sjbase/search.cpp \ src/sjbase/skin.cpp \ src/sjbase/skinenum.cpp \ src/sjbase/skinml.cpp \ src/sjdata/data.cpp \ src/sjmodules/accel.cpp \ src/sjmodules/advsearch.cpp \ src/sjmodules/arteditor.cpp \ src/sjmodules/basicsettings.cpp \ src/sjmodules/cinterface.cpp \ src/sjmodules/help/help.cpp \ src/sjmodules/help/htmlwindow.cpp \ src/sjmodules/internalinterface.cpp \ src/sjmodules/kiosk/creditbase.cpp \ src/sjmodules/kiosk/kiosk.cpp \ src/sjmodules/kiosk/monitor_overview.cpp \ src/sjmodules/kiosk/numpad.cpp \ src/sjmodules/kiosk/numpadmenu.cpp \ src/sjmodules/kiosk/numpadpassword.cpp \ src/sjmodules/kiosk/numpadplay.cpp \ src/sjmodules/kiosk/numpadsearch.cpp \ src/sjmodules/kiosk/numpadtextentry.cpp \ src/sjmodules/kiosk/password_dlg.cpp \ src/sjmodules/kiosk/virtkeybd.cpp \ src/sjmodules/library.cpp \ src/sjmodules/modulebase.cpp \ src/sjmodules/mymusic.cpp \ src/sjmodules/openfiles.cpp \ src/sjmodules/playbacksettings.cpp \ src/sjmodules/scanner/folder_scanner.cpp \ src/sjmodules/scanner/server_scanner_config.cpp \ src/sjmodules/scanner/server_scanner.cpp \ src/sjmodules/settings.cpp \ src/sjmodules/tageditor/freedb.cpp \ src/sjmodules/tageditor/tageditor.cpp \ src/sjmodules/tageditor/tageditorfreedb.cpp \ src/sjmodules/tageditor/tageditorplugin.cpp \ src/sjmodules/tageditor/tageditorrename.cpp \ src/sjmodules/tageditor/tageditorreplace.cpp \ src/sjmodules/tageditor/tageditorsplit.cpp \ src/sjmodules/viewsettings.cpp \ src/sjmodules/vis/vis_bg.cpp \ src/sjmodules/vis/vis_cdg_raw.cpp \ src/sjmodules/vis/vis_cdg_reader.cpp \ src/sjmodules/vis/vis_frame.cpp \ src/sjmodules/vis/vis_karaoke_module.cpp \ src/sjmodules/vis/vis_module.cpp \ src/sjmodules/vis/vis_oscilloscope.cpp \ src/sjmodules/vis/vis_projectm_module.cpp \ src/sjmodules/vis/vis_synctxt_raw.cpp \ src/sjmodules/vis/vis_synctxt_reader.cpp \ src/sjmodules/vis/vis_vidout_module.cpp \ src/sjmodules/vis/vis_window.cpp \ src/sjmodules/weblinks.cpp \ src/sjtools/busyinfo.cpp \ src/sjtools/console.cpp \ src/sjtools/csv_tokenizer.cpp \ src/sjtools/dialog.cpp \ src/sjtools/explore.cpp \ src/sjtools/ext_list.cpp \ src/sjtools/fs_inet.cpp \ src/sjtools/gcalloc.cpp \ src/sjtools/hash.c \ src/sjtools/http.cpp \ src/sjtools/imgop.cpp \ src/sjtools/imgthread.cpp \ src/sjtools/levensthein.c \ src/sjtools/littleoption.cpp \ src/sjtools/msgbox.cpp \ src/sjtools/normalise.cpp \ src/sjtools/sqlt.cpp \ src/sjtools/temp_n_cache.cpp \ src/sjtools/testdrive.cpp \ src/sjtools/timeout.cpp \ src/sjtools/tools.cpp \ src/sjtools/tools_gtk.cpp \ src/sjtools/tooltips.cpp \ src/sjtools/volumecalc.cpp \ src/sjtools/volumefade.cpp \ src/sjtools/wavework.cpp \ src/tagger/tg_ape_tag.cpp \ src/tagger/tg_a_tagger_frontend.cpp \ src/tagger/tg_bytefile.cpp \ src/tagger/tg_bytevector.cpp \ src/tagger/tg_flac_file.cpp \ src/tagger/tg_id3v1_tag.cpp \ src/tagger/tg_id3v2_frame.cpp \ src/tagger/tg_id3v2_framefactory.cpp \ src/tagger/tg_id3v2_header_footer.cpp \ src/tagger/tg_id3v2_knownframes.cpp \ src/tagger/tg_id3v2_tag.cpp \ src/tagger/tg_mp4_boxes.cpp \ src/tagger/tg_mp4_file.cpp \ src/tagger/tg_mpc_file.cpp \ src/tagger/tg_mpeg_file.cpp \ src/tagger/tg_mpeg_header.cpp \ src/tagger/tg_mpeg_properties.cpp \ src/tagger/tg_ogg_file.cpp \ src/tagger/tg_oggvorbis_file.cpp \ src/tagger/tg_oggvorbis_properties.cpp \ src/tagger/tg_ogg_xiphcomment.cpp \ src/tagger/tg_tagger_base.cpp \ src/tagger/tg_wma_file_asf.cpp \ src/tagger/tg_wma_file.cpp \ src/tagger/tg_wma_properties.cpp \ src/tagger/tg_wma_tag.cpp silverjuke-16.2.3/README.md000066400000000000000000000066461266006671500152720ustar00rootroot00000000000000Silverjuke ================================================================================ Silverjuke is the easy-to-use jukebox with more than ten yeas of experience, see http://silverjuke.net for further information. The Silverjuke source code is available under the GPL license, see the file LICENSE for details. Installation ================================================================================ **Linux/Unix:** With chance, Silverjuke is available in your favorite packet manager. If it is not there, please contact your linux distributor - we cannot help on this point. Alternatively, more experienced users can build Silverjuke theirself. The source code from https://github.com/r10s/silverjuke plus a simple `./autogen.sh`, `make` and `make install` should do the job. If you want to run silverjuke from your build dir, run `./silverjuke` instead of `make install`. Beyond the usual gcc and system development packages, chances are you'll also need the following stuff: - OpenGL libraries, eg. libgl1-mesa-dev - libgstreamer1.0-dev - wxWidgets-wxcontainer-devel - libsqlite3-dev - python-docutils (for rst2man) - gawk (mawk may cause problems) Note that your distro's default wxwidgets package might contain the stl version, which does _not_ work with silverjuke. Check for something with wxcontainer in the name. Silverjuke does not accept any files after a successful compilation? One reason for this are missing codecs, install the corresponding packages in this case. **Windows, Mac:** For Windows and Mac OS X, ready-to-use programs with the most recent version are available at http://silverjuke.net . Note, that these binaries are not opened sourced. Issues =============================================================================== Any issues can be reported to https://github.com/r10s/silverjuke/issues Coding ================================================================================ Beside the possibility to code on the Silverjuke project itself, you can create skins (or maybe scripts) that will be loaded and executed by Silverjuke. For the possibilities on this, please refer to the `docs` folder. If you want to code on Silverjuke yourself here are some hints that may be usefull esp. if you want to give your work back to the core (pull requests). - For indentation we use tabs. Alignments that are not placed at the beginning of a line should be done with spaces. - For padding between funktions, classes etc. we use 2 empty lines - Files are encoded as UTF-8 with Unix-Lineends (a simple `LF`, `0x0A` or `\n`) - `/sjbase` contains the main functions and the startup routines - `/sjmodules` does not contain loadable libraries but program parts that can communicate with message without knowing each other - `/sjtools` contains - more or less - self-contained and independent classes and functions; there should be no references to /sjbase or /sjmodules - the other directories are used libraries - includes are done using the `#include ` scheme which allows us to move files around and to "overwrite" files by include directories with a higher priority If you use the Silverjuke source code as a base of your projects, keep in mind that Silverjuke is released under the GPL and you have to open source your work as well. See the file LICENSE that comes together with the source code. Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com and contributors. silverjuke-16.2.3/autogen.sh000077500000000000000000000001451266006671500160000ustar00rootroot00000000000000#! /bin/sh aclocal --install -I m4 && automake --gnu --add-missing \ && autoconf && ./configure $@ silverjuke-16.2.3/config.guess000077500000000000000000001235501266006671500163250ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-03-23' # 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 3 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, 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # 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 # # Please send patches with a ChangeLog entry to config-patches@gnu.org. 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 1992-2014 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 case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # 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 tuples: *-*-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 ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_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'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; 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:*:[4567]) 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:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys 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-${LIBC}`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/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 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="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${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-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 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-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} 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-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 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 ;; x86_64:Haiku:*:*) echo x86_64-unknown-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 eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then 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 case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi 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 ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} 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 ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac 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: silverjuke-16.2.3/config.rpath000077500000000000000000000440121266006671500163100ustar00rootroot00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2010 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally 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. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no 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 if test "$with_gnu_ld" = yes; then # 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. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' 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 fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : 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 ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; 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 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 if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) 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 hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; 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. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) 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 ;; hpux10*) if test "$with_gnu_ld" = no; then 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 fi ;; hpux11*) 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_direct=yes # 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*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) 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 ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # 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 1992-2014 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-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | 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/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) 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*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | 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 \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | 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 \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-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-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | 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-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | 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-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | 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-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | 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 ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 | 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*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 ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-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 ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) 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 | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-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 ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; 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* | -plan9* \ | -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* \ | -bitrig* | -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* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -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* | -tirtos*) # 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 ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -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 ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; 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: silverjuke-16.2.3/configure.ac000066400000000000000000000046601266006671500162730ustar00rootroot00000000000000# Process this file with autoconf to produce a configure script. # # Copyright © 2015 Björn Petersen # Copyright © 2015 Dr. Tobias Quathamer # # This file is part of silverjuke. # # 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 3 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, see . # Set up autoconf AC_PREREQ([2.69]) AC_INIT([silverjuke], [16.2.3], [r10s@b44t.com]) AC_CONFIG_MACRO_DIR([m4]) # AC_CONFIG_SRCDIR just checks a single file to make sure, we're in the correct directory AC_CONFIG_SRCDIR([src/sjbase/mainapp.cpp]) # Set up automake AM_INIT_AUTOMAKE([1.13 foreign subdir-objects silent-rules no-dist-gzip dist-xz]) AM_MAINTAINER_MODE # Set up gettext AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.18]) #AC_DEFINE([GETTEXT_PACKAGE], ["silverjuke"], [Gettext package name.]) # Checks for programs AC_PROG_CXX AC_PROG_CC PKG_PROG_PKG_CONFIG # Detect rst2man, needed for building the manpage AC_PATH_PROG([RST2MAN], [rst2man], [no]) if test x"$RST2MAN" == x"no" ; then AC_MSG_ERROR([rst2man is required.]) fi # Detect the needed libraries PKG_CHECK_MODULES([ZLIB], [zlib]) PKG_CHECK_MODULES([SQLITE3], [sqlite3]) PKG_CHECK_MODULES([GST], [gstreamer-1.0 gstreamer-plugins-base-1.0]) PKG_CHECK_MODULES([GL], [gl]) # Check for endian.h to determine endianness for "src/see" library AC_CHECK_HEADERS([endian.h]) # wxWidgets -- we assume that if wx-config is found, wxWidgets is successfully installed. AC_PATH_PROG([WX_CONFIG], [wx-config], [no], [$PATH:/usr/local/bin]) if test x"$WX_CONFIG" = x"no" ; then AC_MSG_ERROR([wx-config not found. Is wxWidgets installed? Is wx-config in your path? Try eg. apt-get install libwxgtk3.0-dev]) fi WX_CPPFLAGS="`$WX_CONFIG --cppflags`" WX_CXXFLAGS="`$WX_CONFIG --cxxflags`" WX_LIBS="`$WX_CONFIG --libs std,gl`" AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_LIBS) # Write configuration files AC_CONFIG_FILES([ Makefile po/Makefile.in ]) # Terminate script AC_OUTPUT silverjuke-16.2.3/depcomp000077500000000000000000000560161266006671500153640ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 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 outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} 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" # Avoid interferences from the environment. gccflag= dashmflag= # 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 if test "$depmode" = msvc7msys; then # This is just like msvc7 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=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc 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 -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## 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). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - 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 -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # 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. ## 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. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -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 -ne 0; then 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 ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # 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 ;; 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. set_dir_from "$object" set_base_from "$object" 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 -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then 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. set_dir_from "$object" set_base_from "$object" 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 -ne 0; then 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_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. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool 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$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # 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 ;; #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|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | 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" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | 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::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$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: silverjuke-16.2.3/docs/000077500000000000000000000000001266006671500147275ustar00rootroot00000000000000silverjuke-16.2.3/docs/command-line.rst000066400000000000000000000104571266006671500200330ustar00rootroot00000000000000========== silverjuke ========== Play and organize your music ---------------------------- :Date: 2016-02-09 :Version: 16.2 :Manual section: 1 SYNOPSIS ======== **silverjuke** [*options*] [*FILES*] DESCRIPTION =========== This manual page documents briefly the **silverjuke** command. It can be used to play and organize your music collection. OPTIONS ======= This program follows the usual GNU command line syntax, with long options starting with two dashes ('**-**'). **silverjuke** supports the following options: --ini=FILE set the configuration file to use to FILE --jukebox=FILE set the jukebox file to use to FILE --temp=DIRECTORY set the temporary directory to use to DIRECTORY --play start playing the current file --pause pause the playback --toggle toggle play/pause --prev play previous file in list --next play next file in list --kiosk start Silverjuke in kiosk mode --minimize start Silverjuke minimized --open FILES open the given FILES, --open may be omitted --enqueue FILES enqueue the given FILES --help Show all available commands --addcredit=NUM Adds the number of credits (tracks that may be enqueued) to the credit system. This option only works if the option "Credits may be added by external programs" is enabled in the kiosk mode settings. --setcredit=NUM Sets the number of credits. This option only works if the option "Credits may be added by external programs" is enabled in the kiosk mode settings. --skiperrors With this option you can avoid showing errors about an erroneous termination on the last Silverjuke run. This is especially useful when turning off Silverjuke using the "Power off" button, as in this case the operating system may not give us the time we need to unload all modules completely. --instance=INI-FILE If you give a different INI-file to each instance, you can use multiple instances of Silverjuke with this option. All settings for each instance are stored in the INI-file, so the instances are completely independent; however, make sure, there are no conflicts regarding the used hardware. You can give the INI-files as complete paths; if the files do not exist, they are created as needed. If you want to use different music libraries for each instance, you have to use the --jukebox=FILE option as described above. --update This will automatically update the index as if you hit F5 just after starting Silverjuke. If you use this option in combination with --kiosk and the kiosk mode is running with limited functionality, the update process cannot be aborted. --kioskrect=DISPLAY|X,Y,W,H[,clipmouse] With this option you can force the Silverjuke window to the given rectangle when using the kiosk mode. This is useful if you want to show sth. beside the Silverjuke window (by default, the whole screen is used). Moreover, if you add the "clipmouse" modifier, the mouse cannot be moved outside the given rectangle. Instead of X,Y,W,H you can also give a simple DISPLAY number, the first display has the number 1. --visrect=DISPLAY|X,Y,W,H Assign a static portion of the screen to the visualization. Instead of X,Y,W,H you can also give a simple DISPLAY number, the first display has the number 1. --blackrect=DISPLAY|X,Y,W,H[;DISPLAY|X,Y,W,H;...] Areas to cover by black rectangles. Instead of X,Y,W,H you can also give a simple DISPLAY number, the first display has the number 1. --volup increase the main volume --voldown decrease the main volume --togglevis toggle the selected visualizations on and off --execute=SCRIPT_OR_FILE Execute the given script snippet or file. With this command line option you are able to execute any little script by the command line. For scripting details, please refer to the Silverjuke SDK. Instead of using the command line for this purpose, you can also use DDE, which, however, is a little bit more tricky. Although there is always only one instance of Silverjuke running, you may call Silverjuke with these commands which will then be forwarded to the running instance if possible. You can set the "db", "temp", "kiosk" and "minimize" options also manually to the current configuration file (ini file) in the section "main". Most commands are also available through TCP/IP communication. AUTHOR ====== Björn Petersen silverjuke-16.2.3/docs/csv-over-http.md000066400000000000000000000126161266006671500200000ustar00rootroot00000000000000CSV over HTTP ================================================================================ Silverjuke can read music libraries from HTTP-Servers, see select "Settings / Music library / Add source". This document describes how you can set up your own HTTP server with your music library to work with Silverjuke and compatible applications. The "music-lib-cfg.txt" File -------------------------------------------------------------------------------- Your server must provide a simple text file with the name `music-lib-cfg.txt` in the used root. Eg. if you use http://domain.com/dir as the server, Silverjuke searches for http://domain.com/dir/music-lib-cfg.txt Each line of the text file has the format `setting=value` and the value may not exceed one line. Spaces or tabs at the beginning or at the end of the setting name are ignored. Same for the value. Lines starting with a semicolon are ignored and may be used for comments. Semicolons inside a line do not introduce a comment. Possible settings -------------------------------------------------------------------------------- - `access-type=TYPE` - the type of the index, currently only CSV index are read and the only valid type is `csv-over-http` - if this setting is not provided, the server cannot be used. - `csv-file=PATH` - enter the path to the CSV index file here. Eg. if your index file is located at "http://www.myserver.com/music/index.csv" please enter music/index.csv - `csv-delim=CHARACTER` - The character used to separate fields from each other, defaults to the comma. - `csv-enclose=CHARACTER` - The character used to (optionally) enclose the field data, defaults to the upper double quote. - `csv-escape=CHARACTER` - The characted used to escape the enclosing character inside a field, also defaults to the upper double quote. - `csv-skip-first-row=0|1` - If the first line of the CSV index just defines the field names and should be ignored therefore, use csv-skip-first-row=1 - otherwise, use csv-skip-first-row=0 or leave this setting out. - `csv-columns=COLUMN_DEFINITIONS` - A comma separated list of the columns used in the CSV index. Eg. if your CSV index contains four columns with an ID and the artist/album/track names, you have to enter ,,, here. In common, you may use _any_ names and re-use them eg. for the music-files setting as described below - however, some names are recognized as known fields and will be added to the database: <Nr> <DiskNr> <Title> <Artist> <OrgArtist> <Composer> <Album> <Album(DiskNr)> (the album name optionally followed by a disk number) <Year> <Comment> <Genre> <Group> <Seconds> <Milliseconds> - `img-files=PATH_WITH_PLACEHOLDERS` - The path to an image that may be used as a cover, the path may contain placeholders that refer to the current record. - `music-files=PATH_WITH_PLACEHOLDERS` - same as the image path but for the music file. Automatic creation of the files -------------------------------------------------------------------------------- It may be an good idea to create some server scripts that create the CSV-files so that you need not to do this by hand. JavaScript, Perl or PHP may help with this purpose, however, we won't go into details about this here. Use a local configuration file -------------------------------------------------------------------------------- If you have a server with music files that fits the needs of CSV-over-HTTP, but you cannot add a configuration file there, you can put it into one of your local search paths as `SERVERNAME.txt` with SERVERNAME as the name of the server with all characters beside a-z and 0-9 replaced by a minus, eg. `domain-com.txt`. Example -------------------------------------------------------------------------------- Assume, you use the server `http://domain.com/dir` which provides the file `http://domain.com/dir/music-lib-cfg.txt` as follows: access-type = csv-over-http csv-file = index.csv csv-skip-first-row= 1 csv-columns = <TrackId>,<Artist>,<Album>,<Title>,<Year> img-files = myCovers/<AnyId>-foo.jpg music-files = myMusic/<File> The example references `http://domain.com/dir/index.csv` which may look as: AnyId, Artist, Album, Title, File 100, Artist A, Album A, Someting, sth.mp3 22, Artist A, Album A, Just, just.ogg 333, Band B, Best Of, w.h.a.t, what.wav 421, Band B, Best Of, FR, fr.ogg 5001, Band B, Best Of, fin, fin.mp3 Finally, the server must provide the following files: http://domain.com/dir/myCovers/100-foo.jpg http://domain.com/dir/myCovers/22-foo.jpg http://domain.com/dir/myCovers/333-foo.jpg http://domain.com/dir/myCovers/421-foo.jpg http://domain.com/dir/myCovers/5001-foo.jpg http://domain.com/dir/myMusic/sth.mp3 http://domain.com/dir/myMusic/just.ogg http://domain.com/dir/myMusic/what.wav http://domain.com/dir/myMusic/fr.ogg http://domain.com/dir/myMusic/fin.mp3 That's all. As you see, the folder structure and the naming conventions are not defined by Silverjuke and completely editable. For further examples, please have a loot at the repository "Silverjuke SDK Examples" at https://github.com/r10s/silverjuke-sdk-examples Copyright (c) Björn Petersen Software Design and Development and contributors ������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/docs/dde.md�����������������������������������������������������������������������0000664�0000000�0000000�00000003564�12660066715�0016015�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������DDE and TCP/IP data exchange ================================================================================ Using the host "localhost" and the service "silverjuke", you can also control Silverjuke by DDE on Windows or TCP/IP on Linux. The supported _topics_ are simelar the the command line options: - open - clear the playlist and open the files given as _data_; playback is started using the first given file - enqueue - enqueue the files given as _data_; the currently playing track stays unchanged and existing files are not removed from the queue - play - same as pressing the "play" button - pause - same as pressing the "pause" button - toggle - toggle play/pause - prev - play the previous track, if any - next - play the next track, if any - kiosk - start kiosk mode - raise - bring the Silverjuke main window to the top of all windows. Please also note the command line options which are easier to use in some cases. - volup - Increase the main volume - voldown - Decrease the main volume - togglevis - Toggle the selected visualizations on and off - execute - Execute the script snippet given in _data_. Instead of giving the script directly, you can also write the script to a file and give the filename as _data_. With this DDE command you are able to execute any little script by the command line. For scripting details, please refer to the file docs/scripting. Silverjuke also supports a basic credit system that may be controlled with the following additional DDE commands: - addcredit - adds the numer of credits (tracks that may be enqueued) given in _data_ to the credit system - setcredit - sets the number of available credits to the number given in _data_ These options only work if "Credits may be added by external programs" is enabled in the kiosk mode options. Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com ��������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/docs/localization.md��������������������������������������������������������������0000664�0000000�0000000�00000007057�12660066715�0017752�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Localization ================================================================================ Silverjuke uses the "gettext" system for localisation of the strings appearing in the user interface. This means, you can use all common tools to edit the files belonging to a localization project. However, for people who do not know "gettext", here's a brief overview: **A brief overview** "gettext" uses two file types: So called "Portable Objects" with the extension *.po and so called "Machine objects" with the extension *.mo -- the first file type will be edited during the translation process, and the latter is then created from it. Only *.mo files are usable from within Silverjuke. So the steps at a glance are: Download a *.po object (eg. from Github), edit it and then create a *.mo file which may then be used by Silverjuke. The edited *.po file may be shared with other users by uploading eg. to Github. **What's needed** To edit *.po files, you only need a text-editor. However, we won't describe the syntax of *.po files here. An easier way is to use a special program for this purpose: poEdit is a good choice. So first of all download and install poEdit from the following site: http://www.poedit.net You may decide to use another editor, however, the following steps are described using poEdit. **Let's start!** To start a localisation, please use one of the existing "Portable Object" (*.po) files. Eg. the file "de.po" contains the english strings as sources and German strings as the current translation (which will be replaced by your translation). After the download, rename the file to the two-letter ISO 639.1 (see http://www.loc.gov/standards/iso639-2/englangn.html ) abbreviation of the language to create, use eg. "fr.po" for "French" or "es.po" for "Spanish". Then, just open the file in poEdit and define the new language and the new country using "Catalog/Settings/Project info", you can also add your e-mail address there. Moreover, make sure, the "Machine objects" (*.mo) files are written automatically, see "File/Preferences/Editor/Automatically compile .mo files on save". Now you can begin with the translation: poEdit shows the original strings aleft and the translated strings (still German) aright. For a first try, change some strings and save your project. Then make sure, the *.mo file is at the right place and start Silverjuke. In Silverjuke you may need to switch to the new language by entering the canonical name to "Advanved Settings/Languages" If all this works, you can translate all other strings. **Placeholders and special strings** Many strings contain placeholders as "%s" or "%i" which will be replaced by other strings by Silverjuke. You have to leave all placeholders _in the same order_ in your translation. Also, if possible, leave other special characters as trailing columns (":"), included pipes ("|"), three points ("...") or surrounding brackets. The meaning of most placeholders and special characters is explained in the comment window in poEdit (make sure "View/Show comment window" is enabled). Some strings are not really translatable strings but settings for the locale. The original strings of these strings begin and end with two underscores, eg. "__DATE_SUNDAY_FIRST__". Again, the meaning and the possible values are explained in the comment window inside poEdit. **Publishing your work** We would be very happy if you publish your work eg. on Github by a "Pull Request". The language changes will come along with the next version of Silverjuke then. Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/docs/plugins.md�������������������������������������������������������������������0000664�0000000�0000000�00000032540�12660066715�0016736�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Plugins ================================================================================ **Contents** - Overview - Initialization - Receiving Notifications from Silverjuke - SJ_PLUGIN_INIT - SJ_PLUGIN_EXIT - SJ_PLUGIN_CALL - Sending Commands to Silverjuke - SJ_GET_VERSION - SJ_EXECUTE - Miscellaneous - Threads - Used Types - Strings in Plugins Overview ================================================================================ The following chapters describes how to write plugins for Silverjuke using the Silverjuke API. A plugin is a compiled .so, .dll- or .dylib-file that is loaded together with Silverjuke. Plugins can be written in nearly any language that can create eg. DLLs. With a Silverjuke plugin you can do everything you can do with Scripting plus you have full system access and your programs may run much faster. Eg. you can do the following: - Access the Silverjuke credit system - eg. you can write a plugin for a special coin tester hardware - Access the player - eg. you can write a plugin for remote controlling Silverjuke - Access the playlist - eg. you can write a plugin that displays some information on an external LCD display - And much more we cannot imagine at the moment ;-) To allow a wide audience to use the Silverjuke API, the interface is an C interface that does not use any advanced language features. The interface is also usable directly in C++, C# and Objective-C. For other languages, you might need a small wrapper. To get started, please have a look at the chapter Initialization or at the examples available. Initialization ================================================================================ A Silverjuke plugin is a simple DLL (or "dynlib" or "so", for easier reading, we simply use DLL in this manual) that exports the symbol SjGetInterface. SjGetInterface is a function that should be declared as follows: SjInterface* SjGetInterface(void); If you use Visual C++, you can export symbols eg. by adding a *.def file to your project that contains the following: LIBRARY "hello_world.dll" EXPORTS SjGetInterface If such a DLL is placed in one of Silverjuke's search paths, Silverjuke loads the DLL and calls the SjGetInterface function which should eturn a SjInterface structure then: struct SjInterface { SJPROC* CallPlugin; SJPROC* CallMaster; SJPARAM rsvd; SJPARAM user; }; The structure must exist all the time the plugin is loaded and will be a global or a static object normally. SjInterface is used for communication between Silverjuke and the Plugin - if you want to call Silverjuke, use the CallMaster() function and if Silverjuke wants to notify the plugin, Silverjuke calls CallPlugin(). So, before you return the structure, you have to set the CallPlugin() member to a function that will receive notifications from Silverjuke, moreover, you can use the "user" member for any internal purposes. The CallMaster() member will be set up by Silverjuke and "rsvd" should not be touched by the plugin. BTW: all structures and prototypes are declared in "sj_api.h". A working example: #include <sj_api.h> SjInterface interf; SJPARAM SJCALLBACK MyPluginHandler(SjInterface* interf, SJPARAM msg, SJPARAM param1, SJPARAM param2, SJPARAM param3) { if( msg == SJ_PLUGIN_INIT ) { interf->CallMaster(interf, SJ_EXECUTE, (SJPARAM)"m = 'A first test';" "i = 'Hello world!';" "program.addMenuEntry(m, function(){program.alert(i)})", 0, 0); return 1; // success } return 0; } SjInterface* SjGetInterface() { interf.CallPlugin = MyPluginHandler; return &interf; } After you restart Silverjuke, the plugin should be availab in the context menu at "Modules" and in the settings dialog at "Advanced / Further options". As you can see, the example let Silverjuke executes some code snippets. In fact, most of the API calls are just wrappers for the scripting engine. This allows us to keep the interface small and simple and you can write parts of the plugin much faster using the often easier Scripting API. If all this works, you can start implementing your plugin's functionality; for this purpose, please have a look at the chapters "Receiving Notifications from Silverjuke" and "Sending Commands to Silverjuke". Receiving Notifications from Silverjuke -------------------------------------------------------------------------------- If something happens that Silverjuke wants to tell a plugin, Silverjuke calls the CallPlugin() function of the SjInterface structure. This function is normally implemented as follows: SJPARAM SJCALLBACK MyPluginHandler(SjInterface* interf, SJPARAM msg, SJPARAM param1, SJPARAM param2, SJPARAM param3) { switch( msg ) { case SJ_PLUGIN_INIT: // ... return 1; case SJ_PLUGIN_EXIT: // ... return 1; case SJ_PLUGIN_CALL: // ... return 1; // catch other notifications of interest here } return 0; } The function has five parameters: "interf" is the same object as returned by the plugin from SjGetInterface and "msg" is one of the SJ_PLUGIN_* constants as defined below. The meaning of "param1", "param2" and "param3" depends on the notification. If not stated otherwise in the following descriptions, you should return "1" if you have processed a notification and "0" otherwise. "0" should also be returned for all unknown notifications - this will allow your plugin to be compatible with future enhancements. If Silverjuke sents strings together with the notifications, they're valid only until the notification is processed (until you return from the CallPlugin() function). SJ_PLUGIN_INIT -------------------------------------------------------------------------------- bSuccess = CallPlugin(interf, SJ_PLUGIN_INIT, 0, 0, 0); SJ_PLUGIN_INIT is sent to the plugin directly after the plugin has called SjGetInterface(). Please return 1 on success or 0 on failure, in the latter case Silverjuke will unload the DLL without calling SJ_PLUGIN_EXIT before. Example: void* neededMemory; SJPARAM SJCALLBACK MyPluginHandler(SjInterface* interf, SJPARAM msg, SJPARAM param1, SJPARAM param2, SJPARAM param3) { switch( msg ) { case SJ_PLUGIN_INIT: neededMemory = malloc(10000); if( neededMemory == 0 ) return 0; // error - SJ_PLUGIN_EXIT won't be called return 1; // success case SJ_PLUGIN_EXIT: free(neededMemory); return 1; } return 0; } SJ_PLUGIN_EXIT -------------------------------------------------------------------------------- CallPlugin(interf, SJ_PLUGIN_EXIT, 0, 0, 0); SJ_PLUGIN_EXIT is sent to the plugin just before it gets unloaded, this is the last message sent to the plugin; not called if SJ_PLUGIN_INIT failed before. See SJ_PLUGIN_INIT for an example. SJ_PLUGIN_CALL -------------------------------------------------------------------------------- CallPlugin(interf, SJ_PLUGIN_CALL, param1, param2, param3); You will receive this notification if you call program.callPlugin() from within a script. The param1 param2 and param3 parameters are exactly forwarded from Program.callPlugin() and may be used for any purpose, depending on what is given to Program.callPlugin(). Independingly of what types are given to program.callPlugin(), all parameters are UTF-8 encoded strings from the view of SJ_PLUGIN_CALL (if less than three parameters are given to Program.callPlugin(), the strings are empty). It is very common to use param1 as the "reason for call", however, this is not neccessary. You can return the long values 0 or 1 directly from this message. For all other values or for strings, please return an UTF-8 encoded string. Example: SJPARAM SJCALLBACK MyPluginHandler(SjInterface* interf, SJPARAM msg, SJPARAM param1, SJPARAM param2, SJPARAM param3) { switch( msg ) { case SJ_PLUGIN_CALL: return (SJPARAM)"test"; } return 0; } In the scripting part, you can receive the string as follows var resultFromNativePart; resultFromNativePart = program.callPlugin(); // resultFromNativePart contains "test" now See also: SJ_EXECUTE, Scripting, Program.callPlugin() Sending Commands to Silverjuke -------------------------------------------------------------------------------- Call CallMaster() to send messages to Silverjuke. If not stated otherwise, the return value all parameters are 0. If Silverjuke returns a string as a result of a command, this string is only valid until you call CallMaster() the next time. SJ_GET_VERSION -------------------------------------------------------------------------------- lVersion = CallMaster(interf, SJ_GET_VERSION, 0, 0, 0); Returns the Silverjuke version as 0xjjnnrr00 with jj=major, nn=minor and rr=revision. The single components are encoded as hexadecimal values. Eg. for Silverjuke 15.10.3, the function returns 0x0F0A0300. This message is thread-save and can be called everywhere. Example: if( interf->CallMaster(interf, SJ_GET_VERSION, 0, 0, 0) >= 0x02000000 ) { // version is fine ... } See also: Program.version SJ_EXECUTE -------------------------------------------------------------------------------- result = CallMaster(interf, SJ_EXECUTE, szScript, bReturnString, 0); This is the most powerful function in this API - it executes any script as defined in the chapters Scripting and returns the result. The script should be given as an UTF-8 string encoded in szScript. The function returns the result as a long value (set bReturnString to 0) or as an UTF-8 encoded string (set bReturnString to 1). If a string is returned, the string is valid as long as no other API function is called. Example: interf->CallMaster(interf, SJ_EXECUTE, (SJPARAM)"player.play();", 0, 0); You can also callback yourself from within a script: SJPARAM SJCALLBACK MyPluginHandler(SjInterface* interf, SJPARAM msg, SJPARAM param1, SJPARAM param2, SJPARAM param3) { switch( msg ) { case SJ_PLUGIN_INIT: // ... return 1; case SJ_PLUGIN_CALL: if( strcmp((char*)param1, "MyID") == 0 ) { // param2 is the current playing time now! } return 1; } return 0; } void sendPlayingTime() { interf.CallMaster(&interf, SJ_EXECUTE, (SJPARAM)"program.callPlugin('MyID', player.time)", 0, 0); } The example above is only there to demonstrate the possibilities; of course you can find out the playing time easier with the following statement: long time = interf.CallMaster(&interf, SJ_EXECUTE, (SJPARAM)"player.time", 0, 0); See also: SJ_PLUGIN_CALL, Scripting, Program.callPlugin() Miscellaneous ================================================================================ In this chapter you find some topics that do not fit well to other chapters. Threads -------------------------------------------------------------------------------- Silverjuke uses different threads internally and your plugin can also used more than one thread. However, when using threads, please note the following: - The CallPlugin() function is always called in the main thread - You should also call CallMaster() only from the main thread There may be a very few exceptions from these rules, this is stated explicitly in the descriptions of the messages and notifications then. Used Types -------------------------------------------------------------------------------- The types SJPARAM, SJCALLBACK and SJPROC are defined in sj_api.h depending on the operating system in use. - SJPARAM is defined as a signed integer that is always large enough to contain a pointers. Moreover, in practise, you can expect this type to have at least 32 bit. - SJCALLBACK defines the calling conventios of the CallMaster and CallPlugin functions. - SJPROC is used by the SjInterface structure and defined a callback type used for the communication between Silverjuke to/from plugin. See also: Strings (see "Strings in Plugins"), sj_api.h Strings in Plugins -------------------------------------------------------------------------------- SJPARAM is also used to return strings or to use strings as parameters. In this case, please cast eg. your char* to SJPARAM or the other way round. The string encoding is always UTF-8. Example: // Give a string to Silverjuke char string1[256] = "player.play()"; interf->CallMaster(interf, SJ_EXECUTE, (SJPARAM)string1, 0, 0); // Get a string from Silverjuke char string2[256] = "program.locale"; char string3[256]; strcpy(string3, (char*)interf->CallMaster(interf, SJ_EXECUTE, (SJPARAM)string2, 1 /*return string*/, 0)); To make the things more clear, we use "plain C strings" for the example, however, you can easily use eg. CString objects instead (which are also more secure). Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com ����������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/docs/scripting.md�����������������������������������������������������������������0000664�0000000�0000000�00000345444�12660066715�0017271�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Scripting in Silverjuke ================================================================================ **Contents** - Overview - Scripting Syntax - Object Reference - Program Object - Program.version - Program.os - Program.locale - Program.layout - Program.viewMode - Program.listMode - Program.zoom - Program.search - Program.musicSel - Program.memory - Program.hwnd - Program.onLoad - Program.onUnload - Program.loaded - Program.lastUserInput - Program.onKiosk - Program.kioskMode - Program.sleepMode - Program.visMode - Program.autoPlay - Program.addMenuEntry() - Program.addConfigButton() - Program.setTimeout() - Program.setDisplayMsg() - Program.setSkinText() - Program.refreshWindows() - Program.selectAll() - Program.getSelection() - Program.getMusicSels() - Program.run() - Program.launchBrowser() - Program.iniRead() - Program.iniWrite() - Program.exportFunction() - Program.callExported() - Program.callPlugin() - Program.gc() - Program.shutdown() - Player Object - Player.time - Player.duration - Player.volume - Player.onTrackChange - Player.onPlaybackDone - Player.play() - Player.pause() - Player.stop() - Player.stopAfterThisTrack - Player.stopAfterEachTrack - Player.isPlaying() etc. - Player.prev() - Player.next() - Player.hasPrev() - Player.hasNext() - Player.queueLength - Player.queuePos - Player.getUrlAtPos() etc. - Player.addAtPos() - Player.removeAtPos() - Player.removeAll() - Player.repeat - Player.shuffle - Player.removePlayed - Player.avoidBoredom - Rights Object - Rights.all - Rights.credits - Rights.useCredits - Rights.play - Rights.pause - Rights.stop - Rights.editQueue - Rights.unqueue - Rights.multiEnqueue - Rights.repeat - Rights.search - Rights.startVis - Rights.volume - Rights.viewMode() - Rights.zoom - Dialog Object - Dialog Constructor - Dialog.addCtrl() - Dialog.getValue() - Dialog.setValue() - Dialog.show() - Dialog.showModal() - Dialog.close() - Database Object - Database Constructor - Database.openQuery() - Database.nextRecord() - Database.getFieldCount() - Database.getField() - Database.closeQuery() - Database.getFile() - Static Database Functions - File Object - File Constructor - File.length - File.pos - File.read() - File.write() - File.flush() - Static File Functions - HttpRequest Object - HttpRequest Constructor - HttpRequest.responseText - HttpRequest.status - HttpRequest.request() - HttpRequest.setRequestHeader() - HttpRequest.getResponseHeader() - HttpRequest.abort() - Math Object - Math Constants - Math.sin() etc. - Math.abs() - Math.ceil() - Math.exp() - Math.floor() - Math.log() - Math.max(), Math.min() - Math.pow() - Math.random() - Math.round() - Math.sqrt() - Date Object - Date Constructor - Date.parse() - Date.UTC() - Date.get() - Date.set() - Date.toString() - Date.toLocaleString() - Date.toUTCString() - Array Object - Array Constructor - Array.length - Array.pop() - Array.push() - Array.reverse() - Array.shift() - Array.sort() - Array.splice() - Array.unshift() - Array.concat() - Array.join() - Array.slice() - String Object - String Constructor - String.length - String.fromCharCode() - String.charAt() - String.charCodeAt() - String.concat() - String.indexOf() - String.lastIndexOf() - String.match() - String.replace() - String.search() - String.slice() - String.split() - String.substr() - String.substring() - String.toLowerCase() - String.toUpperCase() - RegExp Object - RegExp Constructor - RegExp.exec() - RegExp.test() - Globals - eval() - parseInt() - parseFloat() - isNaN() - isFinite() - decodeURI() - decodeURIComponent() - encodeURI() - encodeURIComponent() - print() - logError() - logWarning() - alert() - confirm() - prompt() - fileSel() - Further Topics Overview ================================================================================ If Silverjuke was compiled with scripting functionality, things can be controlled using scrips, simple lines of code, placed eg. in a text file or in attributes attributes of skins. These chapters describe how to write scripts for Silverjuke. **Where scripting can be used** - As mentioned, you can use scripts when creating your skins (see "How to create Skins for Silverjuke"). - You can create independent scripts that are executed when Silverjuke is loaded; these scripts must be placed in one of the search path with the extension .js - You can use scripts even when writing plugins (see "Plugins") for Silverjuke using eg. C or C++. **Scripting commands and Targets** In contrast to targets in skins (see "Targets"), commands are executed independingly of the functionality allowed by the user. Example: <button onclick="pause();" /> <!-- will always pause the player --> <button target="pause" /> <!-- will pause the player only if allowed in Silverjuke's kiosk mode options --> However, if required, you can check the allowed functionality before defining eg. a button; please us the if-tag or the Rights Object for this purpose. **Read on ...** For some examples, please have a look at the files coming together with Skilverjuke. The following chapters will describe the required syntax and the objects, methods, properties and functions that can be used in your scripts. Scripting Syntax ================================================================================ This chapter will give you an overview about the syntax used in Silverjuke scripts. If you are already familiar with this, the next chapters describe the objects and methods (see "Object Reference") specific to Silverjuke. **Overview** The syntax for Silverjuke scripts follow the rules defined by ECMAScript, 3rd edition http://www.ecma-international.org/publications/standards/Ecma-262.htm . The syntax is very close to JavaScript, C/C++ and to other well-known languages. If you have ever written a little program or a script in another language, you should have no problems with Silverjuke scripts. **Variables** Variables have no type attached, and any value can be stored in any variable. - Variables can be declared with a var statement. If this is done, these variables are local to the scope the variable is declared. - Variables declared outside any function, and variables not declared with var, are global and can be used by the entire script. - Variable names (as well as functions and reserved words) are case sensitive. a = 1; // declare a global variable function var_test() { var b = 2; // this is a variable local to var_test() c = 'str'; // this also declares a global variable } var_test(); // call var_test() print(a); // will print 1 print(b); // b is undefined as local to var_test() print(c); // will print 'str' **Basic Data Types** Basic data types are boolean, numbers, strings, arrays and objects. Conversion between these types is done as needed. - Booleans are values which represent one of the states true or false. Each other data type may be converted to a boolean; this is needed if they are used eg. as expressions in control structures. - Numbers are represented as floating point values. Basic calculations can be done directly using eg. the +, -, *, /, %, ++, -, &, |, ^, << or >> operators, for some advanced calculations, please have a look at the Math Object. - Strings are a sequence of characters and can be created directly by placing the series of characters between double or single quotes. Individual characters within a string can be accessed through the [] operator; to append two strings together, use the + operator. For some advanced operations, please have a look at the String Object. - Arrays are maps from integer numbers to other basic data types. Individual values within an array can be accessed through the [] operator. For some advanced operations, please have a look at the Array Object (see "Array Object"). - Objects are values with some attached named properties and are usually created using the new operator; some of the named properties may be functions (callable properties). To access properties of an object, use the . operator a = true; // create a boolean b = 12.2; // assign a number to b c = 'test string'; // assign a string to c d = "another string"; // assign a string to d e = [0,1,2]; // create an array with three elements f = new Array(0,1,2); // same using the new operator g = new Object; // create a new (empty) object g.prop = 23; // assign a property to the object h = new Date; // create an object of a predefined class h.getDay() // call a method (a callable property) of the object There is no need to worry about deleting variables - this is done automatically by Silverjuke's garbage collection. **Control Structures** You can use the control structures if, switch, for, while and do..while. if ( expr ) { statements; } else { statements; } If-expression: The curly braces are needed only if you use more than one statment. In general, they are recommended in most cases. The else part is optional. switch ( expr ) { case 1: statements; break; case 2: statements; break; default: statements; break; } Switch-expression: The curly braces are required, break is optional but recommended in most cases - if left out, execution will continue to the body of the next case block. The default part is optional. for ( initial-expr; cond-expr; expr evaluated after each loop ) { statements to execute each loop; } For-expression: Every expression part can be left out if unneeded. The curly braces are needed only if you use more than one statment. In general, they are recommended in most cases. while ( cond-expr ) { statements; } While-expression: The curly braces are needed only if you use more than one statment. In general, they are recommended in most cases. do { statements; } while ( cond-expr ); While-expression: The curly braces are needed only if you use more than one statment. In general, they are recommended in most cases. In contrast to while(..){..}, the do{..}while(..) loop is always executed at least one time. Examples: if( program.kioskMode ) { // we're in kiosk mode, do what to do } else { // we're not in kiosk mode, do what to do } switch( program.viewMode ) { case 0: // we're in album mode, do what to do break; case 1: // we're in cover mode, do what to do break; default: // handle other modes here break; } **Functions** A function is a block with a (possibly empty) argument list and an optional name. A function may give back a return value. // declare the function function my_func_text( a ) { print( a ); // call the predefined function print() } // call the function my_func_test( 'Hello!' ); // functions may also be used as properties for objects: program.launchBrowser( 'http://...' ); // you can also give "anonymous" (unnamed) functions directly as arguments: program.addMenuEntry( 'bla', function(){alert('Unamed function')} ); Are arguments given by value or by reference? This is quite easy to answer: - Booleans, Numbers and Strings are given by value - you get a copy of the value, if you change the value, the changes are not visible to the caller. - All other types are given by reference for performance reasons - if you change eg. an object given as an argument, these changes are visible to the caller. **Error Handling** If any error occur while your script is executed, an error object is thrown. You may catch these errors using a try..catch block: try { // do what to do here } catch(err) { // if any error occurs in the try block above, we go here. } // here we go if no erros occur If any error is thrown outside a try..catch block, the script is terminated immediately; in this case - and eg. for syntax errors - Silverjuke logs and error to the console window. BTW: You can also easily test a function, a macro or a little script by just entering it to the text file and click on "Evaluate". Now, as you have an idea about the syntax, you may want to have a look at the next chapters which describe the objects and methods (see "Object Reference") specific for Silverjue. Object Reference ================================================================================ The following chapters describe the objects and methods available for your scripts or macros. If not stated otherwise, the functions do not return a value nor expect any arguments. For a brief overview about the syntax, see the previous chapter, "Scripting Syntax". Program Object ================================================================================ The Program object gives you access to the Silverjuke program itself, it has one predefined instance, program (written lower case). Program.version -------------------------------------------------------------------------------- value = program.version; Read only property. Contains the Silverjuke version as 0xjjnn00rr with: - jj as the major version - nn ans the minor version - rr as the revision The single components are hexadecimal values. Eg. for Version 15.10.3, the function returns 0x0F0A0300. See also: SJ_GET_VERSION Program.os -------------------------------------------------------------------------------- value = program.os; Read only property. Contains one of the following strings representing the underlying operating system: - gtk - Silverjuke and the scripts run unter GTK, normally Linux - win - Silverjuke and the scripts runs under Microsoft Windows or compatible software. - mac - Silverjuke and the scripts runs under Mac OS X or compatible software. Example: if( program.os == 'gtk' ) { print("we're running under Linux"); } if( program.os == 'win' ) { print("we're running under Windows"); } else if( program.os == 'mac' ) { print("we're running under OS X"); } else { print("we're running under an unknown OS?!"); } Program.locale -------------------------------------------------------------------------------- value = program.locale; Read only property. Contains a string with the language and the country as a two- or five-letter string in xx or xx_YY format: - xx - the ISO-639 code, of the language, see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes - YY is the ISO-3166 code of the country, see http://en.wikipedia.org/wiki/ISO_3166-1 Examples are "en", "en_GB", "en_US" or "fr_FR". If in doubt, please write all messages given to the user in english. Program.layout -------------------------------------------------------------------------------- value = program.layout; Read/write property. Contains the name of the currently selected layout. The layout names must be defined in the skins using the layout-tag. Example: name = program.layout; // find out the current layout program.layout = "Small"; // switch to another layout Program.viewMode -------------------------------------------------------------------------------- value = program.viewMode; Read/write property. Contains the current view mode (0=album view, 1=cover view, 2=list view). Example: program.viewMode++; // switch to the next view mode program.viewMode = 0; // set view mode to "album view" See also: Rights.viewMode(), Program.zoom Program.listMode -------------------------------------------------------------------------------- value = program.listModeOrder; values = program.listModeColumns; Read/write properties to access the columns in the list view mode (see "Program.viewMode"). - program.listModeOrder contains the column that is used for sorting. The column is defined by one of the column IDs below. Negative column IDs indicate descending ordering, positive column IDs are used for ascending ordering. - program.listModeColumns is an array (see "Array Object") that contains the column IDs currently displayed. Each item in the array represents one column, the array index specified the order of the columns (0 is the first, most left column). For the column IDs, please refer to the following list: - 1 - URL or file - 2 - track name - 4 - track number - 8 - track count - 16 - disk number - 31 - time added - 32 - disk count - 47 - time modified - 63 - time last played - 64 - lead artist name - 79 - times played - 95 - size - 111 - bitrate - 127 - samplerate (frequency) - 128 - original artist name - 143 - channels - 159 - gain - 175 - type - 191 - current queue position - 256 - composer name - 512 - alum name - 1024 - genre name - 2048 - group name - 4096 - comment - 8192 - beats per minute (bpm) - 16384 - rating - 32768 - year - 65536 - duration Example: // set list mode to "artist - album - track name" // ordered by artist program.listModeColumns = [128,512,2]; program.listModeOrder = 128; // switch to list mode (if not yet done) if( program.viewMode != 2 ) program.viewMode = 2; // toggle ordering program.listModeOrder *= -1; See also: Program.viewMode Program.zoom -------------------------------------------------------------------------------- value = program.zoom; Read/write property that contains the current zoom of the current view. The zoom is defined by a value between 0 and 6 (0=very small, 3=default, 6=very large view). Example: var cur = program.zoom; // find out the current zoom program.zoom = 2; // set another zoom program.zoom++; // zoom in program.zoom--; // zoom out See also: Rights.zoom, Program.viewMode Program.search -------------------------------------------------------------------------------- words = program.search; This property contains the words of the current "simple search". If there is no search at the moment, the property is undefined. You can change the search words by just assinging a string to this property. Note that this property may not work if Silverjuke is not yet loaded completely (see "Program.loaded"). Example: var cur = program.search; // find out the current search program.search = "beatles"; // set another search See also: Program.musicSel Program.musicSel -------------------------------------------------------------------------------- name = program.musicSel; This property contains the name of the currently selected music selection or undefined. You can change the current music selection by assinging one of the existing music seletions to this property. Note that this property may not work if Silverjuke is not yet loaded completely (see "Program.loaded"). Example: var cur = program.musicSel; // find out the current music seletion program.musicSel = "70's music"; // set another music selection See also: Program.getMusicSels(), Prorgram.search Program.memory -------------------------------------------------------------------------------- value = program.memory; value = program.memoryPeak; Read only property. Contains the number of bytes used currently by all scripts together. There is also a property program.memoryPeak which contains the "all time peak". Example: currentlyUsedBytes = program.memory; maxUsedBytes = program.memoryPeak; See also: Program.gc() Program.hwnd -------------------------------------------------------------------------------- value = program.hwnd; Read only property that contains the "system handle" of Silverjuke's main window - this is eg. a "HWND" if Silverjuke runs under Microsoft windows. Program.onLoad -------------------------------------------------------------------------------- program.onLoad = function; This function is triggered after Silverjuke is loaded completely. If Silverjuke is already loaded completely, the function is triggered immediately. Example: function silverjukeLoaded() { // Silverjuke is loaded now, do what to do here. } program.onLoad = silverjukeLoaded; See also: Program.loaded, Program.onUnload, Program.onKiosk Program.onUnload -------------------------------------------------------------------------------- program.onUnload = function; This function is triggered before Silverjuke is terminated. Example: function silverjukeExit() { // Silverjuke is about to quit now - do what to do here. } program.onUnload = silverjukeExit; To remove the callback function, just assign "undefined" to the property. See also: Program.onLoad Program.loaded -------------------------------------------------------------------------------- state = program.loaded; Read only property that contains true if Silverjuke is loaded completely, else false. See also: Program.onLoad Program.lastUserInput -------------------------------------------------------------------------------- ms = program.lastUserInput; Property that contains the number of milliseconds expired since the last user input. This can be used eg. from within a timer to determinate if Silverjuke is not used by the user for some time. Please note, that not all possible actions result in an update of this property. However, you can assume this property to be compatible with the Silverjuke built-in options at "Automatic control" (eg. "Go to current track after .. minutes of inactivity"). See also: Program.setTimeout() Program.onKiosk -------------------------------------------------------------------------------- program.onKioskStarting = function; program.onKioskStarted = function; program.onKioskEnding = function; program.onKioskEnded = function; If you want to be informed on any changes affecting the kiosk mode, please set one or more of these properties to a callback function. - onKioskStarting is called just before the kiosk mode is started; Program.kioskMode will still return false when you receive this notification. - onKioskStarted is called just after the kiosk mode is started; Program.kioskMode will already return true when you receive this notification. - onKioskEnding is called just before the kiosk mode is ended; Program.kioskMode will still return true when you receive this notification. - onKioskEnded is called just after the kiosk mode is ended; Program.kioskMode will already return false when you receive this notification. To remove a callback function, just assign "undefined" to the properties. See also: Player.onTrackChange, Program.onLoad Program.kioskMode -------------------------------------------------------------------------------- state = program.kioskMode; Read/write property that is set to true if Silverjuke is currently running the kiosk mode, else this property is set to false. See also: Program.onKiosk, Program.shutdown() Program.sleepMode -------------------------------------------------------------------------------- enabled = program.sleepMode; minutes = program.sleepMinutes; Read/write propterties to access the most important sleep mode settings. - sleepMode contains the value true if the sleep mode is enabled, false otherwise. - sleepMinutes are to the number of minutes to wait before the "sleep action" is started. If the user has defined a static time instead of a number or minutes, this value is undefined and cannot be changed by the script. Example: // enable the sleep mode to wait for 60 minutes; // we do this only if the number of minutes are changeable, // see the comments above if( typeof program.sleepMinutes != 'undefined' ) { program.sleepMode = true; program.sleepMinutes = 60; } See also: Program.setTimeout() Program.visMode -------------------------------------------------------------------------------- enabled = program.visMode; Read/write propterty to start/stop the selected visualization or to find out if it is running. Example: // start the visualization program.visMode = true; // stop the visualization program.visMode = false; // toggle the visualization on/off program.visMode = !program.visMode; // check if the visualization is running if( program.visMode ) { // yes, the vis. is running, do what to do here } See also: Rights.startVis Program.autoPlay -------------------------------------------------------------------------------- enabled = program.autoPlay; Read/write propterty to access the AutoPlay state. The state is simply true or false for "AutoPlay enabled" or "AutoPlay disabled". Example: enabled = program.autoPlay; // get AutoPlay state program.autoPlay = enabled; // set AutoPlay state To add a "Toggle AutoPlay" button to a skin: <button ... onclick="program.autoPlay=!program.autoPlay;" /> With the following little script, you can also add a shortcut to access the toggle function ... function toggleAutoPlayCallback() { program.autoPlay=!program.autoPlay; } program.addMenuEntry('Toggle AutoPlay', toggleAutoPlayCallback); ... at "Advanced / Further options / Shortcut" you can define a (even global) shortcut for "Toggle AutoPlay" then. See also: Program.sleepMode, Program.addMenuEntry() Program.addMenuEntry() -------------------------------------------------------------------------------- program.addMenuEntry(name, callbackFn); Adds a button eg. for your plugin's configuration dialog to the main menu. The name of the menu entry is defined by name. If the user selects one of "your" menu entry, the given function is called. You can also add shortcuts for a menu entry; see "Advanced / Shortcut" for this purpose. See also: Program.addConfigButton() Program.addConfigButton() -------------------------------------------------------------------------------- program.addConfigButton(name, callbackFn); Adds a button or a menu entry eg. for your plugin's configuration dialog. If the user clicks the button or selects the menu entry, the given function is called. See also: Program.addMenuEntry() Program.setTimeout() -------------------------------------------------------------------------------- program.setTimeout(callbackFn, timeoutMs, [continuous]); With setTimeout() you can let Silverjuke call the given callbackFn function after a given timeout. The timeout is specified in milliseconds with the second parameter, timeoutMs. By default, the callback function is called only once after the given timeout. By setting the third parameter, continuous to true you can let Silverjuke call your callback perdiodically every timeoutMs milliseconds. Example: // the following instruction will call the function // oneSecondTimer() periodically once a second: function oneSecondTimer() { // do what to do here ... } program.setTimeout(oneSecondTimer, 1000, true); To remove a timeout, just use "undefined" as the callback function. See also: Program.lastUserInput Program.setDisplayMsg() -------------------------------------------------------------------------------- program.setDisplayMsg(msg, [holdMs]); Shows the given message msg in the "display" of the main window for the number of milliseconds given in holdMs. If holdMs is left out, a default value is used. Note that the room in the display may be very limited - you should create your message as short as possible. Moreover, you should not display any message longer than about 20 seconds. Example: program.setDisplayMsg('Hello!'); See also: print(), logWarning(), logError() Program.setSkinText() -------------------------------------------------------------------------------- program.setSkinText(id, text); With this function you can change the text of a box-tag. The id should be the same string as given to the id-attribute in the box-tag and text is the text to display. If you use the same ID in different layout, the text is changed for all items. Example - the skin part: <skin name="test"> <layout name="test"> <box x="0" y="0" w="90" h="20" id="myId" /> </layout> </skin> Example - the script part - here we write the current artist to the box: function updateBox() { program.setSkinText("myId", player.getArtistAtPos()); } player.onTrackChange = updateBox; See also: box-tag Program.refreshWindows() -------------------------------------------------------------------------------- program.refreshWindows(what); This function refreshes (redraws) some windows as soon as possible. what is the window to refresh, see the following values: - 1 - Refresh the display - 2 - Refresh the workspace - 3 - Refresh the display and the workspace Please note: An explicit refresh is only needed eg. if you change change the content of the Database. Most other interface functions refresh the needed parts automatically (eg. when using Program.search), so most times there is no need for an explicit refresh. Program.selectAll() -------------------------------------------------------------------------------- program.selectAll([state]); Selects (state=true or left out) or deselects (state=false) all tracks in the workspace. This function is available in V2.52beta2 or later. Example: // select all tracks program.selectAll(); // deselect all tracks program.selectAll(false); See also: Program.getSelection() Program.getSelection() -------------------------------------------------------------------------------- selUrls = program.getSelection([what]); Returns an array (see "Array Object") containing all currently selected URLs (or files) in the workspace or in the queue (also referred to as the "display"). The selected tracks are useful eg. if you want to perform an action on the selection eg. from Program.addMenuEntry(). The parameter "what" defines which selection should be returned: - 0 - Smart selection detection. Return the selection in the workspace. If nothing is selected there, return the selection in the queue. If nothing is selected there return all tracks in the queue. Only if there is nothing enqueued, an empty array is returned. This behaviour is useful eg. if you want to do something with some user selected tracks, but you do not want to worry about where the tracks are selected or where they come from. If you do not specify "what", this is the default behaviour. - 1 - Return the workspace selection. If nothing is selected in the workspace, an empty array is returned. - 2 - Return the queue selection. If nothing is selected in the queue, an empty array is returned. See also: Program.selectAll() Program.getMusicSels() -------------------------------------------------------------------------------- array = program.getMusicSels(); Returns an array (see "Array Object") containin all the names of all music selections available. Note that this function may not work if Silverjuke is not yetloaded completely (see "Program.loaded"). See also: Program.musicSel Program.run() -------------------------------------------------------------------------------- program.run('c:/programs/whatever.exe'); Just run the given program. Silverjuke does not wait until the program terminates. Example: program.run('notepad.exe filetoopen.txt'); See also: Program.launchBrowser() Program.launchBrowser() -------------------------------------------------------------------------------- program.launchBrowser('http://www.whatever.com'); Open the given site in the default browser. See also: Program.run() Program.iniRead() -------------------------------------------------------------------------------- value = program.iniRead(key, defaultValue); Reads a value from Silverjuke's INI-file of from the registry. The value is identified by key which is a unique name or a path (please use the separator "/"). If the value does not exist, the function just returns defaultValue, if defaultValue is ommited, an empty string aka 0 is returned. You can read all "Silverjuke values" or your own keys you've written using Program.iniWrite(). Example: // read our own settings mySetting = program.iniRead("myPlugin/importantSetting", 13); // read a Silverjuke value searchPath = program.iniRead("main/searchPath", ""); See also: Program.iniWrite() Program.iniWrite() -------------------------------------------------------------------------------- program.iniWrite(key, value); Writes value to Silverjuke's INI-file or to the registry. The value is identified by key which is a unique name or a path (please use the separator "/"). Example: // write our own settings program.iniWrite("myPlugin/importantSetting", 13); See also: Program.iniRead() Program.exportFunction() -------------------------------------------------------------------------------- program.exportFunction(function); With this method you can make a function available for other scripts. Other scripts can call your function using Program.callExported() then. Example: // this function will be exported ... function theSuperglobal(param) { alert('You have called my superglobal.\n' + 'You gave me the following parameter:\n' + param); } // ... here: program.exportFunction(theSuperglobal); See also: Program.callExported() Program.callExported() -------------------------------------------------------------------------------- success = program.callExported(functionName, param, ...); With this method you can call functions exported by other scripts or plugins. functionName must be set to the name of the exported function; this must be the same name as the name of the exported function. The parameters and the return value are just forwarded from/to the external function. Note that only "simple" parameters as numbers or strings can be given to exported function or are returned from them. Example: // This example calls the exported function // of the Program.exportFunction() example: program.callExported('theSuperglobal', 'show this string'); // call the imported function program.theSuperglobal(); See also: Program.exportFunction(), Program.callPlugin() Program.callPlugin() -------------------------------------------------------------------------------- result = program.callPlugin(param, ...); If the running script is executed from within a Plugin, you can callback the native part of the plugin using this function. You may give up to three parameters to the plugin which will be received by the plugin on SJ_PLUGIN_CALL. The return value is the value returned from SJ_PLUGIN_CALL. See also: Program.callExported() Program.gc() -------------------------------------------------------------------------------- program.gc(); Force a garbage collection as soon as possible. Normally, there is no need to start the garbage collection manually; this is done automatically from time to time. See also: Program.memory Program.shutdown() -------------------------------------------------------------------------------- program.shutdown(mode); With this function you can shutdown Silverjuke. mode can be one of the following values: - 30 - Just exit Silverjuke. - 40 - Exit Silverjuke and shutdown the computer. - 50 - Exit Silverjuke and reboot the computer. Note that your script may terminate immediately when calling this function. See also: Program.kioskMode Player Object ================================================================================ The Player object gives you access to the player, it has one predefined instance, player (written lower case), a second one named prelisten may be added in the future. Player.time -------------------------------------------------------------------------------- ms = player.time; Read/write property that contains the current position of the current track in milliseconds. Only valid if the player is currently not stopped. Example: ms = player.time; // find out the current postion player.time += 10000; // seek forward 10 seconds player.time -= 10000; // seek backward 10 seconds player.time = 60000; // seek to "1 minute" Player.duration -------------------------------------------------------------------------------- ms = player.duration; Read only property that contains the total time of the currently playing track in milliseconds. On errors or if there is nothing playing at the moment, the property contains the value -1. Player.volume -------------------------------------------------------------------------------- vol = player.volume; Read and write property that contains the current main volume. Volumes between 0 and 255 (including) are valid. Player.onTrackChange -------------------------------------------------------------------------------- player.onTrackChange = function; If you want to be informed on changes affecting the currently playing track, please set this property to a callback function. The given function is called eg. if the next track is started automatically or manually or if Silverjuke assumes more or other details about a track are available. So, this notification is sent more than one time for the playback of a single track - please check the relevant information yourself to find out a change really important to you. Also note, that this notification is also sent if the reason for the change was your script. function myPlayerNotificationHandler() { // do what to do here } player.onTrackChange = myPlayerNotificationHandler; To remove the callback function, just assign "undefined" to the property. Player.onPlaybackDone -------------------------------------------------------------------------------- player.onPlaybackDone = function; If you want to be informed when a track has beed played, please set this property to a callback function. The given function is called a little moment after the end of a track or eg. if the user hits the "next" button. Silverjuke eg. increases the play count on this notification. To remove the callback function, just assign "undefined" to the property. Player.play() -------------------------------------------------------------------------------- player.play([startMs]); Brings the player to the "Play" state. If the player is already playing, nothing happens. Calling this command is not always exactly the same as if the user hits the play button - eg. this command does not auto enqueuing or sth. like that. startMs is only used if the player was stopped before. In this case, this is the starting position in milliseconds of the new track. You could also use Player.time after you've started the song, but using startMs is a little bit smarter and avoids crackle. Player.pause() -------------------------------------------------------------------------------- player.pause(); Pauses the player. If the player is already paused, nothing happens. Player.stop() -------------------------------------------------------------------------------- player.stop(); Bring the player to the "stopped" state. If the player is already stopped, nothing happens. Player.stopAfterThisTrack -------------------------------------------------------------------------------- state = player.stopAfterThisTrack; Read/write property that contains the state of the "Stop after this track" option. Example: state = player.stopAfterThisTrack; // find out the current state player.stopAfterThisTrack = state; // set the state Player.stopAfterEachTrack -------------------------------------------------------------------------------- state = player.stopAfterEachTrack; Read/write property that contains the state of the "Stop after each track" option. Example: state = player.stopAfterEachTrack; // find out the current state player.stopAfterEachTrack = state; // set the state Player.isPlaying() etc. -------------------------------------------------------------------------------- state = player.isPlaying(); state = player.isPaused(); state = player.isStopped(); Check if the player is currently playing, paused or stopped. Player.prev() -------------------------------------------------------------------------------- player.prev(); Go to the previoustrack in the playlist. If there is no previous track, nothing happens. Player.next() -------------------------------------------------------------------------------- player.next([ignoreAutoPlay]); Go to the next track in the playlist. - If there is no next track and AutoPlay is enabled by the user and ignoreAutoPlay is false or left out, a new track is enqueued. - If there is no next track and ignoreAutoPlay is true, nothing happens. Player.hasPrev() -------------------------------------------------------------------------------- state = player.hasPrev(); Checks if there is a previous track in the playlist. Player.hasNext() -------------------------------------------------------------------------------- state = player.hasNext([ignoreAutoPlay]); Checks if there is a next track in the playlist. For the optional ignoreAutoPlay parameter, please see Player.next() for some comments. Player.queueLength -------------------------------------------------------------------------------- len = player.queueLength; Read only property that contains the total number of tracks - played or not played - in the queue. If the queue is this value is 0. Player.queuePos -------------------------------------------------------------------------------- pos = player.queuePos; Read/write property that contains the current playback position in the queue. This is a number between 0 and Player.queueLength-1. Note, that there is also a queue position if the player is stopped or paused. If the queue is empty this value is -1. Example: currentPos = player.queuePos; // find out the current position player.queuePos += 2; // go two tracks forward player.queuePos = 5; // go to position "five" Player.getUrlAtPos() etc. -------------------------------------------------------------------------------- url = player.getUrlAtPos (queuePos); isAutoPlay = player.getAutoplayAtPos (queuePos); playCount = player.getPlayCountAtPos (queuePos); artist = player.getArtistAtPos (queuePos); album = player.getAlbumAtPos (queuePos); title = player.getTitleAtPos (queuePos); ms = player.getDurationAtPos (queuePos); With these methods you can find out some information above a track in the queue. The track is defined by queuePos which is a value between 0 and Player.queueLength-1. Some notes: - You can also skip the queuePos parameter - in this case Player.queuePos is used as the postion - The url returned from getUrlAtPos() is often equal to a file name. Note that, for different reasons, the "forward slash" may be used as a path seperator - even on Windows where normally the "backslash" is used. - isAutoPlay is true if the track is marked as being "auto-played". Tracks marked as being auto-played may have different FX settings and/or may be interrupted when the user - or your plugin - enqueues the next non-auto- play track. You can also add auto-played tracks from your plugin, see Player.addAtPos(). - getPlayCountAtPos() returns the number of times the title was played while it was in the queue. This is not the "overall" play count from the Database (see "Database Object"). Example: var next = player.queuePos+1; var info = "The next track is " + player.getTitleAtPos(next) + " by " + player.getArtistAtPos(next); See also: Program.getSelection() Player.addAtPos() -------------------------------------------------------------------------------- player.addAtPos(queuePos, file, [markAsAutoplay]); Adds the given file or URL to the queue at the position defined by queuePos, eg. if you set queuePos to 0, the new track will become the first one and all other tracks will move one step downward. If you set queuePos to -1, the new track will be the last in the queue; this is the behaviour most often wanted. With the flag markAsAutoplay you can optionally mark the new track as an "auto-played" track - tracks marked this way may have different FX settings and/or may be interrupted when the user - or your plugin - enqueues the next non-auto-play track. To find out the auto-play state of tracks already in the queue, see Player.getAutoplayAtPos(). Player.removeAtPos() -------------------------------------------------------------------------------- player.removeAtPos(queuePos); Removes the track at the given position from the queue. If this is the currently playing track, normally, the next track in the queue is played. Player.removeAll() -------------------------------------------------------------------------------- player.removeAll(); Removes all tracks from the queue. If auto play is enabled, new tracks may be enqueued immediately. Player.repeat -------------------------------------------------------------------------------- state = player.repeat; Read/write property that contains the current repeat mode: 0 = repeat off 1 = repeat single 2 = repeat all This property is available in V2.52beta2 or later. See also: Rights.repeat Player.shuffle -------------------------------------------------------------------------------- state = player.shuffle; Read/write property that contains the current shuffle state. This property is available in V2.52beta2 or later. Player.removePlayed -------------------------------------------------------------------------------- state = player.removePlayed; Read/write property that contains the current state for the "Remove played tracks from queue" option. This property is available in V2.60beta5 or later. Player.avoidBoredom -------------------------------------------------------------------------------- flags = player.avoidBoredom; Read/write property that contains the current "avoid boredom" flags as: 0 = avoid boredom off 1 = avoid boredom regarding the tracks 2 = avoid boredom regarding the artists 3 = avoid boredom regarding the track and artists (1+2) Rights Object ================================================================================ With the Rights object you can check the rights given to the user eg. in the kiosk mode. The Rights object has one predefined instance, rights (lower case), which reflects the current settings from Settings / Kiosk mode / Functionality. Note that the rights object only gives some hints - you may have good reasons for your script to ignore some of them. See also: if-tag in skins Rights.all -------------------------------------------------------------------------------- state = rights.all; Read only property that is true if anything that is possible is allowed to the user (normally outside the kiosk mode). If not, this property is set to false (normally inside the kiosk mode). This property is only a hint. See also: Program.kioskMode Rights.credits -------------------------------------------------------------------------------- value = rights.credits; Read/write property. Contains the number of credits currently availabe for the credit system. Example: rights.credits += 3; // add three credits to the credit system Rights.useCredits -------------------------------------------------------------------------------- state = rights.useCredits; This read only property contains the value true if the credit system is enabled by the user, false if not. Rights.play -------------------------------------------------------------------------------- state = rights.play; Read only property that is true if Player.play() is allowed. If not, this property is set to false. This property is only a hint - Player.play() will work in any case. Rights.pause -------------------------------------------------------------------------------- state = rights.pause; Read only property that is true if Player.pause() is allowed. If not, this property is set to false. This property is only a hint - Player.pause() will work in any case. Rights.stop -------------------------------------------------------------------------------- state = rights.stop; Read only property that is true if Player.stop() is allowed. If not, this property is set to false. This property is only a hint - Player.stop() will work in any case. Rights.editQueue -------------------------------------------------------------------------------- state = rights.editQueue; Property that is true if editing the queue is allowed in any way. If not, this property is set to false. This property can be read and written. "Edit" in this meaning does not include removing tracks from the queue. For this property, please have a look at Rights.unqueue This property is only a hint - editing the queue by your script will work in any case. See also: Player.addAtPos(), Player.removeAtPos() Rights.unqueue -------------------------------------------------------------------------------- state = rights.unqueue; Property that is true if removing tracks from the queue is allowed. If not, this property is set to false. This property can be read and written. This property is only a hint - removing tracks from the queue by your script will work in any case. See also: Player.removeAtPos(), Player.removeAll() Rights.multiEnqueue -------------------------------------------------------------------------------- state = rights.multiEnqueue; Property that is true if enqueueing multiple tracks at the same time (in one step) is allowed. If not, this property is set to false. This property can be read and written. This property is only a hint - editing the queue by your script will work in any case. See also: Player.addAtPos() Rights.repeat -------------------------------------------------------------------------------- state = rights.repeat; Property that is true if the repeat mode can be changed. If not, this property is set to false. This property is only a hint - changing Player.repeat will work in any case. See also: Player.repeat Rights.search -------------------------------------------------------------------------------- state = rights.search; Read only property that is true if searching is allowed in any way. If not, this property is set to false. This property is only a hint. See also: Program.search, Program.musicSel Rights.startVis -------------------------------------------------------------------------------- state = rights.startVis; Read only property that is true if starting the visualization is allowed in any way. If not, this property is set to false. This property is only a hint. See also: Program.visMode Rights.volume -------------------------------------------------------------------------------- state = rights.volume; Read only property that is true if changing the main volume is allowed in any way. If not, this property is set to false. This property is only a hint. See also: Player.volume Rights.viewMode() -------------------------------------------------------------------------------- state = rights.viewMode(mode); This function checks if a given view mode is currently available or not. The function returns true if the mode is available, false if not. See also: Program.viewMode Rights.zoom -------------------------------------------------------------------------------- state = rights.zoom; Read only property that is true if changing the zoom is allowed in any way. If not, this property is set to false. This property is only a hint. See also: Program.zoom Dialog Object ================================================================================ The Dialog object provides a simple way to create your own dialogs. Dialog Constructor -------------------------------------------------------------------------------- dlg = new Dialog(); Create a new dialog object, you can add controls to the dialog using the Dialog.addCtrl() methods. When done, you can show the dialog using Dialog.showModal() or Dialog.show(). For simple dialogs, please also have a look at the static methods alert(), confirm() and prompt(). Dialog.addCtrl() -------------------------------------------------------------------------------- dlg.addTextCtrl (id, label, value); dlg.addMultilineCtrl (id, label, value); dlg.addPasswordCtrl (id, label, value); dlg.addSelectCtrl (id, label, value, option1, option2, ...); dlg.addCheckCtrl (id, label, value); dlg.addStaticText ([id,]label); dlg.addButton (id, label, [callbackFn]); With the addCtrl() functions you add controls to a dialog object. When done, you can show the dialog using Dialog.show() or Dialog.showModal() and query (see "Dialog.getValue()") the values entered by the user after the dialog is closed (see "Dialog.close()"). - The id is any identifier unique to the dialog and is needed if you want to set or get the values of the control. You can mix numbers and strings as you like. - label is any string shown beside or inside the control. - value is the default value of the control. With the addButton() function you can add buttons to the dialog. If the user presses the button, the given callback function is called. - The callbackFn callback function is called in the scope of the dialog object. - If you do not provide a callback function, Dialog.close() is called when the button is pressed. - Buttons with the IDs "ok", "cancel" or "help" are shown at the bottom of the dialog and the labels can be left out. The label of the button "help" may be replaced by another text or icon. - All other buttons are shown in the order as added. - If you do not add at least an "ok" button, the buttons "ok" and "cancel" are added automatically. Example: var d = new Dialog; d.addTextCtrl('name', 'Your name:'); d.addSelectCtrl('like', 'Like this script?', 0, 'yes', 'no'); if( d.showModal() == 'ok' ) { usersName = d.getValue('name'); likeOrDislike = d.getValue('like'); } See also: Dialog.showModal(), Dialog.show(), Dialog.getValue(), Dialog.setValue() Dialog.getValue() -------------------------------------------------------------------------------- value = dlg.getValue(id); Returns the current value of the control identified by id. The id is the value given to Dialog.addCtrl(). Dialog.setValue() -------------------------------------------------------------------------------- dlg.setValue(id, newValue); Sets a new value for the control identified by id. The id is the value given to Dialog.addCtrl(). Dialog.show() -------------------------------------------------------------------------------- dlg.show(); Dialog.show(type); Shows the dialog and let the user change the values. To close the dialog, please use the Dialog.close() method eg. in a button callback (see "Dialog.addCtrl()"). There is also a static implementation of this function which can be used to open some predefined dialogs; in this case, use one of the following strings as the argument type: - console - show the console window - settings - show the settings dialog, additional parameters are just forwarded to the dialog - musicsel - show the "music selection" dialog - openfiles - show the "open files" dialog and let the user select some files to enqueue; the second parameter may be set to true to force appending. - saveplaylist - show the "save playlist" dialog Example: // show a user-defined dialog var d = new Dialog; d.addTextCtrl('name', 'Your name:'); d.addButton('ok', '', function(){alert('Thanks!'); close();}); d.addButton('cancel'); d.show(); // show the predefined "settings" dialog Dialog.show('settings'); See also: Dialog.showModal() Dialog.showModal() -------------------------------------------------------------------------------- result = dlg.showModal(); Shows the dialog and let the user change the values. When the function returns, the dialog is already closed and you can query the values using Dialog.getValue(). The return value is the ID of the button that closes the dialog. Example: var d = new Dialog; d.addTextCtrl('name', 'Your name:'); d.addButton('ok'); d.addButton('cancel'); if( d.showModal() == 'ok' ) { alert('Thanks!') } See also: Dialog.show() Dialog.close() -------------------------------------------------------------------------------- dlg.close(); Closes the dialog, normally you will call this function from within a button callback (see "Dialog.addCtrl()"). You can find out the values entered by the user using the Dialog.GetValue() function. Database Object ================================================================================ With the database object you can access the sqlite database used by Silverjuke. You have the full power of SQL - for a list of used fields in the main table "tracks", see the topic SQL Expressions in the User Manual or inspect the database directly. Moreover, you can create your own databases. Silverjuke's database uses the sqlite3 engine. If needed, you can access the database eg. using the sqlite3explorer or via ODBC. - A list of tools for sqlite can be found at http://www.sqlite.org/cvstrac/wiki?p=SqliteTools. - For ODBC drivers eg. for use with Excel, please have a look at the following search results: http://www.google.com/search?q=sqlite+odbc The tables of interest are normally "tracks" and "albums"; the used fields in these tables should be self-explaining. However, note that using the Silverjuke database outside of Silverjuke is not an official feature and that the Silverjuke database format is always subject to change without notice. Database Constructor -------------------------------------------------------------------------------- db = new Database([file]); Constructs a new database object. - If you do not specify a file, the database object will be an an accessor to the default database of Silverjuke. - If you specify a file, you can access any other database. If the database file does not exist, it is created. To execute SQL statements on the database, use Database.openQuery(). Database.openQuery() -------------------------------------------------------------------------------- success = database.openQuery(sqlStatement); Execute any SQL statement. If the statement returns a result, this can be queried using the functions Database.nextRecord() and Database.getField(). Please do not forget to close the query using Database.closeQuery() - depending on the type of query some tables may stay locked otherwise. On success, the function returns true. For errors, false is returned. Example: // find out the composer of the playing track var url = player.getUrlAtPos(); var db = new Database; db.openQuery("select composername from tracks where url='" + url + "';"); if( db.nextRecord() ) { alert("The composer of the playing track is " + db.getField(0)); } db.closeQuery(); The example above is a little bit buggy for strings containing a quote character - these characters should be replaced by two quotes (not: the double quote). So the 6th line should read as follows: var quoteExpr = new RegExp("'", "g"); db.openQuery("select composername from tracks where url='" + url.replace(quoteExpr, "''") + "';"); The most common database usage will be to query for information as done above. For a list of used fields in the main table "tracks", see the topic "SQL Expressions" in the User Manual or inspect the database directly. However, you can also change the tables using UPDATE, INSERT or DELETE (in this case, you can speed up processing by using transaction as BEGIN and COMMIT or ROLLBACK statements). Please do not expect Silverjuke to reflect all changes immediately; for speed reasons many things are cached in a way not easy to describe here. If in doubt, please contact us. Moreover, if you need your own databases or columns - no problem, you can also use the CREATE TABLE or ALTER TABLE commands. However, please also contact us in this case, so that we can avoid incompatibilities. See also: Database.nextRecord(), Database.getField(), Database.closeQuery() Database.nextRecord() -------------------------------------------------------------------------------- hasNext = database.nextRecord(); Moves the record pointer in the result returned by Database.openQuery() to the next record. If there is a next record, true is returned; if there are no more records, the function returns false. To find out the values of the record, use Database.getField(). If the submitted query does not return a result set, this function is useless. See Database.openQuery() for an example. Database.getFieldCount() -------------------------------------------------------------------------------- cnt = database.getFieldCount(); Returns the number of fields in each row of the result returned by Database.openQuery(). The return value is equal eg. to the number of fields/columns in a "SELECT" statement. To find out the values of the field, use Database.getField(). Database.getField() -------------------------------------------------------------------------------- value = database.getField(n); Returns the value of the nth field of the current record. n is a value between 0 and the Database.getFieldCount() minus 1. To move to the next record, use Database.nextRecord(). Depending on the type of the query, you can also find out some additional information with the following values for n: - If you set n to -1, the function returns the "insert id" of the last insert statement. - If you set n to -2, the function returns the number of affected rows eg. of an update or delete statement. Please note, that getField always returns a string, independently of what is queried in the SQL statement. So, under some circumstances an explicit type conversion may be needed; this can be done by some mathematic statements or by using the Number constructor: db = new Database; db.openQuery("select count(*) from albums;"); foo = db.getField(0); alert(foo + 1) // for 20 record, this shows "201" :-( bar = 1*foo; alert(bar + 1) // for 20 record, this shows "21" :-) alert(Number(foo) + 1) // for 20 record, this shows "21" :-) db.closeQuery(); Database.closeQuery() -------------------------------------------------------------------------------- value = database.closeQuery(); Closes the query (see "Database.openQuery()") and unlocks all used tables. We recommend always to call this function after a query as soon as possible - depending on the query some tables may get unusable for Silverjuke otherwise. Database.getFile() -------------------------------------------------------------------------------- file = database.getFile(); This function returns the file name and path used as the physical storage for the database. Normally, this is the same file name as given to the constructor; if you have not given any file name to the constructor this function returns the file name of the default database. See also: Database Constructor Static Database Functions -------------------------------------------------------------------------------- success = Database.update([deepUpdate]); With Database.update() you synchronize the default database with the assigned music sources and their meta data. By default, only new or changed sources are checked; if you set deepUpdate to true all files will be rescanned. Calling this function has the same effect as pressing eg. F5 in Silverjuke. The function returns true if the update was completed. For errors, or if the user aborts the update, false is returned. File Object ================================================================================ With the file object you can read or write any file in the file system. File Constructor -------------------------------------------------------------------------------- file = new File(name, [binary]); Constructs a new file object. name is the file to open. You should always use the forward slash instead of the backslash in file names, eg. please use "c:/filename.txt" instead of "c:\filename.txt". The file can be opened in two modes: - If binary is set to true, the file is opened in binary mode: All strings read and written will contain exactly one byte per character. This mode can also be used if the file contains ISO 8859-1 encoded text. - If binary is left out or is set to false, the file is opened in UTF-8 mode: The file should be an UTF-8 encoded text then. To access the file data, use eg. File.read() or File.write(). Although the file is closed automatically by the garbage collection, it may be a good idea to call File.flush() as soon as you're done with the file. File.length -------------------------------------------------------------------------------- value = file.length; Property which reflects the current size in bytes of the file. The length may change if you write over the end of the file using File.write(). You can also empty or truncate files using the property. Example: fileBytes = file.length; // find out the size file.length = 0; // empty the file file.length = 100; // truncate the file to 100 bytes file.length -= 32; // make the file 32 bytes smaller File.pos -------------------------------------------------------------------------------- value = file.pos; Read and write property which reflects the current read/write position that is used for reading and writing. The position is always relative to the beginning of the file, however, you can give negative values to seek from the end. Every read and write call will increase the position by the number of bytes read or written. Example: bytesFromBeg = file.pos; // find out the current position file.pos = 0; // move to start of file file.pos = file.length; // move to end of file file.pos = 100; // move the postion to byte 100 file.pos = -100; // move to 100 bytes from end file.pos += 32; // move the pointer 32 bytes forward file.pos -= 32; // move the pointer 32 bytes backward File.read() -------------------------------------------------------------------------------- data = file.read([length]); Reads and returns data from the given file. The data is returned as a string. - If you give the length argument, the number of bytes are read from the file. - If you do not give the length argument, the next line is read. The returned string may contain the character "\n" at its end. The File.pos is increased by the number of bytes read. See also: File.write(), Binary mode (see "File Constructor") File.write() -------------------------------------------------------------------------------- file.write(data); Write data to the given file at the current position. - If data is a string, this string is written to the file. If you want to add a line end after the string, you have add eg. `\n` to data explicitly. - If data is a number, a single byte is written to the file. The File.pos is increased by the number of bytes written, if you write over the end of the file, this will also changed File.length. Example: f = new File('c:/temp/test'); f.write('hello'); // writes 5 bytes f.write('two\nlines'); // writes 2 lines (9 bytes) f.write(12); // writes 1 byte to the file f.write(0); // write a null-byte See also: File.read(), File.flush(), Binary mode (see "File Constructor") File.flush() -------------------------------------------------------------------------------- file.flush(); Flushes the given file and closes it temporarily. Although closing is also done by the garbage collection, closing the file explicitly allows other programs to access the file immediately. If you use any other file method or property after calling flush(), the file is opened again. Static File Functions -------------------------------------------------------------------------------- state = File.exists(path); state = File.isdir(path); array = File.dir(path, [what]); success = File.mkdir(path); success = File.copy(src, dest); success = File.rename(src, dest); success = File.remove(path); ms = File.time(path); These functions provide some file operations are not bound to a specific file object. - File.exists() returns true if the given path specifies an existing file or directory; else false is returned. - File.isdir() returns true if the given path specifies an existing directory; else false is returned. - File.dir() searches the given path for files (set what to 0 or skip this parameter), for directories (set what to 1) or for both (set what to 2). The found files or directories are returned as an array of strings. - File.mkdir() tries to create the directory path. - File.copy() tries to copy the file src to dest; the destination file is overwritten, if it exists. - File.rename() renames the file src to dest. The destination must be given as a full path; the function may also be used to move files therefore. - File.remove() deletes the given file path - File.time() returns the timestamp of the last modification, you can give this timestamp to the Date Constructor to convert it to a Date Object. Examples: // create directories if( !File.isdir('c:/temp') ) { File.mkdir('c:/temp'); File.mkdir('c:/temp/subdir'); } // print all files and directory in c:/temp files = File.dir('c:/temp', 2); for( i = 0; i < files.length; i++ ) { if( File.isdir(files[i]) ) { print('['+files[i]+']'); } else { print(files[i]); } } // rename a file File.rename('c:/temp/bla.txt', 'c:/temp/blub.txt'); // delete a file File.remove('c:/temp/blub.txt'); HttpRequest Object ================================================================================ With the HttpRequest object you can read or post data from/to web servers using the HTTP protocol. HttpRequest Constructor -------------------------------------------------------------------------------- httprequest = new HttpRequest(); Constructs a new HttpRequest object which can be used for HTTP requests then. See also: HttpRequest.request() HttpRequest.responseText -------------------------------------------------------------------------------- data = httprequest.responseText; This property contains the result of a request started eg. by HttpRequest.request(). See also: HttpRequest.getResponseHeader(), HttpRequest.status HttpRequest.status -------------------------------------------------------------------------------- state = httprequest.status; This property contains the numeric status code in response to a request started eg. by HttpRequest.request(). On, success, the status code is normally 200 (OK). Other status codes may indicate errors or warnings, eg. 404 (Not Found) or 400 (Bad Request - also used if no data are requested yet). For a list of possible status codes, please refer to http://www.faqs.org/rfcs/rfc2616.html . See also: HttpRequest.responseText, HttpRequest.getResponseHeader() HttpRequest.request() -------------------------------------------------------------------------------- httprequest.request(url, [postData], callbackFn); With this method you can retrieve the resource defined by url using the methods GET or POST (set or skip postData). Any request started before is aborted when this function is called. The data are loaded asynchronous. When done, the callback function is called which should check the HttpRequest.status and can read the result from HttpRequest.responseText. Example: // the following function is called when the request is done function myCallback() { alert("done - status is " + this.status); } // start a GET request obj = new HttpRequest(); obj.request("http://foo.com/?param1=data¶m2=cont", myCallback); See also: HttpRequest.abort() HttpRequest.setRequestHeader() -------------------------------------------------------------------------------- httprequest.setRequestHeader([header, value]); Set header for the next request(s) started eg. by HttpRequest.request(). Request headers are not cleared by calling HttpRequest.abort() or HttpRequest.request(); for this purpose, please call this function without any parameters. Especially when using the POST method on HttpRequest.request(), do not forget to set the correct content type: Example: // the following function is called when the request is done function myCallback() { alert("done - status is " + this.status); } // start a POST request obj = new HttpRequest(); obj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); obj.request("http://foo.com/", "param1=data¶m2=cont", myCallback); See also: HttpRequest.request(), HttpRequest.getResponseHeader() HttpRequest.getResponseHeader() -------------------------------------------------------------------------------- value = httprequest.getResponseHeader(header); Returns a header of a response to a request started eg. by HttpRequest.request(). See also: HttpRequest.responseText, HttpRequest.status HttpRequest.abort() -------------------------------------------------------------------------------- httprequest.abort(); Stops a request started eg. by HttpRequest.request(). Moreover, calling this function will initialize HttpRequest.status to 400 (Bad Request). Math Object ================================================================================ The Math object is a single object that has some properties and functions useful for working with numbers. Math Constants -------------------------------------------------------------------------------- value = Math.E; value = Math.PI; value = Math.LN10; value = Math.LN2; value = Math.LOG2E; value = Math.LOG10E; value = Math.SQRT1_2; value = Math.SQRT2; The Math objects defines some constant properties as follows: - E - The number value for e, the base of the natural logarithms, which is approximately 2.7182818284590452354. - PI - The number value for "PI", the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932. - LN10 - The number value for the natural logarithm of 10, which is approximately 2.302585092994046. - LN2 - The number value for the natural logarithm of 2, which is approximately 0.6931471805599453. - LOG2E - The number value for the base-2 logarithm of e, the base of the natural logarithms; this value is approximately 1.4426950408889634. The value of Math.LOG2E is approximately the reciprocal of the value of Math.LN2. - LOG10E - The number value for the base-10 logarithm of e, the base of the natural logarithms; this value is approximately 0.4342944819032518. The value of Math.LOG10E is approximately the reciprocal of the value of Math.LN10. - SQRT1_2 - The number value for the square root of 1/2, which is approximately 0.7071067811865476. The value of Math.SQRT1_2 is approximately the reciprocal of the value of Math.SQRT2. - SQRT2 - The number value for the square root of 2, which is approximately 1.4142135623730951. Obviously, all properties are read only. Math.sin() etc. -------------------------------------------------------------------------------- result = Math.sin(x); result = Math.cos(x); result = Math.tan(x); result = Math.asin(x); result = Math.acos(x); result = Math.atan(x); result = Math.atan2(y, x); Some trigonometry functions: - sin(x) - Returns an approximation to the sine of x. The argument is expressed in radians. - If x is NaN, the result is NaN - If x is 0, the result is 0 - If x is +oo or -oo, the result is NaN - cos(x) - Returns an approximation to the cosine of x. The argument is expressed in radians. - If x is NaN, the result is NaN - If x is 0, the result is 1 - If x is +oo, the result is NaN - If x is -oo, the result is NaN - tan(x) - Returns an approximation to the tangent of x. The argument is expressed in radians. - If x is NaN, the result is NaN - If x is 0, the result is 0 - If x is +oo or -oo, the result is NaN - asin(x) - Returns an approximation to the arc sine of x. The result is expressed in radians and ranges from -PI/2 to +PI/2. - If x is NaN, the result is NaN - If x is greater than 1, the result is NaN - If x is less than -1, the result is NaN - If x is 0, the result is 0 - acos(x) - Returns an approximation to the arc cosine of x. The result is expressed in radians and ranges from +0 to +PI. - If x is NaN, the result is NaN - If x is greater than 1, the result is NaN - If x is less than -1, the result is NaN - If x is exactly 1, the result is 0 - atan(x) - Returns an approximation to the arc tangent of x. The result is expressed in radians and ranges from -PI/2 to +PI/2. - If x is NaN, the result is NaN - If x is 0, the result is 0 - If x is +oo, the result is an approximation to +PI/2 - If x is -oo, the result is an approximation to -PI/2 - atan2(y, x) - Returns an approximation to the arc tangent of the quotient y/x of the arguments y and x, where the signs of y and x are used to determine the quadrant of the result. Note that it is intentional and traditional for the two-argument arc tangent function that the argument named y be first and the argument named x b second. The result is expressed in radians and ranges from -PI to +PI. - If either x or y is NaN, the result is NaN - If y>0 and x is 0, the result is an approximation to +PI/2 - If y is 0 and x>0, the result is 0 - If y<0 and x is 0, the result is an approximation to -PI/2 - If y>0 and y is finite and x is +oo, the result is 0 - If y<0 and y is finite and x is +oo, the result is 0 - If y>0 and y is finite and x is -oo, the result if an approximation to +PI - If y<0 and y is finite and x is -oo, the result is an approximation to -PI - If y is +oo and x is finite, the result is an approximation to +PI/2 - If y is -oo and x is finite, the result is an approximation to -PI/2 - If y is +oo and x is +oo, the result is an approximation to +PI/4 - If y is +oo and x is -oo, the result is an approximation to +3PI/4 - If y is -oo and x is +oo, the result is an approximation to -PI/4 - If y is -oo and x is -oo, the result is an approximation to -3PI/4 Math.abs() -------------------------------------------------------------------------------- result = Math.abs(x): Returns the absolute value of x; the result has the same magnitude as x but has positive sign. Some special cases: - If x is NaN, the result is NaN. - If x is -oo, the result is +oo. Math.ceil() -------------------------------------------------------------------------------- result = Math.ceil(x); Returns the smallest number value that is not less than x and is equal to a mathematical integer. The value of Math.ceil(x) is the same as the value of -Math.floor(-x). Some special cases: - If x is already an integer, the result is x. - If x is NaN, the result is NaN. - If x is 0, the result is 0. - If x is +oo, the result is +oo. - If x is -oo, the result is -oo. - If x is less than 0 but greater than -1, the result is 0. Math.exp() -------------------------------------------------------------------------------- result = Math.exp(x); Returns an approximation to the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms). Some special cases: - If x is NaN, the result is NaN. - If x is 0, the result is 1. - If x is +oo, the result is +oo. - If x is -oo, the result is 0. Math.floor() -------------------------------------------------------------------------------- result = Math.floor(x); Returns the greatest number value that is not greater than x and is equal to a mathematical integer. The value of Math.floor(x) is the same as the value of -Math.ceil(-x). Some special cases: - If x is already an integer, the result is x. - If x is NaN, the result is NaN. - If x is 0, the result is 0. - If x is +oo, the result is +oo. - If x is -oo, the result is -oo. - If x is greater than 0 but less than 1, the result is 0. Math.log() -------------------------------------------------------------------------------- result = Math.log(x); Returns an approximation to the natural logarithm of x. Some special cases: - If x is NaN, the result is NaN. - If x is less than 0, the result is NaN. - If x is 0, the result is -oo. - If x is 1, the result is 0. - If x is +oo, the result is +oo. Math.max(), Math.min() -------------------------------------------------------------------------------- result = Math.max(value1, value2, ...); result = Math.min(value1, value2, ...); Returns the largest/smallest of the given values. Some special cases: - If no arguments are given, the result is -oo/+oo - If any value is NaN, the result is NaN. Math.pow() -------------------------------------------------------------------------------- result = Math.pow(x, y); Returns an approximation of raising x to the power y. Some special cases: - If y is NaN, the result is NaN. - If y is 0, the result is 1, even if x is NaN. - If x is NaN and y is nonzero, the result is NaN. - If abs(x)>1 and y is +oo, the result is +oo. - If abs(x)>1 and y is -oo, the result is 0. - If abs(x)==1 and y is +oo, the result is NaN. - If abs(x)==1 and y is -oo, the result is NaN. - If abs(x)<1 and y is +oo, the result is 0. - If abs(x)<1 and y is -oo, the result is +oo. Math.random() -------------------------------------------------------------------------------- result = Math.random(); Returns a number value with positive sign, greater than or equal to 0 but less than 1, chosen pseudo randomly with an approximately uniform distribution over that range. Math.round() -------------------------------------------------------------------------------- result = Math.round(x); Returns the integer number value that is closest to x. If two integer number values are equally close to x, the larger one is returned. Some special cases: - If x is already an integer, the result is x. - If x is NaN, the result is NaN. - If x is +oo, the result is +oo - If x is -oo, the result is -oo Math.sqrt() -------------------------------------------------------------------------------- result = Math.sqrt(x); Returns an approximation to the square root of x. Some special cases: - If x is NaN, the result is NaN. - If x less than 0, the result is NaN. - If x is 0, the result is 0. - If x is +oo, the result is +oo. Date Object ================================================================================ The Date object offers you some method to work with the time. Date Constructor -------------------------------------------------------------------------------- obj = new Date(); obj = new Date(milliseconds); obj = new Date(dateString); obj = new Date(year, month, dayNum[, hour, minute, second[, ms]]); Constructs a new Date object. You can construct a date object using the number of milliseconds since January 1, 1970, 00:00:00, using a formatted date string (see Date.parse()) or by a some concrete values. For the month, the function expects january=0, february=1 and so on. If you do not specify any arguments, the current date and time is set to the object. Date.parse() -------------------------------------------------------------------------------- ms = Date.parse("Tue, 1 Jan 2000 00:00:00 GMT"); This static method parses a string representation of a date, and returns the number of milliseconds since January 1, 1970, 00:00:00 (universal time if you append "GMT" to the string). Date.UTC() -------------------------------------------------------------------------------- ms = Date.UTC(year, month, dayNum[, hour, minute, second[, ms]]); This static method accepts the same parameters as the longest form of the constructor, and returns the number of milliseconds in a Date object since January 1, 1970, 00:00:00, universal time. For the month, the function expects january=0, february=1 and so on. Date.get() -------------------------------------------------------------------------------- var obj = Date(); result = obj.getDate(); result = obj.getDay(); result = obj.getFullYear(); result = obj.getHours(); result = obj.getMilliseconds(); result = obj.getMinutes(); result = obj.getMonth(); result = obj.getSeconds(); result = obj.getTime(); result = obj.getTimezoneOffset(); result = obj.getUTCDate(); result = obj.getUTCDay(); result = obj.getUTCFullYear(); result = obj.getUTCHours(); result = obj.getUTCMilliseconds(); result = obj.getUTCMinutes(); result = obj.getUTCMonth(); result = obj.getUTCSeconds(); With the Date.get() methods you can find out some values of a Date object. - getDate() - Returns the day of the month for the specified date according to local time. - getDay() - Returns the day of the week for the specified date according to local time. - getFullYear() - Returns the year of the specified date according to local time. - getHours() - Returns the hour in the specified date according to local time. - getMilliseconds() - Returns the milliseconds in the specified date according to local time. - getMinutes() - Returns the minutes in the specified date according to local time. - getMonth() - Returns the month in the specified date according to local time (0=january, 1=february etc.). - getSeconds() - Returns the seconds in the specified date according to local time. - getTime() - Returns the numeric value corresponding to the time for the specified date according to universal time. The result is in milliseconds since January 1, 1970, 00:00:00. - getTimezoneOffset() - Returns the time-zone offset in minutes for the current locale. - getUTCDate() - Returns the day (date) of the month in the specified date according to universal time. - getUTCDay() - Returns the day of the week in the specified date according to universal time. - getUTCFullYear() - Returns the year in the specified date according to universal time. - getUTCHours() - Returns the hours in the specified date according to universal time. - getUTCMilliseconds() - Returns the milliseconds in the specified date according to universal time. - getUTCMinutes() - Returns the minutes in the specified date according to universal time. - getUTCMonth() - Returns the month in the specified date according to universal time (0=january, 1=february etc.). - getUTCSeconds() - Returns the seconds in the specified date according to universal time. 3.2.9.5 Date.set() -------------------------------------------------------------------------------- obj = new Date("June 17, 1973 19:27:12"); obj.setDate(newDayNum); obj.setFullYear(newYear); obj.setHours(newHours); obj.setMilliseconds(newMs); obj.setMinutes(newMinutes); obj.setMonth(newMonth); obj.setSeconds(newSeconds); obj.setTime(newTime); obj.setUTCDate(newDayNum); obj.setUTCFullYear(newYear); obj.setUTCHours(newHours); obj.setUTCMilliseconds(newMs); obj.setUTCMinutes(newMinutes); obj.setUTCMonth(newMonth); obj.setUTCSeconds(newSeconds); With the Date.set() methods, you can set some components a date is built of: - setDate() - Sets the day of the month for a specified date according to local time. - setFullYear() - Sets the full year for a specified date according to local time. - setHours() - Sets the hours for a specified date according to local time. - setMilliseconds() - Sets the milliseconds for a specified date according to local time. - setMinutes() - Sets the minutes for a specified date according to local time. - setMonth() - Sets the month for a specified date according to local time (0=january, 1=february etc.). - setSeconds() - Sets the seconds for a specified date according to local time. - setTime() - Sets the value of the Date object according to local time. The argument is expected as milliseconds since January 1, 1970, 00:00:00. - setUTCDate() - Sets the day of the month for a specified date according to universal time. - setUTCFullYear() - Sets the full year for a specified date according to universal time. - setUTCHours() - Sets the hour for a specified date according to universal time. - setUTCMilliseconds() - Sets the milliseconds for a specified date according to universal time. - setUTCMinutes() - Sets the minutes for a specified date according to universal time. - setUTCMonth() - Sets the month for a specified date according to universal time (0=january, 1=february etc.). - setUTCSeconds() - Sets the seconds for a specified date according to universal time. Date.toString() -------------------------------------------------------------------------------- result = date.toString(); Returns a string representing the specified Date object. Date.toLocaleString() -------------------------------------------------------------------------------- result = date.toLocaleString(); result = date.toLocaleDateString(); result = date.toLocaleTimeString(); Returns the "date" and/or portion of the Date as a string, using the current locale's conventions. Date.toUTCString() -------------------------------------------------------------------------------- result = date.toUTCString(); Converts a date to a string, using the universal time convention. Array Object ================================================================================ The array object provides everything you should need to work with arrays. Array Constructor -------------------------------------------------------------------------------- var arrObj1 = new Array(arrayLength); var arrObj2 = new Array(elem0, elem1, ..., elemN); If you give arrayLength to the constructor, an array with the given initial length is constructed. You can access this value using the length property (see "Array.length"). If the value specified is not a number, an array of length 1 is created, with the first element having the specified value. The maximum length allowed for an array is 4,294,967,295. The second form constructs an array from a list of values; the array is initialized with the specified values as its elements, and the array's length property is set to the number of arguments. Array.length -------------------------------------------------------------------------------- value = array.length; Property which reflects the length of the array (the number of elements in the array). For an empty array, length is 0. You can set the length property to truncate an array at any time. When you extend an array by changing its length property, the number of actual elements does not increase; for example, if you set length to 3 when it is currently 2, the array still contains only 2 elements. Array.pop() -------------------------------------------------------------------------------- elem = array.pop(); Removes the last element from an array and returns that element. Array.push() -------------------------------------------------------------------------------- newLength = array.push(elem0, elem1, ..., elemN); Adds one or more elements to the end of an array and returns the new length of the array. Array.reverse() -------------------------------------------------------------------------------- array.reverse(); Reverses the order of the elements of an array - the first becomes the last, and the last becomes the first. Example: myArray = new Array("one", "two", "three"); myArray.reverse(); // myArray[0] is now "three" // myArray[1] is now "two" // myArray[2] is now "one" Array.shift() -------------------------------------------------------------------------------- elem = array.shift(); Removes the first element from an array and returns that element. Array.sort() -------------------------------------------------------------------------------- array.sort([fn]); Sorts the elements of an array. For this purpose, you have to provide a function that can compare two elements in fn: - If fn(a, b) returns a value less than 0, b is sorted to a lower index than a. - If fn(a, b) returns 0, a and b are assumed to be equal. - If fn(a, b) returns a value greater than 0, b is sorted to a higher index than a. So, a compare function for sorting numbers can have the following form: function compareNumbers(a, b) { if( a < b ) { // a is less than b return -1; } if( a > b ) { // a is greater than b return 1; } return 0; // a must be equal to b } Or more simple: function compareNumbers(a, b) { return a - b; } If you do not specify a compare function, the array is sorted lexicographically (in dictionary order) according to the string conversion of each element. Example: var test = new Array("yellow", "green", "red"); test.sort(); // test[0] is now "green" // test[1] is now "red" // test[2] is now "yellow" Array.splice() -------------------------------------------------------------------------------- removed = Array.splice(index, count, [elem1, elem2, ..., elemN]); Changes the array by removing count elements at position index and optionally adds elem1, elem2, ..., elemN instead. - index is the offset in the array at which to start changing the array; this may be a value between 0 and Array.length-1. - count are the number of elements to remove at the given offset; if set to 0, no elements are removed; in this case, you should specify at least one new element. - elem1, elem2, ..., elemN are the elements to add to the array. If you don't specify any elements, splice simply removes elements from the array. - If you specify a different number of elements to insert than the number you're removing, the array will have a different length at the end of the call. The splice method returns an array containing the removed elements. If only one element is removed, an array of one element is returned. Example: var test = new Array("yellow", "green", "red"); removed = test.splice(1, 1, "blue"); // test[0] is now "yellow" // test[1] is now "blue" // test[2] is now "red" // test.length is still 3 // removed[0] is "green" removed = test.splice(1, 1); // test[0] is now "yellow" // test[2] is now "red" // test.length is now 2 // removed[0] is "blue" Array.unshift() -------------------------------------------------------------------------------- newLength = array.unshift(elem0, elem1, ..., elemN); Adds one or more elements to the front of an array and returns the new length of the array. Array.concat() -------------------------------------------------------------------------------- newArray = array.concat(value1, value2, ..., valueN); Returns a new array built out of the given array plus other array(s) and/or value(s). Example: colours = new Array("red", "green", "blue"); fruits = new Array("apple", "banana"); together = colours.concat(fruits); // together[0] is set to "red" // together[1] is set to "green" // together[2] is set to "blue" // together[3] is set to "apple" // together[4] is set to "banana" evenMore = together.concat(1, 2); // evenMore[0] is set to "red" // evenMore[1] is set to "green" // evenMore[2] is set to "blue" // evenMore[3] is set to "apple" // evenMore[4] is set to "banana" // evenMore[5] is set to 1 // evenMore[6] is set to 2 Array.join() -------------------------------------------------------------------------------- string = array.join(separator); Joins all elements of an array to a single string. The elements are separated by the given separator string; if left out, the comma is used to separate the elements. Example: colours = new Array("red", "green", "blue"); t1 = colours.join(); // t1 is set to "red,green,blue" t2 = colours.join(" and "); // t2 is set to "red and green and blue" t3 = colours.join(""); // t3 is set to "redgreenblue" Array.slice() -------------------------------------------------------------------------------- newArray = array.slice(begin, [end]); Returns a section of the array as a new array. The section is defined by the parameters begin and end: - begin - Zero-based index at which to begin extraction. - end - Zero-based index at which to end extraction. slice extracts up to but not including end. If end is omitted, slice extracts to the end of the array. Example: var test = new Array("yellow", "green", "red", "blue"); part = test.slice(1, 3); // part.length is 2 // part[0] is "green" // part[1] is "red" // "test" is not changed String Object ================================================================================ The string object provides everything you should need to work with strings. See also: RegExp Object String Constructor -------------------------------------------------------------------------------- var string = "A new string object"; The statement above construct a new string object that can be use with all string methods (see "String Object"). String.length -------------------------------------------------------------------------------- value = string.length; Read only property which reflects the length of the string. For an empty string, length is 0. String.fromCharCode() -------------------------------------------------------------------------------- result = String.fromCharCode(charCode1, charCode2, ..., charCodeN); Returns a string created by using the specified sequence of Unicode values. See also: String Constructor String.charAt() -------------------------------------------------------------------------------- result = charAt(index); Returns the character at the specified index. String.charCodeAt() -------------------------------------------------------------------------------- result = string.charCodeAt(index); Returns the number indicating the Unicode value of the character at the given index. String.concat() -------------------------------------------------------------------------------- result = string.concat(str2, str3, ...); This function appends all given strings to the string in the string object and returns the result. String.indexOf() -------------------------------------------------------------------------------- result = string.indexOf(searchString [,fromIndex]); Returns the index within the calling string object of the first occurrence of searchString. If searchString was not found, -1 is returned. String.lastIndexOf() -------------------------------------------------------------------------------- result = string.lastIndexOf(searchString [,fromIndex]); Returns the index within the calling string object of the last occurrence of searchString. If searchString was not found, -1 is returned. String.match() -------------------------------------------------------------------------------- result = string.match(regexp); The function matches the string object agains the given regular expression and returns all requested matches. See also: RegExp Object String.replace() -------------------------------------------------------------------------------- result = string.replace(regexp, newSubString); The function searched the string for the regular expression and replaces it by newSubString in the resulting string. Example: str = "Test"; print(str.replace(/t/, "X")); // this will print "TesX" str = "Test"; print(str.replace(/T/, "X")); // this will print "Xest" str = "Test"; print(str.replace(/t/gi, "X")); // this will print "XesX" (note the "g" and "i" flags) See also: RegExp Object String.search() -------------------------------------------------------------------------------- result = string.search(regexp); The function the index of the regular expression inside the string. If the regular expression was not found, returns -1 is returned. See also: RegExp Object String.slice() -------------------------------------------------------------------------------- result = string.slice(beginslice [,endSlice]); Extract a section of a string and return a new string. The section to extract is defined by beginSlice which is the zero-based index at which to begin extraction. and endSlice which is the zero-based index at which to end extraction. If endSlice is omitted, the function extracts to the end of the string. String.split() -------------------------------------------------------------------------------- result = string.split(separator); Split a string object into an array of strings by separating the string into substrings. Separation is done using the string given as separator. Example: var mystr = 'a,b,c'; var result = mystr.split(','); // result is now an array with the length 3 containing // the three strings 'a', 'b' and 'c' String.substr() -------------------------------------------------------------------------------- result = string.substr(start [,length]); Returns the characters in a string beginning at the specified location through the specified number of characters. start is the location at which to begin extracting characters (an integer between 0 and one less than the length of the string). length are the number of characters to extract. Some special cases: - If start is positive and is the length of the string or longer, substr returns no characters. - If start is negative, substr uses it as a character index from the end of the string. If start is negative and abs(start) is larger than the length of the string, substr uses 0 is the start index. - If length is 0 or negative, substr returns no characters. If length is omitted, start extracts characters to the end of the string. Example: var anyString = "Silverjuke"; // Sets test to "verj" var test = anyString.substr(3, 4); String.substring() -------------------------------------------------------------------------------- result = string.substring(indexA [,indexB]); indexA is an integer between 0 and one less than the length of the string. The optional indexB is an integer between 0 and the length of the string. Then the function extracts characters from indexA up to but not including indexB. Some special cases: - If indexA equals indexB, substring returns an empty string. - If indexB is omitted, substring extracts characters to the end of the string. - If either argument is less than 0 or is NaN, it is treated as if it were 0. - If either argument is greater than stringName.length, it is treated as if it were stringName.length. Example: var anyString = "Jukebox"; // Sets test to "Juk" test = anyString.substring(0,3); test = anyString.substring(3,0); // Sets test to "box" test = anyString.substring(4,7); test = anyString.substring(7,4); // Sets test to "Jukebo" test = anyString.substring(0,6); // Sets test to "Jukebox" test = anyString.substring(0,7); test = anyString.substring(0,10); String.toLowerCase() -------------------------------------------------------------------------------- result = string.toLowerCase(); Returns the calling string value converted to lowercase. String.toUpperCase() -------------------------------------------------------------------------------- result = string.toUpperCase(); Returns the calling string value converted to uppercase. RegExp Object ================================================================================ The RegExp object provides some tools to work with regular expressions. See also: String.search(), String.match(), String.replace() RegExp Constructor -------------------------------------------------------------------------------- obj = /pattern/flags; obj = new RegExp(pattern, [flags]); Both statements - the literal form and the constructor function - construct a regular expression object with the given pattern and some optional flags. Example: var re = /e/; while( (input=prompt('Enter a word with an "e" ...')) ) { if( re.test(input) ) alert(input + ' contains an "e".'); else alert(input + ' does not contain an "e".'); } RegExp.exec() -------------------------------------------------------------------------------- result = RegExp.exec(input); This function takes an input string and matches it agains the regular expression of the RegExp object. All matches are returned simelar to String.match(). See also: RegExp.test(), String.match() RegExp.test() -------------------------------------------------------------------------------- result = regexp.test(input); This function checks if a given input string matches against the given regular expression object. If a match was found, the function returns true, else false is returned. For more information (but slower execution) use the RegExp.exec() method which is similar to String.match() then. Example: var re = new RegExp("e"); while( (input=prompt('Enter a word with an "e" ...')) ) { if( re.test(input) ) alert(input + ' contains an "e".'); else alert(input + ' does not contain an "e".'); } See also: RegExp.exec(), String.match() Globals ================================================================================ The following methods are not bound to any object. eval() -------------------------------------------------------------------------------- var result = eval(string); This is a top-level function that is not associated with any object. The argument of the eval function is a string. If the string represents an expression, eval evaluates the expression. If the argument represents one or more statements, eval performs these statements. Finally, the eval() returns the most recent result of the expressions or statements. Note: If the argument of eval is not a string, eval returns the argument unchanged. Example: eval(new String("2+2")); // returns a String object containing "2+2" eval("2+2"); // returns 4 parseInt() -------------------------------------------------------------------------------- result = parseInt(string, [radix]); This function takes the given string and tries to convert it to an integer number regarding the radix (aka base). If the radix is not specified or is specified as 0, we assumes the following: - If the input string begins with "0x", the radix is 16 (hexadecimal). - If the input string begins with "0", the radix is eight (octal). - If the input string begins with any other value, the radix is 10 (decimal). If the first character cannot be converted to a number, parseInt() returns NaN. You can call the isNaN() function to determine if the result of parseInt() is NaN. Example: // The following statements all set i to 15: i = parseInt("F", 16); i = parseInt("17", 8); i = parseInt("15", 10); i = parseInt(15.99, 10); i = parseInt("fire123", 16); // "f" is parsed, "i" is not in base i = parseInt("1111", 2); i = parseInt("15*3", 10); // "*" is not in base, use eval() for calculations i = parseInt("12", 13); // uncommon base // This statement sets i to NaN - "Jukebox" is not a number at all i = parseInt("Jukebox", 8); // This statement sets i to NaN - "0x6" is not in base 10 format i = parseInt("0x6", 10); // This statement sets i to NaN - for base 2 only the 0 and 1 are valid i = parseInt("234", 2); parseFloat() -------------------------------------------------------------------------------- result = parseFloat(string); This function takes the given string and tries to convert it to an floating point number. If it encounters a character other than a sign (+ or -), numeral (0-9), a decimal point, or an exponent, it returns the value up to that point and ignores that character and all succeeding characters. Leading and trailing spaces are allowed. If the given string cannot be converted, the function returns NaN. You can call the isNaN() function to determine if the result of parseFloats() is NaN. Example: // The following statements all set f to 3.14: f = parseFloat("3.14"); f = parseFloat("3.14*2"); // "*" is ignored, use eval() for calculations f = parseFloat("314e-2"); f = parseFloat("0.0314E+2"); f = parseFloat("3.14bla"); // "bla" is just ignored // The following statement sets f to NaN: f = parseFloat("bla"); isNaN() -------------------------------------------------------------------------------- result = isNaN(val); NaN stands for "Not a Number", which is a special value a number type can have. With the global function isNaN() you can check if a given number is a number (return value is false) or is not a number (return value is true). Example: isNaN(NaN); // returns true isNaN("string"); // returns true isNaN("12"); // returns false isNaN(12); // returns false isFinite() -------------------------------------------------------------------------------- result = isFinite(val); You can use this method to determine whether a number is a finite number. The isFinite method examines the number in its argument. If the argument is NaN, positive infinity or negative infinity, this method returns false, otherwise it returns true. decodeURI() -------------------------------------------------------------------------------- var result = decodeURI(encodedUri); Replaces each escape sequence in encodedUri with the character that it represents, the result is returned. encodedUri may have beed created by previously by encodeURI() or by a similar routine. decodeURIComponent() -------------------------------------------------------------------------------- var result = decodeURIComponent(encodedUriComponent); Replaces each escape sequence in encodedUriComponent with the character that it represents, the result is returned. decodeURIComponent may have beed created by previously by encodeURIComponent() or by a similar routine. encodeURI() -------------------------------------------------------------------------------- var result = encodeURI(string); Encodes each character in string as an escape sequence if needed. The following characters are not encoded: - _ . ! * ' ( ) ; / ? : @ & = + $ , # a-z A-Z 0-9 The resulting string is returned. The function assumes that the string is a complete URI, so it does not encode some reserved characters that have special meaning in the URI; to encode more characters, use encodeURIComponent(). To decode the encoded string, use decodeURI(). Example: s = encodeURI("foo bar"); // s is "foo%20bar" now - space is encoded s = encodeURI("foo&bar"); // s is "foo&bar" now - "&" is not encoded by encodeURI() s = encodeURIComponent("foo&bar") // s is "foo%26bar" now - "&" is encoded by encodeURIComponent() encodeURIComponent() -------------------------------------------------------------------------------- var result = encodeURIComponent(string); Encodes each character in string as an escape sequence if needed. The following characters are not encoded: - _ . ! * ' ( ) a-z A-Z 0-9 The resulting string is returned and can be forwarded as parts of an URI, eg. entered parameters; to encode a complete URI, use encodeURI() instead. To decode the encoded string, use decodeURIComponent(). Example: s = encodeURI("foo bar"); // s is "foo%20bar" now - space is encoded s = encodeURI("foo&bar"); // s is "foo&bar" now - "&" is not encoded by encodeURI() s = encodeURIComponent("foo&bar") // s is "foo%26bar" now - "&" is encoded by encodeURIComponent() print() -------------------------------------------------------------------------------- print(string); Prints out the given string to the console. The console is not raised or opened automatically, however, this can be done by the user anytime. Using Dialog.show() you can also open the console by your script. logError() -------------------------------------------------------------------------------- logError(msg); Logs and displays an error. If several errors or warnings must be logged, just call this function several times; if possible the console is opened as soon as possible then. logWarning() -------------------------------------------------------------------------------- logWarning(msg); Logs and displays a warning. If several errors or warnings must be logged, just call this function several times; if possible the console is opened as soon as possible then. alert() -------------------------------------------------------------------------------- alert(msg); This static function simply shows a dialog with the given message. confirm() -------------------------------------------------------------------------------- yesNo = confirm(msg); This static function shows a dialog given message and two buttons, "Yes" and "No". If the user hits "Yes", the function returns true, else false is returned. Example: function Aclicked() { return confirm('goto "A"?'); } In your skin you can call this function eg. using: <button target="gotoA" onclick="Aclicked();" />. prompt() -------------------------------------------------------------------------------- input = prompt(msg, [defaultValue]); This static function shows a dialog with a message and the possiblity to enter any (string) value. The function returns the value entered by the user or false if the user hits the "Cancel" button. With defaultValue you can specify what should be shown initally in the value text control. Example: var name = prompt('Please enter your name:'); if( name ) { alert('Welcome, ' + name + '!'); } else { alert('Hello guest!'); } fileSel() -------------------------------------------------------------------------------- file = fileSel([msg], [defaultFile], [flags]); This static function shows a dialog where the user can select a file. - With msg you can define a little text that is shown to the user (normally in the title bar) - With defaultFile you can define the path and the file initally selected. - flags can be set to 1 to show a "Save as" dialog or to 0 to show a "Open file" dialog. If flags is left out, the "Open file" dialog is shown. - If the user selects a file, the function returns the path and the name of the file. - If the user hits the "Cancel" button, the function returns false. Example: var dlg; function onSelectFileButton() { var file = fileSel('Please select a file to use'); if( file ) dlg.setValue('file', file); } function onOpenDlgMenuEntry() { dlg = new Dialog(); dlg.addTextCtrl('file', 'File:'); dlg.addButton('select', 'Select...', onSelectFileButton); dlg.showModal(); } program.addMenuEntry('fileSel test', onOpenDlgMenuEntry); The example creates a little dialog (see "Dialog Object") where the user can enter a file name manually or select it using the "Open file" dialog. Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/docs/skinning.md������������������������������������������������������������������0000664�0000000�0000000�00000107422�12660066715�0017077�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������How to create Skins for Silverjuke ================================================================================ **Contents** - Overview - Tags - Skin-Tag - Layout-Tag - Img-Tag - Button-Tag - Scrollbar-Tag - Workspace-Tag - Input-Tag - Box-Tag - Tooltips-Tag - Div-Tag - Color-Tag - If-, Else-Tag - Include-Tag - Script-Tag - Targets - Targets for the Button-Tag - Targets for the Box-Tag - Targets for the Scrollbar-Tag - Targets for the Div-Tag Overview ================================================================================ **Whats needed** To create your own skins for Silverjuke, you need any text editor and any painting program. notepad.exe and paint.exe will do the job, however, you may prefer some more powerful applications For finalizing the skin, you need a ZIP-packer. Finalizing the skin is optional, but recommended if you want to spread the skin as all needed files are put into a single archive. **Files skins are build of** The skin definitions are read from one or more XML-files which specify the images to use and the interaction with Silverjuke. You should put all files together into a single folder which must have the extension .sjs (stands for silverjuke skin). While developing the skin, using a folder is very useful, as you can access each file directly. Later, if your skin is ready, you can compress the files in the folder (not the folder itself!) using any ZIP-Packer. After that, you have to rename the extension from .zip again to .sjs. Please also note, that the filenames in the packed skin are case sensitive. To use the skin in Silverjuke, the .sjs-folder or the .sjs-files must be in the program directory or in another search path (see Settings/Advanced/Further options/Search paths). BTW: The best way starting creating your own skins is to have a look at the existing skins. **Images and subimages** Depending on the way an image is used, several _subimages_ are expected inside an image (eg. to reflect different button states). These subimages are divided from each other using horizontal and vertical lines of the colour of the first upper left pixel in the whole image. We call this colour the _control colour_. Even if an image has only one subimage, you have to surround the image by the control colour. See the existing skins to get the idea. The second pixel in the first scanline defines the _mask colour_. Inside a subimage, you can use this colour to define a mask; for pixels with the mask colour the background is painted instead of the mask colour. Finally, the third pixel in the first scanline may optionally define the colour to skip an subimage, the _skip colour_. If you fill a subimage completly with the skip colour, this subimage is ignored by Silverjuke and, if possible, another subimage is used. Eg. if you do not want to create an image for special button states as "clicked", you may fill the subimage for this state with the skip colour. To remember the meaning of the first three pixels, you can use the alphabet: CMS - Control colour, Mask colour, Skip colour. In addition to a simple mask you can also use a full alpha channel. **Images formats** You may use PNG, GIF or BMP files for your images. As JPEG files do not save concrete colour values, which are needed eg. for the control colour, using this file format is not recommended. **Supported tags and targets** See the chapters Tags and Targets for a complete list. Tags ================================================================================ Skin-Tag -------------------------------------------------------------------------------- Tag: <skin> Child tags: <layout>, <tooltips>, <if>, <include>, <script> This tag introduces a new skin. The tag must appear exactly one time for a skin. To provide several skins in one *.sjs archive, you can use several *.xml files containing skin-tags. Attributes: - name - The name of the skin as it appears eg. in the selection dialog. This attribute is always required. - about - Any information about who created this skin. May be shown from within the skin selection dialog. - debuginfo - Set to "1" to show a loading protocol. The protocol will also be shown partly on errors. - debugoutline - Set to "1" to enable debug outlines. Debug outlines are automatically enabled on errors. - debugcond - Override the system conditions using any testing settings. May be usefull in combination with the if-tag. An example skin may look like the following: <skin name="Hello World!"> <layout="My Layout"> <!-- your default layout here --> </layout> </skin> Layout-Tag -------------------------------------------------------------------------------- Tag: <layout> Child tags: <img>, <button>, <scrollbar>, <workspace>, <input>, <box>, <div>, <if>, <include>, <script> This tag introduces a new layout for a skin. Each skin must have at least one layout. You can use several layouts for a single skin. Attributes: - name - The name of the layout. May be used as a target to allow switching between different layouts. This attribute is always required. A special name is "kiosk": this layout is used as the default layout in the kiosk mode. Note the remarks for if-tags when designing skins for the kiosk mode. - minh, maxw - The minimal size of the window in pixels. - maxh, maxw - The maximal size of the window in pixels. - defh, defw - The default size of the window in pixels. - usew, useh, usepos - Any optional unique names. Different layouts may have the same usew-/useh-/usepos-names and share the size and/or the position therefore. By default, every layout has its own, independent size and position. - doubleclicktarget - The action that should be performed on a double click in unused areas. You may use most targets that can be used for button- tags here; for a list of all available targets see the chapter Targets. Img-Tag -------------------------------------------------------------------------------- Tag: <img> Child tags: none With this tag you can paint a simple image in the window. Images do not receive any user input. Attributes: - src - The filename of the image to use. The image must have 3x1 or 1x3 subimages, depending on its orientation. Subimages may use a mask and may be skipped. The image is never stretched, but the middle subimage will be repeated to fill the given size, see the figures below. This attribute is always required. - x, y - The position of the image. The position is relative to the parent tag, point 0/0 is the upper left corner. You may give the position in pixels, as a percentage value or as a combination of both, eg. "50%-22" or "10%+70". Other Calculations are not supported. Moreover, for subsequent items, you can use "same" to use the same x- or y-value again or you can use "next" to use the position of the previous item plus its width or height. If x or y are not specified, "0" is used. - w, h - The width and the height of the image. You may give the size in pixels, as a percentage value or as a combination of both, eg. "50%-22" or "10%+70". Other Calculations are not supported. Moreover, for subsequent items, you can use "same" to use the width or the height of the previous item. With "opposite", you can also use the already calcualted width or height of the item itself. If the width or the height are not specified they default to the smallest possible image size. Do not forget to add the control colour border around the subimages (see chapter "Images and Subimages" in the introduction). The border is even needed if you use a simple image with only one subimage; please refer to the following images to get an idea of the possible orientations. A **horizontal image** must have the following subimages where prologue and epilogue may be skipped (replaced by the skip colour): CMSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C image C repeatable C image C C prologue C part C epilogue C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC A **vertical image** looks like the following - again, prologue and epilogue may be skipped (replaced by the skip colour): CMSCCCCCCCCCCC C C C image C C prologue C C C CCCCCCCCCCCCCC C C C repeatable C C part C C C CCCCCCCCCCCCCC C C C image C C epilogue C C C CCCCCCCCCCCCCC A **simple image** has only one horizonzally- and vertically-repeatable subimage as shown below. CMSCCCCCCCCCCC C C C repeatable C C part C C C CCCCCCCCCCCCCC Finally, some examples to get an idea about the x/y and w/h attributes: <!-- definition of x and y --> <img src="image1.png" x="100" y="200" w="300" h="400" /> <img src="image2.png" x="same+10" y="next" w="300" h="400" /> <!-- definition of width and height --> <img src="image1.png" x="100" y="100" w="100%-200" h="200" /> <img src="image2.png" x="200" y="200" w="same" h="100" /> <img src="image3.png" x="300" y="300" w="30%" h="opposite+10%" /> Button-Tag -------------------------------------------------------------------------------- Tag: <button> Child tags: none Buttons are one of the most important way to receive user input. Each button may be linked to a target which defines the action to take if the user clicks onto the button. Attributes: - target - The action to take on a click on this button. There are lots of several targets, eg. "Play" or "Pause", see the chapter Targets for a complete list. This attribute is always required. - onclick - Here you can give some scripting commands (see "Scripting") to Silverjuke and define, what should happen on a click on this button. Note: If you define a target, this target always comes with predefined commands (eg. obviously the target "play" should start playing) - so often, there will be no need to define explicit commands. If you use the onclick-attribute, you can return false from your onclick-handler to avoid the default target processing - else, the default target commands are executed after your script. - src - The filename of the image to use. The image must have at least 1x3 subimage where the first subimage is the "normal", the second is the "hover" and the third the "clicked" mouse state. If the button is selectable, 3 more subimages must follow representing the three mouse states for the selected button. Some targets use even more button states, eg. the Repeat target has the button states "off", "repeat all" and "repeat one". This attribute is always required. - srcindex - You can put the subimages of different buttons into a single image file - one column for one button. With this option you tell Silverjuke which column to use. "0" is the default value and represents the first column. - x, y, w, h - The position and the size of the button, see img-tag for more information about these attributes. - inactive - If set to "1", the button is not clickable, but the current state will still be shown. So you can use this option for displaying additional state information. Note: only the button gets inactive, other buttons with the same target, menus or shortcuts are not disabled. If set to "0", the button is clickable (default). - cmw - You can add an optional menu area aright of a button. Clicking left into this area is the same than clicking right onto the button. With "cmw" you define the pixel width (context menu width) of this area. A button image can have the following subimages: CMSCCCCCCCCCCCCCCCCCCCC.. . . . . . . . C C . C normal state C normal state . C (first button) C (second button, . C C srcindex="1") . CCCCCCCCCCCCCCCCCCCC. . . . . . . . . . C C . C normal hovered C normal hovered . C (first button) C (second button, . C C srcindex="1") CCCCCCCCCCCCCCCCCCCC. . . C C C normal clicked C C (first button) C C C CCCCCCCCCCCCCCCCCCCC C C C selected state C C (first button) C C C CCCCCCCCCCCCCCCCCCCC C C C selected hovered C C (first button) C C C CCCCCCCCCCCCCCCCCCCC C C C selected clicked C C (first button) C C C CCCCCCCCCCCCCCCCCCCC C C C other states . . (first button) . . Most subimages may be skipped. The width and height defaults to the size of the "normal" subimage. If a larger sizer is set later, the image will be centered vertically and/or horizontally. Scrollbar-Tag -------------------------------------------------------------------------------- Tag: <scrollbar> Child tags: none Scrollbars are used for scrolling the workspace or the display. Moreover, they are also used as sliders eg. for the volume control. Attributes: - target - The action to take if the scrollbar is used. There are lots of several targets, eg. WorkspaceHScroll, VolSlider or Seek, see the chapter Targets for a complete list. This attribute is always required. - src - The image to use for the scrollbar. Depending on the orientation, the image must have 3x5 or 5x3 subimages. See the figures below. This attribute is always required. - x, y, w, h - The position and the size of the scrollbar, see img-tag for more information about these attributes. - hideifunused - If set to "1", the scrollbar is hidden if it is currently not needed. Normally, the scrollbar is even shown in this case. - inactive - See button-Tag. An image for a vertical scrollbar looks like the following: CMSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C page up C page up C page up C C (normal) C (hover) C (clicked) C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C thumb prologue C thumb prologue C thumb prologue C C (normal) C (normal) C (clicked) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C C C C C C C C C thumb C thumb C thumb C C repeatable C repeatable C repeatable C C part C part C part C C (normal) C (hover) C (clicked) C C C C C C C C C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C thumb epilogue C thumb epilogue C thumb epilogue C C (normal) C (hover) C (clicked) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C page down C page down C page down C C (normal) C (hover) C (clicked) C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC The page up/down subimages must also be repeatable, the thumb will have a minimal height of prologue+epiloge height. If the repeatable part of the thumb is skipped, the thumb will have a fixed size (may be used for sliders). An image for a horizontal scrollbar looks like: CMSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C C C page C thumb C thumb C thumb C page C C left C prologue C repeatable part C epilogue C right C C (normal) C (normal) C (normal) C (normal) C (normal) C C C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C C C page C thumb C thumb C thumb C page C C left C prologue C repeatable part C epilogue C right C C (hover) C (hover) C (hover) C (hover) C (hover) C C C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C C C C page C thumb C thumb C thumb C page C C left C prologue C repeatable part C epilogue C right C C (clicked)C (clicked)C (clicked) C (clicked)C (clicked)C C C C C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC Page left/right/up/down functionality is done by normal buttons if wanted. Workspace-Tag -------------------------------------------------------------------------------- Tag: <workspace> Child tags: <color> Use this tag to specify the workspace. Currently, the workspace is always the list of all albums. Moreover, if no visualization-indent-rectangle is defined in any div-tag, the workspace may also be replaced by the visualization. Attributes: - x, y, w, h - The position and the size of the workspace, See img-tag for more information about these attributes. Input-Tag -------------------------------------------------------------------------------- Tag: <input> Child tags: <color> Use this tag to specify an input field. Currently, the input field is only used for the search. Attributes: - x, y, w, h - The position and the size of the input, See img-tag for more information about these attributes. Box-Tag -------------------------------------------------------------------------------- Tag: <box> Child tags: <color> With the box-tag you can draw a simple rectangle with or without a border (foreground) colour and with or without a background colour. If you link the box to a target, Silverjuke may draw some text using the foreground colour. If no background colour is given using the color-tag, the box is transparent. Attributes: - target - Most common targets are "Line00", "Line01" etc. and "DisplayCover". See the chapter Targets for a complete list. - x, y, w, h - The position and the size of the box, See img-tag for more information about these attributes. - border - "1" draws a border, "0" doesn't (default) - centerOffset - If text should be drawn centered (this is decided by Silverjuke, not by the skin) you can move the center origin to the left (negative pixel count) or to the right (positive pixel count) by this option. - inactive - See button-tag. - hideCreditInDisplay - special flag for the target CurrCredit, if set to "1", the display does not show the credit changes - text - The box will display the given line of text. Useful only if no target is set; the text should be encoded as UTF-8. - id - If you have defined a text using the text-Attribute, you may also want to change it afterwards. For this purpose, you can define an ID; then you can change the text of the box later using Program.setSkinText(). - font - With this attribute, you can use different font for different box items. Please specify the font name of an installed font here. You can also specify more than one name by using a comma separated list; Silverjuke will use the first match then. If the font cannot be found, a default font is used. Tooltips-Tag -------------------------------------------------------------------------------- Tag: <tooltips> Child tags: none With the tooltips-tag tag you can define the foreground and the background colours that should be used for the tooltips. Attributes: - bgcolor, fgcolor - The colours to use for the tooltips, always required. Only strict RGB colours as "#RRGGBB" are supported, see the color-tag for more information about colour definitions. - bordercolor - The colour of the 1-pixel-border, only strict RGB colours as "#RRGGBB" are supported, defaults to the foreground colour Div-Tag -------------------------------------------------------------------------------- Tag: <div> Child tags: <img>, <button>, <scrollbar>, <workspace>, <input>, <box>, <div>, <if>, <include>, <script> The div-tag may be used as a container for other items, as all positions and sizes of child items are relative to div-tag, using div-tags makes layouts easier to handle. div-tags may be nested. Attributes: - x, y, w, h - The position and the size of the container, see img-tag for more information about these attributes. - doubleclicktarget - The action that should be performed on a double click in unused areas. You may use most targets that can be used for button- tags here; for a list of all available targets see the chapter Targets. - target - Target for this container, currently only the target "VisRect" is usefull here. With "VisRect" you define the container the visualization will be displayed in. - visautostart - If the target is VisRect, and you set this attribute to "1", the vis. is started automatically together with the kiosk mode. - indent - Set indent borders for the vis. rectangle as "left,top,right,bottom" eg. "1,2,1,2" Color-Tag -------------------------------------------------------------------------------- Tag: <color> Child tags: none With the colour tag, you can specify the colours to use for an item. Note, that the tag is called "color" and not "colour". Attributes: - target - This attribute is always required and sets the colour target to set the colour for. This may be one of the following: - "normal" - eg. a track - "normalodd" - odd tracks and the cover background - "selection" - eg. a selected track - "selectionodd" - an odd selected track - "title1" - artist or album - "title2" - album - "title3" - disk number - "verttext" - the vertical text in the browser - "stubtext" - used for the message if nothing is found Not all items use all (or any) colour targets. - bgcolor - The background colour to use in the given colour target, only strict RGB colours as "#RRGGBB" are supported. Defaults to white ("#FFFFFF"). By convention, this attribute is ignored for "title1", "title2", "title3", "verttext" and "stubtext" and the "normal" background colour is used instead. - fgcolor - The foreground colour to use in the given colour target, only strict RGB colours as "#RRGGBB" are supported. Defaults to black ("#000000"). - hicolor - Used for hiliting eg. search string in the browser or as a shadow colour for other targets, only strict RGB colours as "#RRGGBB" are supported. Defaults to red ("#FF0000"). - offsetx, offsety - If "hicolor" is used as a shadow in a target, you can set the position of the shadow with these options. By default, "offsetx" is 1 and "offsety" is null which means the shadow goes to the right. For less typing, you may also set the "normal" colours directly in the item tags, eg. you can use <box fgcolor="#FF0000" /> instead of <box> <color target="normal" fgcolor="#FF0000" /> </box> Your favourite image processing program should be able to select and display such colours, however, there are also many colour pickers on the web, look eg. at http://de.selfhtml.org/helferlein/farben.htm . If-, Else-Tag -------------------------------------------------------------------------------- Tag: <if> Child tags: <img>, <button>, <scrollbar>, <workspace>, <input>, <box>, <div>, <tooltips>, <color>, <if>, <include>, <script> With this tag you can let tags appear only under certain circumstances. Attributes: - cond - Comma-separated list of conditions. Use the following strings to check the current operating system: - "win" - "mac" - "gtk" With the following strings you can check certain options: - "kiosk" - "creditsystem" - "playpause" - "editqueue" (includes "prev" and "next") - "unqueue" - "volume" - "search" - "startvis" - "enlargedisplay" - "albumview" - "coverview" - "listview" - "toggleview" (true if more than one view is available) - "toggleelements" - "toggletimemode" - "zoom" - "repeat" - "all" If you use the comma to give several options, the condition is true if any of the options is set. You can also negate the list by using "!" as the first character. If an older version of Silverjuke does not understand a condition, this version will always see the condition as _false_. - version - check if Silverjuke runs at least with the given version number. The version number must be given as "major.minor.revision" where "revision" may be skipped. Example: To check against version 15.1, use <if version="15.1">...</if> You should not use if-tags to skip complete layouts or skins for options that may change during Silverjuke is running (this is everything beside the os-flags). To test certain conditions, also note the attribute debugcond for the skin-tag. Finally, the else-tag may be used as follows: <if cond="mac"> ... </if> <else> ... </else> include-Tag -------------------------------------------------------------------------------- Tag: <include> Child tags: none Use this tag to include other XML-Files to the skin. This will have the same effect as just writing the content of the included file at the position of the include-tag. Attributes: - src - The name of the file to include. The file must be in the same directory, so do not prepend any path to the file name. Example: <include src="filetoinclude.xml" /> Script-Tag -------------------------------------------------------------------------------- Tag: <script> Child tags: none Use this tag to include a script to the skin. See the file _scripting_ for more information about scripts. Attributes: - src - The name of the script to include. The file must be in the same directory, so do not prepend any path to the file name. Example: <script src="scripting.js" /> Alternatively, you can also write the script directly to in the XML-file of a skin: <script> // your script here print('skin loaded, just a test'); </script> For details about scripting, see the chapter "Scripting" below. Targets ================================================================================ Targets for the Button-Tag -------------------------------------------------------------------------------- The following list shows possible targets for the button-tag. It is okay to use the same Target more than one time. button-targets may also be used as doubleclick targets for layout- or div-tags. There is no need to support all targets in a layout, it is up to you to decide which functions you want to implement by the skin. Many - but not all - functions are also available by the menus or by shortcuts. - AlwaysOnTop A click onto this button will toggle the "Always on top" state of the Silverjuke main window. This target is used in the "small layout view" of the default skin. - AdvSearch, Settings, Help A click on these button will open the "Music selection", "Settings" or "Help/About" dialogs. These targets are not used in the default skin; the functions are accessible from the menu or by shortcuts. - DisplayDown, DisplayUp Clicks on these buttons will scroll the display lines up or down. The display lines themselves are define by the targets Line00 .. Line99 using a box-tag. Also note the scrollbar-target DisplayVScroll. - EnqueueLast, EnqueueNext, EnqueueNow, Unqueue, UnqueueAll, Prelisten Clicks on these buttons will enqueue the track(s) selected in the browser, prelisten to them or unqueue the track(s) selected in the display. In the default skin, only the "UnqueueAll" target is used (see the large display layout). In the Skin "Silveriness Touched" we're also using the EnqueueNext target. The images show the targets UnqueueAll (left) and EnqueueNext (right). - MoreFromCurrAlbum, MoreFromCurrArtist Clicks on these buttons will enqueue missing tracks from the currently playing artist/album to be playing next. - GotoA, GotoB, GotoC .. GotoZ, Goto0 Clicks on these buttons will scroll the browser to the first album starting with the given letter or, in case of Goto0, to the first album starting with a character different from a-z. - GotoPrevLetter, GotoNextLetter Clicks on these buttons will scroll the browser to the previous or next letter. In the default skin, these targets are not used but you can use them in your own skins or define some shortcuts for them. - GotoRandom, GotoCurr, GotoFirst, GotoLast Go to a random, the current, the first or the last track in the browser. Only the target gotocurr is used in the default skin of Silverjuke. - OpenFiles, AppendFiles, SavePlaylist These targets open the "Open file(s)", "Append file(s)" and "Save playlist" dialogs. - Play, Pause, Prev, Next, FadeToNext The well-known player commands. Note that "Play" and "Pause" both do the same, toggling between play and pause. However, you may use both targets in your skin for layout reasons. The default skin only uses the target "Play". - Repeat, Shuffle, RemovePlayed "Repeat" toggles the repeat state from "off", "all" to "single" (in this direction). So make sure, you have defined enough subimages (see button-tag) to represent all button states. "Shuffle" and "RemovePlayed" just toggles the corresponding states. - SearchButton Starts/ends a search on click. As there are some important options in the context menu for this button, we've added a context menu area in the default skin (see the parameter "cmw" for the button-tag). - SeekBwd, SeekFwd With these buttons you can define explicit buttons for seeking. - StartVis This target starts or stops the currently selected or running visualization. Also note the div-target VisRect. - Stop, StopAfterThisTrack, StopAfterEachTrack These targets set the player to the "stop" mode - either immediately, after the running track or after each running track. The last option is useful esp. for karaoke setups where you have to hit the "play" button before each track then. This allows the next singer to prepare himself. All three targets are not used in the default skin but may be reached by the menu. - ToggleTimeMode A click on a button with this target toggles the time mode from "elapsed" to "remaining" and back. This target is also automatically provided by Silverjuke as a click on the running time in the display, therefore it is not used in the default skin. - ToggleKiosk A click on a button with this target switches the kiosk mode on and off. This target is not used in the default skin. - VolDown, VolUp, Mute Clicks on these targets alter the main volume. In the default skin we do not use the buttons and only use a volume slider defined by the scrollbar-tag VolSlider. However, in the skin Silveriness Touched we use the targets "VolDown" and "VolUp" - WorkspaceDown, WorkspaceLeft, WorkspaceRight, WorkspaceUp These targets alter the horizontal or vertical position in the browser. Also note the scrollbar-targets WorkspaceHScroll and WorkspaceVScroll. - WorkspacePageDown, WorkspacePageLeft, WorkspacePageRight, WorkspacePageUp These targets alter the horizontal or vertical position in the browser by one full page. If you use the "WorkspaceHScroll" or "WorkspaceVScroll" targets, this functionality is also available through the scrollbars by clicking aside of the thumb. - ZoomIn, ZoomOut, ZoomNormal These button targets alter the zoom of the browser. The target ZoomNormal is not used in the default skin but is available with the shortcut "*". - AlbumView, CoverView, ListView, ToggleView These button targets can be used to switch the current view of the workspace. Note that views can be disabled in the kiosk mode, you can check this using the if-tag. - Layout:yourLayoutName You can also use a layout as a target for a button. This allows you to use several switchable layouts, eg. you can show/hide some items this way. Targets for the Box-Tag -------------------------------------------------------------------------------- The following list shows possible targets for the box-tag. - DisplayCover Shows the cover of the currently played track. The cover is automatically scaled to the size of the box. - Box targets "Line00", "Line01" .. "Line99" With these targets you define the display lines. The font size is adapted to the height of the box, the strings to show are truncated, if needed. You should not forget to define DisplayVScroll and/or DisplayDown/DisplayUp targets - otherwise the user cannot scroll eg. the playlist show in the display. Moreover, you should define at least 2 display lines - otherwise some functions of Silverjuke won't work. The normal view of the default skin only uses the targets Line00, Line01 and Line02. - Box targets "CurrTrack", "NextTrack" and "CurrTime" These targets may be used in addition or as a replacement for the "line" targets and display the current and the upcoming track and the elapsed or remained time of the current track. If there is not current/next track, the targets display an empty string or "-:-" for the time. - SearchInfo If you use this target for a box, some search information as the number of matches are shown in the box. Normally, this target is placed close to a search target. - CurrCredit If you use this target for a box, the currently available credits are shown as a number in the box. If there are no credits left, "0" is shown, if the credit system is not enabled and there are infinite credits available, "oo" is shown. Targets for the Scrollbar-Tag -------------------------------------------------------------------------------- The following list shows possible targets for the scrollbar-Tag - DisplayVScroll This target sets the scrollbar to scroll the display (eg. the tracklist) up and down. The display lines themselves are define by the targets Line00 .. Line99 using a box-tag. Also note the button-targets DisplayDown and DisplayUp. - Seek This target sets the scrollbar to alter the playing position of the currently played track (it is used in the default skin as a very thin bar atop of the display). - VolSlider This target sets the scrollbar to alter the main volume of Silverjuke. Also note the button-targets VolUp, VolDown and Mute. - WorkspaceHScroll, WorkspaceVScroll These targets set the scrollbar to alter the horizontal or vertical position in the browser. Also note the button-targets WorkspaceDown, WorkspaceLeft, WorkspaceRight and WorkspaceUp. Targets for the Div-Tag -------------------------------------------------------------------------------- The following list shows possible targets for the div-tag. - VisRect With "VisRect" you define the container the visualization will be displayed in. If you do not define a div-area with this target, the workspace-tag is used as the area to display the visualization in. Also note the button-target StartVis. The image shows the workspace (green) and the VisRect (red) used in the default skin. - Layout:yourLayoutName You can also use layouts as a doubleclick target for a div-tag. This allows you to use several switchable layouts, eg. you can show/hide some items this way. Moreover, you can use the button-targets from above as doubleclick targets for the div-tags. Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/docs/user-guide.md����������������������������������������������������������������0000664�0000000�0000000�00000156707�12660066715�0017342�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Silverjuke User Guide ================================================================================ **Contents** - First Steps - My Music Library - Combine tracks to Albums - Update Music Library - Using Covers - Search Covers on the Web - Playback - Queue - Automatic Control and Fading - Karaoke - Skins, fonts, covers and view - Kiosk Mode - Functionality - Monitors - Virtual Keyboard - Numpad - Credit System - Music Selection - SQL Expressions - Playlists - Edit Tracks - Replace - Split Fields - Rename Files - Query freedb - Visualizations - Advanced and further options - globals.ini First Steps ================================================================================ After you have downloaded Silverjuke from http://www.silverjuke.net/ and started the program, you have to add your music files to your music library. For this purpose, just drag the folders with music files to the main window. Alternativly, select the page "Music library" in the "Jukebox Settings" dialog. The (empty) list shows all sources used to build your music library from. Click on the button "Add source" and select a folder with your music files. Music files are read recursively. If your music files are in different folders, you have to repeat this step for every folder. After clicking "OK", Silverjuke starts searching the given folders for music files recursively. Depending on the number of music files, this may take some minutes, for further information see "Music Library" below. **Usage** We tried to make the usage of Silverjuke as easy as possible - so maybe you can stop reading here and just try out the program yourself... **Search for albums and tracks** To scroll the albums in the main window, use the well-known scrollbars which are normally placed aright and abottom. You can also use the mouse-wheel for this purpose - if you hold the right mouse button while using the wheel, Silverjuke scrolls horizontally. The letters "A" to "Z" show your position in the album list. Click a letter just to go to a certain position. To search an artist, an album or a track, just type the name into the search field - maybe the first letters of the name are enough. Normally, there is no need to commit your search - Silverjuke starts searching and displays the result at once. If you want to stop a search and view all albums, empty the search field, click one of the letters "A" to "Z" or just hit "Esc". See the chapter "Music Selection" for further searching options. **Sorting** By default, the albums are sorted by the name of the artist, the year of the album and finally by the name of the album itself. If Silverjuke cannot obtain the needed information, the tracks will be found under the name of the genre or under "Unsorted tracks". In this case you should edit the tracks and add the missing information (see "Edit tracks" below). More sorting options are described in the chapter "Music Library". **Playing tracks** To play a track, just double-click its name in the album list. Repeat this for each track you want to listen to and Silverjuke will play the tracks successively. Using the context menu (normally invoked using the right mouse button) you may also add the tracks to other positions in the queue. By the way, you'll find some more functions menu and in the context menus - just try them out. **Seeking** If you want to seek inside a track, use the little bar atop of the display (this is true for the Skin "Silveriness" - other skins may have different approaches). The bar shows the current playback position inside a track. By clicking on the end of the bar and dragging the mouse left or right you can seek to another position. Music Library ================================================================================ In the "Music Library", you have to tell Silverjuke all sources (folders, files, (compressed) archives, servers and so on) to read music-files from. To open the dialog, select "Jukebox settings" from the menu and the the page "Music Library". Using the corresponding buttons, you can easily add or remove sources. Moreover, you can set several options for each source. The sources themselves will _not_ be modified by Silverjuke. Removing a source for instance will just delete the reference to this source, not the source itself. If you add a folder as a source, Silverjuke will automatically scan all subdirectories recursively. Combine tracks to Albums -------------------------------------------------------------------------------- To combine difference tracks from different sources to albums, Silverjuke uses its own algorithm which can be configured at "Jukebox Settings / Combine tracks to Albums": - Tracks belong together if the artist name and/or album name of different tracks is identical [1]. If this is true for a given number of tracks, Silverjuke will assume these to be an album. This given number of tracks can be edited using the first value. The default value is 2. - To avoid splitting samplers or compilations into several pieces by the method described above, you can use the second value to define how many tracks of the same artist a sampler may have. This value should be larger than the first value. The default value is 4. Note: You should edit these values only if you really understand what they do - normally you will be happy with the default values. The sorting order of artist- and album names can be optimized by defining stop-words which have to be ignored at the beginning of the name so that these words will be skipped from the sorting. Eg. if you decide to ignore the word "the", "The Rolling Stones" will be read "Rolling Stones, The" and their albums will be found under "R" instead of "T". Separate the stop-words using commas, the function is case-insensitive. To avoid omitting special word groups, just add them complete. Eg. if you want to ignore the german article "die" but leave the band "Die Happy" as it is, type in "die, die happy". Moreover, you can decide whether the ignored words should be displayed tailing or leading the search term - however this does not affect the sorting. The above mentioned example, "The Rolling Stones" will always be sorted in the "R"-list but you can decide whether Silverjuke will display "Rolling Stones, The" (ignored words tailing) or "The Rolling Stones" (ignored words leading). For using covers, see the chapter "Using Covers". Footnotes: [1] The genre may be used as an additional criteria. Moreover, if you really have only one album per directory, you can also select the directory as the main sort criterion. Update Music Library -------------------------------------------------------------------------------- Silverjuke saves all information on the music-files in its own database. Normally, this database will be updated automatically as needed, for instance, if you add a folder or change special options. This update process may take some minutes for the first time as Silverjuke has to analyze all music files. You should not abort the process without reasons - otherwise the Silverjuke database is out of sync with the music files. If you abort the process anyway or if you change music files outside from Silverjuke you can start the update process manually using "Jukebox Settings / Music Library / Update Music Library" or by just hitting the key "F5". With the option "recreate music library" the music library will be recreated "from scratch" which may take more time. Using Covers ================================================================================ When creating or updating your music library, Silverjuke automatically searches for images embedded in music files (eg. by ID3-tags) and for images in the same directory as a music file. Silverjuke assumes that one of the pictures found is useful as a cover. Currently the file formats BMP, GIF, ICO, IFF, JIF, JPE, JPEG, JPG, PXX, PNG, PNM, TIF, TIFF, XPM are supported. If several images are found, the correct cover is identified by one of the keyword defined in "Jukebox Settings / Music Library / Combine tracks to Albums": - With the keywords you can define which words should appear in the file name of an image that should be used as the correct cover. - Separate several keywords using a comma, keywords are not case-sensitive, and keywords aleft have a higher priority. - If none of the keywords match to one of the images found, Silverjuke uses the first image as the cover for an album. Example: Assume you have the images with the names "cover_front.jpg" and "cover_back.jpg" in a folder together with the tracks of an album. If you have defined the keywords as "front, outside, cover", the image "cover_front.jpg" will be used as the keyword "front" has the highest priority and matches first **If no cover is found...** ...Silverjuke creates one of its own ;-) However, you may want to use a more original using the option Search Covers on the Web. For this purpose, click with the right mouse button onto the (maybe wrong) cover and select one of the options below "Search Covers on the Web" from the context menu. After that, Silverjuke opens the internet browser with your request. Within the browser, just save the correct cover eg. into the directory with the album tracks. When updating your music library next, the new cover should be used for the album. Alternatively, you can copy the image to Silverjuke using the clipboard (move the mouse to the desired album row) or simply using drag'n'drop. However, note that "drag'n'drop" does not work with all browsers. **Set covers manually** The automatic cover recognition may be overrided by you for some albums. For this purpose, just click with the right mouse button onto a cover and select one of the images presented under the option "Select cover"; you can also select a completely different cover using the option "Select cover / Browse". **Enlarge covers** In the main window you can zoom the covers together with the track lists using the keys "+" and "-". The key "*" sets the zoom back to the normal size. To enlarge a single cover and show it full screen, just double click onto the cover; this also leads us to the next topic: **Edit covers** To edit a cover, double click onto the cover. In the enlarged cover view, you can use the following options from the context menu (right mouse button): - You can rotate the cover in 90 degrees step, - you can mirror the cover horizontally or vertically, - you can change the brightness and the contrast, - you can grayscale or negative the cover, - and finally you can crop it. For cropping covers, click with the left mouse button onto the upper left corner of the desired selection, hold the mouse button and move the mouse to the lower right corner. To remove a cropped selection, use the context menu or hit the key "C". Btw. the context menu for editing covers is also available in the main window. **Options for all covers** Finally, there are some options that affect all images; you find them in the context menu of a cover: - You can smooth images which may increase the image quality. Using the key "Alt-S" you may switch this option on and off to get the idea. - When enlarging covers, you can decide whether the enlarged cover should fit to screen or to the main window. Moreover, using the option use default images, you can reset the manually selection images back to the images automatically recognized by Silverjuke. Search Covers on the Web -------------------------------------------------------------------------------- If you want to search covers on the web, click with the right mouse button onto the (maybe wrong) cover and select one of the options below "Search covers on the web" from the context menu. After that, Silverjuke opens the internet browser with your request. Within the browser, you have the following possibilities to embed the cover to Silverjuke: - Clipboard Choose the wanted cover in the browser and make sure the image is not too small. After that, inside the browser, click the right mouse button on the desired cover and select the option "Copy" (or simelar, however, do not use "Copy link location"). Switch to Silverjuke. In Silverjuke, click with the right mouse button on the (missing) cover and select the option "Open cover/Past image from clipboard" from the context menu. - Drag'n'Drop Choose the wanted cover in the browser and make sure, both, the browser and Silverjuke, are visible on the screen. After that, click and hold the left mouse button on the desired image in the browser window and move the mouse to the corresponding album row in Silverjuke. If you want to create a copy of the image in the album's directory, please hold the "CTRL" key while this operation. Unfortunately, this method does not work in all browsers. - Save as Inside the browser, click the right mouse button on the desired cover and select the option "Save image as..." (or simelar, however, do not use "Save target as..." if you do not know exactly that the target is an image of higher quality). In the appearing "Save as"-dialog, select a directory (using the folder where the *.mp3 files of the album are placed in is normally a good choice) and hit "OK". In Silverjuke you can open the saved cover explicitly by clicking with the right mouse button on a cover and selecting "Open cover/Open file...". If you have saved the image to the album's directory, it will also be used implicitly on the next update of your music library (eg. hit "F5" for this purpose). Playback ================================================================================ In the dialog "Jukebox Settings / Playback" you can configure different hardware and software options affecting the playback in Silverjuke. Queue -------------------------------------------------------------------------------- - With the option "Kiosk mode: Allow max. ... tracks waiting" in the queue you can avoid having too many titles waiting in the queue. If a user tries to enqueue a title in this case, a warning is shown in the display. - "Kiosk mode: Avoid double tracks waiting in queue" - "Remove played tracks from queue" - "Avoid boredom" - With "Shuffle intensity" you can configure how "randomly" the shuffle mode of Silverjuke should be. Moreover, you can define, that Silverjuke should take care about not playing one title several times in a given time period. Use the option avoid boredom for this purpose. With the button "Reset to default values" you can init all options _only_ on this page to their default values. Automatic control and Fading -------------------------------------------------------------------------------- With the options at "Jukebox Settings / Automatic control" you can define which actions should be done automatically after given timeouts or at certain conditions. **AutoPlay** You can use the option If the playlist is empty ... to let Silverjuke enqueue and play tracks automatically: - With the first input field, you'll define the number of minutes Silverjuke should wait on empty playlists before taking further actions. - After the given number of minutes, Silverjuke plays the number of tracks defined in the second input field. - The tracks to play are chosen randomly from the selected Music Selection in the last popup. You may also define your own Music Selections and use them here, more details are found the chapter Music Selections (btw. you can open the "Music Selection"-Dialog directly for here by pressing the button "..."). Finally, some hints to the option "If the playlist is empty": - If "Repeat" is enabled or if you stop Silverjuke manually, no automatic playback takes place. - The automatic playback flow is interrupted if a user puts a new title to the queue. However, the currently playing title will always be played to end. - If the given number of tracks have been played, Silverjuke waits again the given time span; after that, it plays again the given number of tracks. This all is repeated until a user enqueues a track itself. - If you set the number of minutes to "0", Silverjuke plays further tracks immediately if the playlist gets empty. In this case, the number of tracks to play is meaningless. - The automatic playback also takes plave if you've just started Silverjuke. If you've set the number of minutes to "0" in this case, Silverjuke will start playback immediately after the program start. **Sleep mode** With these options you can force a specific behaviour at a given time or after a given timeout. **Fading** If you click on the button "Fading...", you can open another dialog where you can configure several options affecting (cross-)fadings. The option Automatic crossfades enables smart changes between tracks. This is done by fading the volume down at the end of the playing track while fading the volume of the next track up at the same time. The length of the fading process can be configured using the slider. We recommend values about 10 seconds. Moreover, you should leave the option skip silence between tracks enabled - otherwise this effect may just fade in and out silent parts of the tracks and you won't hear anything. With the slider beside Manual crossfades you can define the time for a crossfade initiated manually by you. You can start manual crossfades by using the (context-)menu option "Playback / Fade to next" or by holding down the "Shift" key when pressing eg. the forward button. **Volume control** In a large music library, many tracks may have different volume levels. If these tracks are played after each other, the one tracks seems to be louder than the other one. To avoid adjusting the volume always manually, you can use the effect "Automatic volume" which calculates the perfect volume and stores it in your music library. The effect has the following options: - With the option desired volume you can set the relative overall volume, normally you should leave +0 dB here. - With the Max. gain you define the maximal amplification that may be used to reach the desired volume for a track. If the max. gain is too small, the automatic volume won't work for more quietly tracks; if it is too large, you may notice overdrives if the calculated volume is not yet perfect. Normally, you should simply leave the default value here. - With the adjustment time you define the time that is used for smooth volume changes inside a track. Volume adjustments are needed if you play a track for the first time and the first assumption of the volume is not perfect and needs to be corrected. - Finally, if Play all tracks of an album with the same volume is enabled, Silverjuke regards all tracks of the album together, so that all tracks of an album will have the same calculated gain. You should enable this option only if all tracks of the albums come from the same source, eg. from a CD, so that one can assume any volume changes are wanted by the artist. To avoid misunderstandings: Low volumes inside a track stay low and loud ones stay loud. Only the overall volume for the duration of a track will be adapted. When a new track starts, the volume will be adapted again. However, during the first playback of a track, the calculated volume may be corrected. **Further options** - "Go to current track after ... minutes of inactivity": If there is no user input [1] in the given number of minutes, Silverjuke will scroll the album view to the playing album/track. Hint: you may override this timeout by pressing the button "Go to current track" in the main window (usually this button is a "*" beside the "A-Z" bar). - "Reset view after ... minutes of inactivitiy to ...": Use this option to force the given view after the given timeout - "Start Visualization after ... minutes of inactivity": If there is no user input [2] in the given number of minutes, Silverjuke will start the selected Visualization. - With the option "Stop Visualization after ... minutes" you can stop a running Visualization after the given number of minutes. It does not matter whether the Visualization was started automatically or manually before. Footnotes: [1] In this case, "user input" means all mouse clicks and key presses affecting the album view. Simple mouse movements are no user input in this meaning. [2] In this case, "user input" means all mouse clicks and key presses affecting Silverjuke. Simple mouse movements are no user input in this meaning. The visualization is not started if the Silverjuke main window is not the active window. Karaoke -------------------------------------------------------------------------------- Silverjuke supports playback of Karaoke files in the formats CDG and LRC: If you have such files, just make sure they are placed in the same directory under the same name as the belonging *.mp3 files: Eg. if you have a file c:\music\Karaoke.mp3, the CDG file must be named c:\music\Karaoke.cdg. That all! To start the Karaoke screen, first start a normal playback of the file and then click on the little icon in the lower left corner of the display. On the first start you may have to select "Karaoke prompt" from the menu atop of the Visualization. You can also place the Karaoke prompt on a secondary monitor; please see the chapter Monitors for details. Skins, fonts, covers and view ================================================================================ With the options placed at "Jukebox Settings / Skins" you can change the appearance and some Functionality of Silverjuke. **Skins** With so called "Skins" you can change the appearance of Silverjuke completely. The basic Functionality cannot be changed by skins, however, different skins may provide different buttons for existing functions. Skins always have the file extension *.sjs (for Silverjuke Skin). For installation copy the *.sjs files into one of the search paths defined at "Advanced / Further options / Search paths". Btw. there is also documentation about how to create your own skins in the file "skinning.md" (or "skinning.txt"). **Fonts and covers** You can define the font face, the font size and the size of the covers independently (changes are displayed at once in the main window, however, do not forget to hit "OK" to save them). The given sizes refer to a zoom setting of 100%. If you change the zoom in the main window eg. by the keys "+" and "-", the font and the cover sizes change proportionally. Btw. the key "*" brings you back to a zoom of 100%. **View options** In the "View" part of the main menu, you can define several view options. Most of them are self-explaining, however, we'd like to mention some of them here: - **Columns / Automatic track number:** If this option is set to "yes", Silverjuke automatically enumerates all tracks of an album with no gaps starting at "1". This will ignore the information stored in the database or in the (ID3-)tags which will be used otherwise. Available in album view only. - **Columns / Track list: Show different...** For the artist- and album names you can define if they should be shown if they differ from the artist-/album names of the whole album. Available in album view only. Kiosk Mode ================================================================================ With the so called "Kiosk Mode" you can run the program in full screen mode and with a limited Functionality. Doing so, you can use Silverjuke eg. as a jukebox on a party. Before you start the Kiosk Mode, you should set some options in the dialog "Settings / Kiosk mode": First, on dialog page "Start kiosk mode", make sure, you know how to end the Kiosk mode after you have started it. By default, the Kiosk mode can be ended using the key F11. Moreover, you can protect the Kiosk Mode by a password and disable special system keys. If you enter a new password, Silverjuke asks you to confirm the new password before you start the Kiosk Mode. This is needed to avoid typing errors. If everything is set correctly in your opinion, click onto the button Start to start the Kiosk Mode... we wish you many fun with Silverjuke! On the dialog pages beside "Start Kiosk Mode" you'll find some options to configure the Kiosk Mode to fit your needs. Moreover, you may like to use the options for the "Automatic Control" in combination with the Kiosk Mode. Functionality -------------------------------------------------------------------------------- Under "Kiosk Mode / Functionality" you'll find several options that will alter the behaviour or limit the Functionality of the Kiosk Mode. - With the options in the upper area you can disable the named functions for the use from within the Kiosk Mode. Depending on the skin in use, the corrensponding buttons will be hidden. If a button is not shown even if the function is enabled, you can use the function by a shortcut or by the display. - The option "Limit tracks to the Music Selection ..." let the Kiosk Mode display only the tracks from this Music Selection. You may also define your own Music Selections and use them here, more details are found the chapter "Music Selections" (btw. you can open the "Music Selection"-Dialog directly for here by pressing the button "..."). Monitors -------------------------------------------------------------------------------- You can use two monitors in the Kiosk Mode of Silverjuke - eg. one for the Visualization or for the Karaoke screen and the other for the main window. Just open "Kiosk Mode / Monitors" and define which monitor to use for which purpose. Finally, you can switch the display resolution while the Kiosk Mode is runnning. This is useful eg. if you find the view too small. Virtual Keyboard -------------------------------------------------------------------------------- If you don't have a real keyboard available (eg. if you use a touchscreen), you may activate the built-in virtual keyboard on the page "Settings / Kiosk Mode / Virtual keyboard": - To use the virtual keyboard only if the Kiosk Mode is started, enable the option "Use the virtual keyboard" - To use the virtual keyboard also outside the Kiosk Mode, enable the option "Use the virtual keyboard" and then "Also use the virtual keyboard outside the Kiosk Mode". If you click into the test field or into the search field in the main window now, the virtual keyboard is shown abottom of the screen. To close the virtual keyboard, click onto "OK", onto the little "X" in the upper-right corner or somewhere outside the keyboard window. Hints: - The virtual keyboard is not shown if you only set the focus by the tab-key to a text field - in this case, we assume you have a real keyboard. - You may use the virtual keyboard as a normal keyboard, every key pressed will be entered to the text field and the shift- and alt-keys will work as usual. To delete the last character entered, klick on the "Delete" key. If you want to delete all characters, hit "Shift-Delete". - If you protect the Kiosk Mode using a password, the virtual keyboard is also shown if you click into the password-entry field. - The skin "Silveriness Touched" is created especially for touchscreens. Finally, you may customize the appearance of the virtual keyboard with the following options: - With the popup at Virtual keyboard layout you may define which keys appear where on the keyboard - just select a layout from the list. If your favourite layout is missing, you can also create virtual keyboard layouts yourself, see the file "virtual-keyboards.md" (or "virtual-keyboards.txt"). Numpad -------------------------------------------------------------------------------- You may control Silverjuke completly using a numpad (keys "0"-"9") plus some other special keys for paging left/right and up/down. To enable the numpad control, select the option "Use numpad controls" at "Kiosk Mode / Numpad". After that, the album view displays unique album- and track-numbers left of the names. If you press one of these numbers (first the album- and then the track-number), Silverjuke plays or enqueues the selected title. You can use any keys to react to the numpad control, eg. not only "0"-"9". This should make it possible, to use external hardware devices that emulate keypresses. Just click onto "Edit..." to edit the keys. Some hints to the keys: - The keys to input "0"-"9" should always be defined. - Moreover, you should define keys for "Left", "Right", "Up" and "Down". If you have not defined these keys, you can also navigage using the numpad's menu (see below), which, however, is not very comfortable. - If you have defined a key for "Down" but not for "Up", pressing the "Down"-Button if the album view is already abottom, will bring you back to the top. - If you do not define a key for "Cancel", you can cancel the selection by pressing an invalid track number or just a sequence of "0". Moreover, you can certainly use all other shortcuts available in Silverjuke and map them to your hardware control, if wanted. **The numpad's menu** If you have defined a menu-key or if you hit the key "0" several times [1], you can enter the menu-mode. In the menu-mode, the display shows which actions can be done with which keys. You can switch to the next menu page using the key "0". The available actions depend on the current state of Silverjuke and on the Functionality you have allowed for the Kiosk Mode. To exit the menu, hit "0" until the normal display of Silverjuke appears or hit any undefined key. Using the numpad-menu, you can also access the search Functionality: For this purpose, select the entry "Search" from the numpad-menu as described above. After that, you can enter the text using the keys "0"-"9" - you may know this from a mobile phone: - The display shows with which keys you can enter which characters. To enter a character, you have to press the key multiple times. The display does not show all possible characters, by pressing a key several times, you can also reach other characters - overview... (see "Text Input Using the Numpad's Menu") - If you enter only one character, the "go to" function (same as pressing one of the "A"-"Z" buttons) is used instead of a search. - With the key "1" you can delete the last entered character. - With the key "0" you submit your entry. - To cancel the process, first delete all characters using "1" and then hit "0". - Upper-case letters cannot be entered, however, they are not needed as the search is not case-sensitive and the password input ignores the case here. If you have protected the Kiosk Mode by a Password and want to exit it using the numpad-menu, first select the entry "Exit Kiosk Mode". After that, you have to enter the password using the keys "0"-"9" as decribed above. Characters already entered are not shown for security reasons. Moreover, make sure, you use a password that can be entered this way. **Text Input Using the Numpad's Menu** - Pressing the **key 2** multiple times, results in the following characters: a b c 0 1 2 ä - + * / . , : ; ! ( ) [ ] { } | @ < > _ = % & ... - Pressing the **key 3** multiple times, results in the following characters: d e f 3 ... - Pressing the **key 4** multiple times, results in the following characters: g h i 4 ... - Pressing the **key 5** multiple times, results in the following characters: j k l 5 ... - Pressing the **key 6** multiple times, results in the following characters: m n o 6 ö ... - Pressing the **key 7** multiple times, results in the following characters: p q r s 7 ß ... - Pressing the **key 8** multiple times, results in the following characters: t u v 8 ü ... - Pressing the **key 9** multiple times, results in the following characters: w x y z 9 ... Moreover, at the end of each list, you'll find a space. With the key "1" you can delete the last entered character and with the key "0" you submit your text. Footnotes: [1] For each digit in the album numbers, you have to press "0" one time. Eg. if you have 99 albums or less, you have to enter "00" to enter the menu-mode; if you have between 100 and 999 albums, you have to enter "000" and so on. Credit System -------------------------------------------------------------------------------- With the credit system of the Silverjuke Kiosk Mode you can let the users only allow to play tracks if they have inserted eg. some coins into any hardware. To enable the credit system, open the settings dialog and go to the page "Kiosk Mode/Credit system". There, just enable the options "Use credit system" and "Credits may be added by external programs". Done so, you can add credits from external programs or scripts using the command line or DDE - see the files "command-line.rst" and "dde.md" (or ".txt") for details about this. As the external programs or scripts are responsible for communicating with the hardware, Silverjuke supports eg. any type or coin or or bill acceptors this way. Music Selection ================================================================================ Beside the search options described in the First Steps, Silverjuke offers a more powerful possibility to search for tracks and albums, the so called "Music Selection". With the Music Selection you can combine different search criteria, eg. you can search for all titles of a defined genre in a defined period. You open the dialog for the Music Selection using the right mouse button and by selecting the menu entry "Music Selection" then. **Saved Music Selections** At the dialog's left side you see a list with the saved Music Selections (starting the program for the first time you will find some predefined selections by default). With the button menu below this list you can create new Music Selections, rename existing ones, save a copy of a Music Selection under a new name and finally you have the option to delete Music Selections. Hint: If you delete all Music Selections, the predefined selections will be added again. **Start and end search** To search for titles in a Music Selection, select the Music Selection and then click search. Only titles matching the Music Selection will be shown in the main window, so that you can verify the result at once. As long as the Music Selection is activated each action in the main window will only affect the found titles, eg. a search using the search field in the main window will search in the result of the Music Selection only. Hint: the "Music Selection" dialog is not modal - you can switch between the dialog and the main window without closing the dialog. Btw. this is true for most dialogs in Silverjuke. To cancel a Music Selection click onto the button end search. Alternatively, you can also cancel the search from within the main window by clicking onto the "X" aright of the search field (if you have entered any text in the search field, the first click removes the text and the second click ends the Music Selection). Closing the Music Selection dialog does not end the search, so you can use an Music Selection as a permanent filter without having the search dialog opened all the time. Moreover, by the query history, which you access by the little arrow aright of the search field in the main window, you have the possibility to access prior Music Selections without opening the Music Selection dialog. **Edit Music Selections** To edit a Music Selection, select the Music Selection to edit in the list aleft. After this, the details about the Music Selection are show aright in the dialog. Atop of the details, you have the choice whether to select single tracks or full albums and how to combine the search criteria below. Search criteria always affect fields in the tracks - you decide to select full albums, missing tracks of are simply added to the result. **Edit criteria** - To add a criterion, click onto "+", to remove one, click onto "-". Hint: there must be at least one criterion defined. - A criterion normally has three parts: the field to search in (first popup), an operator for comparison (second popup) and the values to search for (further popups or other controls). - Normally, after adding a new search criterion, you'll first select the field, then the operator and finally defined the values to search for. Hint: depending on the selected files and the selected operator, the operator/ the value controls may change. Eg. the operator "is in range" requires two values while the operator "is equal to" requires only one. To get an idea about the possibilities of the Music Selection, the best is to try it out for yourself. However, there are still some important points: - If you select the operator "is equal to" or "is unequal to" for a textfield (eg. "title"), the upper- and lower-case of the value is important. For other operators, case is not significant. - date fields (eg. "last played" or "modified") offer the operator "is in the last days/hours/minutes". The other operators offer you a calendar control which is reachable using the little arrow aright of the text (choose "select..." from the popup). - Using the file limit result to you can limit the result to a given number of tracks, albums, minutes or MB. Moreover, you have to define the field the tracks should be selected by eg. by "most often played" or by "random". It is okay to use this criterion several times - in this case the limit reached first is used. - You may include or exclude single tracks by just selecting them in the main window and then pressing the keys "Ins" or "Del". Finally, more experienced users have the possibility to use the field "SQL Expression" which allows to defined more complex Music Selections in the query language "SQL". SQL Expressions -------------------------------------------------------------------------------- If you choose the option "SQL Expression" for a field in a criterion of a Music Selection, the operator popup disappears to make place for a larger text field. In this text field you can input any valid SQL Expressions as rating=3 OR (rating=2 AND timesplayed>2) See eg. http://en.wikipedia.org/wiki/SQL for details about SQL. Allwed is everything that is allowed in the WHERE clause; you may also use subselects. We do not want to explain SQL in this help file, so here is only a brief overview about the available fields, operators and functions: **Fields** url timeadded timemodified timesplayed lastplayed databytes bitrate samplerate channels playtimems autovol trackname tracknr trackcount disknr diskcount leadartistname orgartistname composername albumname genrename groupname comment beatsperminute rating year id **Operators and Functions** =, ==, !=, <>, <, >, <=, >= +, -, *, /, %, &, |, || and, glob, in, like, like escape, not, or val = abs(val) str = filetype(filename) val = length(str) bool = levensthein(str, pattern) dist = levensthein(str, pattern, max_dist) str = lower(str) val = max(val1, val2, ...) val = min(val1, val2, ...) pos = queuepos(url) curr_pos = queuepos() val = random() val = round(val) str = substr(str, pos, len) str = soundex(str) val = sum(val) val = timestamp(date_time) str = upper(str) Hint: You can define a criterion first using the normal selection controls for the field, the operator and the value, and then change the field to "SQL Expression" which will convert the given criteria to SQL Expression. Finally, you can refine the converted expression. Playlists -------------------------------------------------------------------------------- A playlist is a compilation of different tracks from your music library. If you eg. put different tracks into the queue, you can save them all as a playlist to be re-opened and played again later at any time. You can read and write playlists in different formats. Currently Silverjuke supports the formats CUE, M3U, PLS; however, we recommend the M3U format as it is widely spread. To save the queue as a playlist, press the right mouse button in the queue display and select "save playlist" from the context menu. In the following dialog you have to enter a name for the playlist. Finally, hit "OK" to save the playlist. To open a saved playlist again, press the right mouse button and select "open playlist or files" or "append playlist or files" from the context menu. Again, in the following dialog select the name of the desired playlist and hit "OK". Alternativly, you can just drag a playlist to the Silverjuke main window. Hint: you can also use playlists which were not created with Silverjuke, if your music library contains the referenced files. Edit Tracks ================================================================================ To view or edit information for a track, select the track and press Ctrl-I or use the option "Edit Tracks/Get info" from the context menu. You can edit multiple tracks at the same time by just selecting them together in the main window using eg. the "ctrl" or the "shift" keys. The dialog "Edit Tracks" now shows all available information about the track(s) whereas most of them can also be edited as follows: - The title is the name of the tracks. You should always enter a title as otherwise it is hard to identify a track. - The name of the artist. You should not leave this field empty as Silverjuke uses this information to combine different tracks to albums. - The names of the original artist and the composer's name are optional. However, please to not enter sth. like "unknown" here, just leave this field blank if you do not want to enter these information. - The name of the album. You should not leave this field empty as Silverjuke uses this information to combine different tracks to albums. - Any optional comment - The track number and the track count on this disk (see below). Silverjuke uses these information to sort the tracks within an album. If an album has only one track, enter "1 of 1" here. Feel free to leave this field blank. - The disk number and the disk count on the album. Silverjuke uses these information to sort the tracks within an album. If an album has only one disk (mostly true), enter "1 of 1" here. Feel free to leave this field blank. - The genre of the track. If you fill out this field for a significant number of tracks, you can use it as an criterion for Music Selections (btw, this is true for all information). - The group can be used for additional criterions specific for you music library. - The year of the track; this is not the year where the original title (if any) was released. Silverjuke uses this information to combine different tracks to albums. Feel free to leave this field blank. - The BPM or "beats per minute". Feel free to leave this field blank. - Your rating from one to five stars where five stars should be the best rating. If you do not want to rate a track, select "no rating" here. Finally, clicking "OK" saves the modified information in the database and, if possible and wanted in the (ID3-)tags of the file. If you edit more than one track, a detailed confirmation dialog is displayed before the changes will take effect. In this dialog, you can also edit the changes in a "final" step by double-clicking on am item. Writing (ID3)-tags can be disabled using the corresponding option in the confirmation dialog or with the "menu" button. Further edit tools: A click onto the "menu"-button shows a menu which gives you access to some more edit tools, see below. BTW: If you want to Extract information from the file name use the function "split fields" which also allows to use the path and/or file name as source field. Replace -------------------------------------------------------------------------------- The dialog "Replace" allows you to search and replace strings in some (ID3-)tags or in the file name of any tracks. This is most useful if you edit the information of several tracks in one step. To open the dialog: - select all tracks to edit in the main window eg. by holding the "ctrl" or the "shift" keys while clicking on them ... - click with the right mouse button on one of the selected tracks and select "Edit Tracks/Get info..." from the context-menu; this will open the Edit Tracks-dialog ... - here, click onto the "Menu"-button and select "Replace". In the dialog: - enter the text to search for and decide whether the search should be case-sensitive and whether you want to search for whole words only. - select the field where to search in. You can also search in the file or the path name of the tracks. If you select "All fields", this refers to all fields but the path and file names. - enter the text found strings should be replaced with - more experienced users can also use regular expressions in the search strings. Note: the regular expressions follow the POSIX-standard and not the PERL-standard. Finally, clicking OK will show a detailed confirmation dialog; if everything is okay there, press OK once again and the changes will be written. Split Fields -------------------------------------------------------------------------------- The dialog "Split fields" allows you to split the text of one source field (eg. one ID3-information or the path or the file name) into several destination fields. This is most useful if you edit the information of several tracks in one step. To open the dialog: - select all tracks to edit in the main window eg. by holding the "ctrl" or the "shift" keys while clicking on them ... - click with the right mouse button on one of the selected tracks and select "Edit Tracks/Get info..." from the context-menu; this will open the Edit Tracks-dialog ... - here, click onto the "Menu"-button and select "Split fields". In the dialog: - first, select the field to split. The selected field should contain some text information that can be splitted into several other fields; often this is true for the path and file name. - using Destination fields and pattern you'll define how the field to split looks like: - Text, that is identical in each record, is entered directly. - Text that contains information you want to copy to another field is entered as a info-placeholder, where "info" must be replaced by the name of the destination field. The easiest way to enter these placeholders is to use the Insert-button. - Text, that is not identical in each record, but does not contain any useful information is entered as "*". - the Example shows you at any time all source and destination fields of a sample record. So you can verify if the pattern matches your wishes. Finally, clicking OK will show a detailed confirmation dialog; if everything is okay there, press OK once again and the changes will be written. Rename Files -------------------------------------------------------------------------------- The dialog "Rename files" allows you to rename files based on the old file name and/or on some (ID3-)tag-informationen This is most useful if you edit the information of several tracks in one step. To open the dialog: - select all tracks to edit in the main window eg. by holding the "ctrl" or the "shift" keys while clicking on them ... - click with the right mouse button on one of the selected tracks and select "Edit Tracks/Get info..." from the context-menu; this will open the Edit Tracks-dialog ... - here, click onto the "Menu"-button and select "Rename files". In the dialog: - Enter the Pattern for the new file name. The pattern may be built out of several placehoders as _title_, for a list of possible placeholders, use the Insert-button. - Text that should be identical for all files to rename can be entered directly to the pattern. - You can use the character "/" to also rename some folders in the path of the file. Finally, clicking OK will show a detailed confirmation dialog; if everything is okay there, press OK once again and the changes will be written. Query freedb -------------------------------------------------------------------------------- When editing track information using the Track Editor, you can also query the freedb-Database for missing track information. This works best, if you select all tracks of a given album. Then open the Track Editor and select "Query online database..." from the "Menu..." button. A little moment later, you get a list with possible albums. If the correct album is in the list, select it and click on "OK". After that, the normal confirmation dialog is shown where you can also edit the suggested information. The default server used to query the freedb database is http://www.freedb.org , however, you can also define a mirror that is closer to you at "Advanced / Further options / Online database: Server name". Visualizations ================================================================================ So called "Visualizations" are graphical output plugins which render their graphics - more or less - in synchronity with the playing music. If playback is started you can start a visualizations using the key F2 or the symbol (eg. a wave) in the main window. Usually, visualizations can be stopped using the "escape" key. You can select the visualization to use by the menu atop of the visualization. However, only one visualization can be started at the same time. Advanced and Further options ================================================================================ With the options found at "Settings / Advanced / Further options" you can define some less common settings for Silverjuke. Moreover, you can change all shortcuts here. To change an option, select it and click onto the button "Customize". Alternatively you may use the right mouse button. Changed options are shown in a highlighted font in the list. To reset options to their default values, select them (you may select several options using the "shift" and the "ctrl" keys) and click onto "Customize / Reset selection". The options in detail: - **Playback:** These options let you select the playback device; depending on the hardware and the operating system, there may be some more options affecting it - **Language:** By default, Silverjuke just uses the system language. Here you can define another language to use. Further details about the localization can be found in the file "localization.md" (or "localization.txt"). - **Image cache:** With the option RAM cache you can set the amount of memory to use to cache covers; by default 2 MB are used here which is enough for about 3 pages of covers in the standard size. With the option Use temporary directory you can use your harddisk to cache images. When using this option your harddisk should be "large" enough to cache all possible covers; however, for actual hardware this should be no problem. You can use the temporary directory cache in two ways: _asynchony_ or _directly_. Asynchony means, the images to display are rendered in a second thread and displayed when ready; in between, Silverjuke shows an empty square at the place of the cover. Directly means, the program display is halted until the image is ready and therefore no empty squares are shown and the output is a little "smarter" but may halt the user input for a moment. If you are unsure, use the asynchony method or disable the use of the temporary directory completly. - **Index file:** This option displays the index file location (the index file contains the database for your music library). If you want to use another index file, you have to add the parameter --jukebox=FILE to the command line when starting Silverjuke. - **Show files with:** By default when selecting the menu entry "Explore...", files are shown eg. with the Explorer under Windows or with the Finder on Mac OS. However, you can use any other program that supports the command line: Just double-click onto the entry and select the program to use. After that, you may want to change the command line given to the selected program by right-clicking onto the entry and choosing "Edit...". - **Temporary directory:** This option displays the temporary directory in use. The temporary directory is used eg. for the cover cache (see above). If you want to use a different temporary directory, you have to start Silverjuke with the option -temp=DIR in the command line. - **Ask on close if playing:** When the program is about to be closed by a user request and there is still some music playing, Silverjuke can ask you whether really to quit. This option has no effect if the program is closed by other reasons, eg. by a shutdown of windows. - **Search: Lookup genre on simple search:** If this option is set to "yes", you can type in a genre into the simple search field in the main window. If the genre is found, Silverjuke displays all tracks of this genre then. - **Search: Max. history size:** With this option you define the number of previous searches that should be saved in the history. You can access the history by clicking onto the little arrow beside the search field. - **Search: Save modified Music Selections:** By default, Silverjuke asks you whether to save a modified Music Selection eg. if you close the dialog. However, Silverjuke can also save (select "always") or cancel (select "never") all modified Music Selections automatically without asking. If you select "never", do not forget to save the Music Selection manually eg. by pressing "Ctrl-S". - **Search: Search while typing:** If you enter a search text into the simple search field in the main window, Silverjuke can start the search while you are still typing (incremental search) or wait until you hit "enter". - **Mouse wheel:** With this option you can define if the mouse wheel should scroll the album view horizontally or vertically. Btw: holding the "shift"-key or pressing the right mouse button while using the mouse wheel toggles the direction. - **Mouse wheel: Context sensitive:** If this option is enabled and the mouse is over the display, the mouse wheel scrolls the display content (the queue) instead of the album view. - **Shortcuts:** Lots of options refer to shortcuts which may be customized by double-clicking on an option and then hitting the new shortcut. You may define several shortcuts for a command. To remove a shortcut, use the right mouse button and then "Remove shortcut...". You can even define system-wide shortcuts. System-wide shortcuts may be used even if Silverjuke is not the active program, eg. you can use the "pause" key to start/stop playback from within any running application. To define a system-wide shortcut, press the right mouse button and choose "Add system-wide shortcut...". - **Shortcuts: Numpad:** These options are available if you enable the numpad control for the Kiosk Mode. In this case, you can customize the keys to use for the numpad control as described above. globals.ini -------------------------------------------------------------------------------- Experienced users can set some other options can be set in the `[main]` section of the globals.ini file: - `debug =` Debugging flags: 1=Enable debugging, 2=Invoke test assert, 4=Do scripting tests. You can use more than one flag by adding them. Needed for debugging purposes only, defaults to 0. Options for the `[tageditor]` section of the globals.ini file: - `ratinguser =` Some tag formats (eg. ID3) support multiple ratings in a single file. With this setting you define the user, ratings should be read or written for. Normally, the user is defined by an E-Mail-Address. Defaults to `r@silverjuke.net` - `tagflags =` 1=read ratings, 2=write ratings, 4=read others ratings, 8=change others ratings, 16=remove others ratings, 32=add leading zeros to track and disk numbers. You can use more than one flag by adding them. Defaults to 15 (1+2+4+8). Example: [main] debug = 1 [tageditor] ratinguser = myname@domain.com tagflags = 3 Copyright (c) Björn Petersen Software Design and Development, http://b44t.com ���������������������������������������������������������silverjuke-16.2.3/docs/virtual-keyboards.md���������������������������������������������������������0000664�0000000�0000000�00000010225�12660066715�0020720�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Creating Virtual Keyboards ================================================================================ Silverjuke Versions support a virtual keyboard which is useful esp. in combination with the kiosk mode (see "Settings/Kiosk mode/Virtual keyboard"). This document describes how the virtual keyboard keys may be customized eg. to fit the needs of a complete localization. **A brief overview** A virtual keyboard layout is a plain text file that contains statements as name=value; Line breaks are not significant, you may put any number of statements into a single line - however, do not forget the trailing semicolon. The file must be encoded as ISO8859-1 (see http://en.wikipedia.org/wiki/ISO8859-1 ). To use the file in Silverjuke, it must have the extension *.sjk and must be located in one of the search paths. To define a virtual keyboard, first set its name and then simply define all keys one by one, starting from the first key in the first row and ending with the last key in the last row. The following snippet contains a complete and valid keyboard with the keys a-c: layout=My first test; key=a; key=b; key=c; If you also want to type the upper-case letters, you can define a shift key and set the shifted values for all letters: layout=My second test; key=a; shift=A; key=b; shift=B; key=c; shift=C; key=shift; Before reading on, it may be a good idea to have a look at the already existing virtual keyboard layouts. **Multiple lines of keys** Of course, you can use multiple lines of keys; just use the statement `nextline;` for this purpose. key=a; nextline; key=b; **The title of a key** If you want to show a different title than the key itself on key, add the title in double quotes to the value: key=a "A"; **Alt- and Dead-keys** You may define up to 32 Alt- or Dead-keys which work simelar to the shift keys. Moreover, each Alt-key may be combined with "shift", so you may have up to 64 additional states of the keyboard. The Alt-keys have the special names "alt1", "alt2" ... "alt32" and are defined as any other key using eg. the statement `key=alt1;`. To define the alternative keys if an alt key is pressed, just add statements as `alt1=@` and `alt1shift=$` behind the key-statement. Example: key=a; shift=A; alt1=@; alt2=[; alt2shift=]; key=alt1; key=alt2 "Alt"; As you see we've added a title only to the second alt-key. This is because the first alt-key automatically gets the title "AltGr" if noting else is given. Note: Silverjuke versions smaller that 3.02 only allow up to 9 Alt-Keys. **Defining special keys** You can also define any key using its hexadecimal representation, eg. `key=a;` and `key=0x61;` refer to the same character. Some keys must _always_ be written in this representation: the space, the backslash and the semicolon; in this order: key=0x20; key=0x5c; key=0x3b; This way you can also access all Unicode characters, eg. with `key=0x3b1;` you can access the greek letter "alpha". Some other special keys are `backsp`, `clearall` and `enter`: key=backsp; key=clearall; key=enter; Finally, very special is the pseudo-key "entercont" which may be used to span the enter key over two rows, see the already existing keyboard layouts for an example. **Using different key widths** Normally, all keys have a relative width of 1.0. With the "width"-statement you can give some keys different widths. If you want to let the spacebar be 5 times wider than a normal key, use the following statement: key=0x20; width=5.0; To create a "natural" keyboard layout, you may need some empty room, esp. aleft of a row start. For this, use the "spacer"-statement: key=backsp; nextline; spacer; width=0.7; key=q; **Locking the state of the Alt-keys** Normally, the Alt-states are reset if a key is pressed. You can optionally "lock" the Alt-states; for this purpose, simply add the "lock" keyword to the key-statement: key=alt1 lock; This way, you can create "shift lock" or "caps lock" keys. Or you can add two completely different alphabets to one keyboard layout. Copyright (c) Bjoern Petersen Software Design and Development, http://b44t.com ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/�������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0014317�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/codeset.m4���������������������������������������������������������������������0000664�0000000�0000000�00000001413�12660066715�0016206�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# codeset.m4 serial 4 (gettext-0.18) dnl Copyright (C) 2000-2002, 2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset], [AC_TRY_LINK([#include <langinfo.h>], [char* cs = nl_langinfo(CODESET); return !cs;], [am_cv_langinfo_codeset=yes], [am_cv_langinfo_codeset=no]) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE([HAVE_LANGINFO_CODESET], [1], [Define if you have <langinfo.h> and nl_langinfo(CODESET).]) fi ]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/fcntl-o.m4���������������������������������������������������������������������0000664�0000000�0000000�00000005634�12660066715�0016133�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# fcntl-o.m4 serial 1 dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. # Test whether the flags O_NOATIME and O_NOFOLLOW actually work. # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. AC_DEFUN([gl_FCNTL_O_FLAGS], [ dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; ]], [[ int status = !constants; { static char const sym[] = "conftest.sym"; if (symlink (".", sym) != 0 || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0) status |= 32; unlink (sym); } { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); char c; struct stat st0, st1; if (fd < 0 || fstat (fd, &st0) != 0 || sleep (1) != 0 || read (fd, &c, 1) != 1 || close (fd) != 0 || stat (file, &st1) != 0 || st0.st_atime != st1.st_atime) status |= 64; } return status;]])], [gl_cv_header_working_fcntl_h=yes], [case $? in #( 32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac], [gl_cv_header_working_fcntl_h=cross-compiling])]) case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], [Define to 1 if O_NOATIME works.]) case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], [Define to 1 if O_NOFOLLOW works.]) ]) ����������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/gettext.m4���������������������������������������������������������������������0000664�0000000�0000000�00000035132�12660066715�0016251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# gettext.m4 serial 63 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include <libintl.h> $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include <libintl.h> $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include <libintl.h> $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/glibc2.m4����������������������������������������������������������������������0000664�0000000�0000000�00000001435�12660066715�0015726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# glibc2.m4 serial 2 dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.0 or newer. # From Bruno Haible. AC_DEFUN([gt_GLIBC2], [ AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer], [ac_cv_gnu_library_2], [AC_EGREP_CPP([Lucky GNU user], [ #include <features.h> #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) Lucky GNU user #endif #endif ], [ac_cv_gnu_library_2=yes], [ac_cv_gnu_library_2=no]) ] ) AC_SUBST([GLIBC2]) GLIBC2="$ac_cv_gnu_library_2" ] ) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/glibc21.m4���������������������������������������������������������������������0000664�0000000�0000000�00000001526�12660066715�0016010�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# glibc21.m4 serial 4 dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([gl_GLIBC21], [ AC_CACHE_CHECK([whether we are using the GNU C Library 2.1 or newer], [ac_cv_gnu_library_2_1], [AC_EGREP_CPP([Lucky GNU user], [ #include <features.h> #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], [ac_cv_gnu_library_2_1=yes], [ac_cv_gnu_library_2_1=no]) ] ) AC_SUBST([GLIBC21]) GLIBC21="$ac_cv_gnu_library_2_1" ] ) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/iconv.m4�����������������������������������������������������������������������0000664�0000000�0000000�00000015226�12660066715�0015705�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# iconv.m4 serial 9 (gettext-0.18) dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include <stdlib.h> #include <iconv.h>], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include <stdlib.h> #include <iconv.h>], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include <iconv.h> #include <string.h> int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_TRY_COMPILE([ #include <stdlib.h> #include <iconv.h> extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) fi ]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/intdiv0.m4���������������������������������������������������������������������0000664�0000000�0000000�00000004446�12660066715�0016146�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# intdiv0.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ gt_cv_int_divbyzero_sigfpe= changequote(,)dnl case "$host_os" in macos* | darwin[6-9]* | darwin[1-9][0-9]*) # On MacOS X 10.2 or newer, just assume the same as when cross- # compiling. If we were to perform the real test, 1 Crash Report # dialog window would pop up. case "$host_cpu" in i[34567]86 | x86_64) gt_cv_int_divbyzero_sigfpe="guessing yes" ;; esac ;; esac changequote([,])dnl if test -z "$gt_cv_int_divbyzero_sigfpe"; then AC_TRY_RUN([ #include <stdlib.h> #include <signal.h> static void sigfpe_handler (int sig) { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], [gt_cv_int_divbyzero_sigfpe=yes], [gt_cv_int_divbyzero_sigfpe=no], [ # Guess based on the CPU. changequote(,)dnl case "$host_cpu" in alpha* | i[34567]86 | x86_64 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac changequote([,])dnl ]) fi ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED([INTDIV0_RAISES_SIGFPE], [$value], [Define if integer division by zero raises signal SIGFPE.]) ]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/intl.m4������������������������������������������������������������������������0000664�0000000�0000000�00000027057�12660066715�0015542�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# intl.m4 serial 17 (gettext-0.18) dnl Copyright (C) 1995-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2009. AC_PREREQ([2.52]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([gt_GLIBC2])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([gl_VISIBILITY])dnl AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl AC_REQUIRE([gt_TYPE_WCHAR_T])dnl AC_REQUIRE([gt_TYPE_WINT_T])dnl AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gt_TYPE_INTMAX_T]) AC_REQUIRE([gt_PRINTF_POSIX]) AC_REQUIRE([gl_GLIBC21])dnl AC_REQUIRE([gl_XSIZE])dnl AC_REQUIRE([gl_FCNTL_O_FLAGS])dnl AC_REQUIRE([gt_INTL_MACOSX])dnl dnl Support for automake's --enable-silent-rules. case "$enable_silent_rules" in yes) INTL_DEFAULT_VERBOSITY=0;; no) INTL_DEFAULT_VERBOSITY=1;; *) INTL_DEFAULT_VERBOSITY=1;; esac AC_SUBST([INTL_DEFAULT_VERBOSITY]) AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) AC_CHECK_FUNCS([asprintf fwprintf newlocale putenv setenv setlocale \ snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). gt_CHECK_DECL(_snprintf, [#include <stdio.h>]) gt_CHECK_DECL(_snwprintf, [#include <stdio.h>]) dnl Use the *_unlocked functions only if they are declared. dnl (because some of them were defined without being declared in Solaris dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl on Solaris 2.5.1 to run on Solaris 2.6). dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>]) case $gt_cv_func_printf_posix in *yes) HAVE_POSIX_PRINTF=1 ;; *) HAVE_POSIX_PRINTF=0 ;; esac AC_SUBST([HAVE_POSIX_PRINTF]) if test "$ac_cv_func_asprintf" = yes; then HAVE_ASPRINTF=1 else HAVE_ASPRINTF=0 fi AC_SUBST([HAVE_ASPRINTF]) if test "$ac_cv_func_snprintf" = yes; then HAVE_SNPRINTF=1 else HAVE_SNPRINTF=0 fi AC_SUBST([HAVE_SNPRINTF]) if test "$ac_cv_func_newlocale" = yes; then HAVE_NEWLOCALE=1 else HAVE_NEWLOCALE=0 fi AC_SUBST([HAVE_NEWLOCALE]) if test "$ac_cv_func_wprintf" = yes; then HAVE_WPRINTF=1 else HAVE_WPRINTF=0 fi AC_SUBST([HAVE_WPRINTF]) AM_LANGINFO_CODESET gt_LC_MESSAGES dnl Compilation on mingw and Cygwin needs special Makefile rules, because dnl 1. when we install a shared library, we must arrange to export dnl auxiliary pointer variables for every exported variable, dnl 2. when we install a shared library and a static library simultaneously, dnl the include file specifies __declspec(dllimport) and therefore we dnl must arrange to define the auxiliary pointer variables for the dnl exported variables _also_ in the static library. if test "$enable_shared" = yes; then case "$host_os" in mingw* | cygwin*) is_woe32dll=yes ;; *) is_woe32dll=no ;; esac else is_woe32dll=no fi WOE32DLL=$is_woe32dll AC_SUBST([WOE32DLL]) dnl On mingw and Cygwin, we can activate special Makefile rules which add dnl version information to the shared libraries and executables. case "$host_os" in mingw* | cygwin*) is_woe32=yes ;; *) is_woe32=no ;; esac WOE32=$is_woe32 AC_SUBST([WOE32]) if test $WOE32 = yes; then dnl Check for a program that compiles Windows resource files. AC_CHECK_TOOL([WINDRES], [windres]) fi dnl Determine whether when creating a library, "-lc" should be passed to dnl libtool or not. On many platforms, it is required for the libtool option dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool dnl in the *.la files - makes it impossible to create multithreaded programs, dnl because libtool also reorders the -lc to come before the -pthread, and dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>. case "$host_os" in hpux*) LTLIBC="" ;; *) LTLIBC="-lc" ;; esac AC_SUBST([LTLIBC]) dnl Rename some macros and functions used for locking. AH_BOTTOM([ #define __libc_lock_t gl_lock_t #define __libc_lock_define gl_lock_define #define __libc_lock_define_initialized gl_lock_define_initialized #define __libc_lock_init gl_lock_init #define __libc_lock_lock gl_lock_lock #define __libc_lock_unlock gl_lock_unlock #define __libc_lock_recursive_t gl_recursive_lock_t #define __libc_lock_define_recursive gl_recursive_lock_define #define __libc_lock_define_initialized_recursive gl_recursive_lock_define_initialized #define __libc_lock_init_recursive gl_recursive_lock_init #define __libc_lock_lock_recursive gl_recursive_lock_lock #define __libc_lock_unlock_recursive gl_recursive_lock_unlock #define glthread_in_use libintl_thread_in_use #define glthread_lock_init_func libintl_lock_init_func #define glthread_lock_lock_func libintl_lock_lock_func #define glthread_lock_unlock_func libintl_lock_unlock_func #define glthread_lock_destroy_func libintl_lock_destroy_func #define glthread_rwlock_init_multithreaded libintl_rwlock_init_multithreaded #define glthread_rwlock_init_func libintl_rwlock_init_func #define glthread_rwlock_rdlock_multithreaded libintl_rwlock_rdlock_multithreaded #define glthread_rwlock_rdlock_func libintl_rwlock_rdlock_func #define glthread_rwlock_wrlock_multithreaded libintl_rwlock_wrlock_multithreaded #define glthread_rwlock_wrlock_func libintl_rwlock_wrlock_func #define glthread_rwlock_unlock_multithreaded libintl_rwlock_unlock_multithreaded #define glthread_rwlock_unlock_func libintl_rwlock_unlock_func #define glthread_rwlock_destroy_multithreaded libintl_rwlock_destroy_multithreaded #define glthread_rwlock_destroy_func libintl_rwlock_destroy_func #define glthread_recursive_lock_init_multithreaded libintl_recursive_lock_init_multithreaded #define glthread_recursive_lock_init_func libintl_recursive_lock_init_func #define glthread_recursive_lock_lock_multithreaded libintl_recursive_lock_lock_multithreaded #define glthread_recursive_lock_lock_func libintl_recursive_lock_lock_func #define glthread_recursive_lock_unlock_multithreaded libintl_recursive_lock_unlock_multithreaded #define glthread_recursive_lock_unlock_func libintl_recursive_lock_unlock_func #define glthread_recursive_lock_destroy_multithreaded libintl_recursive_lock_destroy_multithreaded #define glthread_recursive_lock_destroy_func libintl_recursive_lock_destroy_func #define glthread_once_func libintl_once_func #define glthread_once_singlethreaded libintl_once_singlethreaded #define glthread_once_multithreaded libintl_once_multithreaded ]) ]) dnl Checks for the core files of the intl subdirectory: dnl dcigettext.c dnl eval-plural.h dnl explodename.c dnl finddomain.c dnl gettextP.h dnl gmo.h dnl hash-string.h hash-string.c dnl l10nflist.c dnl libgnuintl.h.in (except the *printf stuff) dnl loadinfo.h dnl loadmsgcat.c dnl localealias.c dnl log.c dnl plural-exp.h plural-exp.c dnl plural.y dnl Used by libglocale. AC_DEFUN([gt_INTL_SUBDIR_CORE], [ AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_REQUIRE([gl_LOCK])dnl AC_TRY_LINK( [int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }], [], [AC_DEFINE([HAVE_BUILTIN_EXPECT], [1], [Define to 1 if the compiler understands __builtin_expect.])]) AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h]) AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \ stpcpy strcasecmp strdup strtoul tsearch uselocale argz_count \ argz_stringify argz_next __fsetlocking]) dnl Use the *_unlocked functions only if they are declared. dnl (because some of them were defined without being declared in Solaris dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl on Solaris 2.5.1 to run on Solaris 2.6). dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. gt_CHECK_DECL([feof_unlocked], [#include <stdio.h>]) gt_CHECK_DECL([fgets_unlocked], [#include <stdio.h>]) AM_ICONV dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) dnl gt_CHECK_DECL(FUNC, INCLUDES) dnl Check whether a function is declared. AC_DEFUN([gt_CHECK_DECL], [ AC_CACHE_CHECK([whether $1 is declared], [ac_cv_have_decl_$1], [AC_TRY_COMPILE([$2], [ #ifndef $1 char *p = (char *) $1; #endif ], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) if test $ac_cv_have_decl_$1 = yes; then gt_value=1 else gt_value=0 fi AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) ]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/intldir.m4���������������������������������������������������������������������0000664�0000000�0000000�00000001633�12660066715�0016231�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# intldir.m4 serial 2 (gettext-0.18) dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. AC_PREREQ([2.52]) dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory. AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], []) �����������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/intlmacosx.m4������������������������������������������������������������������0000664�0000000�0000000�00000004575�12660066715�0016755�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# intlmacosx.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) �����������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/intmax.m4����������������������������������������������������������������������0000664�0000000�0000000�00000002040�12660066715�0016055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# intmax.m4 serial 5 (gettext-0.18) dnl Copyright (C) 2002-2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether the system has the 'intmax_t' type, but don't attempt to dnl find a replacement if it is lacking. AC_DEFUN([gt_TYPE_INTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t], [AC_TRY_COMPILE([ #include <stddef.h> #include <stdlib.h> #if HAVE_STDINT_H_WITH_UINTMAX #include <stdint.h> #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include <inttypes.h> #endif ], [intmax_t x = -1; return !x;], [gt_cv_c_intmax_t=yes], [gt_cv_c_intmax_t=no])]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.]) fi ]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/inttypes-pri.m4����������������������������������������������������������������0000664�0000000�0000000�00000002201�12660066715�0017223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# inttypes-pri.m4 serial 6 (gettext-0.18) dnl Copyright (C) 1997-2002, 2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.52]) # Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_CHECK_HEADERS([inttypes.h]) if test $ac_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], [gt_cv_inttypes_pri_broken], [ AC_TRY_COMPILE([#include <inttypes.h> #ifdef PRId32 char *p = PRId32; #endif ], [], [gt_cv_inttypes_pri_broken=no], [gt_cv_inttypes_pri_broken=yes]) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1], [Define if <inttypes.h> exists and defines unusable PRI* macros.]) PRI_MACROS_BROKEN=1 else PRI_MACROS_BROKEN=0 fi AC_SUBST([PRI_MACROS_BROKEN]) ]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/inttypes_h.m4������������������������������������������������������������������0000664�0000000�0000000�00000001671�12660066715�0016754�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# inttypes_h.m4 serial 9 dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists, # doesn't clash with <sys/types.h>, and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h], [AC_TRY_COMPILE( [#include <sys/types.h> #include <inttypes.h>], [uintmax_t i = (uintmax_t) -1; return !i;], [gl_cv_header_inttypes_h=yes], [gl_cv_header_inttypes_h=no])]) if test $gl_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1], [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and declares uintmax_t. ]) fi ]) �����������������������������������������������������������������������silverjuke-16.2.3/m4/lcmessage.m4�������������������������������������������������������������������0000664�0000000�0000000�00000002433�12660066715�0016526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# lcmessage.m4 serial 6 (gettext-0.18) dnl Copyright (C) 1995-2002, 2004-2005, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper <drepper@cygnus.com>, 1995. # Check whether LC_MESSAGES is available in <locale.h>. AC_DEFUN([gt_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES], [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], [gt_cv_val_LC_MESSAGES=yes], [gt_cv_val_LC_MESSAGES=no])]) if test $gt_cv_val_LC_MESSAGES = yes; then AC_DEFINE([HAVE_LC_MESSAGES], [1], [Define if your <locale.h> file defines LC_MESSAGES.]) fi ]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/lib-ld.m4����������������������������������������������������������������������0000664�0000000�0000000�00000006603�12660066715�0015731�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# lib-ld.m4 serial 4 (gettext-0.18) dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 </dev/null` in *GNU* | *'with BFD'*) acl_cv_prog_gnu_ld=yes ;; *) acl_cv_prog_gnu_ld=no ;; esac]) with_gnu_ld=$acl_cv_prog_gnu_ld ]) dnl From libtool-1.4. Sets the variable LD. AC_DEFUN([AC_LIB_PROG_LD], [AC_ARG_WITH([gnu-ld], [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi 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 GCC]) 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. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path 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([acl_cv_path_LD], [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT([$LD]) else AC_MSG_RESULT([no]) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) �����������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/lib-link.m4��������������������������������������������������������������������0000664�0000000�0000000�00000100202�12660066715�0016255�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# lib-link.m4 serial 21 (gettext-0.18) dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.54]) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes popdef([NAME]) popdef([Name]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. The missing-message dnl defaults to 'no' and may contain additional hints for the user. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, dnl because these -l options might require -L options that are present in dnl LIBS. -l options benefit only from the -L options listed before it. dnl Otherwise, add it to the front of LIBS, because it may be a static dnl library that depends on another static library that is present in LIBS. dnl Static libraries benefit only from the static libraries listed after dnl it. case " $LIB[]NAME" in *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; *) LIBS="$LIB[]NAME $LIBS" ;; esac AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) popdef([NAME]) popdef([Name]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/lib-prefix.m4������������������������������������������������������������������0000664�0000000�0000000�00000020422�12660066715�0016622�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>. dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/lock.m4������������������������������������������������������������������������0000664�0000000�0000000�00000002314�12660066715�0015511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# lock.m4 serial 10 (gettext-0.18) dnl Copyright (C) 2005-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gl_LOCK], [ AC_REQUIRE([gl_THREADLIB]) if test "$gl_threads_api" = posix; then # OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the # pthread_rwlock_* functions. AC_CHECK_TYPE([pthread_rwlock_t], [AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1], [Define if the POSIX multithreading library has read/write locks.])], [], [#include <pthread.h>]) # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro. AC_TRY_COMPILE([#include <pthread.h>], [#if __FreeBSD__ == 4 error "No, in FreeBSD 4.0 recursive mutexes actually don't work." #else int x = (int)PTHREAD_MUTEX_RECURSIVE; return !x; #endif], [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1], [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])]) fi gl_PREREQ_LOCK ]) # Prerequisites of lib/lock.c. AC_DEFUN([gl_PREREQ_LOCK], [ AC_REQUIRE([AC_C_INLINE]) ]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/longlong.m4��������������������������������������������������������������������0000664�0000000�0000000�00000010575�12660066715�0016410�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# longlong.m4 serial 14 dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_LONG_LONG_INT if 'long long int' works. # This fixes a bug in Autoconf 2.61, but can be removed once we # assume 2.62 everywhere. # Note: If the type 'long long int' exists but is only 32 bits large # (as on some very old compilers), HAVE_LONG_LONG_INT will not be # defined. In this case you can treat 'long long int' like 'long int'. AC_DEFUN([AC_TYPE_LONG_LONG_INT], [ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. dnl If cross compiling, assume the bug isn't important, since dnl nobody cross compiles for this platform as far as we know. AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[@%:@include <limits.h> @%:@ifndef LLONG_MAX @%:@ define HALF \ (1LL << (sizeof (long long int) * CHAR_BIT - 2)) @%:@ define LLONG_MAX (HALF - 1 + HALF) @%:@endif]], [[long long int n = 1; int i; for (i = 0; ; i++) { long long int m = n << i; if (m >> i != n) return 1; if (LLONG_MAX / 2 < m) break; } return 0;]])], [ac_cv_type_long_long_int=yes], [ac_cv_type_long_long_int=no], [ac_cv_type_long_long_int=yes])], [ac_cv_type_long_long_int=no])]) if test $ac_cv_type_long_long_int = yes; then AC_DEFINE([HAVE_LONG_LONG_INT], [1], [Define to 1 if the system has the type `long long int'.]) fi ]) # Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works. # This fixes a bug in Autoconf 2.61, but can be removed once we # assume 2.62 everywhere. # Note: If the type 'unsigned long long int' exists but is only 32 bits # large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT # will not be defined. In this case you can treat 'unsigned long long int' # like 'unsigned long int'. AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT], [ AC_CACHE_CHECK([for unsigned long long int], [ac_cv_type_unsigned_long_long_int], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [ac_cv_type_unsigned_long_long_int=yes], [ac_cv_type_unsigned_long_long_int=no])]) if test $ac_cv_type_unsigned_long_long_int = yes; then AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], [Define to 1 if the system has the type `unsigned long long int'.]) fi ]) # Expands to a C program that can be used to test for simultaneous support # of 'long long' and 'unsigned long long'. We don't want to say that # 'long long' is available if 'unsigned long long' is not, or vice versa, # because too many programs rely on the symmetry between signed and unsigned # integer types (excluding 'bool'). AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET], [ AC_LANG_PROGRAM( [[/* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63;]], [[/* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull));]]) ]) �����������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/nls.m4�������������������������������������������������������������������������0000664�0000000�0000000�00000002315�12660066715�0015356�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/pkg.m4�������������������������������������������������������������������������0000664�0000000�0000000�00000017167�12660066715�0015356�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant <scott@netsplit.com>. # # 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/po.m4��������������������������������������������������������������������������0000664�0000000�0000000�00000044616�12660066715�0015212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# po.m4 serial 17 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003. AC_PREREQ([2.50]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.18]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat <<EOT $* EOT } gt_echo='echo_func' fi fi # A sed script that extracts the value of VARIABLE from a Makefile. sed_x_variable=' # Test if the hold space is empty. x s/P/P/ x ta # Yes it was empty. Look if we have the expected variable definition. /^[ ]*VARIABLE[ ]*=/{ # Seen the first line of the variable definition. s/^[ ]*VARIABLE[ ]*=// ba } bd :a # Here we are processing a line from the variable definition. # Remove comment, more precisely replace it with a space. s/#.*$/ / # See if the line ends in a backslash. tb :b s/\\$// # Print the line, without the trailing backslash. p tc # There was no trailing backslash. The end of the variable definition is # reached. Clear the hold space. s/^.*$// x bd :c # A trailing backslash means that the variable definition continues in the # next line. Put a nonempty string into the hold space to indicate this. s/^.*$/P/ x :d ' changequote([,])dnl # Set POTFILES to the value of the Makefile variable POTFILES. sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'` POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"` # Compute POTFILES_DEPS as # $(foreach file, $(POTFILES), $(top_srcdir)/$(file)) POTFILES_DEPS= for file in $POTFILES; do POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file" done POMAKEFILEDEPS="" if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS. sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'` ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"` fi # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) # Compute PROPERTIESFILES # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties) # Compute CLASSFILES # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class) # Compute QMFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm) # Compute MSGFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg) # Compute RESOURCESDLLFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= PROPERTIESFILES= CLASSFILES= QMFILES= MSGFILES= RESOURCESDLLFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties" CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class" QMFILES="$QMFILES $srcdirpre$lang.qm" frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg" frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= JAVACATALOGS= QTCATALOGS= TCLCATALOGS= CSHARPCATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties" QTCATALOGS="$QTCATALOGS $lang.qm" frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg" frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll" done fi sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" <<EOF $frobbedlang.msg: $lang.po @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \ \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; } EOF done fi if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <<EOF $frobbedlang/\$(DOMAIN).resources.dll: $lang.po @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \ \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; } EOF done fi if test -n "$POMAKEFILEDEPS"; then cat >> "$ac_file.tmp" <<EOF Makefile: $POMAKEFILEDEPS EOF fi mv "$ac_file.tmp" "$ac_file" ]) dnl Initializes the accumulator used by AM_XGETTEXT_OPTION. AC_DEFUN([AM_XGETTEXT_OPTION_INIT], [ XGETTEXT_EXTRA_OPTIONS= ]) dnl Registers an option to be passed to xgettext in the po subdirectory. AC_DEFUN([AM_XGETTEXT_OPTION], [ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT]) XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1" ]) ������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/printf-posix.m4����������������������������������������������������������������0000664�0000000�0000000�00000002751�12660066715�0017230�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# printf-posix.m4 serial 5 (gettext-0.18) dnl Copyright (C) 2003, 2007, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether the printf() function supports POSIX/XSI format strings with dnl positions. AC_DEFUN([gt_PRINTF_POSIX], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings], gt_cv_func_printf_posix, [ AC_TRY_RUN([ #include <stdio.h> #include <string.h> /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, [ AC_EGREP_CPP([notposix], [ #if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ notposix #endif ], [gt_cv_func_printf_posix="guessing no"], [gt_cv_func_printf_posix="guessing yes"]) ]) ]) case $gt_cv_func_printf_posix in *yes) AC_DEFINE([HAVE_POSIX_PRINTF], [1], [Define if your printf() function supports format strings with positions.]) ;; esac ]) �����������������������silverjuke-16.2.3/m4/progtest.m4��������������������������������������������������������������������0000664�0000000�0000000�00000005573�12660066715�0016442�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# progtest.m4 serial 6 (gettext-0.18) dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper <drepper@cygnus.com>, 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) �������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/size_max.m4��������������������������������������������������������������������0000664�0000000�0000000�00000005630�12660066715�0016404�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# size_max.m4 serial 9 dnl Copyright (C) 2003, 2005-2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gl_SIZE_MAX], [ AC_CHECK_HEADERS([stdint.h]) dnl First test whether the system already has SIZE_MAX. AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [ gl_cv_size_max= AC_EGREP_CPP([Found it], [ #include <limits.h> #if HAVE_STDINT_H #include <stdint.h> #endif #ifdef SIZE_MAX Found it #endif ], [gl_cv_size_max=yes]) if test -z "$gl_cv_size_max"; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl than the type 'unsigned long'. Try hard to find a definition that can dnl be used in a preprocessor #if, i.e. doesn't contain a cast. AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1], [#include <stddef.h> #include <limits.h>], [size_t_bits_minus_1=]) AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)], [#include <stddef.h>], [fits_in_uint=]) if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. AC_TRY_COMPILE([#include <stddef.h> extern size_t foo; extern unsigned long foo; ], [], [fits_in_uint=0]) fi dnl We cannot use 'expr' to simplify this expression, because 'expr' dnl works only with 'long' integers in the host environment, while we dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else dnl Shouldn't happen, but who knows... gl_cv_size_max='((size_t)~(size_t)0)' fi fi ]) if test "$gl_cv_size_max" != yes; then AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], [Define as the maximum value of type 'size_t', if the system doesn't define it.]) fi dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with dnl #define by AC_DEFINE_UNQUOTED. AH_VERBATIM([SIZE_MAX], [/* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #ifndef SIZE_MAX # undef SIZE_MAX #endif]) ]) dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. dnl Remove this when we can assume autoconf >= 2.61. m4_ifdef([AC_COMPUTE_INT], [], [ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])]) ]) ��������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/stdint_h.m4��������������������������������������������������������������������0000664�0000000�0000000�00000001641�12660066715�0016377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# stdint_h.m4 serial 8 dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists, # doesn't clash with <sys/types.h>, and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h], [AC_TRY_COMPILE( [#include <sys/types.h> #include <stdint.h>], [uintmax_t i = (uintmax_t) -1; return !i;], [gl_cv_header_stdint_h=yes], [gl_cv_header_stdint_h=no])]) if test $gl_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1], [Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares uintmax_t. ]) fi ]) �����������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/threadlib.m4�������������������������������������������������������������������0000664�0000000�0000000�00000032377�12660066715�0016533�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# threadlib.m4 serial 5 (gettext-0.18) dnl Copyright (C) 2005-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl gl_THREADLIB dnl ------------ dnl Tests for a multithreading library to be used. dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS, dnl USE_PTH_THREADS, USE_WIN32_THREADS dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with dnl libtool). dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for dnl programs that really need multithread functionality. The difference dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread". dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. AC_DEFUN([gl_THREADLIB_EARLY], [ AC_REQUIRE([gl_THREADLIB_EARLY_BODY]) ]) dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once. AC_DEFUN([gl_THREADLIB_EARLY_BODY], [ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that dnl influences the result of the autoconf tests that test for *_unlocked dnl declarations, on AIX 5 at least. Therefore it must come early. AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl AC_BEFORE([$0], [gl_ARGP])dnl AC_REQUIRE([AC_CANONICAL_HOST]) dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems. dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes dnl AC_GNU_SOURCE. m4_ifdef([AC_USE_SYSTEM_EXTENSIONS], [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])], [AC_REQUIRE([AC_GNU_SOURCE])]) dnl Check for multithreading. m4_divert_text([DEFAULTS], [gl_use_threads_default=]) AC_ARG_ENABLE([threads], AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API]) AC_HELP_STRING([--disable-threads], [build without multithread safety]), [gl_use_threads=$enableval], [if test -n "$gl_use_threads_default"; then gl_use_threads="$gl_use_threads_default" else changequote(,)dnl case "$host_os" in dnl Disable multithreading by default on OSF/1, because it interferes dnl with fork()/exec(): When msgexec is linked with -lpthread, its dnl child process gets an endless segmentation fault inside execvp(). dnl Disable multithreading by default on Cygwin 1.5.x, because it has dnl bugs that lead to endless loops or crashes. See dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>. osf*) gl_use_threads=no ;; cygwin*) case `uname -r` in 1.[0-5].*) gl_use_threads=no ;; *) gl_use_threads=yes ;; esac ;; *) gl_use_threads=yes ;; esac changequote([,])dnl fi ]) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then # For using <pthread.h>: case "$host_os" in osf*) # On OSF/1, the compiler needs the flag -D_REENTRANT so that it # groks <pthread.h>. cc also understands the flag -pthread, but # we don't use it because 1. gcc-2.95 doesn't understand -pthread, # 2. putting a flag into CPPFLAGS that has an effect on the linker # causes the AC_TRY_LINK test below to succeed unexpectedly, # leading to wrong values of LIBTHREAD and LTLIBTHREAD. CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac # Some systems optimize for single-threaded programs by default, and # need special flags to disable these optimizations. For example, the # definition of 'errno' in <errno.h>. case "$host_os" in aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac fi ]) dnl The guts of gl_THREADLIB. Needs to be expanded only once. AC_DEFUN([gl_THREADLIB_BODY], [ AC_REQUIRE([gl_THREADLIB_EARLY_BODY]) gl_threads_api=none LIBTHREAD= LTLIBTHREAD= LIBMULTITHREAD= LTLIBMULTITHREAD= if test "$gl_use_threads" != no; then dnl Check whether the compiler and linker support weak declarations. AC_CACHE_CHECK([whether imported symbols can be declared weak], [gl_cv_have_weak], [gl_cv_have_weak=no dnl First, test whether the compiler accepts it syntactically. AC_TRY_LINK([extern void xyzzy (); #pragma weak xyzzy], [xyzzy();], [gl_cv_have_weak=maybe]) if test $gl_cv_have_weak = maybe; then dnl Second, test whether it actually works. On Cygwin 1.7.2, with dnl gcc 4.3, symbols declared weak always evaluate to the address 0. AC_TRY_RUN([ #include <stdio.h> #pragma weak fputs int main () { return (fputs == NULL); }], [gl_cv_have_weak=yes], [gl_cv_have_weak=no], [dnl When cross-compiling, assume that only ELF platforms support dnl weak symbols. AC_EGREP_CPP([Extensible Linking Format], [#ifdef __ELF__ Extensible Linking Format #endif ], [gl_cv_have_weak="guessing yes"], [gl_cv_have_weak="guessing no"]) ]) fi ]) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY. AC_CHECK_HEADER([pthread.h], [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads gl_have_pthread= # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. AC_TRY_LINK([#include <pthread.h>], [pthread_mutex_lock((pthread_mutex_t*)0); pthread_mutexattr_init((pthread_mutexattr_t*)0);], [gl_have_pthread=yes]) # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test -n "$gl_have_pthread"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. AC_CHECK_LIB([pthread], [pthread_kill], [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. case "$host_os" in solaris* | hpux*) AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], [Define if the pthread_in_use() detection is hard.]) esac ]) else # Some library is needed. Try libpthread and libc_r. AC_CHECK_LIB([pthread], [pthread_kill], [gl_have_pthread=yes LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread]) if test -z "$gl_have_pthread"; then # For FreeBSD 4. AC_CHECK_LIB([c_r], [pthread_kill], [gl_have_pthread=yes LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r]) fi fi if test -n "$gl_have_pthread"; then gl_threads_api=posix AC_DEFINE([USE_POSIX_THREADS], [1], [Define if the POSIX multithreading library can be used.]) if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], [Define if references to the POSIX multithreading library should be made weak.]) LIBTHREAD= LTLIBTHREAD= fi fi fi fi fi if test -z "$gl_have_pthread"; then if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then gl_have_solaristhread= gl_save_LIBS="$LIBS" LIBS="$LIBS -lthread" AC_TRY_LINK([#include <thread.h> #include <synch.h>], [thr_self();], [gl_have_solaristhread=yes]) LIBS="$gl_save_LIBS" if test -n "$gl_have_solaristhread"; then gl_threads_api=solaris LIBTHREAD=-lthread LTLIBTHREAD=-lthread LIBMULTITHREAD="$LIBTHREAD" LTLIBMULTITHREAD="$LTLIBTHREAD" AC_DEFINE([USE_SOLARIS_THREADS], [1], [Define if the old Solaris multithreading library can be used.]) if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1], [Define if references to the old Solaris multithreading library should be made weak.]) LIBTHREAD= LTLIBTHREAD= fi fi fi fi if test "$gl_use_threads" = pth; then gl_save_CPPFLAGS="$CPPFLAGS" AC_LIB_LINKFLAGS([pth]) gl_have_pth= gl_save_LIBS="$LIBS" LIBS="$LIBS -lpth" AC_TRY_LINK([#include <pth.h>], [pth_self();], [gl_have_pth=yes]) LIBS="$gl_save_LIBS" if test -n "$gl_have_pth"; then gl_threads_api=pth LIBTHREAD="$LIBPTH" LTLIBTHREAD="$LTLIBPTH" LIBMULTITHREAD="$LIBTHREAD" LTLIBMULTITHREAD="$LTLIBTHREAD" AC_DEFINE([USE_PTH_THREADS], [1], [Define if the GNU Pth multithreading library can be used.]) if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then AC_DEFINE([USE_PTH_THREADS_WEAK], [1], [Define if references to the GNU Pth multithreading library should be made weak.]) LIBTHREAD= LTLIBTHREAD= fi fi else CPPFLAGS="$gl_save_CPPFLAGS" fi fi if test -z "$gl_have_pthread"; then if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then if { case "$host_os" in mingw*) true;; *) false;; esac }; then gl_threads_api=win32 AC_DEFINE([USE_WIN32_THREADS], [1], [Define if the Win32 multithreading API can be used.]) fi fi fi fi AC_MSG_CHECKING([for multithread API to use]) AC_MSG_RESULT([$gl_threads_api]) AC_SUBST([LIBTHREAD]) AC_SUBST([LTLIBTHREAD]) AC_SUBST([LIBMULTITHREAD]) AC_SUBST([LTLIBMULTITHREAD]) ]) AC_DEFUN([gl_THREADLIB], [ AC_REQUIRE([gl_THREADLIB_EARLY]) AC_REQUIRE([gl_THREADLIB_BODY]) ]) dnl gl_DISABLE_THREADS dnl ------------------ dnl Sets the gl_THREADLIB default so that threads are not used by default. dnl The user can still override it at installation time, by using the dnl configure option '--enable-threads'. AC_DEFUN([gl_DISABLE_THREADS], [ m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) ]) dnl Survey of platforms: dnl dnl Platform Available Compiler Supports test-lock dnl flavours option weak result dnl --------------- --------- --------- -------- --------- dnl Linux 2.4/glibc posix -lpthread Y OK dnl dnl GNU Hurd/glibc posix dnl dnl FreeBSD 5.3 posix -lc_r Y dnl posix -lkse ? Y dnl posix -lpthread ? Y dnl posix -lthr Y dnl dnl FreeBSD 5.2 posix -lc_r Y dnl posix -lkse Y dnl posix -lthr Y dnl dnl FreeBSD 4.0,4.10 posix -lc_r Y OK dnl dnl NetBSD 1.6 -- dnl dnl OpenBSD 3.4 posix -lpthread Y OK dnl dnl MacOS X 10.[123] posix -lpthread Y OK dnl dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK dnl dnl HP-UX 11 posix -lpthread N (cc) OK dnl Y (gcc) dnl dnl IRIX 6.5 posix -lpthread Y 0.5 dnl dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK dnl dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK dnl -lpthread (gcc) Y dnl dnl Cygwin posix -lpthread Y OK dnl dnl Any of the above pth -lpth 0.0 dnl dnl Mingw win32 N OK dnl dnl BeOS 5 -- dnl dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is dnl turned off: dnl OK if all three tests terminate OK, dnl 0.5 if the first test terminates OK but the second one loops endlessly, dnl 0.0 if the first test already loops endlessly. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/uintmax_t.m4�������������������������������������������������������������������0000664�0000000�0000000�00000002131�12660066715�0016566�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# uintmax_t.m4 serial 12 dnl Copyright (C) 1997-2004, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ([2.13]) # Define uintmax_t to 'unsigned long' or 'unsigned long long' # if it is not already defined in <stdint.h> or <inttypes.h>. AC_DEFUN([gl_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) test $ac_cv_type_unsigned_long_long_int = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type], [Define to unsigned long or unsigned long long if <stdint.h> and <inttypes.h> don't define.]) else AC_DEFINE([HAVE_UINTMAX_T], [1], [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.]) fi ]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/visibility.m4������������������������������������������������������������������0000664�0000000�0000000�00000006246�12660066715�0016760�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# visibility.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Tests whether the compiler supports the command-line option dnl -fvisibility=hidden and the function and variable attributes dnl __attribute__((__visibility__("hidden"))) and dnl __attribute__((__visibility__("default"))). dnl Does *not* test for __visibility__("protected") - which has tricky dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on dnl MacOS X. dnl Does *not* test for __visibility__("internal") - which has processor dnl dependent semantics. dnl Does *not* test for #pragma GCC visibility push(hidden) - which is dnl "really only recommended for legacy code". dnl Set the variable CFLAG_VISIBILITY. dnl Defines and sets the variable HAVE_VISIBILITY. AC_DEFUN([gl_VISIBILITY], [ AC_REQUIRE([AC_PROG_CC]) CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then dnl First, check whether -Werror can be added to the command line, or dnl whether it leads to an error because of some other option that the dnl user has put into $CC $CFLAGS $CPPFLAGS. AC_MSG_CHECKING([whether the -Werror option is usable]) AC_CACHE_VAL([gl_cv_cc_vis_werror], [ gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" AC_TRY_COMPILE([], [], [gl_cv_cc_vis_werror=yes], [gl_cv_cc_vis_werror=no]) CFLAGS="$gl_save_CFLAGS"]) AC_MSG_RESULT([$gl_cv_cc_vis_werror]) dnl Now check whether visibility declarations are supported. AC_MSG_CHECKING([for simple visibility declarations]) AC_CACHE_VAL([gl_cv_cc_visibility], [ gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" dnl We use the option -Werror and a function dummyfunc, because on some dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning dnl "visibility attribute not supported in this configuration; ignored" dnl at the first function definition in every compilation unit, and we dnl don't want to use the option in this case. if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi AC_TRY_COMPILE( [extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void) {}], [], [gl_cv_cc_visibility=yes], [gl_cv_cc_visibility=no]) CFLAGS="$gl_save_CFLAGS"]) AC_MSG_RESULT([$gl_cv_cc_visibility]) if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi AC_SUBST([CFLAG_VISIBILITY]) AC_SUBST([HAVE_VISIBILITY]) AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY], [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.]) ]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/wchar_t.m4���������������������������������������������������������������������0000664�0000000�0000000�00000001353�12660066715�0016212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# wchar_t.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether <stddef.h> has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], [AC_TRY_COMPILE([#include <stddef.h> wchar_t foo = (wchar_t)'\0';], , [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.]) fi ]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/m4/wint_t.m4����������������������������������������������������������������������0000664�0000000�0000000�00000001726�12660066715�0016073�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# wint_t.m4 serial 4 (gettext-0.18) dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether <wchar.h> has the 'wint_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], [AC_TRY_COMPILE([ /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before <wchar.h>. BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included before <wchar.h>. */ #include <stddef.h> #include <stdio.h> #include <time.h> #include <wchar.h> wint_t foo = (wchar_t)'\0';], , [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.]) fi ]) ������������������������������������������silverjuke-16.2.3/m4/xsize.m4�����������������������������������������������������������������������0000664�0000000�0000000�00000000662�12660066715�0015727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# xsize.m4 serial 4 dnl Copyright (C) 2003-2004, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSIZE], [ dnl Prerequisites of lib/xsize.h. AC_REQUIRE([gl_SIZE_MAX]) AC_REQUIRE([AC_C_INLINE]) AC_CHECK_HEADERS([stdint.h]) ]) ������������������������������������������������������������������������������silverjuke-16.2.3/po/�������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0014415�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/LINGUAS������������������������������������������������������������������������0000664�0000000�0000000�00000000107�12660066715�0015440�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Set of available languages. cs da de en@boldquot en@quot es fr nb nl ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/Makefile.in.in�����������������������������������������������������������������0000664�0000000�0000000�00000037442�12660066715�0017101�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu> # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.18 GETTEXT_MACRO_VERSION = 0.18 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use @SHELL@, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && @SHELL@ ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/Makevars�����������������������������������������������������������������������0000664�0000000�0000000�00000003560�12660066715�0016115�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --keyword=wxPLURAL:1,2 --no-location MSGMERGE_OPTIONS = --previous # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Bjoern Petersen Software Design and Development # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = r10s@b44t.com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = ������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/Makevars.template��������������������������������������������������������������0000664�0000000�0000000�00000003416�12660066715�0017727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/POTFILES.in��������������������������������������������������������������������0000664�0000000�0000000�00000007272�12660066715�0016202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# List of source files which contain translatable strings. src/sjbase/autoctrl.cpp src/sjbase/backend.cpp src/sjbase/backend_gstreamer.cpp src/sjbase/backend_xine.cpp src/sjbase/browser_album.cpp src/sjbase/browser_cover.cpp src/sjbase/browser.cpp src/sjbase/browser_list.cpp src/sjbase/columnmixer.cpp src/sjbase/display.cpp src/sjbase/mainapp.cpp src/sjbase/mainframe.cpp src/sjbase/mainframe_menu.cpp src/sjbase/player.cpp src/sjbase/playlist.cpp src/sjbase/queue.cpp src/sjbase/search.cpp src/sjbase/skin.cpp src/sjbase/skinenum.cpp src/sjbase/skinml.cpp src/sjdata/data.cpp src/sjmodules/accel.cpp src/sjmodules/advsearch.cpp src/sjmodules/arteditor.cpp src/sjmodules/basicsettings.cpp src/sjmodules/cinterface.cpp src/sjmodules/help/help.cpp src/sjmodules/help/htmlwindow.cpp src/sjmodules/internalinterface.cpp src/sjmodules/kiosk/creditbase.cpp src/sjmodules/kiosk/kiosk.cpp src/sjmodules/kiosk/monitor_overview.cpp src/sjmodules/kiosk/numpad.cpp src/sjmodules/kiosk/numpadmenu.cpp src/sjmodules/kiosk/numpadpassword.cpp src/sjmodules/kiosk/numpadplay.cpp src/sjmodules/kiosk/numpadsearch.cpp src/sjmodules/kiosk/numpadtextentry.cpp src/sjmodules/kiosk/password_dlg.cpp src/sjmodules/kiosk/virtkeybd.cpp src/sjmodules/library.cpp src/sjmodules/modulebase.cpp src/sjmodules/mymusic.cpp src/sjmodules/openfiles.cpp src/sjmodules/playbacksettings.cpp src/sjmodules/scanner/folder_scanner.cpp src/sjmodules/scanner/server_scanner_config.cpp src/sjmodules/scanner/server_scanner.cpp src/sjmodules/settings.cpp src/sjmodules/tageditor/freedb.cpp src/sjmodules/tageditor/tageditor.cpp src/sjmodules/tageditor/tageditorfreedb.cpp src/sjmodules/tageditor/tageditorplugin.cpp src/sjmodules/tageditor/tageditorrename.cpp src/sjmodules/tageditor/tageditorreplace.cpp src/sjmodules/tageditor/tageditorsplit.cpp src/sjmodules/viewsettings.cpp src/sjmodules/vis/vis_bg.cpp src/sjmodules/vis/vis_cdg_raw.cpp src/sjmodules/vis/vis_cdg_reader.cpp src/sjmodules/vis/vis_frame.cpp src/sjmodules/vis/vis_karaoke_module.cpp src/sjmodules/vis/vis_module.cpp src/sjmodules/vis/vis_oscilloscope.cpp src/sjmodules/vis/vis_projectm_module.cpp src/sjmodules/vis/vis_synctxt_raw.cpp src/sjmodules/vis/vis_synctxt_reader.cpp src/sjmodules/vis/vis_vidout_module.cpp src/sjmodules/vis/vis_window.cpp src/sjmodules/weblinks.cpp src/sjtools/busyinfo.cpp src/sjtools/console.cpp src/sjtools/csv_tokenizer.cpp src/sjtools/dialog.cpp src/sjtools/explore.cpp src/sjtools/ext_list.cpp src/sjtools/fs_inet.cpp src/sjtools/gcalloc.cpp src/sjtools/hash.c src/sjtools/http.cpp src/sjtools/imgop.cpp src/sjtools/imgthread.cpp src/sjtools/levensthein.c src/sjtools/littleoption.cpp src/sjtools/msgbox.cpp src/sjtools/normalise.cpp src/sjtools/ringbuffer.cpp src/sjtools/sqlt.cpp src/sjtools/temp_n_cache.cpp src/sjtools/testdrive.cpp src/sjtools/timeout.cpp src/sjtools/tools.cpp src/sjtools/tools_gtk.cpp src/sjtools/tooltips.cpp src/sjtools/volumecalc.cpp src/sjtools/volumefade.cpp src/sjtools/wavework.cpp src/tagger/tg_ape_tag.cpp src/tagger/tg_a_tagger_frontend.cpp src/tagger/tg_bytefile.cpp src/tagger/tg_bytevector.cpp src/tagger/tg_flac_file.cpp src/tagger/tg_id3v1_tag.cpp src/tagger/tg_id3v2_frame.cpp src/tagger/tg_id3v2_framefactory.cpp src/tagger/tg_id3v2_header_footer.cpp src/tagger/tg_id3v2_knownframes.cpp src/tagger/tg_id3v2_tag.cpp src/tagger/tg_mp4_boxes.cpp src/tagger/tg_mp4_file.cpp src/tagger/tg_mpc_file.cpp src/tagger/tg_mpeg_file.cpp src/tagger/tg_mpeg_header.cpp src/tagger/tg_mpeg_properties.cpp src/tagger/tg_ogg_file.cpp src/tagger/tg_oggvorbis_file.cpp src/tagger/tg_oggvorbis_properties.cpp src/tagger/tg_ogg_xiphcomment.cpp src/tagger/tg_tagger_base.cpp src/tagger/tg_wma_file_asf.cpp src/tagger/tg_wma_file.cpp src/tagger/tg_wma_properties.cpp src/tagger/tg_wma_tag.cpp ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/Rules-quot���������������������������������������������������������������������0000664�0000000�0000000�00000003400�12660066715�0016415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/boldquot.sed�������������������������������������������������������������������0000664�0000000�0000000�00000000331�12660066715�0016740�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/cs.po��������������������������������������������������������������������������0000664�0000000�0000000�00000250307�12660066715�0015371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2011-06-30 20:39+0100\n" "Last-Translator: David Minář <antro@pb.cz>\n" "Language-Team: Czech\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" msgid "Sleep mode activated." msgstr "Režim spánku aktivován." msgid "Sleep mode deactivated." msgstr "Režim spánku deaktivován." msgid "Play time exceeded" msgstr "" msgid "Default" msgstr "Výchozí" #, fuzzy #| msgid "Devices" msgid "Device" msgstr "Zařízení" msgid "Show covers" msgstr "Zobrazit obaly" msgid "Duration" msgstr "Délka" msgid "Artist" msgstr "Interpret" msgid "Original artist" msgstr "Původní interpret" msgid "Composer" msgstr "Skladatel" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Číslo skladby" msgid "Automatic track number" msgstr "Automatické číslo skladby" msgid "Disk number" msgstr "Číslo disku" msgid "Genre" msgstr "Žánr" msgid "Year" msgstr "Rok" #, fuzzy #| msgid "My rating" msgid "Rating" msgstr "Hodnocení" msgid "Comment" msgstr "Komentář" msgid "Show double tracks" msgstr "Zobrazit dvojité skladby" msgid "Show different artist names" msgstr "Zobrazit různá jména umělců" msgid "Show different album names" msgstr "Zobrazit různé názvy alb" #, fuzzy #| msgid "Show covers" msgid "Show cover titles" msgstr "Zobrazit obaly" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s skladeb" msgid "Drag folders with music here." msgstr "Sem přetáhněte složky s hudbou." msgid "Reset to default values" msgstr "Reset na výchozí hodnoty" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Vzorkovací frekvence" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "Přehrát automaticky" msgid "Shuffle" msgstr "Náhodný výběr" msgid "Recreating music library" msgstr "Vytvořit hudební knihovnu" msgid "Updating music library" msgstr "Aktualizace hudební knihovny" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Pokud zrušíte proces aktualizace, nebude seznam hudby aktuální.\n" "\n" "Zrušit proces aktualizace?" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" "%s momentálně přehrává skladbu. Chcete zastavit přehrávání skladby a ukončit " "%s?" #, c-format msgid "Exit %s" msgstr "Ukončit %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Nelze otevřít \"%s\"." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "Nainstalovat skript \"%s\" pro trvalé použití" #, c-format msgid "Execute the script \"%s\"?" msgstr "Spustit skript \"%s\"?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "Hledání" msgid "On" msgstr "Zapnuto" msgid "Off" msgstr "Vypnuto" msgid "Repeat playlist" msgstr "Opakování playlistu" msgid "Repeat one" msgstr "Opakovat všechny skladby pouze jednou" msgid "Repeat all" msgstr "Opakovat všechny skladby" msgid "Select a track, then start playback." msgstr "Vybrat skladbu, spustit přehrávání." msgid "Stop after this track" msgstr "Stop po této skladbě" msgid "Stop after each track" msgstr "Stop po každé skladbě" #, fuzzy #| msgid "Double click on covers" msgid "Double click play tracks at once" msgstr "Poklikat na obaly" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback on first enqueue" msgstr "Spustit přehrávání na zařadit" msgid "Remove played tracks from queue" msgstr "Odstranit přehrané skladby z playlistu" msgid "More from current album" msgstr "Více z aktuálního alba" msgid "More from current artist" msgstr "Více z aktuálního interpreta" msgid "No more tracks." msgstr "Žádné další skladby." #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Remove all %i tracks from the queue and stop playback?" msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "Zastavit přehrávání a odstranit všechny %i skladby z playlistu?" msgstr[1] "Zastavit přehrávání a odstranit všechny %i skladby z playlistu?" msgstr[2] "Zastavit přehrávání a odstranit všechny %i skladby z playlistu?" msgid "Clear playlist" msgstr "Vymazat playlist" msgid "Track played, click to reset" msgstr "Skladba přehrána, klikněte na reset" msgid "Boredom avoided: Track moved down" msgstr "Skladba přesunuta nakonec" msgid "Remove this track" msgstr "Odstranit tuto skladbu" msgid "Toggle time mode" msgstr "Přepnout časový režim" #, c-format msgid "Go to \"%s\"" msgstr "Přejít na \"%s\"" msgid "End search" msgstr "Konec hledání" msgid "click right for options" msgstr "klikněte pravým tlačítkem pro možnosti" msgid "Volume" msgstr "Hlasitost" msgid "Double-click to enlarge the cover" msgstr "Dvojklikem zvětšíte obal" #, c-format msgid "Close this window and exit %s" msgstr "Ukončit %s" msgid "Open main menu" msgstr "Otevřít hlavní menu" msgid "Toggle shuffle mode" msgstr "Přepnout režim náhodného přehrávání" msgid "Repeat all/repeat current" msgstr "Opakování všech/opakování aktuálních" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Hledat v \"%s\"" msgid "Help" msgstr "Pomoc" #, fuzzy #| msgid "Read files and folders" msgid "Add folders and files" msgstr "Načísti soubory a složky" #, fuzzy #| msgid "File extension" msgid "Extensions" msgstr "Přípona souboru" msgid "Show remaining time" msgstr "Zobrazit zbývající čas" msgid "Show elapsed time" msgstr "Zobrazit uplynulý čas" msgid "Show total time" msgstr "Zobrazit celkový čas" msgid "Show track number" msgstr "Zobrazit číslo skladby" msgid "Show artist name" msgstr "Zobrazit jméno interpreta" msgid "Show AutoPlay" msgstr "Zobrazit automatického přehrávání" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "Zobrazení" #, fuzzy #| msgid "Volume" msgid "Columns" msgstr "Hlasitost" msgid "Same zoom in all views" msgstr "Stejné přiblížení ve všech pohledech" msgid "Fonts and covers" msgstr "Písma a obaly" msgid "Zoom" msgstr "Přiblížení" msgid "Skins" msgstr "Skiny" #, fuzzy #| msgid "Start kiosk mode" msgid "Start kiosk mode..." msgstr "Start kiosk režimu" # %s will be replaced by the name of an artist #, fuzzy, c-format #| msgid "\"%s\" on the web" msgid "%s on the web" msgstr "\"%s\" na webu" msgid "All files" msgstr "Všechny soubory" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "O %s" msgid "File" msgstr "Soubor" msgid "Edit" msgstr "Upravit" msgid "View" msgstr "Zobrazit" msgid "Playback" msgstr "Přehrávání" #, fuzzy #| msgid "Fit to screen" msgid "Video screen" msgstr "Přizpůsobit obrazovce" msgid "Kiosk mode" msgstr "Kiosk režim" msgid "None" msgstr "" msgid "Further options" msgstr "Další možnosti" msgid "Queue" msgstr "Playlist" msgid "Automatic control" msgstr "Automatické řízení" msgid "Current view" msgstr "Aktuální zobrazení" #, c-format msgid "Next track from \"%s\"" msgstr "Další skladba z \"%s\"" msgid "Next track" msgstr "Další skladba" msgid "Search for genre" msgstr "Vyhledat podle žánru" msgid "Search for music selection" msgstr "Vyhledat podle výběru hudby" msgid "Edit tracks/Get info" msgstr "Úpravy skladeb/Více info" msgid "Show file" msgstr "Zobrazit soubor" msgid "Cover editor" msgstr "Editor obalů" msgid "Mix" msgstr "" #, fuzzy #| msgid "Channels" msgid "Left channel" msgstr "Kanály" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Odposlech" msgid "No" msgstr "Ne" msgid "Yes" msgstr "Ano" #, fuzzy #| msgid "Only initalize system volume" msgid "Only initialize system volume" msgstr "Pouze inicializace hlasitosti systému" msgid "Output" msgstr "" msgid "Use system volume" msgstr "Použít systémovou hlasitost" msgid "Several artists" msgstr "Několik interpretů" msgid "Unknown title" msgstr "Neznámá skladba" msgid "Save playlist" msgstr "Uložit playlist" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Nelze zapsat \"%s\"." msgid "Open playlist" msgstr "Otevřít playlist" msgid "Title" msgstr "Titul" msgid "Track count" msgstr "Počet skladeb" msgid "Disk count" msgstr "Počet disků" msgid "Group" msgstr "Skupina" msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Kanály" msgid "Bitrate" msgstr "Datový tok" msgid "File name" msgstr "Název souboru" msgid "File size" msgstr "Velikost souboru" msgid "Date added" msgstr "Datum vložení" msgid "Date modified" msgstr "Datum změny" msgid "Last played" msgstr "Naposledy přehráno" msgid "Play count" msgstr "Počet přehrání" msgid "SQL expression" msgstr "SQL výraz" msgid "Limit result to" msgstr "Omezit výsledek na" msgid "Title/artist/album" msgstr "Název/interpret/album" msgid "File type" msgstr "Typ souboru" msgid "Queue position" msgstr "Pořadí ve frontě" msgid "Include tracks" msgstr "Obsah skladeb" msgid "Exclude tracks" msgstr "Vyloučit skladby" msgid "Random" msgstr "Náhodné přehrávání" # %s bude nahrazeno zkratkou, např. "Ins" nebo "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "Stiskni \"%s\" v hlavním okně" msgid "Insert" msgstr "Vložit" msgid "Del" msgstr "Del" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "Zadejte prosím datum \"dd.mm.yyyy\", můžete také zadat čas \"hh: mm\"." msgid "Please enter the text." msgstr "Zadejte prosím text." msgid "Please enter a value." msgstr "Zadejte prosím hodnotu." msgid "Please enter a valid value." msgstr "Zadejte prosím platnou hodnotu." msgid "(second field)" msgstr "(Druhé pole)" msgid "No valid criteria defined." msgstr "Žádná platná kritéria stanovená." msgid "The search cannot be started; please check the following fields:" msgstr "Hledání nelze spustit, zkontrolujte následující oblasti:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" "Poznámka: Operátory \"stejné\" a \"nerovné\" jsou citlivý na velikost písmen." # %s will be replaced by the name of a music selection #, fuzzy, c-format #| msgid "Do you really want to delete the music selection \"%s\"?" msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Opravdu chcete odstranit výběr hudby \"%s\"?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Zrušit" msgid "Page left" msgstr "Page left" msgid "Page right" msgstr "Page right" msgid "Page up" msgstr "Page up" msgid "Page down" msgstr "Page down" msgid "Menu" msgstr "Menu" msgid "Cursor left" msgstr "Cursor left" msgid "Cursor right" msgstr "Cursor right" msgid "Cursor up" msgstr "Cursor up" msgid "Cursor down" msgstr "Cursor down" msgid "Line left" msgstr "Line left" msgid "Line right" msgstr "Line right" msgid "Line up" msgstr "Line up" msgid "Line down" msgstr "Line down" msgid "Home" msgstr "Home" msgid "End" msgstr "End" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Vymazat" msgid "Album view" msgstr "Zobrazit album" msgid "Cover view" msgstr "Zobrazit obal" msgid "List view" msgstr "Zobrazit seznam" msgid "Toggle view" msgstr "Přepnout zobrazení" #, fuzzy #| msgid "Open playlist" msgid "Open playlist..." msgstr "Otevřít playlist" msgid "Unqueue marked tracks" msgstr "Odstranit z playlistu označené skladby" msgid "Unqueue all but marked tracks" msgstr "Odstranit z playlistu všechny skladby kromě označených" #, fuzzy #| msgid "Save playlist" msgid "Save playlist..." msgstr "Uložit playlist" msgid "Paste" msgstr "Vložit" #, fuzzy #| msgid "Music selection" msgid "Music selection..." msgstr "Výběr hudby" msgid "Settings" msgstr "Nastavení" msgid "Update music library" msgstr "Aktualizovat hudební knihovnu" msgid "Recreate music library" msgstr "Vytvořit hudební knihovnu" msgid "Enqueue tracks" msgstr "Vložit skladby do playlistu" msgid "Play tracks next" msgstr "Přehrát další skladby" msgid "Play tracks now" msgstr "Přehrát skladby okamžitě" msgid "Volume up" msgstr "Zesílení" msgid "Volume down" msgstr "Zeslabení" msgid "Unqueue tracks" msgstr "Odstranění skladeb z playlistu" #, fuzzy #| msgid "Edit tracks/Get info" msgid "Edit tracks/Get info..." msgstr "Úpravy skladeb/Více info" msgid "Play" msgstr "Přehrát" msgid "Pause" msgstr "Pauza" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Předchozí skladba" msgid "Seek backward" msgstr "Posun zpět" msgid "Seek forward" msgstr "Posun vpřed" msgid "Fade to next" msgstr "Plynule přejít na další" msgid "Mute" msgstr "Ztlumit" msgid "Reload skin" msgstr "Znovunačíst skin" #, fuzzy #| msgid "Fit to screen" msgid "Toggle video screen" msgstr "Přizpůsobit obrazovce" msgid "Smooth" msgstr "Hladký" msgid "Select all" msgstr "Vybrat vše" msgid "Zoom in" msgstr "Přiblížit" msgid "Zoom out" msgstr "Oddálit" msgid "Normal zoom" msgstr "Normální přiblížení" msgid "Always on top" msgstr "Vždy napovrchu" msgid "Go to current track" msgstr "Přejít na aktuální skladby" msgid "Go to marked track" msgstr "Přejít na označený skladby" msgid "Go to random album" msgstr "Přejít na náhodné album" msgid "Go to previous letter" msgstr "Přejít na předchozí písmeno" msgid "Go to next letter" msgstr "Přejít na další písmeno" msgid "Add credit" msgstr "Dobít kredit" #, fuzzy #| msgid "Console" msgid "Console..." msgstr "Konzole" #, fuzzy #| msgid "Replace" msgid "Replace..." msgstr "Nahradit" #, fuzzy #| msgid "Split field" msgid "Split field..." msgstr "Rozdělit oblast" #, fuzzy #| msgid "Rename files" msgid "Rename files..." msgstr "Přejmenování souborů" #, fuzzy #| msgid "Query online database" msgid "Query online database..." msgstr "Dotaz na on-line databázi" #, fuzzy #| msgid "New music selection" msgid "New music selection..." msgstr "Nový výběr hudby" msgid "Save" msgstr "Uložit" #, fuzzy #| msgid "Save as" msgid "Save as..." msgstr "Uložit jako" #, fuzzy #| msgid "Rename" msgid "Rename..." msgstr "Přejmenovat" msgid "Revert to saved" msgstr "Vrátit se k uloženému" #, fuzzy #| msgid "Open file" msgid "Open file..." msgstr "Otevřít soubor" #, fuzzy #| msgid "Save cover" msgid "Save cover..." msgstr "Uložit obal" msgid "Rotate left" msgstr "Otočit vlevo" msgid "Rotate right" msgstr "Otočit vpravo" msgid "Flip horizontally" msgstr "Překlopit vodorovně" msgid "Flip vertically" msgstr "Překlopit svisle" msgid "Grayscale" msgstr "Ve stupních šedi" msgid "Negative" msgstr "Negativní" msgid "Fit to screen" msgstr "Přizpůsobit obrazovce" msgid "Decrease brightness" msgstr "Snížení jasu" msgid "Increase brightness" msgstr "Zvýšení jasu" msgid "Decrease contrast" msgstr "Snížení kontrastu" msgid "Increase contrast" msgstr "Zvýšení kontrastu" msgid "Normal brightness/contrast" msgstr "Normální jas/kontrast" msgid "Crop" msgstr "Oříznout" msgid "Please press the shortcut to add." msgstr "Stiskněte prosím klávesovou zkratku pro přidání." msgid "System-wide:" msgstr "Pro celý systém:" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Odstranit klávesovou zkratku \"%s\"" msgid "Add system-wide shortcut..." msgstr "Přidat klávesovou zkratku pro celý systém..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Přidat klavesovou zkratku na \"%s\"..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "Klávesová zkratka \"%s\" je aktuálně přiřazena k příkazu \"%s\".\n" "\n" "Chcete přiřadit klávesovou zkratku na \"%s\"?" msgid "Mouse" msgstr "Myš" msgid "Drag window content" msgstr "Přetáhněte obsah okna" msgid "Left mouse button" msgstr "Levé tlačítko myši" msgid "Drag selected tracks" msgstr "Přetáhněte vybrané skladby" msgid "Second click with the left mouse button" msgstr "Druhým kliknutím levým tlačítkem myši" msgid "Show icons beside mouse cursor" msgstr "Zobrazit ikony vedle kurzoru myši" msgid "Middle mouse button" msgstr "Prostřední tlačítko myši" msgid "Edit tracks" msgstr "Úpravy skladeb" msgid "Tooltips" msgstr "Popisy" msgid "Mouse wheel" msgstr "Kolečko myši" #, fuzzy #| msgid "Scroll horizontally" msgid "Scroll horizontally in album view" msgstr "Rolovat vodorovně" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "Použijte multimediální klávesy" msgid "Ask on close if playing" msgstr "Zeptat se příště na ukončení při přehrávání." msgid "Ask before enqueuing multiple tracks" msgstr "Zeptat se před přidáním více stop" msgid "Ask before clearing the playlist" msgstr "Zeptat se před vymazáním playlistu" #, fuzzy #| msgid "Ask before changing my rating" msgid "Ask before changing the rating" msgstr "Zeptat se na hodnocení před změnou" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Backspace" msgid "Space" msgstr "Space" msgid "Up" msgstr "Up" msgid "Left" msgstr "Left" msgid "Right" msgstr "Right" msgid "Down" msgstr "Down" msgid "Print" msgstr "Print" msgid "Ins" msgstr "Ins" msgid "Music selection" msgstr "Výběr hudby" msgid "Numpad" msgstr "Numpad" msgid "Select date and time" msgstr "Zvolte datum a čas" msgid "Time" msgstr "Čas" msgid "contains" msgstr "Obsahuje" msgid "does not contain" msgstr "neobsahuje" msgid "starts with" msgstr "začíná" msgid "does not start with" msgstr "nezačíná" msgid "starts simelar to" msgstr "začíná na simelar do" msgid "ends with" msgstr "končí" msgid "does not end with" msgstr "nekončí" msgid "on" msgstr "na" msgid "is equal to" msgstr "je rovno" msgid "not on" msgstr "ne na" msgid "is unequal to" msgstr "není rovno" msgid "is simelar to" msgstr "Je simelar na" msgid "is after" msgstr "je po" msgid "is greater than" msgstr "je větší než" msgid "is on or after" msgstr "je na nebo po" msgid "is greater or equal" msgstr "je větší nebo rovno" msgid "is before" msgstr "je před" msgid "is less than" msgstr "je menší než" msgid "is on or before" msgstr "je na nebo před" msgid "is less or equal" msgstr "je menší nebo roven" msgid "is in the last" msgstr "je v posledním" msgid "is not in the last" msgstr "není v posledním" msgid "is in the period" msgstr "je v období" msgid "is in range" msgstr "je v rozsahu" msgid "is not in the period" msgstr "není v období" msgid "is not in range" msgstr "není v rosahu" msgid "is set" msgstr "je nastaven" msgid "is unset" msgstr "není nastaven" msgid "tracks" msgstr "skladby" msgid "albums" msgstr "alba" msgid "minutes" msgstr "minut" msgid "hours" msgstr "hodin" msgid "seconds" msgstr "sekund" msgid "days" msgstr "dnů" msgid "No rating" msgstr "Bez hodnocení" msgid "random" msgstr "náhodně" msgid "highest rating" msgstr "nejvyšší hodnocení" msgid "lowest rating" msgstr "nejnižší hodnocení" msgid "most often played" msgstr "nejčastěji hrála" msgid "least often played" msgstr "nejméně hrála" msgid "most recently played" msgstr "naposledy hrála" msgid "least recently played" msgstr "alespoň v poslední době hrála" msgid "most recently added" msgstr "naposledy přidané" msgid "least recently added" msgstr "alespoň v poslední době přidané" msgid "most recently modified" msgstr "naposledy upravené" msgid "least recently modified" msgstr "alespoň v poslední době upravené" msgid "most recently released" msgstr "nedávno uvolněn" msgid "least recently released" msgstr "alespoň nedávno vydala" msgid "low queue position" msgstr "nízké pořadí v playlistu" msgid "high queue position" msgstr "vysoké pořadí v playlistu" msgid "Today" msgstr "Dnes" msgid "Yesterday" msgstr "Včera" msgid "Select..." msgstr "Vyberte..." msgid "Show tracks..." msgstr "Seznam skladeb..." msgid "Add tracks from playlist" msgstr "Přidat skladeby z playlistu" msgid "Current position" msgstr "Aktuální pozice" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "od" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "do" msgid "Remove criterion" msgstr "Odstranit kritérium" msgid "Add criterion" msgstr "Přidat kritérium" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "Skladby obsahují na \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Skladby vyloučeny z \"%s\"" msgid "Saved selections" msgstr "Uložené výběry" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Hledat %s %s odpovídající z následujících kritérií:" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "skladby|alba" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "všechny|nějaké|žádné" msgid "Close" msgstr "Zavřít" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Přejete si uložit změny v hudebním výběru \"%s\"?" msgid "Music selection modified" msgstr "Výběr hudby upravené" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "Upravit výběr hudby \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Opravdu chcete odstranit výběr hudby \"%s\"?" msgid "Delete music selection" msgstr "Smazat výběr hudby" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Opravdu chcete odstranit %i označený hudební výběr?" msgid "Delete music selections" msgstr "Smazat výběr hudby" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "Nebyl nalezen záznam pro \"%s\"." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "Přejete si odstranit vybranou skladbu(y) z hudebního výběr \"%s\"?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "Chcete přidat vybranou skladbu(y) do výběru hudby \"%s\"?" # This is the name of a predefined music selection msgid "70's music" msgstr "70's music" msgid "Worst rated" msgstr "Nejhůře hodnocený" # This is the name of a predefined music selection msgid "Top rated" msgstr "Nejlépe hodnocené" # This is the name of a predefined music selection msgid "Top 20" msgstr "Top 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "V poslední době přehrané" # This is the name of a predefined music selection msgid "Played today" msgstr "Přehrané dnes" # This is the name of a predefined music selection msgid "Random selection" msgstr "Náhodný výběr" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Skladby v playlistu" msgid "Untitled Music selection" msgstr "Výběr hudby bez názvu" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Žádné záznamy v \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "1 záznam v \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s záznam(y) v \"%s\"" msgid "No matches" msgstr "Žádné záznamy" msgid "1 match" msgstr "1 záznam" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s záznamů" msgid "Search single words" msgstr "Hledání samostatného slova" msgid "Lookup genre on simple search" msgstr "Vyhledání žánru jednoduchým vyhledáváním" msgid "Search while typing" msgstr "Hledat při psaní" msgid "Save modified music selections" msgstr "Uložit upravený hudební výběr" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "Zeptat se" msgid "Max. history size" msgstr "Maximální historická velikost" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Hledat \"%s\" v \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Hledat \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Stiskněte a držte levé tlačítko myši. Pak vyberte plochu k oříznutí pohybem " "myši." msgid "<Abstract>" msgstr "<Obal vytvořený z názvu alba>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Výchozí)" msgid "Paste image from clipboard" msgstr "Vložit obrázek ze schránky" msgid "Browse" msgstr "Prohlížet" msgid "Select cover" msgstr "Vybrat obal" msgid "Search covers on the web" msgstr "Hledat obaly na webu" msgid "Don't rotate" msgstr "Neotáčet" msgid "Rotate/flip" msgstr "Otočit / převrátit" msgid "Use default images..." msgstr "Použít výchozí obrázky..." msgid "Effects/options" msgstr "Efekty/možnosti" msgid "Select image" msgstr "Vybrat obrázek" msgid "Save cover" msgstr "Uložit obal" msgid "Reset all selected alternative images to their default value?" msgstr "Reset všechny označené alternativní obrázky na jejich výchozí hodnoty?" msgid "Search paths" msgstr "Hledat cestu" msgid "The search paths are used for skins, language files and modules." msgstr "Hledat cestu použité pro skiny, jazykové soubory a moduly." msgid "Add..." msgstr "Přidat..." msgid "Remove" msgstr "Odstranit" msgid "Please select the folder to add to the search paths." msgstr "Vyberte prosím složku pro přidání do vyhledávací cesty." msgid "Edit..." msgstr "Upravit..." #, fuzzy #| msgid "Comment" msgid "Command" msgstr "Komentář" msgid "Shortcut" msgstr "Zkratka" #, fuzzy #| msgid "Options" msgid "Option" msgstr "Možnosti" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "Následující nastavení je pouze pro zkušené uživatele." msgid "Customize" msgstr "Vlastní" msgid "Reset selection" msgstr "Reset výběru" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Opravdu chcete obnovit všechny %i vybrané nástroje a možnosti, na jejich " "výchozí hodnoty?" #, fuzzy #| msgid "Shortcut" msgid "Shortcuts" msgstr "Zkratka" msgid "Language" msgstr "Jazyk" msgid "Show files with" msgstr "Ukázat soubory s" msgid "Instance" msgstr "Příklad" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Použití příkazového řádku --%s=<file> změnit." msgid "Index file" msgstr "Index souboru" msgid "RAM cache" msgstr "RAM cache" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "Dotaz - průměrný čas: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synchronity" msgid "Fast" msgstr "Rychle" msgid "Save but slower" msgstr "Uložit ale pomalejší" msgid "Very save and slow" msgstr "Velmi pomalé ukládání" msgid "Image cache" msgstr "Obrázky cache" msgid "Use temporary directory" msgstr "Použití dočasného adresáře" msgid "Yes, load images asynchrony" msgstr "Ano, načíst obrázky asynchroně" msgid "Yes, load images directly and avoid flickering" msgstr "Ano, načíst obrázky přímo a vyhnout se blikání" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% využito pro %i obrázky" msgid "Regard file changes" msgstr "Přečíst soubor změn" msgid "Advanced" msgstr "Pokročilé" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Změny %s se projeví po restartu Silverjuke" msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Nápověda systému" # String for "Don't know" or "unset" msgid "n/a" msgstr "Nedostupný" msgid "Internal" msgstr "Interní" msgid "No credit." msgstr "Žádný kredit." #, c-format msgid "Credit: %i" msgstr "Kredit: %i" msgid "Start" msgstr "Start" #, fuzzy #| msgid "Functionality" msgid "Functions" msgstr "Funkčnost" msgid "Monitors" msgstr "Monitory" msgid "Virtual keyboard" msgstr "Virtuální klávesnice" msgid "Credit system" msgstr "Kreditní systém" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke nabízí tzv. \"kiosk režim\", který umožňuje spustit program \n" "v celoobrazovém režimu s definovanými funkcemi." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Před vstupem do KIOSK režimu (kliknutím na \"Start\") se ujistěte,\n" "že víte, jak tento režim opustit:" #, c-format msgid "Exit by hitting %s" msgstr "Ukončit stiskem klávesy %s" msgid "Exit by clicking into two different corners" msgstr "Ukončit kliknutím do obou horních rohů obrazovky" msgid "Try to set exclusive" msgstr "" msgid "Ask for a password on exit" msgstr "Při ukončení požádat o heslo" msgid "Change password..." msgstr "Změnit heslo..." msgid "Exit action:" msgstr "Konec akce:" msgid "Start the kiosk mode with the following functionality:" msgstr "Start kiosk režimu s následujícími funkcemi:" msgid "Play/pause" msgstr "Přehrát/Pauza" msgid "Edit queue" msgstr "Upravit pořadí ve frontě" msgid "Toggle elements" msgstr "Přepnout prvky" msgid "Enqueue multiple tracks" msgstr "Hromadné vložení skladeb" msgid "All functions" msgstr "Všechny funkce" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Omezit výběr hudby na %s" msgid "Please enter the password again for verification." msgstr "Zadejte prosím heslo pro ověření." msgid "Overview:" msgstr "Přehled:" msgid "Main window" msgstr "Hlavní okno" msgid "Monitor" msgstr "Monitor" msgid "Disable screensaver" msgstr "Zakázat spořič obrazovky" msgid "Disable power management" msgstr "Zakázat správu napájení" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Není-li fyzická klávesnice k dispozici, můžete využít virtuální klávesnice.\n" "Virtuální klávesnice se zobrazí vždy po kliknutí do textového pole (hledání)." msgid "Use the virtual keyboard" msgstr "Použít virtuální klávesnici v kios režimu" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Použít virtuální klávesnici i mimo kios režim" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(Klikněte prosím do textového pole)" msgid "Virtual keyboard layout:" msgstr "Virtuální klávesnice k dispozici:" msgid "Colour:" msgstr "Barva:" msgid "Black" msgstr "Černá" msgid "White" msgstr "Bílá" msgid "Transparency:" msgstr "Průhlednost:" msgid "Hide cursor" msgstr "Skrýt kurzor" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Silverjuke je možné ovládat pomocí numerické klávesnice, nebo pomocí\n" "speciálních harwarových tlačítek. V tomto případě se skladby do playlistu\n" "vkládají zadáním unikátního čísla uvedeného vedle názvu alba a skladby." msgid "Use Numpad controls" msgstr "Použít ovládací prvky numerické klávesnice v kiosk režimu" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Použít ovládací prvky numerické klávesnice i mimo kiosk režim" msgid "Keys:" msgstr "Klávesy:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "S kreditním systémem musí nejdřív uživatel vhodit mince před přidáním " "skladby do fronty, nebo použít klavesovou zkratku.\n" "V online nápovědě naleznete informace o možnostech kreditního systému a " "podporovaný hardware." msgid "Use credit system" msgstr "Použít kreditní systém" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "" "Kredit může být doplněn DDE příkazového řádku, nebo klávesovou zkratkou" msgid "Keys..." msgstr "Klávesy..." msgid "Remember credits between program starts" msgstr "Pamatuje si vložený kredit po spuštění programu" msgid "Current credit:" msgstr "Aktuální kredit:" msgid "Please enter your password to exit the kiosk mode." msgstr "Zadejte své heslo pro ukončení kiosk režimu." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Příliš mnoho skladeb ve frontě,\n" "Zkuste to později." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "Tato skladba je již v playlistu,\n" "zkuste to později." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" "Tato skladba, nebo interpret se zrovna přehrává,\n" "zkuste to později." msgid "Maintenance password" msgstr "Údržba hesla" msgid "Exit kiosk mode" msgstr "Ukončit kiosk režim" msgid "Start kiosk mode" msgstr "Start kiosk režimu" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Heslo:" msgid "Invalid password. Please try again." msgstr "Neplatné heslo. Zkuste to znovu prosím." msgid "Invalid track number" msgstr "Neplatné číslo skladby" msgid "Action:" msgstr "Akce:" msgid "Shutdown computer" msgstr "Vypnout počítač" msgid "Reboot computer" msgstr "Restartovat počítač" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Delete|Clear\n" "všechno|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Album musí obsahovat alespoň %s skladby s příslušným %s." msgid "artist/album" msgstr "interpret/album" msgid "artist/album or genre" msgstr "interpret/album nebo žánr" msgid "directory" msgstr "adresář" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Kompilace může obsahovat až %s skladby téhož interpreta." msgid "Separate the words using commas, case is ignored" msgstr "Ignorovat samostatná slova s čárkami" msgid "Sort by:" msgstr "Řadit podle:" msgid "Stop-words for sorting artists:" msgstr "Záchytná slova pro třídění interpretů:" msgid "Stop-words for sorting albums:" msgstr "Záchytná slova pro třídění alb:" msgid "Show stop-words words at end" msgstr "Zobrazit záchytná slova na konci" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "Je-li vybrán, např. \"The Rolling Stones\" s \"Rolling Stones, The\";\n" "řadit sám není touto volbou" msgid "Keywords to identify cover image for an album:" msgstr "Klíčová slova pro identifikaci obalu albumu:" msgid "Double click on covers" msgstr "Poklikat na obaly" msgid "Select/play album" msgstr "Vybrat/přehrát album" msgid "Combine tracks to albums" msgstr "Zkombinovat skladby do alb" msgid "Updating genres..." msgstr "Aktualizuju žánry..." msgid "Updating groups..." msgstr "Aktualizuju skupiny..." msgid "Combining tracks to albums..." msgstr "Kombinuju skladby do alb..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Chcete přidat následující složku(y) do hudební knihovny?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Ano, nechat obrázek v \"%s\"" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Ano, obrázek zkopírovat do \"%s\"" #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Chcete použít danou podobu jako obal pro \"%s\"?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "\"%s\" není ve vaší hudební knihovně, proto nemohla být upravena." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s skladeb z %s alb nalezeno pro \"%s\"" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s skladeb v %s albech" msgid "Albums" msgstr "Alba" msgid "All albums" msgstr "Všechna alba" msgid "Unsorted tracks" msgstr "Netříděné skladby" # %i will be replaced by the disk number #, c-format msgid "Disk %i" msgstr "Disk %i" # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Konec odposlechu" #, c-format msgid "Prelisten \"%s\"" msgstr "Odposlech \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "Přidat \"%s\" do playlistu" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "Přehrát \"%s\" okamžitě" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "Přehrát \"%s\" jako další v pořadí" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "Unqueue \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Enqueue %i tracks" msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "Zařadít %i skladby" msgstr[1] "Zařadít %i skladby" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks now" msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Přehrát %i skladby okamžitě" msgstr[1] "Přehrát %i skladby okamžitě" msgstr[2] "Přehrát %i skladby okamžitě" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks next" msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Přehrát %i skladby jako další" msgstr[1] "Přehrát %i skladby jako další" msgstr[2] "Přehrát %i skladby jako další" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Unqueue %i tracks" msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Unqueue %i skladeb" msgstr[1] "Unqueue %i skladeb" msgstr[2] "Unqueue %i skladeb" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" na webu" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Průměrné hodnocení: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, fuzzy, c-format #| msgid "My rating: %s" msgid "Rating: %s" msgstr "Hodnocení: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to change the rating for all %i selected tracks?" msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Chcete změnit hodnocení všech %i vybraných skladeb?" msgstr[1] "Chcete změnit hodnocení všech %i vybraných skladeb?" msgstr[2] "Chcete změnit hodnocení všech %i vybraných skladeb?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Změna hodnocení" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" "Kliknutím označíte všechny skladby tohoto alba, dvojklikem vložíte do " "playlistu" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" "Kliknutím označíte všechny skladby tohoto interpreta, dvojklikem vložíte do " "playlistu" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" "Kliknutím označíte všechny skladby tohoto disku, dvojklikem vložíte do " "playlistu" # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Vložit \"%s\" do playlistu" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to enqueue all %i selected tracks?" msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Chcete vložit do playlistu %i vybrané skladby?" msgstr[1] "Chcete vložit do playlistu %i vybrané skladby?" msgid "Size" msgstr "Velikost" msgid "Gain" msgstr "Zisk" msgid "Read music-files from the following folders and sources:" msgstr "Načíst hudební soubory z těchto složek a zdrojů:" msgid "Read music-files from the following sources:" msgstr "Načíst hudební soubory z těchto zdrojů:" msgid "Add source" msgstr "Přidat zdroj" msgid "Remove source" msgstr "Odstranit zdroj" msgid "Options" msgstr "Možnosti" #, fuzzy #| msgid "Supported file-types" msgid "Supported file types" msgstr "Podporované typy souborů" #, fuzzy #| msgid "My music library" msgid "Music library" msgstr "Hudební knihovny" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Možnosti pro \"%s\"" msgid "Options..." msgstr "Možnosti..." msgid "Jukebox" msgstr "" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "" "Vyberte prosím seznam skladeb, hudební soubory, nebo zadejte URL streamu" msgid "Append to current playlist" msgstr "Připojit k aktuálnímu playlistu" msgid "Volume control" msgstr "Ovládání hlasitosti" msgid "Play all tracks of an album with the same volume" msgstr "Přehrát všechny skladby ze stejného alba se stejnou hlasitostí" msgid "Desired volume:" msgstr "Požadované zesílení:" msgid "Max. gain:" msgstr "Max. zisk:" msgid "Current volume:" msgstr "Aktuální hlasitost:" msgid "Fading" msgstr "Prolínání" msgid "Crossfading" msgstr "Prolínání" msgid "Manual crossfades:" msgstr "Manuální prolínání:" msgid "Automatic crossfades:" msgstr "Automatická prolínání:" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "Zakázat prolínání mezi skladbami ze stejného alba" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Jakmile dohraje stará skladba, nová skladba začíná s plným zesílením" msgid "Resume" msgstr "" msgid "Jingles" msgstr "Znělky" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "Následující volby definují chování playlistu. Pro \"shuffle intenzitu\"\n" "nízká hodnota vytváří pouze slabé variace z nabídky playlistu (dosud " "nehraných skladeb),\n" "zatímco velká hodnota vytváří velké variace." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Povolit max. %i skladeb čekajících ve frontě" msgstr[1] "Povolit max. %i skladeb čekajících ve frontě" msgstr[2] "Povolit max. %i skladeb čekajících ve frontě" #, fuzzy #| msgid "Avoid double tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "" "Zamezit přidání duplicitních skladeb do playlistu, které již čekájí ve frontě" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "Neopakovat stejné skladby během %i minut" #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "Neopakovat stejného interpreta během %i minut" msgid "Shuffle intensity:" msgstr "Shuffle intenzita:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" #, fuzzy #| msgid "Edit queue" msgid "Restore queue" msgstr "Upravit pořadí ve frontě" #, fuzzy #| msgid "Remove played tracks from queue" msgid "Restore already played tracks" msgstr "Odstranit přehrané skladby z playlistu" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback from last position" msgstr "Spustit přehrávání na zařadit" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Použijte následující volby k nastavení akcí, které budou automaticky " "provedeny\n" "po určitém čase." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "Automatické přehrávání: Pokud je playlist prázdný, počkat %i minut" #, c-format msgid "then, play %i tracks from the %s" msgstr "a pak přehrát %i skladby z %s" msgid "Ignore tracks from the music selection" msgstr "Ignorovat skladby z hudebního výběru" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "" "Po vložení skladby do playlistu okamžitě přerušit přehrávání skladby z " "automatického přehrávání" msgid "Sleep mode:" msgstr "Režim spánku:" msgid "Stop playback" msgstr "Zastavit přehrávání" #, fuzzy #| msgid "in|after|at|always in|always after|always at" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "za|po|v|vždy za|vždy po|pokaždé v" #, fuzzy #| msgid "minutes" msgid "minutes|o'clock" msgstr "minut" #, c-format msgid "Before this, fade out %i seconds" msgstr "Před tím postupně zeslabovat %i sekund(y)" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" #, fuzzy #| msgid "minutes" msgid "minutes," msgstr "minut" #, fuzzy #| msgid "Ignore tracks from the music selection" msgid "play a track from the music selection" msgstr "Ignorovat skladby z hudebního výběru" #, fuzzy #| msgid "Alt" msgid "At" msgstr "Alt" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Přejít na aktuální skladby po %i minutách nečinnosti" # The string will be followed by "Album view", "Cover view" or "List view" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Reset zobrazení po %i minutách nečinnosti" #, fuzzy, c-format #| msgid "Open %s after %i minutes of inactivity" msgid "Open video screen after %i minutes of inactivity" msgstr "Otevřít %s po %i minutách nečinnosti" #, fuzzy, c-format #| msgid "Close %s after %i minutes" msgid "Close video screen after %i minutes" msgstr "Zavřít %s po %i minutách" #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "Načíst složky:" msgid "Read file:" msgstr "Načíst soubor" msgid "Ignore music-files and images with the following extensions:" msgstr "Ignorovat hudební soubory a obrázky s těmito příponami:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "(Oddělte pomocí čárky)" msgid "Include folder to the update process" msgstr "Obsah složky zahrnout do procesu aktualizace" msgid "Read hidden files" msgstr "Načíst skryté soubory" #, fuzzy #| msgid "Read hidden files" msgid "Read hidden folders" msgstr "Načíst skryté soubory" msgid "Read inside ZIP-/TAR-archives" msgstr "Načíst ZIP-/TAR-archivy" msgid "Read (ID3)-tags" msgstr "Načíst (ID3)-tagy" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "" "Cesta ke složce a souboru je vzorem pro informaci skladby, je-li ID3 tag " "nedostupný:" msgid "Placeholders:" msgstr "Symboly:" msgid "Read files and folders" msgstr "Načísti soubory a složky" msgid "Add a folder to search for music-files" msgstr "Přidat složky hudebních souborů" msgid "Add a single music-file" msgstr "Přidat hudební soubor" msgid "Disabled" msgstr "Zakázáno" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "Žádná aktualizace" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "Odstranit \"%s\" z hudební knihovny?" msgid "Select a folder with music-files" msgstr "Vyberte složku s hudebními soubory" msgid "Select music-file" msgstr "Zvolte hudební soubor" msgid "Unknown track" msgstr "Neznámá skladba" msgid "Unknown artist" msgstr "Neznámý interpret" msgid "Add a server containing music-files" msgstr "Přidat server obsahující hudební soubory" msgid "Use server:" msgstr "Použít server:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Typ" msgid "Login name:" msgstr "Přihlašovací jméno:" msgid "Include server to the update process" msgstr "Patří server procesu aktualizace" msgid "Configuration file" msgstr "Konfigurační soubor" #, c-format msgid "Loading %s" msgstr "Načtení %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Chyba %i" msgid "Edit track" msgstr "Upravit skladbu" msgid "of" msgstr "z" msgid "Write (ID3-)tags" msgstr "Zapsat (ID3-) tagy" msgid "File names" msgstr "Názvy souborů" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Zobrazit všechny %s názvy souborů ..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "Uvedené hodnoty jsou součtem nebo průměr všech jednotlivých hodnot v daném " "souboru." msgid "Track" msgstr "Skladba" msgid "Further information" msgstr "Další informace" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "Dočasný adresář" msgid "Further information..." msgstr "Další informace..." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Nelze přejmenovat \"%s\" na \"%s\"." msgid "Server name" msgstr "Název serveru" msgid "Query online database" msgstr "Dotaz na on-line databázi" msgid "more..." msgstr "více ..." msgid "Please select one of the following albums:" msgstr "Vyberte prosím jedno z těchto alb:" msgid "Old file name" msgstr "Starý název souboru" msgid "New file name" msgstr "Nový název souboru" msgid "Field" msgstr "Oblast" msgid "Old value" msgstr "Staré hodnoty" msgid "New value" msgstr "Nové hodnoty" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<prázdný>" msgid "Confirm modifications" msgstr "Potvrdit změny" msgid "Delete empty folders" msgstr "Odstranit prázdné složky" msgid "Please confirm or edit the following modification:" msgstr "Prosím potvrďte nebo upravte následující změny:" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Prosím potvrďte nebo upravte následující %s úpravy:" msgid "(lower case)" msgstr "(Malá písmena)" msgid "(upper case)" msgstr "(Velká písmena)" msgid "(n characters)" msgstr "(n znaků)" msgid "Rename files" msgstr "Přejmenování souborů" msgid "Pattern:" msgstr "Vzor:" #, fuzzy #| msgid "(first character)" msgid "Artist (first character)" msgstr "(první znak)" #, fuzzy #| msgid "(first character)" msgid "Album (first character)" msgstr "(první znak)" #, fuzzy #| msgid "(first character)" msgid "Genre (first character)" msgstr "(první znak)" #, fuzzy #| msgid "(first character)" msgid "Group (first character)" msgstr "(první znak)" #, fuzzy #| msgid "(n characters)" msgid "Year (4 characters)" msgstr "(n znaků)" #, fuzzy #| msgid "(n characters)" msgid "Year (2 characters)" msgstr "(n znaků)" #, fuzzy #| msgid "(n characters)" msgid "Duration (5 characters)" msgstr "(n znaků)" msgid "Directory change" msgstr "Adresář změny" #, fuzzy #| msgid "(n characters)" msgid "File name (8 characters)" msgstr "(n znaků)" msgid "File extension" msgstr "Přípona souboru" msgid "Example:" msgstr "Příklad:" msgid "Replace" msgstr "Nahradit" msgid "Search for:" msgstr "Hledat:" msgid "in:" msgstr "v:" msgid "All fields" msgstr "Všechna pole" msgid "Path and file name" msgstr "Cesta a název souboru" msgid "Replace with:" msgstr "Nahradit s:" msgid "Match whole words only" msgstr "Pouze celá slova" msgid "Match case" msgstr "Část výrazu" msgid "Regular expression" msgstr "Regulární výraz" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "\"%s\" nebyl nalezen." msgid "Split field" msgstr "Rozdělit oblast" msgid "Field to split:" msgstr "Pole k rozdělení:" msgid "Destination fields and pattern:" msgstr "Cíl polí a vzor:" #, fuzzy #| msgid "Track number" msgid "Track number (1 character)" msgstr "Číslo skladby" #, fuzzy #| msgid "(n characters)" msgid "Track number (2 characters)" msgstr "(n znaků)" #, fuzzy #| msgid "(first character)" msgid "Disk number (1 character)" msgstr "(první znak)" #, fuzzy #| msgid "(n characters)" msgid "Disk number (2 characters)" msgstr "(n znaků)" msgid "Void information" msgstr "Void informace" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "S různými skiny můžete změnit \"vzhled\" %s.\n" "Stačí vybrat skin z výše uvedeného seznamu. Další skiny naleznete na webu." msgid "Name" msgstr "Jméno" msgid "Info..." msgstr "Info..." msgid "Update list" msgstr "Aktualizace seznamu" msgid "More skins on the web..." msgstr "Další skiny na webu ..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Můžete nastavit nezávisle písmo a velikost obalu pro použití v hlavním " "okně.\n" "Rozměry se vztahují ke 100% velikosti. Pokud budete zvětšovat, nebo " "zmenšovat\n" "(např. pomocí klávesy \"+\" nebo \"-\"), oba rozměry se budou měnit úměrně." msgid "Font:" msgstr "Písmo:" msgid "Font size:" msgstr "Velikost písma:" msgid "Use this font for dialogs, too" msgstr "Použít nastavení písma i pro dialogy" msgid "Column width:" msgstr "Šířka sloupce:" msgid "Cover size:" msgstr "Velikost obalu:" msgid "No lyrics found." msgstr "Text pisně nenalezen." msgid "Karaoke Prompt" msgstr "Karaoke řádek" #, c-format msgid "No images found in \"%s\"." msgstr "Nebyly nalezeny žádné obrázky v \"%s\"." msgid "Background" msgstr "Pozadí" #, c-format msgid "Use %s-files" msgstr "Použít %s-soubory" msgid "Please select a directory with images" msgstr "Vyberte prosím adresář s obrázky" msgid "If appropriate, switch over automatically" msgstr "V případě potřeby přepínat automaticky" msgid "Half size" msgstr "Poloviční velikost" msgid "Spectrum Monitor" msgstr "Spektrum Monitor" msgid "Show spectrum" msgstr "Zobrazit spektrum" msgid "Show oscilloscope" msgstr "Zobrazit osciloskop" msgid "Show starfield" msgstr "Zobrazit hvězdné pole" #, fuzzy #| msgid "Show starfield" msgid "Show other figures" msgstr "Zobrazit hvězdné pole" msgid "Visualization" msgstr "Vizualizace" msgid "Video output" msgstr "Video výstup" msgid "Search homepage" msgstr "Vyhledat domovskou stránku" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Texty na %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "Vyhledat pomocí %s" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informace na %s" # Nesmíme zapomenout na ":" na konci řetězce. msgid "Object count:" msgstr "Počet objektů:" # Nesmíme zapomenout na ":" na konci řetězce. msgid "Elapsed time:" msgstr "Uplynulý čas:" msgid "Message" msgstr "Zpráva" msgid "Scope" msgstr "Rozsah" msgid "Console" msgstr "Konzole" #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i message(s)" msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i zpráv(a, y)" msgstr[1] "%i zpráv(a, y)" msgstr[2] "%i zpráv(a, y)" msgid "Evaluate" msgstr "Posoudit" msgid "Clear" msgstr "Vymazat" msgid "Open console on errors and warnings" msgstr "Otevřít konzoly chyb a varování" msgid "Details" msgstr "Detaily" msgid "Clear all messages?" msgstr "Smazat všechny zprávy?" #, c-format msgid "Overwrite \"%s\"?" msgstr "Přepsat \"%s\"?" msgid "Append" msgstr "Připojit" msgid "State" msgstr "Stav" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "%s-souborů" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "%s-audio" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "%s-obrázků" #, c-format msgid "%s-video" msgstr "" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "%s-playlistů" #, fuzzy #| msgid "Archive-files" msgid "Script-files" msgstr "Archiv souborů" msgid "Silverjuke skin-files" msgstr "Silverjuke skin soubory" #, fuzzy #| msgid "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Silverjuke skin soubory" msgid "Archive-files" msgstr "Archiv souborů" msgid "Supported file-types" msgstr "Podporované typy souborů" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programy" msgid "Cleanup index..." msgstr "Vyčištění indexu..." msgid "max. size" msgstr "Maximální velikost" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "Naposledy %s nebyl korektně ukončen.\n" "Následující (pravděpodobně chybné) objekty byly používány těsně před " "ukončením programu:\n" "\n" "%s\n" "\n" "Pro zamezení těchto problémů se zkuste vyhnout používáním těchto objektů.\n" "Chcete i nadále používat tyto objekty?" msgid "Use maybe errorous objects?" msgstr "Použít pravděpodobně chybné objekty?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "" msgid "__VIRT_KEYBD__" msgstr "" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "," #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i days" msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dní" msgstr[1] "%i dní" msgstr[2] "%i dní" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Neplatný regulární výraz \"%s\"." msgid "Fatal error" msgstr "Fatální chyba" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Zvětšit okno" msgid "Shrink window" msgstr "Zmenšit okno" msgid "Enlarge display" msgstr "Zvětšit zobrazení" msgid "Shrink display" msgstr "Zmenšit zobrazení" #, fuzzy #| msgid "Devices" msgid "Services" msgstr "Zařízení" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Hide %s" msgstr "Skrýt %s" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #| msgid "Hide %s" msgid "Hide Others" msgstr "Skrýt %s" #, fuzzy #| msgid "Show file" msgid "Show All" msgstr "Zobrazit soubor" #, fuzzy, c-format #| msgid "Exit %s" msgid "Quit %s" msgstr "Ukončit %s" msgid "Extras" msgstr "" msgid "Full screen" msgstr "Celá obrazovka" msgid "Modules on the web..." msgstr "Moduly na webu..." msgid "Explore" msgstr "Prozkoumat" msgid "Reveal in Finder" msgstr "Najít ve vyhledávači" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "Soubor \"%s\" neexistuje." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "Nelze spustit \"%s\"." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" #~ msgid "Scroll vertically" #~ msgstr "Rolovat vertikálně" #~ msgid "Context sensitive" #~ msgstr "Kontextová citlivost" #, fuzzy #~| msgid "Exit %s" #~ msgid "Exit" #~ msgstr "Ukončit %s" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "Zakázat %s" #~ msgid "Disable shutdown" #~ msgstr "Zakázat vypnutí" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Pokud máte připojeno více monitorů,\n" #~ "můžete nastavit, kde co zobrazovat." #~ msgid "Monitor for" #~ msgstr "Monitor pro" #~ msgid "Switch resolution to %s" #~ msgstr "Přepnout rozlišení na %s" #~ msgid "Calculated volumes:" #~ msgstr "Vypočítaná hlasitost:" #~ msgid "Skip silence between tracks" #~ msgstr "Přeskočit ticho mezi skladbami" #~ msgid "Other fadings" #~ msgstr "Ostatní volby prolínání" #~ msgid "Attached window" #~ msgstr "Přiložené okna" #~ msgid "Show album name" #~ msgstr "Zobrazit název alba" #~ msgid "Online help" #~ msgstr "Online nápověda" #~ msgid "Tools" #~ msgstr "Nástroje" #~ msgid "Workspace" #~ msgstr "Pracovní plocha" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #~| msgid "" #~| "Beside several options, you can change the shortcuts to use in %s here. " #~| "You can\n" #~| "also define system-wide shortcuts. To modify an option, select the " #~| "option from the list\n" #~| "and click on \"Customize\". This page is for experienced users only." #~ msgid "" #~ "Beside several options, you can change the shortcuts to use here.\n" #~ "This page is for experienced users only." #~ msgstr "" #~ "Kromě několika možností můžete měnit zkratky k ovládání %s.\n" #~ "Můžete také definovat klávesové zkratky pro celý systém. Chcete-li změnit " #~ "volby, zvolte možnost ze seznamu\n" #~ "a klikněte na \"Vlastní \". Tato stránka je pouze pro zkušené uživatele." #~ msgid "Command or option" #~ msgstr "Příkaz nebo možnost" #~ msgid "Setting" #~ msgstr "Nastavení" #~ msgid "Preferred cover" #~ msgstr "Preferovaný obal" #~ msgid "Album cover" #~ msgstr "Obal alba" #~ msgid "Track cover" #~ msgstr "Obal skladby" #~ msgid "Track list" #~ msgstr "Seznam skladeb" #~ msgid "Show disk number" #~ msgstr "Zobrazit číslo disku" #~ msgid "Show original artist" #~ msgstr "Zobrazit originálního umělce" #~ msgid "Show composer" #~ msgstr "Zobrazit skladatele" #~ msgid "Show time" #~ msgstr "Zobrazit čas" #~ msgid "Show year" #~ msgstr "Zobrazit rok" #~ msgid "Show comment" #~ msgstr "Zobrazit komentář" #~ msgid "Show genre" #~ msgstr "Zobrazit žánr" #~ msgid "Show rating" #~ msgstr "Zobrazit hodnocení" #, fuzzy #~| msgid "Currently, the following files are supported:" #~ msgid "Currently, the following file types are read:" #~ msgstr "V současné době jsou podporovány následující typy souborů:" #~ msgid "minutes|minutes of inactivity|o'clock" #~ msgstr "minut|minutách nečinnosti|hodin" # %i will be replaced by the number of characters #~ msgid "(%i characters)" #~ msgstr "(%i znaků)" #~ msgid "More layouts on the web..." #~ msgstr "Další k dipozici na webu ..." #, fuzzy #~| msgid "Monitor for" #~ msgid "Monitor for main window" #~ msgstr "Monitor pro" #~ msgid "Initializing %s..." #~ msgstr "Inicializuju %s..." #~ msgid "Microphone" #~ msgstr "Mikrofon" # This is the name of the "First steps" button. Do not add "..." to the string! #~ msgid "First steps" #~ msgstr "První kroky" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Buy %s..." #~ msgstr "Koupit %s..." #~ msgid "Unlicenced version" #~ msgstr "Neregistrovaná verze" #~ msgid "These options are available if you buy Silverjuke." #~ msgstr "Tyto možnosti jsou k dispozici v registrované verzi Silverjuke." # The first %s will be replaced by the program name (usually "Silverjuke"), the second and third %s will be replaced by a file type (eg. "MP3"), the fourth %s will be replaced by the URL to search for modules (eg. "http://www.silverjuke.net/en/modules.html". #~ msgid "" #~ "%s has not found an %s-decoder on your system. If you want to play %s-" #~ "files, you should install a module for this purpose.\n" #~ "\n" #~ "Open %s and search for modules now?" #~ msgstr "" #~ "%s nebyl nalezen %s-dekodér v systému. Pokud chcete přehrát %s-soubory, " #~ "musíte si nainstalovat modul pro tento účel.\n" #~ "\n" #~ "Otevřít %s a vyhledat moduly?" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Do you want %s to check for missing decoders in future?" #~ msgstr "Chcete kontrolovat %s chybějící dekodéry v budoucnu?" # This is a context-menu option that is placed in the "Playback" submenu #~ msgid "Play tracks at once on double click" #~ msgstr "Přehrát skladby okamžitě po výběru" # The first %s will be replaced by the program name, the second by the name of the licence holder. #~ msgid "%s licenced to %s" #~ msgstr "%s, vlastník licence: %s" # %s will be replaced by the name of the licence holder #~ msgid "Licenced to %s" #~ msgstr "Licencován na %s" #~ msgid "" #~ "To disable Ctrl+Alt+Del you have to install a special keyboard driver " #~ "once.\n" #~ "\n" #~ "Do you want to install the driver and reboot?" #~ msgstr "" #~ "Chcete-li zakázat Ctrl+Alt+Del, je třeba nainstalovat speciální ovladač " #~ "klávesnice.\n" #~ "\n" #~ "Chcete nainstalovat ovladač a restartovat?" # %s will be replaced by the shortcut #~ msgid "Cannot register system-wide shortcut \"%s\"." #~ msgstr "Nelze registrovat klávesovou zkratku pro celý systém \"%s\"." #~ msgid "Silverjuke language-files" #~ msgstr "Silverjuke jazykové soubory" #~ msgid "Apply" #~ msgstr "Použít" #~ msgid "Check for new Silverjuke version..." #~ msgstr "Zkontrolujte, je-li k dispozici nová verze Silverjuke..." # The first %s will be replaces by the new version, the others %s will be replaced by the URL for downloading it. #~ msgid "" #~ "A new version of Silverjuke (%s) is available for download on %s.\n" #~ "\n" #~ "Do you want to open %s now?" #~ msgstr "" #~ "Nová verze Silverjuke (%s) je k dispozici ke stažení na %s.\n" #~ "\n" #~ "Chcete %s otevřít?" #~ msgid "Other program" #~ msgstr "Jiný program" #~ msgid "Set markers" #~ msgstr "Nastavit značky" # %i will be replaced by the number of the marker, %s will be replaced by the marker position or by a control to select the marker position #~ msgid "Show marker %i at %s." #~ msgstr "Zobrazit značku %i na %s." #~ msgid "Minutes" #~ msgstr "Minut" #~ msgid "Warn if marker is crossed" #~ msgstr "Upozornit při překročení značek" #~ msgid "Set markers..." #~ msgstr "Nastavit značky" #~ msgid "Burn CD" #~ msgstr "Vypálit CD" #~ msgid "Tracks to burn:" #~ msgstr "Skladby k vypálení" #~ msgid "Recorder:" #~ msgstr "Vypálit pomocí:" #~ msgid "Please select an installed and available program" #~ msgstr "Vyberte prosím z nainstalovaných a dostupných programů" # %s will be replaced by the name of a program #~ msgid "Please locate \"%s\"" #~ msgstr "Lokalizujte prosím \"%s\"" # %s will be replaced by the name of a program #~ msgid "Arguments for \"%s\"" #~ msgstr "Argumenty pro \"%s\"" #~ msgid "Total time" #~ msgstr "Celkový čas" #~ msgid "Cannot calculate the total time" #~ msgstr "Nelze spočítat celkový čas" #~ msgid "" #~ "The size of the selected tracks is larger than the assumed capacity of " #~ "the disk to burn.\n" #~ "\n" #~ "Continue anyway?" #~ msgstr "" #~ "Velikost vybraných skladeb je větší, než je předpokládaná kapacita média " #~ "pro vypálení.\n" #~ "\n" #~ "Chcete pokračovat?" #~ msgid "Minimize window" #~ msgstr "Minimalizovat okno" #~ msgid "Maximize window" #~ msgstr "Maximalizovat okno" #~ msgid "Center window" #~ msgstr "Vycentrovat okno" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Show %s" #~ msgstr "Zobrazit %s" #~ msgid "System tray" #~ msgstr "Systémová lišta" #~ msgid "Show current track" #~ msgstr "Zobrazit aktuální skladby" #~ msgid "Menus" #~ msgstr "Menu" #~ msgid "Show shortcuts" #~ msgstr "Zobrazit klávesové zkratky" #~ msgid "Show icons" #~ msgstr "Zobrazit ikony" #~ msgid "Licence key" #~ msgstr "Licenční klíč" #~ msgid "Select the language for the user-interface from the following list:" #~ msgstr "Vyberte jazyk uživatelského rozhraní z následujícího seznamu:" #~ msgid "Unknown language" #~ msgstr "Neznámy jazyk" #~ msgid "More languages on the web..." #~ msgstr "Více jazyků na webu ..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Note: Changing the language requires to restart %s." #~ msgstr "Poznámka: Změna jazyka vyžaduje restart %s." # %s will be replaced by the program name, usually"Silverjuke" #~ msgid "This is an unlicenced copy of %s!" #~ msgstr "Toto je neregistrovaná kopie %s!" #~ msgid "" #~ "Please enter your name or your company's name and the licence key\n" #~ "you received when purchasing or updating your %s-licence:" #~ msgstr "" #~ "Zadejte prosím své jméno, nebo název firmy a licenční klíč,\n" #~ "který jste obdrželi při koupi programu, nebo při aktualizaci váší %s " #~ "licence:" #~ msgid "Your name/company:" #~ msgstr "Vaše jméno/společnost:" # The first %s will be replaced by the program name, usually "Silverjuke". The second %i will be replaced by the number of evaluation days. The last %s, again, will be replaced by the program name. #~ msgid "" #~ "If you haven't bought a %s-licence, you may test this program %i days for " #~ "free.\n" #~ "After this period, you have to buy a licence for %s if you want to " #~ "continue using\n" #~ "this program." #~ msgstr "" #~ "Pokud nemáte zakoupenou %s licenci, můžete si program vyzkoušet po dobu " #~ "%i dní zdarma.\n" #~ "Po uplynutí této doby musíte zakoupit licenci pro %s, pokud chcete nadále " #~ "používat \n" #~ "tento program." # The first %s will be replaced by the program name, usually "Silverjuke". The second %s will be replaced by the name of the website, eg. www.silverjuke.net #~ msgid "" #~ "Further information about purchasing %s licences\n" #~ "are available at %s." #~ msgstr "" #~ "Další informace o nákupu %s licencí\n" #~ "je k dispozici na adrese %s." # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s..." #~ msgstr "Otevřít %s..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Thank you for buying a %s-licence!" #~ msgstr "Děkujeme, že jste si zakoupili licenci %s!" #~ msgid "This copy is licenced to:" #~ msgstr "Vlastník této licence:" #~ msgid "" #~ "If this is not your name or the name of your company, you are not using a " #~ "legal licence!" #~ msgstr "" #~ "Pokud to není vaše jméno, nebo název vaší společnosti, používáte " #~ "nelegální licenci!" #~ msgid "Load external modules" #~ msgstr "Otevřít externí moduly" #~ msgid "\"Magnetic\" window borders" #~ msgstr "\"Magnetické\" okraje oken" #~ msgid "Window" #~ msgstr "Okno" #~ msgid "Use shaped windows" #~ msgstr "Použití tvarovaného okna" #~ msgid "Automatic version check" #~ msgstr "Automatická kontrola nové verze" # %i will be replaced by the number of days #~ msgid "Every %i days" #~ msgstr "Každý %i den" #~ msgid "FX" #~ msgstr "FX" #~ msgid "" #~ "Please select the input and output devices to use. If you encounter any " #~ "problems,\n" #~ "please try a different buffer size and the \"Use hardware\" option." #~ msgstr "" #~ "Vyberte prosím vstupní a výstupní zařízení. Pokud narazíte na nějaké " #~ "problémy se zvukem, \n" #~ "zkuste změnit velikost vyrovnávací paměti a vyzkoušejte volbu \"Použít " #~ "hardwarovou akceleraci\"." #~ msgid "Audio-output" #~ msgstr "Audio-výstup" #~ msgid "Prelisten audio-output" #~ msgstr "Odposlech audio-výstup" #~ msgid "Buffer" #~ msgstr "Vyrovnávací paměť" #~ msgid "Use hardware" #~ msgstr "Použít hardwarovou akceleraci" #~ msgid "" #~ "With these options, you can add jingles (small pieces of sound) between " #~ "tracks.\n" #~ "Add the jingles as normal music-files and decide how often they should be " #~ "played." #~ msgstr "" #~ "Tato volba umožnuje vložit znělky mezi skladbami.\n" #~ "Přidejte znělky jako normální hudební soubory a zvolte, jak často budou " #~ "přehrávány." #~ msgid "Use jingles" #~ msgstr "Použít znělky" #~ msgid "Jingles:" #~ msgstr "Znělky:" # %s will be replaced by a control to select the number of tracks #~ msgid "Play a jingle about every %s tracks." #~ msgstr "Přehrát znělku po každé %s skladbě." #~ msgid "Select jingle(s)" #~ msgstr "Vybrat znělku(y)" #~ msgid "Use separate FX settings" #~ msgstr "Používat oddělené nastavení efektů" #~ msgid "" #~ "The \"system tray\" is an area normally placed at the edge of the " #~ "screen.\n" #~ "With the following options, you can add a little symbol with frequently\n" #~ "used functions to this area." #~ msgstr "" #~ "\"Systémová lišta\" je oblast, obvykle umístěna na okraji obrazovky v " #~ "pravo dole (tray lišta).\n" #~ "Z následujících možností můžete\n" #~ "nastavit použití systémové lišty." #~ msgid "Never use system tray" #~ msgstr "Nikdy nepoužívat systémovou lištu" #~ msgid "Use system tray for the minimized window" #~ msgstr "Použít systémovou lištu při minimalizaci okna" #~ msgid "Always use system tray" #~ msgstr "Vždy použít systémovou lištu" #~ msgid "Show current track tooltip for %i seconds" #~ msgstr "" #~ "Zobrazit aktuální popis skladby v systémové liště po dobu %i sekund(y)" #~ msgid "Only if inactive" #~ msgstr "Pouze v případě neaktivity" #~ msgid "Use this module for the following file extensions:" #~ msgstr "Použít tento modul pro tyto přípony souborů:" #~ msgid "Further options..." #~ msgstr "Další možnosti..." # %s will be replaced by a list of extensions, eg. "MP3, MP2, MP1" #~ msgid "" #~ "If you disable this module or change the file types, make sure,\n" #~ "you don't need \"%s\" or they are supported by another module.\n" #~ "\n" #~ "Note: Remember that not every module can play every file type." #~ msgstr "" #~ "Pokud zakážete tento modul, nebo změníte typy souborů, ujistěte se,\n" #~ "Chcete nepotřebují \"%s\" nebo jsou podporovány další modul.\n" #~ "\n" #~ "Poznámka:. Pamatujte, že ne každý modul přehraje každý typ souboru." # %s will be replaced by the string an abbreviation should be entered for, eg. "Composer" or "Original artist" #~ msgid "Abbreviation for \"%s\"" #~ msgstr "Zkratka pro \"%s\"" #~ msgid "Close %s" #~ msgstr "Zavřít %s" #~ msgid "Open %s" #~ msgstr "Otevřít %s" #~ msgid "Selection: %s" #~ msgstr "Výběr: %s" #~ msgid "Select another visualization" #~ msgstr "Zvolit další vizualizaci" #~ msgid "Playback mode:" #~ msgstr "Mód přehrávání:" #~ msgid "Normal" #~ msgstr "Normální" #~ msgid "Interpolation:" #~ msgstr "Interpolace:" #~ msgid "Linear" #~ msgstr "Lineární" #~ msgid "Sensitive" #~ msgstr "Citlivost" #~ msgid "Query settings before start" #~ msgstr "Dotaz nastavení před startem" #~ msgid "DAAP-/iTunes-client" #~ msgstr "DAAP-/iTunes-client" #~ msgid "Add a DAAP-/iTunes-server" #~ msgstr "Add a DAAP-/iTunes-server" #~ msgid "" #~ "With Silverjuke's HTTP server you can access the program and your music " #~ "library from any\n" #~ "browser or other Silverjuke instances in your network." #~ msgstr "" #~ "Se serverem Silverjuke HTTP máte přístup k programu a hudební knihovnu z " #~ "jakéhokoliv\n" #~ "prohližeče nebo jiné Silverjuke případy ve vaší síti." #~ msgid "Enable HTTP server on port %s" #~ msgstr "Povolit HTTP server na portu %s" #~ msgid "Share my music library over HTTP" #~ msgstr "Sdílet své hudební knihovny pomocí protokolu HTTP" #~ msgid "Enable web interface access over HTTP" #~ msgstr "Povolit přístup přes webové rozhraní HTTP" #~ msgid "Playlist" #~ msgstr "Playlist" #~ msgid "Empty" #~ msgstr "Prázdný" #~ msgid "Update" #~ msgstr "Aktualizovat" #~ msgid "Sharing/Web interface" #~ msgstr "Sdílení/webové rozhraní" #~ msgid "Audio-decoder" #~ msgstr "Audio-dekodér" #~ msgid "Online database" #~ msgstr "Online databáze" # The first %i will be replaced by the current day number in the evaluation period, the second %i will be replaced by the total number of days of the evaluation period (currently 14). #~ msgid "You are on day %i of the %i-days testing period." #~ msgstr "Nacházíte se v den %i z %i denní zkušební období." # This string is shown as a link the the "About" dialog. #~ msgid "Enter licence key now..." #~ msgstr "Zadejte nyní licenční klíč..." #~ msgid "Setup" #~ msgstr "Nastavení" #~ msgid "Show the following effects:" #~ msgstr "Zobrazit následující efekty:" #~ msgid "" #~ "To install further effects, just copy the\n" #~ "VST-plugins to one of the search paths." #~ msgstr "" #~ "Chcete-li nainstalovat další efekty, stačí zkopírovat \n" #~ "VST-plugins do jedné z cest pro vyhledávání." #~ msgid "FX settings for %s :" #~ msgstr "FX nastavení pro %s:" #~ msgid "Normal playback" #~ msgstr "Normální přehrávání" #~ msgid "Enable %s" #~ msgstr "Povolit %s" #~ msgid "%s parameters" #~ msgstr "%s parametr(y)" #~ msgid "Load %s" #~ msgstr "Načíst %s" #~ msgid "Save %s" #~ msgstr "Uložit %s" #~ msgid "%s priority" #~ msgstr "%s priorita" #~ msgid "Load all" #~ msgstr "Načtení všech" #~ msgid "Save all" #~ msgstr "Uložit vše" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/da.po��������������������������������������������������������������������������0000664�0000000�0000000�00000246205�12660066715�0015352�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2010-11-14 10:21+0100\n" "Last-Translator: Dan Larsen <dvl@privat.dk>\n" "Language-Team: Danish\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" msgid "Sleep mode activated." msgstr "Dvaletilstand aktiveret." msgid "Sleep mode deactivated." msgstr "Dvaletilstand deaktiveret." msgid "Play time exceeded" msgstr "" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "Default" msgstr "Standard" #, fuzzy #| msgid "Devices" msgid "Device" msgstr "Enheder" msgid "Show covers" msgstr "Vis omslag" msgid "Duration" msgstr "Varighed" msgid "Artist" msgstr "Kunstner" msgid "Original artist" msgstr "Oprindelige Kustner" msgid "Composer" msgstr "Komponist" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Spornummer" msgid "Automatic track number" msgstr "Automatisk sang nummer" msgid "Disk number" msgstr "Plade nummer" msgid "Genre" msgstr "Genre" msgid "Year" msgstr "År" #, fuzzy #| msgid "My rating" msgid "Rating" msgstr "Mine karakterer" msgid "Comment" msgstr "Kommentar" msgid "Show double tracks" msgstr "Vis dobbelt numre" msgid "Show different artist names" msgstr "Vis forskellige kunstnernavne" msgid "Show different album names" msgstr "Vis forskellige album navne" #, fuzzy #| msgid "Show covers" msgid "Show cover titles" msgstr "Vis omslag" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s spor" msgid "Drag folders with music here." msgstr "Træk mapper med musik her." msgid "Reset to default values" msgstr "Nulstil til standardværdier" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "Automatisk Afspilling" msgid "Shuffle" msgstr "Bland" msgid "Recreating music library" msgstr "Genskab musikbibliotek" msgid "Updating music library" msgstr "Opdater musikbibiotek" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Hvis du annullerer opdateringen, vil dit musikbibliotek ikke være " "opdateret.\n" "\n" "Stop opdateringen?" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "%s afspilles. Vil du stoppe denne og afslutte %s?" #, c-format msgid "Exit %s" msgstr "Afslut %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Kan ikke starte \"%s\"." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "Også installere scriptet til \"% s \" til permanent brug" #, c-format msgid "Execute the script \"%s\"?" msgstr "Kør scriptet \"%s\"?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "Søg" msgid "On" msgstr "Tænd" msgid "Off" msgstr "Sluk" msgid "Repeat playlist" msgstr "Gentag spillelister" msgid "Repeat one" msgstr "Gentag en" msgid "Repeat all" msgstr "Gentag alle" msgid "Select a track, then start playback." msgstr "Vælg et spor, derefter begynde afspilningen." msgid "Stop after this track" msgstr "Stop efter dette nummer" msgid "Stop after each track" msgstr "Stop efter hvert nummer" #, fuzzy #| msgid "Double click on covers" msgid "Double click play tracks at once" msgstr "Dobbelklikk på omslag" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback on first enqueue" msgstr "Start afsplining når sat i kø" msgid "Remove played tracks from queue" msgstr "Fjern afspillet numre fra køen" msgid "More from current album" msgstr "Mere fra dette album" msgid "More from current artist" msgstr "Mere fra denne kustner" msgid "No more tracks." msgstr "Ikke flere numre" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Remove all %i tracks from the queue and stop playback?" msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "Fjern alle %i numre fra køen og stop afspilning?" msgstr[1] "Fjern alle %i numre fra køen og stop afspilning?" msgid "Clear playlist" msgstr "Tøm køen" msgid "Track played, click to reset" msgstr "Spor afspillet, klik for at nulstille" msgid "Boredom avoided: Track moved down" msgstr "Kedsomhed undgås: Nummer flyttet ned" msgid "Remove this track" msgstr "Fjern dette nummer" msgid "Toggle time mode" msgstr "Vælg tidsvisning" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Go to \"%s\"" msgstr "Gå til \"%s\"" msgid "End search" msgstr "Stop Søgningen" msgid "click right for options" msgstr "Højreklik for valg" msgid "Volume" msgstr "Lydstyrke" msgid "Double-click to enlarge the cover" msgstr "Dobbelt klik for maksimere omslag" #, c-format msgid "Close this window and exit %s" msgstr "Luk vinduet og afslut %s" msgid "Open main menu" msgstr "Åben hovedmenu" msgid "Toggle shuffle mode" msgstr "Aktiver blandings mode" msgid "Repeat all/repeat current" msgstr "Gentag alle/gentag nuværende" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Søg i \"%s\"" msgid "Help" msgstr "Hjælp" #, fuzzy #| msgid "Read files and folders" msgid "Add folders and files" msgstr "Læs filer og kataloger" #, fuzzy #| msgid "File extension" msgid "Extensions" msgstr "Filendelse" msgid "Show remaining time" msgstr "Vis resterende tid" msgid "Show elapsed time" msgstr "Vis forløbet tid" msgid "Show total time" msgstr "Vis samlet tid" msgid "Show track number" msgstr "Vis spornummer" msgid "Show artist name" msgstr "Vis kustnerens navn" msgid "Show AutoPlay" msgstr "Vis autospilling" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "Vis" #, fuzzy #| msgid "Volume" msgid "Columns" msgstr "Lydstyrke" msgid "Same zoom in all views" msgstr "Samme zoom i alle visninger" msgid "Fonts and covers" msgstr "Fonter og omslag" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Skinds" #, fuzzy #| msgid "Start kiosk mode" msgid "Start kiosk mode..." msgstr "Start Kiosk tilstand" # %s will be replaced by the name of an artist #, fuzzy, c-format #| msgid "\"%s\" on the web" msgid "%s on the web" msgstr "\"%s\" på nettet" msgid "All files" msgstr "Alle filer" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "Om %s" msgid "File" msgstr "Fil" msgid "Edit" msgstr "Rediger" msgid "View" msgstr "Vis" msgid "Playback" msgstr "Afspilning" #, fuzzy #| msgid "Fit to screen" msgid "Video screen" msgstr "Tilpas til skærm" msgid "Kiosk mode" msgstr "Kiosk" msgid "None" msgstr "" msgid "Further options" msgstr "Yderligere optioner" msgid "Queue" msgstr "Kø" msgid "Automatic control" msgstr "Automatisk kontrol" msgid "Current view" msgstr "Aktuel visning" #, c-format msgid "Next track from \"%s\"" msgstr "Næste nummer fra \"%s\"" msgid "Next track" msgstr "Næste nummer" msgid "Search for genre" msgstr "Søg efter genre" msgid "Search for music selection" msgstr "Søg efter musik valg" msgid "Edit tracks/Get info" msgstr "Rediger nummer/Hent info" msgid "Show file" msgstr "Vis fil" msgid "Cover editor" msgstr "Omslags redigering" msgid "Mix" msgstr "" #, fuzzy #| msgid "Channels" msgid "Left channel" msgstr "Kanaler" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Prelisten" msgid "No" msgstr "Nej" msgid "Yes" msgstr "Ja" #, fuzzy #| msgid "Only initalize system volume" msgid "Only initialize system volume" msgstr "Kun initalize systemets lydstyrke" msgid "Output" msgstr "" msgid "Use system volume" msgstr "Brug systemets lydstyrke" msgid "Several artists" msgstr "Flere Kustnere" msgid "Unknown title" msgstr "Ukent titel" msgid "Save playlist" msgstr "Gem afspilnings liste" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Kan ikke skrive til \"%s\"." msgid "Open playlist" msgstr "Åben afspilnings liste" msgid "Title" msgstr "Titel" msgid "Track count" msgstr "Antal spor" msgid "Disk count" msgstr "Antal Plader" msgid "Group" msgstr "Gruppe" msgid "BPM" msgstr "BMP" msgid "Channels" msgstr "Kanaler" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "Filnavn" msgid "File size" msgstr "Fil størrelse" msgid "Date added" msgstr "Dato tilføjet" msgid "Date modified" msgstr "Dato ændret" msgid "Last played" msgstr "Sidst Afspillet" msgid "Play count" msgstr "Antal afspilninger" msgid "SQL expression" msgstr "SQL kommando" msgid "Limit result to" msgstr "Begræns resultater til" msgid "Title/artist/album" msgstr "Titel/kunstner/album" msgid "File type" msgstr "Fil type" msgid "Queue position" msgstr "Placering i køen" msgid "Include tracks" msgstr "Medtag nummer" msgid "Exclude tracks" msgstr "Fjern nummer" msgid "Random" msgstr "Tilfældig" # %s will be replaced by a shortcut, eg. "Ins" or "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "Tryk \"%s\" i hovedvinduet" msgid "Insert" msgstr "Indsæt" msgid "Del" msgstr "Fjern" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Indtast venligst datoen som \"dd.mm.yyyy \", du kan også tilføje \"hh: mm \" " "for tiden." msgid "Please enter the text." msgstr "Indtast teksten." msgid "Please enter a value." msgstr "Indtast en værdi" msgid "Please enter a valid value." msgstr "Indtast en gyldig værdi." msgid "(second field)" msgstr "(Andre felt)" msgid "No valid criteria defined." msgstr "Ingen gyldig definerede kriterier." msgid "The search cannot be started; please check the following fields:" msgstr "Søgningen kan ikke gennemføres, kontroller følgende felter:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "Bemærk: Operatørerne \"lige \" og \"ulige \" er case-sensitive." # %s will be replaced by the name of a music selection #, fuzzy, c-format #| msgid "Do you really want to delete the music selection \"%s\"?" msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Vil du slette musik biblioteket \"%s\"?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Fortryd" msgid "Page left" msgstr "Side venstre" msgid "Page right" msgstr "Side højre" msgid "Page up" msgstr "Side op" msgid "Page down" msgstr "Side ned" msgid "Menu" msgstr "Menu" msgid "Cursor left" msgstr "Cursor venstre" msgid "Cursor right" msgstr "Cursor højre" msgid "Cursor up" msgstr "Cursor op" msgid "Cursor down" msgstr "Cursor ned" msgid "Line left" msgstr "Linje venstre" msgid "Line right" msgstr "Linje højre" msgid "Line up" msgstr "Linje op" msgid "Line down" msgstr "Linje ned" msgid "Home" msgstr "Hjem" msgid "End" msgstr "Slut" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Slet" msgid "Album view" msgstr "Albumvisningen" msgid "Cover view" msgstr "Omslag visning" msgid "List view" msgstr "Liste visning" msgid "Toggle view" msgstr "Skift visning" #, fuzzy #| msgid "Open playlist" msgid "Open playlist..." msgstr "Åben afspilnings liste" msgid "Unqueue marked tracks" msgstr "Fjern markeret numre fra kø" msgid "Unqueue all but marked tracks" msgstr "Fjern alle umarket numre fra kø" #, fuzzy #| msgid "Save playlist" msgid "Save playlist..." msgstr "Gem afspilnings liste" msgid "Paste" msgstr "Sæt ind" #, fuzzy #| msgid "Music selection" msgid "Music selection..." msgstr "Musik valg" msgid "Settings" msgstr "Indstillinger" msgid "Update music library" msgstr "Opdater musik bibliotek" msgid "Recreate music library" msgstr "Genskab musik bibliotek" msgid "Enqueue tracks" msgstr "Sæt numre i kø" msgid "Play tracks next" msgstr "Spil numrer efter" msgid "Play tracks now" msgstr "Spil numre nu" msgid "Volume up" msgstr "Skru op" msgid "Volume down" msgstr "Skru ned" msgid "Unqueue tracks" msgstr "Fjern numre fra kø" #, fuzzy #| msgid "Edit tracks/Get info" msgid "Edit tracks/Get info..." msgstr "Rediger nummer/Hent info" msgid "Play" msgstr "Afspil" msgid "Pause" msgstr "Pause" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Forrige spor" msgid "Seek backward" msgstr "Søg baglæns" msgid "Seek forward" msgstr "Søg forlæns" msgid "Fade to next" msgstr "Fade til næste" msgid "Mute" msgstr "Sluk for lyd" msgid "Reload skin" msgstr "Indlæs skin igen" #, fuzzy #| msgid "Fit to screen" msgid "Toggle video screen" msgstr "Tilpas til skærm" msgid "Smooth" msgstr "Glat" msgid "Select all" msgstr "Vælg alle" msgid "Zoom in" msgstr "Zoom in" msgid "Zoom out" msgstr "Zoom ud" msgid "Normal zoom" msgstr "Normal zoom" msgid "Always on top" msgstr "Alltid øverst" msgid "Go to current track" msgstr "Gå til nuværende nummer" msgid "Go to marked track" msgstr "Gå til markeret nummer" msgid "Go to random album" msgstr "Gå til tilfældigt album" msgid "Go to previous letter" msgstr "Gå til forrige bogstav" msgid "Go to next letter" msgstr "Gå til næste bogstav" msgid "Add credit" msgstr "Tilføj kredit" #, fuzzy #| msgid "Console" msgid "Console..." msgstr "Konsol" #, fuzzy #| msgid "Replace" msgid "Replace..." msgstr "Erstat" #, fuzzy #| msgid "Split field" msgid "Split field..." msgstr "Del felt" #, fuzzy #| msgid "Rename files" msgid "Rename files..." msgstr "Omdøb filer" #, fuzzy #| msgid "Query online database" msgid "Query online database..." msgstr "Spørg online database" #, fuzzy #| msgid "New music selection" msgid "New music selection..." msgstr "Nyt music valg" msgid "Save" msgstr "Gem" #, fuzzy #| msgid "Save as" msgid "Save as..." msgstr "Gem som" #, fuzzy #| msgid "Rename" msgid "Rename..." msgstr "Omdøb" msgid "Revert to saved" msgstr "Gå tilbage til gemte" #, fuzzy #| msgid "Open file" msgid "Open file..." msgstr "Åben fil" #, fuzzy #| msgid "Save cover" msgid "Save cover..." msgstr "Gem omslag" msgid "Rotate left" msgstr "Roter venstre" msgid "Rotate right" msgstr "Roter højre" msgid "Flip horizontally" msgstr "Flip vandret" msgid "Flip vertically" msgstr "Flip lodret" msgid "Grayscale" msgstr "Gråskala" msgid "Negative" msgstr "Negativ" msgid "Fit to screen" msgstr "Tilpas til skærm" msgid "Decrease brightness" msgstr "Formindsk lysstyrke" msgid "Increase brightness" msgstr "Øge lysstyrken" msgid "Decrease contrast" msgstr "Formindsk kontrast" msgid "Increase contrast" msgstr "Øge kontrast" msgid "Normal brightness/contrast" msgstr "Normal lysstyrke / kontrast" msgid "Crop" msgstr "Beskær" msgid "Please press the shortcut to add." msgstr "Tryk på genvejen for at tilføje." msgid "System-wide:" msgstr "System-dækkende:" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Fjern genveji \"%s\"" msgid "Add system-wide shortcut..." msgstr "Tilføj system-dækkende genvej..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Tilføj genvej til \"%s\"..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "Genvejen \"%s\" er i øjeblikket er tildelt til kommandoen \"%s\". \n" "\n" "Ønsker du at tildele den til den genvej \"%s\" nu?" msgid "Mouse" msgstr "Mus" msgid "Drag window content" msgstr "Træk vinduet indhold" msgid "Left mouse button" msgstr "Venstre museknap" msgid "Drag selected tracks" msgstr "Træk valgte numre" msgid "Second click with the left mouse button" msgstr "Andet klik med ventre museknap" msgid "Show icons beside mouse cursor" msgstr "Vis koner ved siden af muse cursor" msgid "Middle mouse button" msgstr "Miderste museknap" msgid "Edit tracks" msgstr "Rediger numre" msgid "Tooltips" msgstr "Tooltips" msgid "Mouse wheel" msgstr "Musehjul" #, fuzzy #| msgid "Scroll horizontally" msgid "Scroll horizontally in album view" msgstr "Rull lodret" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "Brug multimedia keyboard taster" msgid "Ask on close if playing" msgstr "Spørg ved afslut hvis der afspilles" msgid "Ask before enqueuing multiple tracks" msgstr "Spørg før flere numre sættes i kø" msgid "Ask before clearing the playlist" msgstr "Spørg før spillelisten ryddes" #, fuzzy #| msgid "Ask before changing my rating" msgid "Ask before changing the rating" msgstr "Spørg før ændring af min bedømmelse" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Backspace" msgid "Space" msgstr "Mellemrum" msgid "Up" msgstr "Op" msgid "Left" msgstr "Venstre" msgid "Right" msgstr "Højre" msgid "Down" msgstr "Ned" msgid "Print" msgstr "Skriv ud" msgid "Ins" msgstr "Ins" msgid "Music selection" msgstr "Musik valg" msgid "Numpad" msgstr "Numpad" msgid "Select date and time" msgstr "Vælg dato og tid" msgid "Time" msgstr "Tid" msgid "contains" msgstr "Indeholder" msgid "does not contain" msgstr "indeholder ikke" msgid "starts with" msgstr "starter med" msgid "does not start with" msgstr "starter ikke med" msgid "starts simelar to" msgstr "starter magen til" msgid "ends with" msgstr "ender med" msgid "does not end with" msgstr "ender ikke med" msgid "on" msgstr "på" msgid "is equal to" msgstr "er lig med" msgid "not on" msgstr "ikke på" msgid "is unequal to" msgstr "ikke lig med" msgid "is simelar to" msgstr "er magen til" msgid "is after" msgstr "er efter" msgid "is greater than" msgstr "er større end" msgid "is on or after" msgstr "er på eller efter" msgid "is greater or equal" msgstr "er større end eller lig med" msgid "is before" msgstr "er før" msgid "is less than" msgstr "er mindre end" msgid "is on or before" msgstr "er på eller før" msgid "is less or equal" msgstr "er mindre end eller lig med" msgid "is in the last" msgstr "er i den sidste" msgid "is not in the last" msgstr "er ikke i den sidste" msgid "is in the period" msgstr "er i perioden" msgid "is in range" msgstr "er i niveau" msgid "is not in the period" msgstr "er ikke i perioden" msgid "is not in range" msgstr "er ikke i niveau" msgid "is set" msgstr "er sat" msgid "is unset" msgstr "er ikke sat" msgid "tracks" msgstr "Numre" msgid "albums" msgstr "album" msgid "minutes" msgstr "minutter" msgid "hours" msgstr "timer" msgid "seconds" msgstr "sekunder" msgid "days" msgstr "dage" msgid "No rating" msgstr "Ingen bedømmelse" msgid "random" msgstr "tilfældig" msgid "highest rating" msgstr "højeste bedommelse" msgid "lowest rating" msgstr "laveste bedømmelse" msgid "most often played" msgstr "mest afspillet" msgid "least often played" msgstr "mindste afspillet" msgid "most recently played" msgstr "senest afspillet" msgid "least recently played" msgstr "længst siden sidste afsplining" msgid "most recently added" msgstr "senest tilføjede" msgid "least recently added" msgstr "længst siden tilføjet" msgid "most recently modified" msgstr "seneste ændret" msgid "least recently modified" msgstr "længst siden sidste ændring" msgid "most recently released" msgstr "seneste udgivet" msgid "least recently released" msgstr "ældste udgivelse" msgid "low queue position" msgstr "lav placering i køen" msgid "high queue position" msgstr "høj placering i køen" msgid "Today" msgstr "I dag" msgid "Yesterday" msgstr "I går" msgid "Select..." msgstr "Vælg..." msgid "Show tracks..." msgstr "Vis numre" msgid "Add tracks from playlist" msgstr "Tilføj numre fra playlist" msgid "Current position" msgstr "Nuværende position" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "af" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "til" msgid "Remove criterion" msgstr "Fjern kriteria" msgid "Add criterion" msgstr "Tilføj kriteria" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "Numre tilføjet till \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Numre fjernet fra \"%s\"" msgid "Saved selections" msgstr "Gemte lister" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Søg efter %s matchende %s af følgende kriterier:" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "numrer|album" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "Alle|nogen|ingen" msgid "Close" msgstr "Luk" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Ønsker du at gemme dine ændringer til musikbiblliotek \"%s\"?" msgid "Music selection modified" msgstr "Musik bibliotek ændret" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "Rediger musik biblotek \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Vil du slette musik biblioteket \"%s\"?" msgid "Delete music selection" msgstr "Slet musik bibliotek" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Vil du virkelig fjerne %i valgte musikbiblotek?" msgid "Delete music selections" msgstr "Slet musik biblotek" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "Intet fundet for \"%s\"." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "Vil du fjerne de valgte numre fra musik bibloteket \"%s\"?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "Ønsker du at tilføje det valgte nummer til musikbiblioteket \"%s\"?" # This is the name of a predefined music selection msgid "70's music" msgstr "70's musik" # This is the name of a predefined music selection msgid "Worst rated" msgstr "Værst bedømt" # This is the name of a predefined music selection msgid "Top rated" msgstr "Højeste karakter" # This is the name of a predefined music selection msgid "Top 20" msgstr "Top 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "Senste spillet" # This is the name of a predefined music selection msgid "Played today" msgstr "Spillet i dag" # This is the name of a predefined music selection msgid "Random selection" msgstr "Tilfældig valgt" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Numre i kø" msgid "Untitled Music selection" msgstr "Unavngivet musik bibliotek" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Intet fundet i \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "1 fundet i \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s fundet i \"%s\"" msgid "No matches" msgstr "Ingen fundet" msgid "1 match" msgstr "1 fundet" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s fundet" # %s will be replaced by the name of a music selection msgid "Search single words" msgstr "Søg efter enkelt ord" msgid "Lookup genre on simple search" msgstr "Opslag genre på simpel søgning" msgid "Search while typing" msgstr "Søg mens der skrives" msgid "Save modified music selections" msgstr "Gem ændret musik biblotek" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "Spørg" msgid "Max. history size" msgstr "Maks historiestørrelse" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Søg efter \"%s\" i \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Søg efter \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Tryk og hold nede på venstre museknap. Herefter vælg det område der skal " "beskæres ved at flytte musen." msgid "<Abstract>" msgstr "<Abstrakt>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Standard)" msgid "Paste image from clipboard" msgstr "Brug billede fra clipboard" msgid "Browse" msgstr "Browse" msgid "Select cover" msgstr "Vælg omslag" msgid "Search covers on the web" msgstr "Søg efter omslag på nettet" msgid "Don't rotate" msgstr "Roter ikke" msgid "Rotate/flip" msgstr "Roter/flip" msgid "Use default images..." msgstr "Brug standard billede..." msgid "Effects/options" msgstr "Effekter/Optioner" msgid "Select image" msgstr "Vælg billede" msgid "Save cover" msgstr "Gem omslag" msgid "Reset all selected alternative images to their default value?" msgstr "Nulstil alle valgte alternativ billeder til deres standard værdi?" msgid "Search paths" msgstr "Søgestier" msgid "The search paths are used for skins, language files and modules." msgstr "Søgningen stier anvendes til skind, sprog filer og moduler." msgid "Add..." msgstr "Tilføj..." msgid "Remove" msgstr "Slet" msgid "Please select the folder to add to the search paths." msgstr "Vælg den mappe for at tilføje til søgestier." msgid "Edit..." msgstr "Rediger..." #, fuzzy #| msgid "Comment" msgid "Command" msgstr "Kommentar" msgid "Shortcut" msgstr "Genvej" #, fuzzy #| msgid "Options" msgid "Option" msgstr "Optioner" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "De følgende indstillinger er kun for erfarne brugere." msgid "Customize" msgstr "Tilpas" msgid "Reset selection" msgstr "Nulstil valg" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Vil du virkelig nulstille %i valgte kommandoer og valg til standard værdier?" #, fuzzy #| msgid "Shortcut" msgid "Shortcuts" msgstr "Genvej" msgid "Language" msgstr "Sprog" msgid "Show files with" msgstr "Vis filer med" msgid "Instance" msgstr "Instans" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Brug kommandolinje optionen --%s=<file> for at ændre dette." msgid "Index file" msgstr "Indeksfil" msgid "RAM cache" msgstr "RAM cache" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "Genn. søgetid: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synkronisering" msgid "Fast" msgstr "Hurtigt" msgid "Save but slower" msgstr "Gem men langsommere" msgid "Very save and slow" msgstr "Meget sikker og langsomt" msgid "Image cache" msgstr "Billede cache" msgid "Use temporary directory" msgstr "Brug midlertidig mapper" msgid "Yes, load images asynchrony" msgstr "Ja, indlæse billeder asynkront" msgid "Yes, load images directly and avoid flickering" msgstr "Ja, indlæse billeder direkte og undgå flimre" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% brugt til %i billeder" msgid "Regard file changes" msgstr "Henvis filændringer" msgid "Advanced" msgstr "Avanceret" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Genstart venligst %s, så ændringerne kan træde i kraft." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Hælpe systmet" # String for "Don't know" or "unset" msgid "n/a" msgstr "N/A" msgid "Internal" msgstr "Intern" msgid "No credit." msgstr "Ingen kredit" #, c-format msgid "Credit: %i" msgstr "Kredit: %i" msgid "Start" msgstr "Start" #, fuzzy #| msgid "Functionality" msgid "Functions" msgstr "Funktionalitet" msgid "Monitors" msgstr "Monitorer" msgid "Virtual keyboard" msgstr "Virtuelt tastetur" msgid "Credit system" msgstr "Kredit system" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke har en såkaldt \"kiosk\", som tillader dig at køre programmet \n" "fuld skærm med en defineret funktion." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Før du skifter til kiosk tilstand ved at klikke på \"Start\", så sørg for, " "du ved, hvordan \n" "du afslutter igen:" # %s will be replaced by a shortcut, eg. "F11" #, c-format msgid "Exit by hitting %s" msgstr "Afslut ved at trykke %s" msgid "Exit by clicking into two different corners" msgstr "Afslut ved at klikke i to forskellige hjørner" msgid "Try to set exclusive" msgstr "" msgid "Ask for a password on exit" msgstr "Bed om en adgangskode ved afslutning:" msgid "Change password..." msgstr "Ændre password..." msgid "Exit action:" msgstr "Luk:" msgid "Start the kiosk mode with the following functionality:" msgstr "Start kiosk med følgende funktionalitet:" msgid "Play/pause" msgstr "Spill/Pause" msgid "Edit queue" msgstr "Rediger køen" msgid "Toggle elements" msgstr "Slå elementer til og fra" msgid "Enqueue multiple tracks" msgstr "Sæt flere numre i kø" msgid "All functions" msgstr "Alle funktioner" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Begræns numre til musik valget %s" msgid "Please enter the password again for verification." msgstr "Indtast password igen til verifikation" msgid "Overview:" msgstr "Oversigt:" msgid "Main window" msgstr "Hovedvindue" msgid "Monitor" msgstr "Monitor" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB msgid "Disable screensaver" msgstr "Deaktiver screensaver" msgid "Disable power management" msgstr "Deaktiver strømstyring" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Hvis der ikke fysisk tastatur er til stede, kan du bruge vores virtuelle " "tastatur; \n" "Det virtuelle tastatur så vises når du klikker på en tekst kontrol." msgid "Use the virtual keyboard" msgstr "Brug virtuelt tastatur" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "brug også det virtuelle tastatur uden kiosken mode" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(klik i text kontrol)" msgid "Virtual keyboard layout:" msgstr "Virtuelt tastatur layout:" msgid "Colour:" msgstr "Farve:" msgid "Black" msgstr "Sort" msgid "White" msgstr "Hvid" msgid "Transparency:" msgstr "Gennemsigtighed:" # %s will be replaced by the program name, usually "Silverjuke" msgid "Hide cursor" msgstr "Skjul cursor" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Brug af Numpad plus nogle andre specielle taster, kan du styre Silverjuke " "helt \n" "af tastaturet eller anden hardware knapper. I dette tilfælde skal du enqueue " "nye \n" "spor ved at indtaste de unikke numre vises ved siden af album og spor navne." msgid "Use Numpad controls" msgstr "Brug numpad" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Brug også numpad uden for kiosk" msgid "Keys:" msgstr "Taster:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "Til den ordning, skal brugerne fx. Tilføj mønter før spor kan sættes kø. " "Venligst \n" "se i online hjælpen for detaljer om muligheder og den understøttet hardware." msgid "Use credit system" msgstr "Brug betalingssystem" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "Kredit kan tilføjes af DDE, kommandolinje eller genveje" msgid "Keys..." msgstr "Taster..." msgid "Remember credits between program starts" msgstr "Husk kredit mellem program starter" msgid "Current credit:" msgstr "Nuværende kredit:" msgid "Please enter your password to exit the kiosk mode." msgstr "Indtast password for at forlade Kiosk tilstand" msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Køen er fuld,\n" "Prøv igen senere." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "Dette nummer er allerede i køen,\n" "Prøv lidt senere." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "Dette nummer eller kunstner er lige blevet spillet, prøv igen senere" msgid "Maintenance password" msgstr "Password til vedligeholdese" msgid "Exit kiosk mode" msgstr "Forlad Kiosk tilstand" msgid "Start kiosk mode" msgstr "Start Kiosk tilstand" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Password:" msgid "Invalid password. Please try again." msgstr "Ugyldigt password. Prøv igjen" msgid "Invalid track number" msgstr "Ugyldig sang nummer" msgid "Action:" msgstr "Handling:" msgid "Shutdown computer" msgstr "Sluk for computeren" msgid "Reboot computer" msgstr "Genstart computeren" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Et album skal mindst have %s numre med tilhørende %s" msgid "artist/album" msgstr "kunstner/album" msgid "artist/album or genre" msgstr "kunstner/album eller genre" msgid "directory" msgstr "mappe" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Opsamlinger kan indeholde op til %s numre af samme kunstner." msgid "Separate the words using commas, case is ignored" msgstr "Adskild ordene med komma, store bogstaver ignorers" msgid "Sort by:" msgstr "Sorter efter:" msgid "Stop-words for sorting artists:" msgstr "Stop-ord for sortering kunstnere:" msgid "Stop-words for sorting albums:" msgstr "Stop-ord for sortering album:" msgid "Show stop-words words at end" msgstr "Vis stop-ord i slutningen" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "Hvis de udvælges, f.eks. \"The Rolling Stones\" bliver \"Rolling Stones, The" "\", \n" "sortering i sig selv er ikke påvirket af denne mulighed" msgid "Keywords to identify cover image for an album:" msgstr "Søgeord for at identificere omslagett til et album:" msgid "Double click on covers" msgstr "Dobbelklikk på omslag" msgid "Select/play album" msgstr "Vælg/spil album" msgid "Combine tracks to albums" msgstr "Kombiner numre til album" msgid "Updating genres..." msgstr "Opderter genre..." msgid "Updating groups..." msgstr "Opdater grupper..." msgid "Combining tracks to albums..." msgstr "Kombiner numre til album..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Ønsker du at tilføje følgende mappe(r) til musikbiblioteket?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Ja, gem billedet i \"%s\"" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Ja, kopier billedet til \"%s\"" # %s will be replaced by the album name #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Ønsker du at bruge de givne billede som omslag for \"%s\"?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "\"%s\" er ikke i dit musikbibliotek og kan derfor ikke redigeres." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s numre på %s albums fundet for \"%s\"" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s numre på %s album" msgid "Albums" msgstr "Album" msgid "All albums" msgstr "Alle albums" msgid "Unsorted tracks" msgstr "Usorteret numre" # %i will be replaced by the disk number #, c-format msgid "Disk %i" msgstr "Disk %i" # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Stop prelisten" #, c-format msgid "Prelisten \"%s\"" msgstr "Prelisten \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "Tilføj til \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "Spill \"%s\" nu" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "Spill \"%s\" som den næste" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "Fjern \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Enqueue %i tracks" msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "Tilføj %i numre" msgstr[1] "Tilføj %i numre" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks now" msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Spill %i numre nu" msgstr[1] "Spill %i numre nu" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks next" msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Spill %i som de næste" msgstr[1] "Spill %i som de næste" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Unqueue %i tracks" msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Fjern %i numre" msgstr[1] "Fjern %i numre" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" på nettet" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Gennemsnitlig karakter: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, fuzzy, c-format #| msgid "My rating: %s" msgid "Rating: %s" msgstr "Mine karakterer: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to change the rating for all %i selected tracks?" msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Vil du ændre karakter for alle %i valgte numre?" msgstr[1] "Vil du ændre karakter for alle %i valgte numre?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Ændre karakter" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" "Klik for at vælge alle numre på dette album, dobbeltklik for at spille dem" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" "Klik for at vælge alle numre på denne kunstner, dobbeltklik for at spille " "dem" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" "Klik for at vælge alle numre på denne disk, dobbeltklik for at spille dem" # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Dobbelt klik for at tilføje \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to enqueue all %i selected tracks?" msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Vil du tilføje alle %i valgte numre?" msgstr[1] "Vil du tilføje alle %i valgte numre?" msgid "Size" msgstr "Størrelse" msgid "Gain" msgstr "Gain" msgid "Read music-files from the following folders and sources:" msgstr "Hent musik-filer fra følgende mapper og kilder:" msgid "Read music-files from the following sources:" msgstr "Hent musik filer fra følgende kilde:" msgid "Add source" msgstr "Tilføg kilde" msgid "Remove source" msgstr "Fjern kilde" msgid "Options" msgstr "Optioner" #, fuzzy #| msgid "Supported file-types" msgid "Supported file types" msgstr "Understøttet filtyper" #, fuzzy #| msgid "My music library" msgid "Music library" msgstr "Mit musikbibliotek" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Optioner for \"%s\"" msgid "Options..." msgstr "Optioner ..." msgid "Jukebox" msgstr "" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "Vælg en afspilningsliste, nogle filer eller indtast en streaming URL" msgid "Append to current playlist" msgstr "Tilføj til den nuværende spilleliste" msgid "Volume control" msgstr "Volumkontrol" msgid "Play all tracks of an album with the same volume" msgstr "Spil alle numre fra et album ved samme lydstyrke" msgid "Desired volume:" msgstr "Ønsket lydstyrke:" msgid "Max. gain:" msgstr "Maks. gain:" msgid "Current volume:" msgstr "Nuværende lydstyrke:" msgid "Fading" msgstr "Fading" msgid "Crossfading" msgstr "Crossfading" msgid "Manual crossfades:" msgstr "Manuel crossfades:" msgid "Automatic crossfades:" msgstr "Automatisk crossfades:" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "Ingen crossfades mellem numre fra samme album" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Kun fade ud den gamle nummer, det nye nummer starter med fuld styrke" msgid "Resume" msgstr "" msgid "Jingles" msgstr "Jingles" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "Følgende valgmuligheder definerer opførsel i køen. For \"shuffle intensitet " "\", \n" "små værdier skaber kun mindre variationer i køen orden, mens store værdier \n" "forårsager store variationer." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Tillad maks. %i numre i køen" msgstr[1] "Tillad maks. %i numre i køen" #, fuzzy #| msgid "Avoid double tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Undgå at samme nummer er i køen mere end 1 gang" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "Undgå kedsomhed. Numre må ikke gentages inden for %i minutter" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "Undgå kedsomhed: Kustner må ikke gentages inden for %i minutter" msgid "Shuffle intensity:" msgstr "Blandings intensitet:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" #, fuzzy #| msgid "Edit queue" msgid "Restore queue" msgstr "Rediger køen" #, fuzzy #| msgid "Remove played tracks from queue" msgid "Restore already played tracks" msgstr "Fjern afspillet numre fra køen" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback from last position" msgstr "Start afsplining når sat i kø" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Brug følgende muligheder for at definere, hvilke tiltag der bør gøres " "automatisk \n" "efter at have givet timeouts." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "Autospilling: Hvis spillelisten er tom,vent i %i minutter;" #, c-format msgid "then, play %i tracks from the %s" msgstr "da, spill %i nummer fra %s" # %s will be replaced by the name of a music selection msgid "Ignore tracks from the music selection" msgstr "Ignorer numre fra musik listen" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "Manuel valgte numre afbryder Autospil øjeblikkeligt" msgid "Sleep mode:" msgstr "Dvaletilstand:" msgid "Stop playback" msgstr "Stop afspilning" #, fuzzy #| msgid "in|after|at|always in|always after|always at" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "in|after|at|always in|always after|always at" #, fuzzy #| msgid "minutes" msgid "minutes|o'clock" msgstr "minutter" #, c-format msgid "Before this, fade out %i seconds" msgstr "Før dette, fade i %i sekunder" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" #, fuzzy #| msgid "minutes" msgid "minutes," msgstr "minutter" # %s will be replaced by the name of a music selection #, fuzzy #| msgid "Ignore tracks from the music selection" msgid "play a track from the music selection" msgstr "Ignorer numre fra musik listen" #, fuzzy #| msgid "Alt" msgid "At" msgstr "Alt" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Gå til nuværende nummer efter %i minutter inaktivitet" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Reset visning efter %i minutter af inaktivitet til" #, fuzzy, c-format #| msgid "Open %s after %i minutes of inactivity" msgid "Open video screen after %i minutes of inactivity" msgstr "Åben %s efter %i minutter inaktivitet" #, fuzzy, c-format #| msgid "Close %s after %i minutes" msgid "Close video screen after %i minutes" msgstr "Luk %s efter %i minutter" #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "Læs mapper:" msgid "Read file:" msgstr "Læs fil:" msgid "Ignore music-files and images with the following extensions:" msgstr "Ignorer musik-filer og billeder med følgende extensions:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "(separarer typerne ved hjælp af komma, )" msgid "Include folder to the update process" msgstr "Medtag mappe til opdateringen" msgid "Read hidden files" msgstr "Læs skjulte filer" #, fuzzy #| msgid "Read hidden files" msgid "Read hidden folders" msgstr "Læs skjulte filer" msgid "Read inside ZIP-/TAR-archives" msgstr "Læs inde i ZIP/TAR arkiver" msgid "Read (ID3)-tags" msgstr "Læs (ID3)-tags" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "Sti og fil mønster for nummer-oplysninger, hvis (ID3-) tags mangler:" msgid "Placeholders:" msgstr "Pladsholdere:" msgid "Read files and folders" msgstr "Læs filer og kataloger" msgid "Add a folder to search for music-files" msgstr "Tilføj en mappe for at søge efter musik-filer" msgid "Add a single music-file" msgstr "Tilføj en enkelt musik fil" msgid "Disabled" msgstr "Slået fra" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "Ingen opdatering" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "Fjern \"%s\" fra musik biblioteket?" msgid "Select a folder with music-files" msgstr "Vælg en mappe med musik filer" msgid "Select music-file" msgstr "Vælg musik fil" msgid "Unknown track" msgstr "Ukent nummer" msgid "Unknown artist" msgstr "Ukent kunstner" msgid "Add a server containing music-files" msgstr "Tilføj en server, der indeholder musik filer" msgid "Use server:" msgstr "Brug server:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Type" msgid "Login name:" msgstr "Login navn:" msgid "Include server to the update process" msgstr "Medtag server i opdateringer" msgid "Configuration file" msgstr "Konfigurationsfil" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #, c-format msgid "Loading %s" msgstr "Henter %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Fejl %i" msgid "Edit track" msgstr "Rediger nummer" msgid "of" msgstr "af" msgid "Write (ID3-)tags" msgstr "skriv (ID3-)tags" msgid "File names" msgstr "Filnavne" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Vis alle %s filnavne..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "De viste værdier er summen eller gennemsnittet af alle single værdier i de " "givne filer." msgid "Track" msgstr "Nummer" msgid "Further information" msgstr "Yderlig information" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "Midlertidlig mappe" msgid "Further information..." msgstr "Yderlig information..." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Kan ikke omdøbe \"%s\" til \"%s\"." msgid "Server name" msgstr "Server navn" msgid "Query online database" msgstr "Spørg online database" msgid "more..." msgstr "mere..." msgid "Please select one of the following albums:" msgstr "Vælg et af de følgende albums:" msgid "Old file name" msgstr "Gammelt filnavn" msgid "New file name" msgstr "Nyt filnavn" msgid "Field" msgstr "Felt" msgid "Old value" msgstr "Gammel værdi" msgid "New value" msgstr "Ny værdi" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<tom>" msgid "Confirm modifications" msgstr "Godkend ændringer" msgid "Delete empty folders" msgstr "Slet tomme mapper" msgid "Please confirm or edit the following modification:" msgstr "Bekræft eller ret følgende ændringer:" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Bekræft eller ret følgende %s ændringer:" msgid "(lower case)" msgstr "(Små bogstaver)" msgid "(upper case)" msgstr "(Store bogstaver)" msgid "(n characters)" msgstr "(n karakterer)" msgid "Rename files" msgstr "Omdøb filer" msgid "Pattern:" msgstr "Mønster:" #, fuzzy #| msgid "(first character)" msgid "Artist (first character)" msgstr "(første bogstav)" #, fuzzy #| msgid "(first character)" msgid "Album (first character)" msgstr "(første bogstav)" #, fuzzy #| msgid "(first character)" msgid "Genre (first character)" msgstr "(første bogstav)" #, fuzzy #| msgid "(first character)" msgid "Group (first character)" msgstr "(første bogstav)" #, fuzzy #| msgid "(n characters)" msgid "Year (4 characters)" msgstr "(n karakterer)" #, fuzzy #| msgid "(n characters)" msgid "Year (2 characters)" msgstr "(n karakterer)" #, fuzzy #| msgid "(n characters)" msgid "Duration (5 characters)" msgstr "(n karakterer)" msgid "Directory change" msgstr "Skift mappe" #, fuzzy #| msgid "(n characters)" msgid "File name (8 characters)" msgstr "(n karakterer)" msgid "File extension" msgstr "Filendelse" msgid "Example:" msgstr "Eksempel:" msgid "Replace" msgstr "Erstat" msgid "Search for:" msgstr "Søg efter:" msgid "in:" msgstr "i:" msgid "All fields" msgstr "Alle felter" msgid "Path and file name" msgstr "Sti og filnavne" msgid "Replace with:" msgstr "Erstat med:" msgid "Match whole words only" msgstr "Søg kun på hele ord" msgid "Match case" msgstr "Søg på store og små bogstaver" msgid "Regular expression" msgstr "Regulære udtryk" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "\"%s\" blev ikke fundet." msgid "Split field" msgstr "Del felt" msgid "Field to split:" msgstr "Felter der skal deles:" msgid "Destination fields and pattern:" msgstr "Destination felter og mønster:" #, fuzzy #| msgid "Track number" msgid "Track number (1 character)" msgstr "Spornummer" #, fuzzy #| msgid "(n characters)" msgid "Track number (2 characters)" msgstr "(n karakterer)" #, fuzzy #| msgid "(first character)" msgid "Disk number (1 character)" msgstr "(første bogstav)" #, fuzzy #| msgid "(n characters)" msgid "Disk number (2 characters)" msgstr "(n karakterer)" msgid "Void information" msgstr "Tom information" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "Med forskellige skinds du kan ændre \"look and feel\" af %s. Bare \n" "vælg et skind fra listen. Du kan finde flere skinds på nettet." msgid "Name" msgstr "Navn" msgid "Info..." msgstr "Information..." msgid "Update list" msgstr "Opdater liste" msgid "More skins on the web..." msgstr "Fllere skinds på nettet..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Du kan indstille uafhængige skrifttyper og omslags størrelser til brug i " "hovedvinduet. Størrelserne \n" "henvise til en zoom på 100%. Hvis du zoomer ind eller ud (f.eks ved at bruge " "\"+ \" eller \"- \" taster), begge \n" "størrelser vil vokse eller skrumpe proportionalt." msgid "Font:" msgstr "Font:" msgid "Font size:" msgstr "Font størrelse:" msgid "Use this font for dialogs, too" msgstr "Brug også denne font til dialoger" msgid "Column width:" msgstr "Kolonne bredde:" msgid "Cover size:" msgstr "Omslags størrelse" msgid "No lyrics found." msgstr "Tekster ikke fundet" msgid "Karaoke Prompt" msgstr "Karaoke tegn" # %s will be replaced by the name of a music selection #, c-format msgid "No images found in \"%s\"." msgstr "Ingen billeder fundet i \"%s\"." msgid "Background" msgstr "Baggrund" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "Use %s-files" msgstr "Brug %s-filer" msgid "Please select a directory with images" msgstr "Vælg en mappe med billeder" msgid "If appropriate, switch over automatically" msgstr "Hvis det er relevant, skift automatisk" msgid "Half size" msgstr "Halv størrelse" msgid "Spectrum Monitor" msgstr "Spektrum Monitor" msgid "Show spectrum" msgstr "Vis spektrum" msgid "Show oscilloscope" msgstr "Vis ocilloskope" msgid "Show starfield" msgstr "Vis stjerneregn" #, fuzzy #| msgid "Show starfield" msgid "Show other figures" msgstr "Vis stjerneregn" msgid "Visualization" msgstr "Start Visualisering" msgid "Video output" msgstr "Video udgang" msgid "Search homepage" msgstr "Søg hjemmesiden" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Tekster %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "Søg med %s" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informasion om %s" # Do not forget the ":" at the end of the string. msgid "Object count:" msgstr "Antal objekter:" # Do not forget the ":" at the end of the string. msgid "Elapsed time:" msgstr "Forløbet tid:" msgid "Message" msgstr "Besked" msgid "Scope" msgstr "Scope" msgid "Console" msgstr "Konsol" #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i message(s)" msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i Besked(er)" msgstr[1] "%i Besked(er)" msgid "Evaluate" msgstr "Evaluer" msgid "Clear" msgstr "Ryd" msgid "Open console on errors and warnings" msgstr "Åben en konsol ved fejl og advarsler" msgid "Details" msgstr "Detaljer" msgid "Clear all messages?" msgstr "Ryd alle beskeder" #, c-format msgid "Overwrite \"%s\"?" msgstr "Overskrivr \"%s\"?" msgid "Append" msgstr "Tilføj" msgid "State" msgstr "Tillstand" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "%s-filer" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "%s-lyd" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "%s-bilder" #, c-format msgid "%s-video" msgstr "" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "%s-afsplinings lister" #, fuzzy #| msgid "Archive-files" msgid "Script-files" msgstr "Arkiv filer" msgid "Silverjuke skin-files" msgstr "Silverjuke skin-filer" #, fuzzy #| msgid "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Silverjuke skin-filer" msgid "Archive-files" msgstr "Arkiv filer" msgid "Supported file-types" msgstr "Understøttet filtyper" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programmer" msgid "Cleanup index..." msgstr "Rens indeks..." msgid "max. size" msgstr "maks. størrelse" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "Sidste gang afsluttes %s ikke normalt.\n" "Følgende - måske fejl behæftet - objekter var i brug lige før unormal " "afslutning: \n" "\n" "%s\n" "\n" "Hvis problemerne forsætter, så prøv at undgå at bruge disse objekter.\n" "Vil du bruge objekterne denne gang?" msgid "Use maybe errorous objects?" msgstr "Brug mulige fejl behæftet objekter?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "__DATE_TIME_LONG__" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "__DATE_TIME_EDITABLE__" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "__DATE_LONG__" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "__DATE_EDITABLE__" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "__DATE_SUNDAY_FIRST__" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "_THIS_LANG__" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "__COVER_SEARCH_URLS__" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "__ARTIST_INFO_URLS__" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "__STOP_ARTISTS__" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "__STOP_ALBUMS__" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "__COVER_KEYWORDS__" msgid "__VIRT_KEYBD__" msgstr "__VIRT_KEYBD__" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "," #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i days" msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dage" msgstr[1] "%i dage" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Ugyldigt regulært udtryk \"%s\"." msgid "Fatal error" msgstr "Alvorlig fejl" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Forstør Vindue" msgid "Shrink window" msgstr "Formindsk Vindue" msgid "Enlarge display" msgstr "Forstør display" msgid "Shrink display" msgstr "Formindsk display" #, fuzzy #| msgid "Devices" msgid "Services" msgstr "Enheder" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Hide %s" msgstr "Skjul %s" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #| msgid "Hide %s" msgid "Hide Others" msgstr "Skjul %s" #, fuzzy #| msgid "Show file" msgid "Show All" msgstr "Vis fil" #, fuzzy, c-format #| msgid "Exit %s" msgid "Quit %s" msgstr "Afslut %s" msgid "Extras" msgstr "" msgid "Full screen" msgstr "Fuld skærm" msgid "Modules on the web..." msgstr "Moduler på nettet.." msgid "Explore" msgstr "Udforsk" msgid "Reveal in Finder" msgstr "Vis i finder" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "Filen \"%s\" eksisterer ikke." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "Kan ikke starte \"%s\"." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" #~ msgid "Scroll vertically" #~ msgstr "Rul vandret" #~ msgid "Context sensitive" #~ msgstr "Kontekstafhængige" #, fuzzy #~| msgid "Exit %s" #~ msgid "Exit" #~ msgstr "Afslut %s" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "Deaktiver %s" #~ msgid "Disable shutdown" #~ msgstr "Deaktiver shutdown" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Hvis du har mere end én skærm tilsluttet computeren, \n" #~ "Du kan tildele de forskellige Silverjuke vinduer til forskellige skærme " #~ "her." #~ msgid "Monitor for" #~ msgstr "Monitor for" # %s will be replaced by a control for selecting the display resolution #~ msgid "Switch resolution to %s" #~ msgstr "Skift opløsning for %s" #~ msgid "Calculated volumes:" #~ msgstr "Udregnet lydstyrke:" #~ msgid "Skip silence between tracks" #~ msgstr "Spring stilhed mellem numre over" #~ msgid "Other fadings" #~ msgstr "Andre fadinger" #~ msgid "Attached window" #~ msgstr "Vedhæftet vindue" #~ msgid "Show album name" #~ msgstr "Vis albumnavn" #~ msgid "Online help" #~ msgstr "Hjælp på nettet" #~ msgid "Tools" #~ msgstr "Værktøjer" #~ msgid "Workspace" #~ msgstr "Arbejdsfelt" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #~| msgid "" #~| "Beside several options, you can change the shortcuts to use in %s here. " #~| "You can\n" #~| "also define system-wide shortcuts. To modify an option, select the " #~| "option from the list\n" #~| "and click on \"Customize\". This page is for experienced users only." #~ msgid "" #~ "Beside several options, you can change the shortcuts to use here.\n" #~ "This page is for experienced users only." #~ msgstr "" #~ "Udover flere muligheder, kan du ændre genveje til brug i%s her. Du kan \n" #~ "også definere genvege for hele systemet. For at ændre en indstilling, " #~ "skal du vælge indstillingen fra listen \n" #~ "og klikke på \"Tilpas\". Denne side er kun for erfarne brugere." #~ msgid "Command or option" #~ msgstr "Kommando eller option" #~ msgid "Setting" #~ msgstr "Indstillinger" #~ msgid "Preferred cover" #~ msgstr "Fortrukket omslag" #~ msgid "Album cover" #~ msgstr "Album omslag" #~ msgid "Track cover" #~ msgstr "Nummer omslag" #~ msgid "Track list" #~ msgstr "Nummer liste" #~ msgid "Show disk number" #~ msgstr "Vis disk nummer" #~ msgid "Show original artist" #~ msgstr "Vis original kunstner" #~ msgid "Show composer" #~ msgstr "Vis komponist" #~ msgid "Show time" #~ msgstr "Vis tid" #~ msgid "Show year" #~ msgstr "Vis år" #~ msgid "Show comment" #~ msgstr "Vis kommentar" #~ msgid "Show genre" #~ msgstr "Vis genre" #~ msgid "Show rating" #~ msgstr "Vis karakter" #, fuzzy #~| msgid "Currently, the following files are supported:" #~ msgid "Currently, the following file types are read:" #~ msgstr "I øjeblikket er følgende filer understøttet:" #~ msgid "minutes|minutes of inactivity|o'clock" #~ msgstr "minutes|minutes of inactivity|o'clock" # %i will be replaced by the number of characters #~ msgid "(%i characters)" #~ msgstr "(%i bogstaver)" #~ msgid "More layouts on the web..." #~ msgstr "Flere latouts på nettet..." #, fuzzy #~| msgid "Monitor for" #~ msgid "Monitor for main window" #~ msgstr "Monitor for" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #~ msgid "Initializing %s..." #~ msgstr "Starter %s..." #~ msgid "Microphone" #~ msgstr "Mikrofon" # This is the name of the "First steps" button. Do not add "..." to the string! #~ msgid "First steps" #~ msgstr "Første skridt" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Buy %s..." #~ msgstr "Køb %s..." #~ msgid "Unlicenced version" #~ msgstr "Ulicenseret version" #~ msgid "These options are available if you buy Silverjuke." #~ msgstr "Disse indstillinger er tilgængelige, hvis du køber Silverjuke." # The first %s will be replaced by the program name (usually "Silverjuke"), the second and third %s will be replaced by a file type (eg. "MP3"), the fourth %s will be replaced by the URL to search for modules (eg. "http://www.silverjuke.net/en/modules.html". #~ msgid "" #~ "%s has not found an %s-decoder on your system. If you want to play %s-" #~ "files, you should install a module for this purpose.\n" #~ "\n" #~ "Open %s and search for modules now?" #~ msgstr "" #~ "%s har ikke fundet en %s-dekoder på dit system. Hvis du ønsker at spille " #~ "%s-filer, bør du installere et modul til dette formål.\n" #~ "\n" #~ "Åbne %s og søge efter moduler nu?" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Do you want %s to check for missing decoders in future?" #~ msgstr "Skal %s kontrollere for manglende dekodere i fremtiden?" # This is a context-menu option that is placed in the "Playback" submenu #~ msgid "Play tracks at once on double click" #~ msgstr "Afspil nummer med det samme efter dobbelt klik" # The first %s will be replaced by the program name, the second by the name of the licence holder. #~ msgid "%s licenced to %s" #~ msgstr "%s licens til %s" # %s will be replaced by the name of the licence holder #~ msgid "Licenced to %s" #~ msgstr "Licenseret til %s" #~ msgid "" #~ "To disable Ctrl+Alt+Del you have to install a special keyboard driver " #~ "once.\n" #~ "\n" #~ "Do you want to install the driver and reboot?" #~ msgstr "" #~ "For at deaktivere Ctrl + Alt + Del er du nødt til at installere et " #~ "særligt tastatur driver én gang.\n" #~ "\n" #~ "Ønsker du at installere driveren og genstarte?" # %s will be replaced by the shortcut #~ msgid "Cannot register system-wide shortcut \"%s\"." #~ msgstr "Cannot register system-wide shortcut \"%s\"." #~ msgid "Silverjuke language-files" #~ msgstr "Silverjuke sprog filer" # This is the help topic for the "First steps" that are opened if Silverjuke is started the first time. The topic is also reachable through the "About" dialog. You can use _simple_ HTML here: <h1>, <p>, <b>, <i> and <a>. Please refer to one of the example files in the developer network. #~ msgid "__HELP__" #~ msgstr "__HELP__" #~ msgid "Apply" #~ msgstr "Brug" #~ msgid "Check for new Silverjuke version..." #~ msgstr "Undersøg om der er en ny version af Silvejuke" # The first %s will be replaces by the new version, the others %s will be replaced by the URL for downloading it. #~ msgid "" #~ "A new version of Silverjuke (%s) is available for download on %s.\n" #~ "\n" #~ "Do you want to open %s now?" #~ msgstr "" #~ "En ny version af Silverjuke (%s) er tilgængelig: %s.\n" #~ "\n" #~ "Vil du åbne %s?" #~ msgid "Other program" #~ msgstr "Andre programmer" #~ msgid "Set markers" #~ msgstr "Sær markør" # %i will be replaced by the number of the marker, %s will be replaced by the marker position or by a control to select the marker position #~ msgid "Show marker %i at %s." #~ msgstr "Sæt markør %i ved %s." #~ msgid "Minutes" #~ msgstr "Minutter" #~ msgid "Warn if marker is crossed" #~ msgstr "Advar hvis markør passeret" #~ msgid "Set markers..." #~ msgstr "Sæt markør..." #~ msgid "Burn CD" #~ msgstr "Brænd CD" #~ msgid "Tracks to burn:" #~ msgstr "Brænd numre:" #~ msgid "Recorder:" #~ msgstr "Brændererr:" #~ msgid "Please select an installed and available program" #~ msgstr "Vælg venligst et installeret og tilgængeligt program" # %s will be replaced by the name of a program #~ msgid "Please locate \"%s\"" #~ msgstr "Find \"%s\"" # %s will be replaced by the name of a program #~ msgid "Arguments for \"%s\"" #~ msgstr "Argumenter for \"%s\"" #~ msgid "Total time" #~ msgstr "Samlet tid" #~ msgid "Cannot calculate the total time" #~ msgstr "Kan ikke beregne samlet tid" #~ msgid "" #~ "The size of the selected tracks is larger than the assumed capacity of " #~ "the disk to burn.\n" #~ "\n" #~ "Continue anyway?" #~ msgstr "" #~ "Størrelsen af de valgte numre er større end den antaget kapacitet af " #~ "disken.\n" #~ "\n" #~ "Fortsæt alligevel?" #~ msgid "Minimize window" #~ msgstr "Minimer vindue" #~ msgid "Maximize window" #~ msgstr "Maksimer vindue" #~ msgid "Center window" #~ msgstr "Centrer vindue" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Show %s" #~ msgstr "Vis %s" #~ msgid "System tray" #~ msgstr "System tray" #~ msgid "Show current track" #~ msgstr "Vis nuværende nummer" #~ msgid "Menus" #~ msgstr "Menuer" #~ msgid "Show shortcuts" #~ msgstr "Vis genveje" #~ msgid "Show icons" #~ msgstr "Vis ikoner" #~ msgid "Licence key" #~ msgstr "Licens nøgle" #~ msgid "Select the language for the user-interface from the following list:" #~ msgstr "Vælg sprog fra listen:" #~ msgid "Unknown language" #~ msgstr "Ukendt sprog" #~ msgid "More languages on the web..." #~ msgstr "Flere sprog på nettet..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Note: Changing the language requires to restart %s." #~ msgstr "Husk: Ændring af sprog kræver genstart af %s." # %s will be replaced by the program name, usually"Silverjuke" #~ msgid "This is an unlicenced copy of %s!" #~ msgstr "Dette er en prøveversion af %s!" #~ msgid "" #~ "Please enter your name or your company's name and the licence key\n" #~ "you received when purchasing or updating your %s-licence:" #~ msgstr "" #~ "Indtast dit navn eller dit virksomheds navn og licens nøglen\n" #~ "du har modtaget, da du købte eller opdateret din %s-licens:" #~ msgid "Your name/company:" #~ msgstr "Dit navn:" # The first %s will be replaced by the program name, usually "Silverjuke". The second %i will be replaced by the number of evaluation days. The last %s, again, will be replaced by the program name. #~ msgid "" #~ "If you haven't bought a %s-licence, you may test this program %i days for " #~ "free.\n" #~ "After this period, you have to buy a licence for %s if you want to " #~ "continue using\n" #~ "this program." #~ msgstr "" #~ "Hvis du ikke har købt en %s-licens, kan du teste dette program %i dage " #~ "gratis.\n" #~ "Efter denne periode, skal du købe en licens for %s, hvis du ønsker at " #~ "fortsætte med at bruge \n" #~ "dette program." # The first %s will be replaced by the program name, usually "Silverjuke". The second %s will be replaced by the name of the website, eg. www.silverjuke.net #~ msgid "" #~ "Further information about purchasing %s licences\n" #~ "are available at %s." #~ msgstr "" #~ "Yderligere oplysninger om køb af %s licenser \n" #~ "findes på %s." # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s..." #~ msgstr "Åben %s..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Thank you for buying a %s-licence!" #~ msgstr "Tak fordi du købte en %s licens!" #~ msgid "This copy is licenced to:" #~ msgstr "Dette program er licenseret til:" #~ msgid "" #~ "If this is not your name or the name of your company, you are not using a " #~ "legal licence!" #~ msgstr "" #~ "Hvis dette ikke er dit navn eller navnet på dit firma, bruger du en " #~ "ugyldig licens!" #~ msgid "Load external modules" #~ msgstr "Load eksterne moduler" #~ msgid "\"Magnetic\" window borders" #~ msgstr "\"Magnetisk\" vinduesgrænse" #~ msgid "Window" #~ msgstr "Vindue" #~ msgid "Use shaped windows" #~ msgstr "Brug tilpassede vinduer" #~ msgid "Automatic version check" #~ msgstr "Automatisk versions kontrol" # %i will be replaced by the number of days #~ msgid "Every %i days" #~ msgstr "Hver %i dage" #~ msgid "FX" #~ msgstr "FX" #~ msgid "" #~ "Please select the input and output devices to use. If you encounter any " #~ "problems,\n" #~ "please try a different buffer size and the \"Use hardware\" option." #~ msgstr "" #~ "Vælg venligst hvilke input og output enheder der skal bruges. Hvis du " #~ "støder på problemer, \n" #~ "prøv en anden buffer størrelse og \"Brug hardware\" valgmulighed." #~ msgid "Audio-output" #~ msgstr "Lydudgang" #~ msgid "Prelisten audio-output" #~ msgstr "Lydudgang til prelisten" #~ msgid "Buffer" #~ msgstr "Buffer" #~ msgid "Use hardware" #~ msgstr "Brug hardware" #~ msgid "" #~ "With these options, you can add jingles (small pieces of sound) between " #~ "tracks.\n" #~ "Add the jingles as normal music-files and decide how often they should be " #~ "played." #~ msgstr "" #~ "Med disse indstillinger, kan du tilføje jingles (små stykker af lyd) " #~ "mellem numrene.\n" #~ "Tilsæt jingler som normale musik filer og beslut, hvor ofte de skal " #~ "spilles." #~ msgid "Use jingles" #~ msgstr "Brug jingles" #~ msgid "Jingles:" #~ msgstr "Jingles:" # %s will be replaced by a control to select the number of tracks #~ msgid "Play a jingle about every %s tracks." #~ msgstr "Spil en jingle ved hvert %s nummer." #~ msgid "Select jingle(s)" #~ msgstr "Vælg jingle(r)" #~ msgid "Use separate FX settings" #~ msgstr "Brug separate FX indstillinger" #~ msgid "" #~ "The \"system tray\" is an area normally placed at the edge of the " #~ "screen.\n" #~ "With the following options, you can add a little symbol with frequently\n" #~ "used functions to this area." #~ msgstr "" #~ "\"system tray\" er et område normalt placeret i kanten af skærmen.\n" #~ "Med følgende indstillinger, kan du tilføje et lille symbol med ofte \n" #~ "anvendte funktioner til dette område." #~ msgid "Never use system tray" #~ msgstr "Brug aldrig system tray" #~ msgid "Use system tray for the minimized window" #~ msgstr "Brug system tray til minimeret vinduer" #~ msgid "Always use system tray" #~ msgstr "Brug altid system tray" #~ msgid "Show current track tooltip for %i seconds" #~ msgstr "Vis nuværende nummer info i %i sekunder" #~ msgid "Only if inactive" #~ msgstr "Kun hvis inaktiv" #~ msgid "Use this module for the following file extensions:" #~ msgstr "Brug dette modul til følgende fil typer:" #~ msgid "Further options..." #~ msgstr "Yderligere optioner" # %s will be replaced by a list of extensions, eg. "MP3, MP2, MP1" #~ msgid "" #~ "If you disable this module or change the file types, make sure,\n" #~ "you don't need \"%s\" or they are supported by another module.\n" #~ "\n" #~ "Note: Remember that not every module can play every file type." #~ msgstr "" #~ "Hvis du deaktiverer dette modul eller ændre filtyper, skal du sørge " #~ "for, \n" #~ "du behøver ikke \"%s\", eller de understøttes af et andet modul. \n" #~ "\n" #~ "Bemærk: Husk, at ikke alle moduler kan spille alle filtyper." # %s will be replaced by the string an abbreviation should be entered for, eg. "Composer" or "Original artist" #~ msgid "Abbreviation for \"%s\"" #~ msgstr "Forkortelse for \"%s\"" #~ msgid "Close %s" #~ msgstr "Luk %s" # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s" #~ msgstr "Åben %s" #~ msgid "Selection: %s" #~ msgstr "Valg: %s" #~ msgid "Select another visualization" #~ msgstr "Vælg en anden visualisering" #~ msgid "Playback mode:" #~ msgstr "Afspilning:" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Interpolation:" #~ msgstr "Interpolation:" #~ msgid "Linear" #~ msgstr "Lineær" #~ msgid "Sensitive" #~ msgstr "Følsomme" #~ msgid "Query settings before start" #~ msgstr "Spørg om indstillinger for start" #~ msgid "DAAP-/iTunes-client" #~ msgstr "DAAP-/iTunes-klient" #~ msgid "Add a DAAP-/iTunes-server" #~ msgstr "Tilføj en DAAP-/iTunes-server" #~ msgid "" #~ "With Silverjuke's HTTP server you can access the program and your music " #~ "library from any\n" #~ "browser or other Silverjuke instances in your network." #~ msgstr "" #~ "Med Silverjuke's HTTP server, kan du få adgang til programmet og dit " #~ "musikbibliotek fra enhver\n" #~ "browser eller andre Silverjuke forekomster i dit netværk." #~ msgid "Enable HTTP server on port %s" #~ msgstr "Aktiver HTTP server på port %s" #~ msgid "Share my music library over HTTP" #~ msgstr "Del mit musik biblotek over HTTP" #~ msgid "Enable web interface access over HTTP" #~ msgstr "Aktiver web adgang over HTTP" #~ msgid "Playlist" #~ msgstr "Spilleliste" #~ msgid "Empty" #~ msgstr "Tom" #~ msgid "Update" #~ msgstr "Opdater" #~ msgid "Sharing/Web interface" #~ msgstr "Del/Web interface" #~ msgid "Audio-decoder" #~ msgstr "Lyd dekoder" #~ msgid "Online database" #~ msgstr "Online database" # The first %i will be replaced by the current day number in the evaluation period, the second %i will be replaced by the total number of days of the evaluation period (currently 14). #~ msgid "You are on day %i of the %i-days testing period." #~ msgstr "Du er på dag %i af %i-dages prøve perioden." # This string is shown as a link the the "About" dialog. #~ msgid "Enter licence key now..." #~ msgstr "Indtast licens nøgle nu..." #~ msgid "Setup" #~ msgstr "Indstillinger" #~ msgid "Show the following effects:" #~ msgstr "Vis følgende effekter:" #~ msgid "" #~ "To install further effects, just copy the\n" #~ "VST-plugins to one of the search paths." #~ msgstr "" #~ "Hvis du vil installere yderligere effekter, bare kopiere \n" #~ "VST-plugins til en af de søgestier." #~ msgid "FX settings for %s :" #~ msgstr "FX indstillinger for %s :" #~ msgid "Normal playback" #~ msgstr "Normal afspilning" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Enable %s" #~ msgstr "Aktiver %s" # %i will be replaced by the number of characters #~ msgid "%s parameters" #~ msgstr "%s parametere" #~ msgid "Load %s" #~ msgstr "Start %s" #~ msgid "Save %s" #~ msgstr "Gem %s" #~ msgid "%s priority" #~ msgstr "%s prioritet" #~ msgid "Load all" #~ msgstr "Start alle" #~ msgid "Save all" #~ msgstr "Gem alle" #~ msgid "Stop visualization/karaoke prompt" #~ msgstr "Stopp visulasjon/Karaoke" #~ msgid "Start visualization/karaoke prompt" #~ msgstr "Start visulasjon/Karaoke " #~ msgid "Drag'n'drop" #~ msgstr "Dra og slipp" #~ msgid "Start visualization after %i minutes of inactivity" #~ msgstr "Start visulasjon etter %i minutter uten aktivitet." #~ msgid "Karaoke, Vis. etc" #~ msgstr "Karaoke, Vis. etc" #~ msgid "Verify password" #~ msgstr "Bekreft passord" #~ msgid "Password not set." #~ msgstr "Passord ikke valgt" #~ msgid "Visualization/Karaoke Prompt" #~ msgstr "Visulasjon/Karaoke Tegn" #~ msgid "Please close the \"%s\" configuration window before continuing." #~ msgstr "Vennligst steng \"%s\"konfigurasjonsvindu før du fortsetter." �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/de.po��������������������������������������������������������������������������0000664�0000000�0000000�00000214261�12660066715�0015353�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Dr. Tobias Quathamer <toddy@debian.org>, 2016. msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2016-02-14 12:54+0100\n" "Last-Translator: Dr. Tobias Quathamer <toddy@debian.org>\n" "Language-Team: German <debian-l10n-german@lists.debian.org>\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" "X-Generator: Lokalize 2.0\n" msgid "Sleep mode activated." msgstr "Schlafmodus aktiviert." msgid "Sleep mode deactivated." msgstr "Schlafmodus deaktiviert." msgid "Play time exceeded" msgstr "Maximale Spielzeit überschritten" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "Default" msgstr "Standard" msgid "Device" msgstr "Gerät" msgid "Show covers" msgstr "Cover anzeigen" msgid "Duration" msgstr "Dauer" msgid "Artist" msgstr "Künstler" msgid "Original artist" msgstr "Originärer Künstler" msgid "Composer" msgstr "Komponist" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Titelnummer" msgid "Automatic track number" msgstr "Automatische Titelnummer" msgid "Disk number" msgstr "Disknummer" msgid "Genre" msgstr "Musikrichtung" msgid "Year" msgstr "Jahr" msgid "Rating" msgstr "Wertung" msgid "Comment" msgstr "Kommentar" msgid "Show double tracks" msgstr "Doppelte Titel anzeigen" msgid "Show different artist names" msgstr "Unterschiedliche Künstlernamen anzeigen" msgid "Show different album names" msgstr "Unterschliedliche Albennamen anzeigen" msgid "Show cover titles" msgstr "Covertitel anzeigen" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s Titel" msgid "Drag folders with music here." msgstr "Ordner mit Musikdateien hierher ziehen." msgid "Reset to default values" msgstr "Standardwerte verwenden" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "Bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "AutoPlay" msgid "Shuffle" msgstr "Zufällige Wiedergabe" msgid "Recreating music library" msgstr "Neuerstellung des Musikarchivs" msgid "Updating music library" msgstr "Aktualisiere Musikarchiv" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Wenn Sie den Aktualisierungsvorgang abbrechen ist Ihr Musikarchiv " "möglicherweise nicht auf dem aktuellen Stand.\n" "\n" "Aktualisierungsvorgang abbrechen?" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" "Momentan spielt %s einen Titel. Möchten Sie den Titel stoppen und %s beenden?" #, c-format msgid "Exit %s" msgstr "%s beenden" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Kann \"%s\" nicht öffnen." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "Das Skript außerdem in \"%s\" installieren und immer starten" # %s will be replaced by the name of the track #, c-format msgid "Execute the script \"%s\"?" msgstr "Möchten Sie das Skript \"%s\" ausführen?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" "ACHTUNG: Skripte können Silverjuke verlangsamen oder Daten beschädigen. " "Verwenden Sie nur Skripte aus Quellen, denen Sie vertrauen." msgid "Search" msgstr "Suchen" msgid "On" msgstr "An" msgid "Off" msgstr "Aus" msgid "Repeat playlist" msgstr "Wiedergabeliste wiederholen" msgid "Repeat one" msgstr "Einen Titel wiederholen" msgid "Repeat all" msgstr "Alles wiederholen" msgid "Select a track, then start playback." msgstr "Wählen Sie zunächst einen Titel und starten Sie dann die Wiedergabe." msgid "Stop after this track" msgstr "Stop nach diesem Titel" msgid "Stop after each track" msgstr "Stop nach jedem Titel" msgid "Double click play tracks at once" msgstr "Doppelklick spielt Titel sofort ab" msgid "Start playback on first enqueue" msgstr "Wiedergabe beim ersten Einstellen in Warteliste starten" # %s will be replaced by the name of a music selection msgid "Remove played tracks from queue" msgstr "Gespielte Titel aus Warteschlange entfernen" msgid "More from current album" msgstr "Mehr vom aktuellen Album" msgid "More from current artist" msgstr "Mehr vom aktuellen Künstler" msgid "No more tracks." msgstr "Keine weiteren Titel." #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "" "%i Titel aus der Warteschlange entfernen und die Wiedergabe stoppen?" msgstr[1] "" "%i Titel aus der Warteschlange entfernen und die Wiedergabe stoppen?" msgid "Clear playlist" msgstr "Wiedergabeliste leeren" msgid "Track played, click to reset" msgstr "Titel wurde gespielt" msgid "Boredom avoided: Track moved down" msgstr "Titel wurde verschoben und Langeweile vermieden" msgid "Remove this track" msgstr "Titel aus Warteschlange entfernen" msgid "Toggle time mode" msgstr "Zeitanzeige umschalten" # %s will be replaced by a letter or by a number #, c-format msgid "Go to \"%s\"" msgstr "Gehe zu \"%s\"" msgid "End search" msgstr "Suche beenden" msgid "click right for options" msgstr "klicken Sie rechts für Optionen" msgid "Volume" msgstr "Lautstärke" msgid "Double-click to enlarge the cover" msgstr "Doppelklick: Cover vergrößern" #, c-format msgid "Close this window and exit %s" msgstr "Fenster schließen und %s beenden" msgid "Open main menu" msgstr "Hauptmenü öffnen" msgid "Toggle shuffle mode" msgstr "Zufällige Wiedergabe" msgid "Repeat all/repeat current" msgstr "Alle Titel/einen Titel wiederholen" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Suche in \"%s\"" msgid "Help" msgstr "Hilfe" msgid "Add folders and files" msgstr "Ordner und Dateien hinzufügen" msgid "Extensions" msgstr "Erweiterungen" msgid "Show remaining time" msgstr "Verbleibende Zeit anzeigen" msgid "Show elapsed time" msgstr "Abgelaufene Zeit anzeigen" msgid "Show total time" msgstr "Gesamtzeit anzeigen" msgid "Show track number" msgstr "Titelnummer anzeigen" msgid "Show artist name" msgstr "Künstlernamen anzeigen" msgid "Show AutoPlay" msgstr "AutoPlay anzeigen" msgid "Prefer album- to track-cover" msgstr "Alben- den Titelcovern vorziehen" msgid "Display" msgstr "Display" msgid "Columns" msgstr "Spalten" msgid "Same zoom in all views" msgstr "Gleiche Vergrößerung in allen Ansichten" msgid "Fonts and covers" msgstr "Schrift und Cover" msgid "Zoom" msgstr "Vergrößerung" msgid "Skins" msgstr "Skins" msgid "Start kiosk mode..." msgstr "Kiosk-Modus starten ..." # %s will be replaced by the name of an artist #, c-format msgid "%s on the web" msgstr "%s im Internet" msgid "All files" msgstr "Alle Dateien" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "Über %s" msgid "File" msgstr "Datei" # Menu Title (eg. if "Settings/Basic settings/Further options/Window: Use shaped windows" is disabled or on Mac OS X msgid "Edit" msgstr "Bearbeiten" # "View" menu title with - optionally - different translations for Microsoft Windows and Mac OS X msgid "View" msgstr "Ansicht" msgid "Playback" msgstr "Wiedergabe" msgid "Video screen" msgstr "Videoschirm" msgid "Kiosk mode" msgstr "Kiosk-Modus" msgid "None" msgstr "Keine" msgid "Further options" msgstr "Weitere Optionen" msgid "Queue" msgstr "Warteschlange" msgid "Automatic control" msgstr "Automatische Steuerung" msgid "Current view" msgstr "Aktuelle Ansicht" #, c-format msgid "Next track from \"%s\"" msgstr "Nächster Titel aus \"%s\"" msgid "Next track" msgstr "Nächster Titel" msgid "Search for genre" msgstr "Suche nach Musikrichtung" msgid "Search for music selection" msgstr "Suche nach Musikauswahl" msgid "Edit tracks/Get info" msgstr "Titel bearbeiten/Info" msgid "Show file" msgstr "Datei anzeigen" msgid "Cover editor" msgstr "Cover-Editor" msgid "Mix" msgstr "Mix" msgid "Left channel" msgstr "Linker Kanal" msgid "Right channel" msgstr "Rechter Kanal" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Vorhören" msgid "No" msgstr "Nein" msgid "Yes" msgstr "Ja" msgid "Only initialize system volume" msgstr "" msgid "Output" msgstr "" #, fuzzy #| msgid "Desired volume:" msgid "Use system volume" msgstr "Gewünschte Lautstärke:" msgid "Several artists" msgstr "Verschiedene Künstler" msgid "Unknown title" msgstr "Unbekannter Titel" msgid "Save playlist" msgstr "Wiedergabeliste speichern" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Kann \"%s\" nicht schreiben." msgid "Open playlist" msgstr "Wiedergabeliste öffnen" msgid "Title" msgstr "Titel" msgid "Track count" msgstr "Titelanzahl" msgid "Disk count" msgstr "Diskanzahl" msgid "Group" msgstr "Gruppierung" # This is the abbreviation for "beats per minute" (the number of "quarter notes" per minute which defines the tempo of a track). The string is used in the dailog "Edit tracks/Get info...". If in doubt, just enter "BPM" here. msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Kanäle" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "Dateiname" msgid "File size" msgstr "Dateigröße" msgid "Date added" msgstr "Hinzugefügt" msgid "Date modified" msgstr "Geändert" msgid "Last played" msgstr "Zuletzt gespielt" msgid "Play count" msgstr "Anzahl Abspielungen" msgid "SQL expression" msgstr "SQL-Ausdruck" msgid "Limit result to" msgstr "Ergebnis limitieren auf" msgid "Title/artist/album" msgstr "Titel/Künstler/Album" msgid "File type" msgstr "Dateityp" msgid "Queue position" msgstr "Warteschlangenpos." msgid "Include tracks" msgstr "Titel einschließen" msgid "Exclude tracks" msgstr "Titel ausschließen" msgid "Random" msgstr "Zufall" # %s will be replaced by a shortcut, eg. "Ins" or "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "Drücken Sie \"%s\" im Hauptfenster" msgid "Insert" msgstr "Einfügen" msgid "Del" msgstr "Entf" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Bitte geben Sie das Datum als \"tt.mm.jjjj\" ein; Sie können \"hh:mm\" für " "die Zeit hinzufügen." msgid "Please enter the text." msgstr "Bitte geben Sie den Text ein." msgid "Please enter a value." msgstr "Bitte geben Sie einen Wert ein." msgid "Please enter a valid value." msgstr "Bitte geben Sie einen gültigen Wert ein." msgid "(second field)" msgstr "(zweites Feld)" msgid "No valid criteria defined." msgstr "Keine gültigen Kriterien definiert." msgid "The search cannot be started; please check the following fields:" msgstr "" "Die Suche kann nicht ausgeführt werden; bitte überprüfen Sie die folgenden " "Felder:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" "Hinweis: \"gleich\" und \"ungleich\" unterscheidet die Groß- und " "Kleinschreibung." # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Möchten Sie die Skripte aus der Skin \"%s\" ausführen?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Abbrechen" msgid "Page left" msgstr "Seite links" msgid "Page right" msgstr "Seite rechts" msgid "Page up" msgstr "Seite hoch" msgid "Page down" msgstr "Seite runter" msgid "Menu" msgstr "Menü" msgid "Cursor left" msgstr "Cursor links" msgid "Cursor right" msgstr "Cursor rechts" msgid "Cursor up" msgstr "Cursor hoch" msgid "Cursor down" msgstr "Cursor runter" msgid "Line left" msgstr "Zeile links" msgid "Line right" msgstr "Zeile rechts" msgid "Line up" msgstr "Zeile hoch" msgid "Line down" msgstr "Zeile runter" msgid "Home" msgstr "Pos 1" msgid "End" msgstr "Ende" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Löschen" msgid "Album view" msgstr "Albenansicht" msgid "Cover view" msgstr "Coveransicht" msgid "List view" msgstr "Listenansicht" msgid "Toggle view" msgstr "Ansicht umschalten" msgid "Open playlist..." msgstr "Wiedergabeliste öffnen ..." msgid "Unqueue marked tracks" msgstr "Markierte Titel entfernen" msgid "Unqueue all but marked tracks" msgstr "Alles außer Markierung entfernen" msgid "Save playlist..." msgstr "Wiedergabeliste speichern ..." msgid "Paste" msgstr "Einfügen" msgid "Music selection..." msgstr "Musikauswahl ..." msgid "Settings" msgstr "Einstellungen" msgid "Update music library" msgstr "Musikarchiv aktualisieren" msgid "Recreate music library" msgstr "Musikarchiv neu erstellen" msgid "Enqueue tracks" msgstr "Titel in Warteschlange stellen" msgid "Play tracks next" msgstr "Titel als nächstes spielen" msgid "Play tracks now" msgstr "Titel jetzt spielen" msgid "Volume up" msgstr "Lauter" msgid "Volume down" msgstr "Leiser" msgid "Unqueue tracks" msgstr "Titel aus Warteschlange entfernen" msgid "Edit tracks/Get info..." msgstr "Titel bearbeiten/Info ..." msgid "Play" msgstr "Wiedergabe" msgid "Pause" msgstr "Pause" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Vorheriger Titel" msgid "Seek backward" msgstr "Zurückspulen" msgid "Seek forward" msgstr "Vorspulen" msgid "Fade to next" msgstr "Zum nächsten Titel überblenden" msgid "Mute" msgstr "Ton aus" msgid "Reload skin" msgstr "Skin neu laden" msgid "Toggle video screen" msgstr "Videoschirm umschalten" msgid "Smooth" msgstr "Kanten glätten" msgid "Select all" msgstr "Alles auswählen" msgid "Zoom in" msgstr "Vergrößern" msgid "Zoom out" msgstr "Verkleinern" msgid "Normal zoom" msgstr "Normale Vergrößerung" msgid "Always on top" msgstr "Immer im Vordergrund" msgid "Go to current track" msgstr "Gehe zum aktuellen Titel" msgid "Go to marked track" msgstr "Gehe zum markierten Titel" msgid "Go to random album" msgstr "Gehe irgendwo hin" msgid "Go to previous letter" msgstr "Gehe zum vorherigen Buchstaben" msgid "Go to next letter" msgstr "Gehe zum nächsten Buchstaben" msgid "Add credit" msgstr "Kredit hinzufügen" msgid "Console..." msgstr "Konsole ..." msgid "Replace..." msgstr "Ersetzen ..." msgid "Split field..." msgstr "Feld aufteilen ..." msgid "Rename files..." msgstr "Dateien umbenennen ..." msgid "Query online database..." msgstr "Online-Datenbank abfragen ..." msgid "New music selection..." msgstr "Neue Musikauswahl ..." msgid "Save" msgstr "Speichern" msgid "Save as..." msgstr "Speichern unter ..." msgid "Rename..." msgstr "Umbenennen ..." msgid "Revert to saved" msgstr "Änderungen verwerfen" msgid "Open file..." msgstr "Datei öffnen ..." msgid "Save cover..." msgstr "Cover speichern ..." msgid "Rotate left" msgstr "Linksrum drehen" msgid "Rotate right" msgstr "Rechtsrum drehen" msgid "Flip horizontally" msgstr "Horizontal spiegeln" msgid "Flip vertically" msgstr "Vertikal spiegeln" msgid "Grayscale" msgstr "Graustufen" msgid "Negative" msgstr "Negativ" msgid "Fit to screen" msgstr "An Bildschirmgröße anpassen" msgid "Decrease brightness" msgstr "Helligkeit verringern" msgid "Increase brightness" msgstr "Helligkeit erhöhen" msgid "Decrease contrast" msgstr "Kontrast verringern" msgid "Increase contrast" msgstr "Kontrast erhöhen" msgid "Normal brightness/contrast" msgstr "Helligkeit/Kontrast normal" msgid "Crop" msgstr "Ausschnitt" msgid "Please press the shortcut to add." msgstr "Bitte drücken Sie das hinzuzufügende Tastaturkürzel." msgid "System-wide:" msgstr "Systemweit:" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Tastaturkürzel \"%s\" entfernen" msgid "Add system-wide shortcut..." msgstr "Tastaturkürzel systemweit hinzufügen..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Tastaturkürzel zu \"%s\" hinzufügen..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "Das Tastaturkürzel \"%s\" ist momentan dem Befehl \"%s\" zugeordnet.\n" "\n" "Möchten Sie diese Zuordnung aufheben und das Tastaturkürzel dem Befehl \"%s" "\" zuordnen?" msgid "Mouse" msgstr "Maus" msgid "Drag window content" msgstr "Fensterinhalt verschieben" msgid "Left mouse button" msgstr "Linke Maustaste" msgid "Drag selected tracks" msgstr "Auswahl verschieben" msgid "Second click with the left mouse button" msgstr "Zweiter Klick mit der linken Maustaste" msgid "Show icons beside mouse cursor" msgstr "Symbole neben Mauszeiger anzeigen" msgid "Middle mouse button" msgstr "Mittlere Maustaste" msgid "Edit tracks" msgstr "Titel bearbeiten" msgid "Tooltips" msgstr "Tooltips" msgid "Mouse wheel" msgstr "Mausrad" msgid "Scroll horizontally in album view" msgstr "In Albenansicht horizontal scrollen" msgid "Modifier key toggles axis" msgstr "Modifier-Taste wechselt die Achse" msgid "Right mouse button toggles axis" msgstr "Rechte Maustaste wechselt die Achse" msgid "Modify volume, scrollbars, letters etc." msgstr "Lautstärke, Buchstaben etc. ändern" msgid "Use multimedia keyboard keys" msgstr "Multimedia-Tastatur verwenden" msgid "Ask on close if playing" msgstr "Beim Beenden nachfragen, falls Wiedergabe läuft" msgid "Ask before enqueuing multiple tracks" msgstr "Beim Einstellen mehrerer Titel in die Warteschlange nachfragen" msgid "Ask before clearing the playlist" msgstr "Beim Leeren der Wiedergabeliste nachfragen" msgid "Ask before changing the rating" msgstr "Vor dem Ändern der Wertung nachfragen" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Rückschr." msgid "Space" msgstr "Leertaste" msgid "Up" msgstr "Hoch" msgid "Left" msgstr "Links" msgid "Right" msgstr "Rechts" msgid "Down" msgstr "Runter" msgid "Print" msgstr "Drucken" msgid "Ins" msgstr "Einfg" msgid "Music selection" msgstr "Musikauswahl" msgid "Numpad" msgstr "Ziffernblock" msgid "Select date and time" msgstr "Datum und Uhrzeit auswählen" msgid "Time" msgstr "Zeit" msgid "contains" msgstr "enthält" msgid "does not contain" msgstr "enthält nicht" msgid "starts with" msgstr "beginnt mit" msgid "does not start with" msgstr "beginnt nicht mit" msgid "starts simelar to" msgstr "beginnt ähnlich wie" msgid "ends with" msgstr "endet mit" msgid "does not end with" msgstr "endet nicht mit" msgid "on" msgstr "am" msgid "is equal to" msgstr "ist gleich" msgid "not on" msgstr "nicht am" msgid "is unequal to" msgstr "ist ungleich" msgid "is simelar to" msgstr "ist ähnlich wie" msgid "is after" msgstr "nach dem" msgid "is greater than" msgstr "ist größer als" msgid "is on or after" msgstr "nach dem oder am" msgid "is greater or equal" msgstr "ist größer gleich" msgid "is before" msgstr "vor dem" msgid "is less than" msgstr "ist kleiner als" msgid "is on or before" msgstr "vor dem oder am" msgid "is less or equal" msgstr "ist kleiner gleich" msgid "is in the last" msgstr "in den letzten" msgid "is not in the last" msgstr "nicht in den letzten" msgid "is in the period" msgstr "im Zeitraum von" msgid "is in range" msgstr "ist im Bereich" msgid "is not in the period" msgstr "nicht im Zeitraum von" msgid "is not in range" msgstr "ist nicht im Bereich" msgid "is set" msgstr "ist gesetzt" msgid "is unset" msgstr "ist ungesetzt" msgid "tracks" msgstr "Titel" msgid "albums" msgstr "Alben" msgid "minutes" msgstr "Minuten" msgid "hours" msgstr "Stunden" msgid "seconds" msgstr "Sekunden" msgid "days" msgstr "Tagen" msgid "No rating" msgstr "Keine Wertung" msgid "random" msgstr "Zufall" msgid "highest rating" msgstr "höchster Wertung" msgid "lowest rating" msgstr "niedrigster Wertung" msgid "most often played" msgstr "häufig gespielt" msgid "least often played" msgstr "selten gespielt" msgid "most recently played" msgstr "zuletzt gespielt" msgid "least recently played" msgstr "vor längerem gespielt" msgid "most recently added" msgstr "zuletzt hinzugefügt" msgid "least recently added" msgstr "vor längerem hinzugefügt" msgid "most recently modified" msgstr "zuletzt geändert" msgid "least recently modified" msgstr "vor längerem geändert" msgid "most recently released" msgstr "zuletzt erschienen" msgid "least recently released" msgstr "vor längerem erschienen" msgid "low queue position" msgstr "niedriger Warteschlangenpos." msgid "high queue position" msgstr "hoher Warteschlangenpos." msgid "Today" msgstr "Heute" msgid "Yesterday" msgstr "Gestern" msgid "Select..." msgstr "Auswahl..." msgid "Show tracks..." msgstr "Titel anzeigen..." msgid "Add tracks from playlist" msgstr "Titel aus Wiedergabeliste hinzufügen" msgid "Current position" msgstr "Aktuelle Position" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "nach" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "bis" msgid "Remove criterion" msgstr "Kriterium entfernen" msgid "Add criterion" msgstr "Kriterium hinzufügen" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "In \"%s\" eingeschlossene Titel" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Von \"%s\" ausgeschlossene Titel" msgid "Saved selections" msgstr "Gespeicherte Auswahlen" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Suche nach %s mit %s der folgenden Kriterien:" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "Titeln|Alben" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "allen|einigen|keinen" msgid "Close" msgstr "Schließen" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Möchen Sie Ihre Änderungen an der Musikauswahl \"%s\" speichern?" msgid "Music selection modified" msgstr "Musikauswahl geändert" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "Musikauswahl \"%s\" bearbeiten" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Möchen Sie die Musikauswahl \"%s\" wirklich löschen?" msgid "Delete music selection" msgstr "Musikauswahl löschen" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Möchen Sie die %i ausgewählten Musikauswahlen wirklich löschen?" msgid "Delete music selections" msgstr "Musikauswahlen löschen" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "Keine Treffer für \"%s\" gefunden." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "" "Möchten Sie die ausgewählten Titel von der Musikauswahl \"%s\" ausschließen?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "" "Möchten Sie die ausgewählten Titel zu der Musikauswahl \"%s\" hinzufügen?" # This is the name of a predefined music selection msgid "70's music" msgstr "Musik der 70er" # This is the name of a predefined music selection msgid "Worst rated" msgstr "Schlechte Wertungen" # This is the name of a predefined music selection msgid "Top rated" msgstr "Höchste Wertungen" # This is the name of a predefined music selection msgid "Top 20" msgstr "Top 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "Zuletzt gespielt" # This is the name of a predefined music selection msgid "Played today" msgstr "Heute gespielt" # This is the name of a predefined music selection msgid "Random selection" msgstr "Zufällige Auswahl" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Titel in Warteschlange" msgid "Untitled Music selection" msgstr "Unbenannte Musikauswahl" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Keine Treffer in \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "1 Treffer in \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s Treffer in \"%s\"" msgid "No matches" msgstr "Keine Treffer" msgid "1 match" msgstr "1 Treffer" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s Treffer" # %s will be replaced by the name of a music selection msgid "Search single words" msgstr "Nach einzelnen Wörtern suchen" msgid "Lookup genre on simple search" msgstr "Musikrichtung bei einfacher Suche berücksichtigen" msgid "Search while typing" msgstr "Während der Eingabe suchen" msgid "Save modified music selections" msgstr "Geänderte Musikauswahlen speichern" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "Nachfragen" msgid "Max. history size" msgstr "Einträge in der Historie" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Suche nach \"%s\" in \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Suche nach \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Bitte drücken und halten Sie die linke Maustaste; wählen Sie dann den " "gewünschten Ausschnitt durch verschieben der Maus." # Menu entry name for auto-generated covers, please leave the brackets msgid "<Abstract>" msgstr "<Abstrakt>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Standard)" msgid "Paste image from clipboard" msgstr "Bild aus Zwischenablage einfügen" msgid "Browse" msgstr "Durchsuchen" msgid "Select cover" msgstr "Cover auswählen" msgid "Search covers on the web" msgstr "Cover im Internet suchen" msgid "Don't rotate" msgstr "Nicht drehen" msgid "Rotate/flip" msgstr "Drehen/Spiegeln" msgid "Use default images..." msgstr "Standardbilder verwenden..." msgid "Effects/options" msgstr "Effekte/Optionen" msgid "Select image" msgstr "Bild auswählen" msgid "Save cover" msgstr "Cover speichern" msgid "Reset all selected alternative images to their default value?" msgstr "" "Möchten Sie alle ausgewählten, alternativen Bilder auf die Standardwerte " "zurücksetzen?" msgid "Search paths" msgstr "Suchpfade" msgid "The search paths are used for skins, language files and modules." msgstr "" "Die Suchpfade werden für Skins, Sprachdateien und für Module verwendet." msgid "Add..." msgstr "Hinzufügen..." msgid "Remove" msgstr "Entfernen" msgid "Please select the folder to add to the search paths." msgstr "" "Bitte wählen Sie den Ordner, den Sie zu den Suchpfaden hinzufügen möchten." msgid "Edit..." msgstr "Bearbeiten..." msgid "Command" msgstr "Kommando" msgid "Shortcut" msgstr "Tastaturkürzel" msgid "Option" msgstr "Option" msgid "Value" msgstr "Wert" msgid "The following settings are for experienced users only." msgstr "Die folgenden Einstellungen sind erfahreneren Benutzern vorbehalten." msgid "Customize" msgstr "Anpassen" msgid "Reset selection" msgstr "Auswahl zurücksetzen" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Möchen Sie wirklich alle %i ausgewählten Befehle und Optionen auf die " "Standardwerte zurücksetzen?" msgid "Shortcuts" msgstr "Tastaturkürzel" msgid "Language" msgstr "Sprache" msgid "Show files with" msgstr "Dateien anzeigen mit" msgid "Instance" msgstr "Instanz" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Verwenden Sie die Kommandozeilenoption --%s=<datei> um dies zu ändern." msgid "Index file" msgstr "Index-Datei" msgid "RAM cache" msgstr "RAM-Cache" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "durchschnittl. Suchzeit: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synchronität" msgid "Fast" msgstr "Schnell" msgid "Save but slower" msgstr "Sicher aber langsamer" msgid "Very save and slow" msgstr "Sehr sicher und langsam" msgid "Image cache" msgstr "Bild-Cache" msgid "Use temporary directory" msgstr "Temporäres Verzeichnis verwenden" msgid "Yes, load images asynchrony" msgstr "Ja, Bilder asynchron laden" msgid "Yes, load images directly and avoid flickering" msgstr "Ja, Bilder direkt laden und Flimmern vermeiden" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% für %i Bilder verwendet" msgid "Regard file changes" msgstr "Dateiänderungen berücksichtigen" msgid "Advanced" msgstr "Erweitert" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Bitte starten Sie %s neu um die Änderungen zu übernehmen." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Hilfesystem" # String for "Don't know" or "unset" msgid "n/a" msgstr "k.A." msgid "Internal" msgstr "Intern" msgid "No credit." msgstr "Kein Kredit." #, c-format msgid "Credit: %i" msgstr "Kredit: %i" msgid "Start" msgstr "Start" msgid "Functions" msgstr "Funktionen" msgid "Monitors" msgstr "Monitore" msgid "Virtual keyboard" msgstr "Bildschirmtastatur" msgid "Credit system" msgstr "Kreditsystem" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke enthält einen sog. \"Kiosk-Modus\", der es Ihnen erlaubt das " "Programm\n" "als Vollbild mit eingeschränkter Funktionalität laufen zu lassen." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Bevor Sie auf \"Start\" klicken, stellen Sie sicher, daß Sie den Kiosk-" "Modus\n" "wieder beenden können:" # %s will be replaced by a shortcut, eg. "F11" #, c-format msgid "Exit by hitting %s" msgstr "Beenden mit %s" msgid "Exit by clicking into two different corners" msgstr "Beenden durch Klick in zwei verschiedene Ecken" msgid "Try to set exclusive" msgstr "" msgid "Ask for a password on exit" msgstr "Beim Beenden nach einem Passwort fragen" msgid "Change password..." msgstr "Password ändern..." # Eg. the title of the popup for "shutdown", "reboot" etc. msgid "Exit action:" msgstr "Aktion beim Beenden:" msgid "Start the kiosk mode with the following functionality:" msgstr "Kiosk-Modus mit der folgenden Funktionalität starten:" msgid "Play/pause" msgstr "Wiedergabe/Pause" msgid "Edit queue" msgstr "Wiedergabeliste ändern" msgid "Toggle elements" msgstr "Elemente ein-/ausblenden" msgid "Enqueue multiple tracks" msgstr "Mehrere Titel einstellen" msgid "All functions" msgstr "Alle Funktionen" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Titel auf die Musikauswahl %s begrenzen" msgid "Please enter the password again for verification." msgstr "Um Tippfehler zu vermeiden, geben Sie bitte das Passwort erneut ein." msgid "Overview:" msgstr "Übersicht:" msgid "Main window" msgstr "Hauptfenster" msgid "Monitor" msgstr "Monitor" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB msgid "Disable screensaver" msgstr "Bildschirmschoner deaktivieren" msgid "Disable power management" msgstr "Energieschema deaktivieren" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Wenn keine Tastatur zur Verfügung steht, können Sie die eingebaute " "Bildschirmtastatur\n" "verwenden. Die Bildschirmtastatur wird angezeigt, wenn Sie auf ein Textfeld " "klicken." msgid "Use the virtual keyboard" msgstr "Bildschirmtastatur verwenden" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Bildschirmtastatur auch außerhalb des Kiosk-Modus verwenden" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(bitte klicken Sie in das Textfeld)" msgid "Virtual keyboard layout:" msgstr "Tastaturlayout:" msgid "Colour:" msgstr "Farbe:" msgid "Black" msgstr "Schwarz" msgid "White" msgstr "Weiß" msgid "Transparency:" msgstr "Transparenz:" msgid "Hide cursor" msgstr "Mauszeiger ausblenden" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Mit der Ziffernblock und einigen weiteren Tasten können Sie Silverjuke " "komplett\n" "mit der Tastatur oder spezieller Hardware steuern. In diesem Fall werden " "Titel durch\n" "Eingabe der neben dem Album-/Titelnamen stehenden Nummern gespielt." msgid "Use Numpad controls" msgstr "Ziffernblock zur Steuerung verwenden" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Ziffernblock auch außerhalb des Kiosk-Modus verwenden" msgid "Keys:" msgstr "Tasten:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "Mit dem Kreditsystem können Sie das Programm so konfigurieren, daß z.B. vorm " "Einstellen\n" "eines Titels eine Münze ein einen Münzprüfer eingeworfen werden muß. In der " "Online-Hilfe\n" "finden Sie genauere Informationen zum Kreditsystem und zur unterstützten " "Hardware." msgid "Use credit system" msgstr "Kreditsystem verwenden" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "" "Kredite können über DDE, Kommandozeile oder Tastatur hinzugefügt werden" msgid "Keys..." msgstr "Tasten..." msgid "Remember credits between program starts" msgstr "Kredit zwischen zwei Programmstarts merken" msgid "Current credit:" msgstr "Aktueller Kredit:" msgid "Please enter your password to exit the kiosk mode." msgstr "Bitte geben Sie Ihr Passwort ein, um den Kiosk-Modus zu beenden." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Zu viele Titel in der Warteschlange,\n" "bitte versuchen Sie es später erneut." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "Dieser Titel ist bereits in der Warteschlange,\n" "bitte versuchen Sie es später erneut" msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" "Dieser Titel oder Künstler wurde erst kürzlich gespielt,\n" "bitte versuchen Sie es später erneut." msgid "Maintenance password" msgstr "Wartungspasswort" msgid "Exit kiosk mode" msgstr "Kiosk-Modus beenden" msgid "Start kiosk mode" msgstr "Kiosk-Modus starten" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Passwort:" msgid "Invalid password. Please try again." msgstr "Das Passwort ist ungültig, bitte versuchen Sie es erneut." msgid "Invalid track number" msgstr "Ungültige Titelnummer" # Eg. the title of the popup for "shutdown", "reboot" etc. msgid "Action:" msgstr "Aktion:" msgid "Shutdown computer" msgstr "Computer herunterfahren" msgid "Reboot computer" msgstr "Computer neu starten" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Löschen|Alles\n" "löschen|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" "Keine Bildschirmtastatur gefunden, bitte fügen Sie die *.sjk-Dateien in den " "Suchpfaden hinzu." #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Ein Album muss mind. %s Titel mit Übereinstimmungen bei %s haben." msgid "artist/album" msgstr "Künstler/Album" msgid "artist/album or genre" msgstr "Künstler/Album oder Musikrichtung" msgid "directory" msgstr "Verzeichnis" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "" "Zusammenstellungen können bis zu %s Titel des selben Künstlers enthalten." msgid "Separate the words using commas, case is ignored" msgstr "" "Trennen Sie die Wörter durch Kommata,\n" "die Groß-/Kleinschreibung ist nicht relevant" msgid "Sort by:" msgstr "Sortieren nach:" msgid "Stop-words for sorting artists:" msgstr "Beim Sortieren der Künstler die folgenden Wörter übergehen:" msgid "Stop-words for sorting albums:" msgstr "Beim Sortieren der Alben die folgenden Wörter übergehen:" msgid "Show stop-words words at end" msgstr "Übergehung anzeigen" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "Wenn ausgewählt wird z.B. \"The Rolling Stones\" als \"Rolling Stones, The\" " "ausgegeben;\n" "die Sortierung selbst bleibt von dieser Option unberührt" msgid "Keywords to identify cover image for an album:" msgstr "Schlüsselwörter, um das richtige Cover für ein Album zu finden:" msgid "Double click on covers" msgstr "Doppelklick auf Cover" msgid "Select/play album" msgstr "Album auswählen/abspielen" msgid "Combine tracks to albums" msgstr "Titel zu Alben zusammenfassen" msgid "Updating genres..." msgstr "Musikrichtungen aktualisieren..." msgid "Updating groups..." msgstr "Gruppen aktualisieren..." msgid "Combining tracks to albums..." msgstr "Titel zu Alben zusammenfassen..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Möchten Sie die folgenden Ordner zu Ihrem Musikarchiv hinzufügen?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Ja, Bild in \"%s\" belassen" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Ja, Bild nach \"%s\" kopieren" # %s will be replaced by the album name #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Möchten Sie das Bild als Cover für \"%s\" verwenden?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "" "\"%s\" ist nicht in Ihrem Musikarchiv und kann daher nicht bearbeitet werden." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s Titel auf %s Alben für \"%s\" gefunden" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s Titel auf %s Alben" msgid "Albums" msgstr "Alben" msgid "All albums" msgstr "Alle Alben" msgid "Unsorted tracks" msgstr "Unsortierte Titel" # %i will be replaced by the disk number. This string is used as headlines in the album browser if an album has several disks (CDs, records and so on). #, c-format msgid "Disk %i" msgstr "Disk %i" # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "K:" msgid "Stop prelistening" msgstr "" # %s will be replaced by the track selected for prelistening #, c-format msgid "Prelisten \"%s\"" msgstr "»%s« vorhören" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "\"%s\" in Warteschlange" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "\"%s\" jetzt spielen" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "\"%s\" als nächstes spielen" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "\"%s\" aus Warteschlange entfernen" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "%i Titel in Warteschlange stellen" msgstr[1] "%i Titel in Warteschlange stellen" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "%i Titel jetzt spielen" msgstr[1] "%i Titel jetzt spielen" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "%i Titel als nächstes spielen" msgstr[1] "%i Titel als nächstes spielen" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "%i Titel aus Warteschlange entfernen" msgstr[1] "%i Titel aus Warteschlange entfernen" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" im Internet" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Durchschnittl. Wertung: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Rating: %s" msgstr "Wertung: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Möchten Sie die Wertung für den ausgewählten Titel ändern?" msgstr[1] "Möchten Sie die Wertung für %i ausgewählte Titel ändern?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Wertung ändern" msgid "Click to select all tracks of this album, double-click to play them" msgstr "Klick/Doppelklick: Alle Titel dieses Albums auswählen/abspielen" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "Klick/Doppelklick: Alle Titel dieses Künsters auswählen/abspielen" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "Klick/Doppelklick: Alle Titel dieser Disk auswählen/abspielen" # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Doppelklick: \"%s\" in Warteschlange stellen" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Möchten Sie den ausgewählten Titel in die Warteschlange stellen?" msgstr[1] "Möchten Sie %i ausgewählte Titel in die Warteschlange stellen?" msgid "Size" msgstr "Größe" msgid "Gain" msgstr "Verstärkung" msgid "Read music-files from the following folders and sources:" msgstr "Musikdateien aus den folgenden Ordnern bzw. Quellen lesen:" msgid "Read music-files from the following sources:" msgstr "Musikdateien aus den folgenden Quellen lesen:" msgid "Add source" msgstr "Quelle hinzufügen" msgid "Remove source" msgstr "Quelle entfernen" msgid "Options" msgstr "Optionen" msgid "Supported file types" msgstr "Unterstützte Dateitypen" msgid "Music library" msgstr "Musikarchiv" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Optionen für \"%s\"" msgid "Options..." msgstr "Optionen..." msgid "Jukebox" msgstr "Jukebox" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "" "Bitte Wiedergabeliste/Dateien auswählen oder die URL eines Streams eingeben" msgid "Append to current playlist" msgstr "An aktuelle Wiedergabeliste anhängen" msgid "Volume control" msgstr "Lautstärkesteuerung" msgid "Play all tracks of an album with the same volume" msgstr "Alle Titel eines Albums mit derselben Lautstärke spielen" msgid "Desired volume:" msgstr "Gewünschte Lautstärke:" msgid "Max. gain:" msgstr "Max. Verstärkung:" msgid "Current volume:" msgstr "Aktuelle Lautstärke:" msgid "Fading" msgstr "Überblendungen" msgid "Crossfading" msgstr "Titel überblenden" msgid "Manual crossfades:" msgstr "Manuelle Überblendungen:" msgid "Automatic crossfades:" msgstr "Automatische Überblendungen:" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "" "Keine Überblendung zwischen aufeinanderfolgenden Titeln des selben Albums" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Nur den alten Titel ausblenden, der neue startet mit voller Lautstärke" msgid "Resume" msgstr "Resume" msgid "Jingles" msgstr "Jingles" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "Hier können Sie das verhalten der Warteschlange festlegen. Zur \"Intensität " "des Zufallsmodus\":\n" "Kleine Werte resultieren in nur leichten Variationen der Abspielreihenfolge, " "große Werte\n" "bewirken starke Änderungen." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Kiosk-Modus: Max. %i Titel in Warteschlange zulassen" msgstr[1] "Kiosk-Modus: Max. %i Titel in Warteschlange zulassen" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Kiosk-Modus: Doppelte Titel in Warteschlange vermeiden" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "" "Langeweile vermeiden: Keinen Titel innerhalb %i Minuten mehrmals spielen" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "" "Langeweile vermeiden: Keinen Künstler innerhalb %i Minuten mehrmals spielen" msgid "Shuffle intensity:" msgstr "Intensität des Zufallsmodus:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" "Hier können Sie einstellen, ob die Wiedergabeliste nach einem Neustart von\n" "Silverjuke wiederhergestellt werden soll." msgid "Restore queue" msgstr "Wiedergabeliste wiederherstellen" # %s will be replaced by the name of a music selection msgid "Restore already played tracks" msgstr "Bereits gespielte Titel wiederherstellen" msgid "Start playback from last position" msgstr "Wiedergabe von letzter Position starten" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Mit den folgenden Optionen können Sie Aktionen festlegen, die nach einer\n" "bestimmten Zeitspanne automatisch ausgeführt werden sollen." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "AutoPlay: Wenn die Wiedergabeliste leer ist, warte %i Minuten;" # %s will be replaced by the name of a music selection #, c-format msgid "then, play %i tracks from the %s" msgstr "spiele danach %i Titel aus %s" # %s will be replaced by the name of a music selection msgid "Ignore tracks from the music selection" msgstr "Titel aus der Musikauswahl ausschliessen" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "AutoPlay durch manuell eingestellte Titel sofort unterbrechen " msgid "Sleep mode:" msgstr "Schlafmodus:" msgid "Stop playback" msgstr "Wiedergabe beenden" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "" "in|nach Inaktivität von|um|immer in|immer nach Inaktivität von|immer um" msgid "minutes|o'clock" msgstr "Minuten|Uhr" #, c-format msgid "Before this, fade out %i seconds" msgstr "Blende zuvor die Lautstärke %i Sekunden lang aus" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" "Jingles sind normale Titel aus dem Musikarchiv, die unter bestimmten\n" "Bedingungen gespielt weren." msgid "If the jukebox is playing, about every" msgstr "Bei Wiedergabe, ungefähr alle" msgid "minutes," msgstr "Minuten," # %s will be replaced by the name of a music selection msgid "play a track from the music selection" msgstr "spiele einen Titel aus der Musikauswahl" msgid "At" msgstr "Um" msgid "o'clock," msgstr "Uhr," msgid "Daily" msgstr "Täglich" msgid "Wait for end of playing track" msgstr "Auf Ende des aktuellen Titels warten" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Gehe zu aktuellem Titel nach %i Minuten Inaktivität" # The string will be followed by "Album view", "Cover view" or "List view" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Ansicht nach %i Minuten Inaktivität umschalten auf" # The string will be followed by "Album view", "Cover view" or "List view" #, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Videoschirm nach %i Minuten Inaktivität öffnen" # %s will be replaced by the name of a visualization #, c-format msgid "Close video screen after %i minutes" msgstr "Videoschirm nach %i Minuten schließen" #, c-format msgid "Limit play time to %i seconds" msgstr "Spielzeit auf %i Sekunden begrenzen" msgid "Read folders:" msgstr "Ordner durchsuchen:" msgid "Read file:" msgstr "Datei lesen:" msgid "Ignore music-files and images with the following extensions:" msgstr "" "Musik- und Bilddateien mit den folgenden Dateierweiterungen ignorieren:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "" "(trennen Sie die Erweiterungen durch Kommata, Groß-/Kleinschreibung ist " "nicht relevant)" msgid "Include folder to the update process" msgstr "Ordner in den Aktualisierungsprozess einbeziehen" msgid "Read hidden files" msgstr "Versteckte Dateien lesen" msgid "Read hidden folders" msgstr "Versteckte Ordner lesen" msgid "Read inside ZIP-/TAR-archives" msgstr "Innerhalb von ZIP-/TAR-Archiven suchen" msgid "Read (ID3)-tags" msgstr "(ID3-)Tags lesen" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "Pfad und Dateimuster für Titelinformationen, falls (ID3-)Tags fehlen:" # This string is used as a headline before a list of placeholders, see eg. "Settings/My music library/Options for <source>". The placeholders may then be used by the user in the corresponding text field and Silverjuke will replace them by something else afterwards. msgid "Placeholders:" msgstr "Platzhalter:" msgid "Read files and folders" msgstr "Dateien und Ordner lesen" msgid "Add a folder to search for music-files" msgstr "Ordner mit Musikdateien hinzufügen" msgid "Add a single music-file" msgstr "Einzelne Musikdatei hinzufügen" # This string is eg. added to disabled sources msgid "Disabled" msgstr "Inaktiv" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "Nicht aktualisieren" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "\"%s\" aus Musikarchiv entfernen?" msgid "Select a folder with music-files" msgstr "Ordner mit Musikdateien hinzufügen" msgid "Select music-file" msgstr "Musikdatei auswählen" msgid "Unknown track" msgstr "Unbekannter Titel" msgid "Unknown artist" msgstr "Unbekannter Künstler" msgid "Add a server containing music-files" msgstr "Server mit Musikdateien hinzufügen" msgid "Use server:" msgstr "Server verwenden:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Typ" msgid "Login name:" msgstr "Loginname:" msgid "Include server to the update process" msgstr "Server in den Aktualisierungsprozess einbeziehen" msgid "Configuration file" msgstr "Konfigurations-Datei" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #, c-format msgid "Loading %s" msgstr "Lade %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Fehler %i" msgid "Edit track" msgstr "Titel bearbeiten" msgid "of" msgstr "von" msgid "Write (ID3-)tags" msgstr "(ID3-)Tags schreiben" msgid "File names" msgstr "Dateinamen" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Alle %s Dateinamen anzeigen..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "Die angezeigten Werte sind die Summe bzw. der Durchschnitt aller einzelnen " "Werte in den gegebenen Dateien." msgid "Track" msgstr "Titel" msgid "Further information" msgstr "Weitere Informationen" msgid "URL" msgstr "URL" msgid "Temporary directory" msgstr "Temporäres Verzeichnis" msgid "Further information..." msgstr "Weitere Informationen..." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Kann \"%s\" nicht in \"%s\" umbenennen." msgid "Server name" msgstr "Server-Name" msgid "Query online database" msgstr "Online-Datenbank abfragen" msgid "more..." msgstr "mehr..." msgid "Please select one of the following albums:" msgstr "Bitte wählen Sie eines der folgenden Alben aus:" msgid "Old file name" msgstr "Alter Dateiname" msgid "New file name" msgstr "Neuer Dateiname" msgid "Field" msgstr "Feld" msgid "Old value" msgstr "Alter Wert" msgid "New value" msgstr "Neuer Wert" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<leer>" msgid "Confirm modifications" msgstr "Änderungen bestätigen" msgid "Delete empty folders" msgstr "Leere Ordner löschen" msgid "Please confirm or edit the following modification:" msgstr "Bitte bestätigen oder bearbeiten Sie die folgende Änderung:" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Bitte bestätigen oder bearbeiten Sie die folgenden %s Änderungen:" msgid "(lower case)" msgstr "(Kleinschreibung)" msgid "(upper case)" msgstr "(Großschreibung)" msgid "(n characters)" msgstr "(n Zeichen)" msgid "Rename files" msgstr "Dateien umbenennen" msgid "Pattern:" msgstr "Muster:" msgid "Artist (first character)" msgstr "Künstler (erstes Zeichen)" msgid "Album (first character)" msgstr "Album (erstes Zeichen)" msgid "Genre (first character)" msgstr "Musikrichtung (erstes Zeichen)" msgid "Group (first character)" msgstr "Gruppe (erstes Zeichen)" msgid "Year (4 characters)" msgstr "Jahr (4 Zeichen)" msgid "Year (2 characters)" msgstr "Jahr (2 Zeichen)" msgid "Duration (5 characters)" msgstr "Dauer (5 Zeichen)" msgid "Directory change" msgstr "Verzeichniswechsel" msgid "File name (8 characters)" msgstr "Dateiname (8 Zeichen)" msgid "File extension" msgstr "Dateierweiterung" msgid "Example:" msgstr "Beispiel:" msgid "Replace" msgstr "Ersetzen" msgid "Search for:" msgstr "Suchen nach:" msgid "in:" msgstr "in:" msgid "All fields" msgstr "Alle Felder" msgid "Path and file name" msgstr "Pfad und Dateiname" msgid "Replace with:" msgstr "Ersetzen durch:" msgid "Match whole words only" msgstr "Nur ganze Wörter" msgid "Match case" msgstr "Groß-/Kleinschreibung beachten" msgid "Regular expression" msgstr "Regulärer Ausdruck" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "\"%s\" nicht gefunden." msgid "Split field" msgstr "Feld aufteilen" msgid "Field to split:" msgstr "Aufzuteilendes Feld:" msgid "Destination fields and pattern:" msgstr "Zielfelder und Muster:" msgid "Track number (1 character)" msgstr "Titelnummer (1 Zeichen)" msgid "Track number (2 characters)" msgstr "Titelnummer (2 Zeichen)" msgid "Disk number (1 character)" msgstr "Disknummer (1 Zeichen)" msgid "Disk number (2 characters)" msgstr "Disknummer (2 Zeichen)" msgid "Void information" msgstr "Nichtige Informationen" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "Mit Skins können Sie das Aussehen und die Funktionalität von %s ändern.\n" "Wählen Sie eine Skin aus der Liste oder laden Sie weitere Skins aus dem " "Internet." msgid "Name" msgstr "Name" msgid "Info..." msgstr "Info..." msgid "Update list" msgstr "Liste aktualisieren" msgid "More skins on the web..." msgstr "Weitere Skins im Internet..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Sie können unabhängige Schrift- und Covergrößen im Hauptfenster verwenden. " "Die\n" "Größen beziehen sich auf eine Zoomeinstellung von 100%. Wenn Sie den Zoom " "ändern\n" "(z.B. über \"+\" und \"-\"), verändern sich beide Größen proportional " "zueinander." msgid "Font:" msgstr "Schrift:" msgid "Font size:" msgstr "Schriftgröße:" msgid "Use this font for dialogs, too" msgstr "Diese Schrift auch in Dialogen verwenden" msgid "Column width:" msgstr "Spaltenbreite:" msgid "Cover size:" msgstr "Covergröße:" msgid "No lyrics found." msgstr "Kein Text gefunden." msgid "Karaoke Prompt" msgstr "Karaoke Prompt" # %s will be replaced by the name of a music selection #, c-format msgid "No images found in \"%s\"." msgstr "Im Ordner \"%s\" wurden keine Bilder gefunden." msgid "Background" msgstr "Hintergrund" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "Use %s-files" msgstr "%s-Dateien verwenden" msgid "Please select a directory with images" msgstr "Bitte wählen Sie einen Ordner mit Bildern aus" msgid "If appropriate, switch over automatically" msgstr "Bei Bedarf automatisch umschalten" msgid "Half size" msgstr "Halbe Größe" msgid "Spectrum Monitor" msgstr "Spektrum Monitor" msgid "Show spectrum" msgstr "Spektrum anzeigen" msgid "Show oscilloscope" msgstr "Oszilloskop anzeigen" msgid "Show starfield" msgstr "Sterne anzeigen" msgid "Show other figures" msgstr "Andere Figuren anzeigen" msgid "Visualization" msgstr "Visualisierung" msgid "Video output" msgstr "Videoausgabe" msgid "Search homepage" msgstr "Homepage suchen" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Texte auf %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "Mit %s suchen" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informationen auf %s" # Do not forget the ":" at the end of the string. msgid "Object count:" msgstr "Anzahl Objekte:" # Do not forget the ":" at the end of the string. msgid "Elapsed time:" msgstr "Zeit bisher:" msgid "Message" msgstr "Nachricht" msgid "Scope" msgstr "Bereich" msgid "Console" msgstr "Konsole" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i Nachricht" msgstr[1] "%i Nachrichten" msgid "Evaluate" msgstr "Auswerten" msgid "Clear" msgstr "Löschen" msgid "Open console on errors and warnings" msgstr "Konsole bei Fehlern und Warnungen öffnen" msgid "Details" msgstr "Details" msgid "Clear all messages?" msgstr "Alle Nachrichten löschen?" # %s will be replaced by the track selected for prelistening #, c-format msgid "Overwrite \"%s\"?" msgstr "\"%s\" überschreiben?" msgid "Append" msgstr "Anhängen" msgid "State" msgstr "Status" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "%s-Dateien" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "%s-Audio" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "%s-Bilder" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-video" msgstr "%s-Video" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "%s-Wiedergabelisten" msgid "Script-files" msgstr "Skript-Dateien" msgid "Silverjuke skin-files" msgstr "Silverjuke Skin-Dateien" msgid "Silverjuke jukebox-files" msgstr "Silverjuke Jukebox-Dateien" msgid "Archive-files" msgstr "Archivdateien" msgid "Supported file-types" msgstr "Unterstützte Dateitypen" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programme" msgid "Cleanup index..." msgstr "Index bereinigen..." msgid "max. size" msgstr "max. Größe" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "Beim letzten Mal wurde %s nicht normal beendet.\n" "Die folgenden - eventuell fehlerhaften - Objekte wurde kurz vor dem " "abnormalen Ende verwendet:\n" "\n" "%s\n" "\n" "Bei anhaltenden Problemen, versuchen Sie diese Objekte nicht zu verwenden.\n" "Sollen die Objekte jetzt verwendet werden?" msgid "Use maybe errorous objects?" msgstr "Eventuell fehlerhafte Objekte verwenden?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "%a, %d. %b. %Y, %H:%M:%S" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "%d.%m.%Y %H:%M:%S" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "%a, %d. %b. %Y" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "%d.%m.%Y" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "0" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "de" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "" "[search]\n" "Amazon.de=http://www.amazon.de/exec/obidos/external-search?" "index=music&keyword=%artist%+%album%\n" "eBay.de=http://search.ebay.de/search/search.dll?" "MfcISAPICommand=GetResult&krd=1&ht=1&shortcut=4&SortProperty=MetaEndSort&cgiurl=http" "%3A%2F%2Fcgi.ebay.de%2Fws%2F&maxRecordsPerPage=50&st=2&ebaytag1code=77&query=" "%artist%+%album%&x=4&y=15\n" "JPC.de=http://www.jpc.de/jpcng/home/search/index.html?dosearch=1&fastsearch=" "%artist%+%album%" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "" "[info]\n" "Wikipedia.de=http://de.wikipedia.org/wiki/%artist%\n" "Laut.de=http://www.google.de/search?q=%22%artistutf8%%22+site:www.laut." "de&btnI=1\n" "[lyrics]\n" "Lyrix.at=http://www.google.de/search?q=%22%artistutf8%%22+site:www.lyrix." "at&btnI=1" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "0" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "0" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "0" # Virtual keyboard layout definitions here. See our Developer Network for more information. To use the layout "US International", enter "0" here. msgid "__VIRT_KEYBD__" msgstr "0" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "." #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "," #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i Tag" msgstr[1] "%i Tage" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Ungültiger regulärer Ausdruck \"%s\"" msgid "Fatal error" msgstr "Fataler Fehler" msgid "Ctrl" msgstr "Strg" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Fenster vergrößern" msgid "Shrink window" msgstr "Fenster verkleinern" msgid "Enlarge display" msgstr "Display vergrößern" msgid "Shrink display" msgstr "Display verkleinern" msgid "Services" msgstr "Dienste" #, c-format msgid "Hide %s" msgstr "%s ausblenden" msgid "Hide Others" msgstr "Andere ausblenden" msgid "Show All" msgstr "Alle einblenden" #, c-format msgid "Quit %s" msgstr "%s beenden" msgid "Extras" msgstr "Extras" msgid "Full screen" msgstr "Ganzer Bildschirm" msgid "Modules on the web..." msgstr "Module im Internet..." msgid "Explore" msgstr "Explore" msgid "Reveal in Finder" msgstr "Im Finder zeigen" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "Die Datei \"%s\" existiert nicht." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "Kann \"%s\" nicht ausführen." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "%s deaktivieren" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable shutdown" #~ msgstr "Herunterfahren/Neustart deaktivieren" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Wenn Sie mehr als einen Monitor an Ihren Computer angeschlossen haben, " #~ "können\n" #~ "Sie die verschiedenen Silverjuke-Fenster hier auf die verschiedenen " #~ "Monitore verteilen." #~ msgid "Monitor for" #~ msgstr "Monitor für" # %s will be replaced by a control for selecting the display resolution #~ msgid "Switch resolution to %s" #~ msgstr "Auflösung umschalten %s" #~ msgid "Calculated volumes:" #~ msgstr "Berechnete Lautstärken:" #~ msgid "Skip silence between tracks" #~ msgstr "Stille zwischen Titeln überspringen" #~ msgid "Other fadings" #~ msgstr "Sonstige Ein- und Ausblendungen" #~ msgid "Attached window" #~ msgstr "Fenster andocken" #~ msgid "Scroll vertically" #~ msgstr "Vertikal scrollen" #~ msgid "Context sensitive" #~ msgstr "Kontextsensitiv" #~ msgid "Exit" #~ msgstr "Beenden" #~ msgid "Show album name" #~ msgstr "Albumnamen anzeigen" #~ msgid "Online help" #~ msgstr "Online-Hilfe" #~ msgid "Jukebox settings..." #~ msgstr "Jukebox-Einstellungen ..." #~ msgid "Advanced settings..." #~ msgstr "Erweiterte Einstellungen ..." #~ msgid "Tools" #~ msgstr "Extras" #~ msgid "Workspace" #~ msgstr "Arbeitsbereich" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/en@boldquot.header�������������������������������������������������������������0000664�0000000�0000000�00000002471�12660066715�0020047�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/en@boldquot.po�����������������������������������������������������������������0000664�0000000�0000000�00000155421�12660066715�0017241�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# English translations for silverjuke package. # Copyright (C) 2016 Bjoern Petersen Software Design and Development # This file is distributed under the same license as the silverjuke package. # Automatically generated, 2016. # # All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # msgid "" msgstr "" "Project-Id-Version: silverjuke 16.2.3\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2016-02-14 12:51+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en@boldquot\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" msgid "Sleep mode activated." msgstr "Sleep mode activated." msgid "Sleep mode deactivated." msgstr "Sleep mode deactivated." msgid "Play time exceeded" msgstr "Play time exceeded" msgid "Default" msgstr "Default" msgid "Device" msgstr "Device" msgid "Show covers" msgstr "Show covers" msgid "Duration" msgstr "Duration" msgid "Artist" msgstr "Artist" msgid "Original artist" msgstr "Original artist" msgid "Composer" msgstr "Composer" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Track number" msgid "Automatic track number" msgstr "Automatic track number" msgid "Disk number" msgstr "Disk number" msgid "Genre" msgstr "Genre" msgid "Year" msgstr "Year" msgid "Rating" msgstr "Rating" msgid "Comment" msgstr "Comment" msgid "Show double tracks" msgstr "Show double tracks" msgid "Show different artist names" msgstr "Show different artist names" msgid "Show different album names" msgstr "Show different album names" msgid "Show cover titles" msgstr "Show cover titles" #, c-format msgid "%s tracks" msgstr "%s tracks" msgid "Drag folders with music here." msgstr "Drag folders with music here." msgid "Reset to default values" msgstr "Reset to default values" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "AutoPlay" msgid "Shuffle" msgstr "Shuffle" msgid "Recreating music library" msgstr "Recreating music library" msgid "Updating music library" msgstr "Updating music library" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" "%s is currently playing. Do you want to stop the playing track and exit %s?" #, c-format msgid "Exit %s" msgstr "Exit %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Cannot open “%s”." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "Also install the script to “%s” for permanent use" #, c-format msgid "Execute the script \"%s\"?" msgstr "Execute the script “%s”?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgid "Search" msgstr "Search" msgid "On" msgstr "On" msgid "Off" msgstr "Off" msgid "Repeat playlist" msgstr "Repeat playlist" msgid "Repeat one" msgstr "Repeat one" msgid "Repeat all" msgstr "Repeat all" msgid "Select a track, then start playback." msgstr "Select a track, then start playback." msgid "Stop after this track" msgstr "Stop after this track" msgid "Stop after each track" msgstr "Stop after each track" msgid "Double click play tracks at once" msgstr "Double click play tracks at once" msgid "Start playback on first enqueue" msgstr "Start playback on first enqueue" msgid "Remove played tracks from queue" msgstr "Remove played tracks from queue" msgid "More from current album" msgstr "More from current album" msgid "More from current artist" msgstr "More from current artist" msgid "No more tracks." msgstr "No more tracks." #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "Remove %i track from the queue and stop playback?" msgstr[1] "Remove %i tracks from the queue and stop playback?" msgid "Clear playlist" msgstr "Clear playlist" msgid "Track played, click to reset" msgstr "Track played, click to reset" msgid "Boredom avoided: Track moved down" msgstr "Boredom avoided: Track moved down" msgid "Remove this track" msgstr "Remove this track" msgid "Toggle time mode" msgstr "Toggle time mode" #, c-format msgid "Go to \"%s\"" msgstr "Go to “%s”" msgid "End search" msgstr "End search" msgid "click right for options" msgstr "click right for options" msgid "Volume" msgstr "Volume" msgid "Double-click to enlarge the cover" msgstr "Double-click to enlarge the cover" #, c-format msgid "Close this window and exit %s" msgstr "Close this window and exit %s" msgid "Open main menu" msgstr "Open main menu" msgid "Toggle shuffle mode" msgstr "Toggle shuffle mode" msgid "Repeat all/repeat current" msgstr "Repeat all/repeat current" #, c-format msgid "Search in \"%s\"" msgstr "Search in “%s”" msgid "Help" msgstr "Help" msgid "Add folders and files" msgstr "Add folders and files" msgid "Extensions" msgstr "Extensions" msgid "Show remaining time" msgstr "Show remaining time" msgid "Show elapsed time" msgstr "Show elapsed time" msgid "Show total time" msgstr "Show total time" msgid "Show track number" msgstr "Show track number" msgid "Show artist name" msgstr "Show artist name" msgid "Show AutoPlay" msgstr "Show AutoPlay" msgid "Prefer album- to track-cover" msgstr "Prefer album- to track-cover" msgid "Display" msgstr "Display" msgid "Columns" msgstr "Columns" msgid "Same zoom in all views" msgstr "Same zoom in all views" msgid "Fonts and covers" msgstr "Fonts and covers" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Skins" msgid "Start kiosk mode..." msgstr "Start kiosk mode..." #, c-format msgid "%s on the web" msgstr "%s on the web" msgid "All files" msgstr "All files" #, c-format msgid "About %s" msgstr "About %s" msgid "File" msgstr "File" msgid "Edit" msgstr "Edit" msgid "View" msgstr "View" msgid "Playback" msgstr "Playback" msgid "Video screen" msgstr "Video screen" msgid "Kiosk mode" msgstr "Kiosk mode" msgid "None" msgstr "None" msgid "Further options" msgstr "Further options" msgid "Queue" msgstr "Queue" msgid "Automatic control" msgstr "Automatic control" msgid "Current view" msgstr "Current view" #, c-format msgid "Next track from \"%s\"" msgstr "Next track from “%s”" msgid "Next track" msgstr "Next track" msgid "Search for genre" msgstr "Search for genre" msgid "Search for music selection" msgstr "Search for music selection" msgid "Edit tracks/Get info" msgstr "Edit tracks/Get info" msgid "Show file" msgstr "Show file" msgid "Cover editor" msgstr "Cover editor" msgid "Mix" msgstr "Mix" msgid "Left channel" msgstr "Left channel" msgid "Right channel" msgstr "Right channel" msgid "Explicit output" msgstr "Explicit output" msgid "Prelisten" msgstr "Prelisten" msgid "No" msgstr "No" msgid "Yes" msgstr "Yes" msgid "Only initialize system volume" msgstr "Only initialize system volume" msgid "Output" msgstr "Output" msgid "Use system volume" msgstr "Use system volume" msgid "Several artists" msgstr "Several artists" msgid "Unknown title" msgstr "Unknown title" msgid "Save playlist" msgstr "Save playlist" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Cannot write “%s”." msgid "Open playlist" msgstr "Open playlist" msgid "Title" msgstr "Title" msgid "Track count" msgstr "Track count" msgid "Disk count" msgstr "Disk count" msgid "Group" msgstr "Group" msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Channels" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "File name" msgid "File size" msgstr "File size" msgid "Date added" msgstr "Date added" msgid "Date modified" msgstr "Date modified" msgid "Last played" msgstr "Last played" msgid "Play count" msgstr "Play count" msgid "SQL expression" msgstr "SQL expression" msgid "Limit result to" msgstr "Limit result to" msgid "Title/artist/album" msgstr "Title/artist/album" msgid "File type" msgstr "File type" msgid "Queue position" msgstr "Queue position" msgid "Include tracks" msgstr "Include tracks" msgid "Exclude tracks" msgstr "Exclude tracks" msgid "Random" msgstr "Random" #, c-format msgid "Press \"%s\" in the main window" msgstr "Press “%s” in the main window" msgid "Insert" msgstr "Insert" msgid "Del" msgstr "Del" msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Please enter the date as “dd.mm.yyyy”, you can also add “hh:mm” " "for the time." msgid "Please enter the text." msgstr "Please enter the text." msgid "Please enter a value." msgstr "Please enter a value." msgid "Please enter a valid value." msgstr "Please enter a valid value." msgid "(second field)" msgstr "(second field)" msgid "No valid criteria defined." msgstr "No valid criteria defined." msgid "The search cannot be started; please check the following fields:" msgstr "The search cannot be started; please check the following fields:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" "Note: The operators “equal” and “unequal” are case-sensitive." #, c-format msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Do you want to execute the scripts embedded in the skin “%s”?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Cancel" msgid "Page left" msgstr "Page left" msgid "Page right" msgstr "Page right" msgid "Page up" msgstr "Page up" msgid "Page down" msgstr "Page down" msgid "Menu" msgstr "Menu" msgid "Cursor left" msgstr "Cursor left" msgid "Cursor right" msgstr "Cursor right" msgid "Cursor up" msgstr "Cursor up" msgid "Cursor down" msgstr "Cursor down" msgid "Line left" msgstr "Line left" msgid "Line right" msgstr "Line right" msgid "Line up" msgstr "Line up" msgid "Line down" msgstr "Line down" msgid "Home" msgstr "Home" msgid "End" msgstr "End" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Delete" msgid "Album view" msgstr "Album view" msgid "Cover view" msgstr "Cover view" msgid "List view" msgstr "List view" msgid "Toggle view" msgstr "Toggle view" msgid "Open playlist..." msgstr "Open playlist..." msgid "Unqueue marked tracks" msgstr "Unqueue marked tracks" msgid "Unqueue all but marked tracks" msgstr "Unqueue all but marked tracks" msgid "Save playlist..." msgstr "Save playlist..." msgid "Paste" msgstr "Paste" msgid "Music selection..." msgstr "Music selection..." msgid "Settings" msgstr "Settings" msgid "Update music library" msgstr "Update music library" msgid "Recreate music library" msgstr "Recreate music library" msgid "Enqueue tracks" msgstr "Enqueue tracks" msgid "Play tracks next" msgstr "Play tracks next" msgid "Play tracks now" msgstr "Play tracks now" msgid "Volume up" msgstr "Volume up" msgid "Volume down" msgstr "Volume down" msgid "Unqueue tracks" msgstr "Unqueue tracks" msgid "Edit tracks/Get info..." msgstr "Edit tracks/Get info..." msgid "Play" msgstr "Play" msgid "Pause" msgstr "Pause" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Previous track" msgid "Seek backward" msgstr "Seek backward" msgid "Seek forward" msgstr "Seek forward" msgid "Fade to next" msgstr "Fade to next" msgid "Mute" msgstr "Mute" msgid "Reload skin" msgstr "Reload skin" msgid "Toggle video screen" msgstr "Toggle video screen" msgid "Smooth" msgstr "Smooth" msgid "Select all" msgstr "Select all" msgid "Zoom in" msgstr "Zoom in" msgid "Zoom out" msgstr "Zoom out" msgid "Normal zoom" msgstr "Normal zoom" msgid "Always on top" msgstr "Always on top" msgid "Go to current track" msgstr "Go to current track" msgid "Go to marked track" msgstr "Go to marked track" msgid "Go to random album" msgstr "Go to random album" msgid "Go to previous letter" msgstr "Go to previous letter" msgid "Go to next letter" msgstr "Go to next letter" msgid "Add credit" msgstr "Add credit" msgid "Console..." msgstr "Console..." msgid "Replace..." msgstr "Replace..." msgid "Split field..." msgstr "Split field..." msgid "Rename files..." msgstr "Rename files..." msgid "Query online database..." msgstr "Query online database..." msgid "New music selection..." msgstr "New music selection..." msgid "Save" msgstr "Save" msgid "Save as..." msgstr "Save as..." msgid "Rename..." msgstr "Rename..." msgid "Revert to saved" msgstr "Revert to saved" msgid "Open file..." msgstr "Open file..." msgid "Save cover..." msgstr "Save cover..." msgid "Rotate left" msgstr "Rotate left" msgid "Rotate right" msgstr "Rotate right" msgid "Flip horizontally" msgstr "Flip horizontally" msgid "Flip vertically" msgstr "Flip vertically" msgid "Grayscale" msgstr "Grayscale" msgid "Negative" msgstr "Negative" msgid "Fit to screen" msgstr "Fit to screen" msgid "Decrease brightness" msgstr "Decrease brightness" msgid "Increase brightness" msgstr "Increase brightness" msgid "Decrease contrast" msgstr "Decrease contrast" msgid "Increase contrast" msgstr "Increase contrast" msgid "Normal brightness/contrast" msgstr "Normal brightness/contrast" msgid "Crop" msgstr "Crop" msgid "Please press the shortcut to add." msgstr "Please press the shortcut to add." msgid "System-wide:" msgstr "System-wide:" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Remove shortcut “%s”" msgid "Add system-wide shortcut..." msgstr "Add system-wide shortcut..." #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Add shortcut to “%s”..." #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "The shortcut “%s” is currently assigned to the command “%s”.\n" "\n" "Do you want to assign it to the shortcut “%s” now?" msgid "Mouse" msgstr "Mouse" msgid "Drag window content" msgstr "Drag window content" msgid "Left mouse button" msgstr "Left mouse button" msgid "Drag selected tracks" msgstr "Drag selected tracks" msgid "Second click with the left mouse button" msgstr "Second click with the left mouse button" msgid "Show icons beside mouse cursor" msgstr "Show icons beside mouse cursor" msgid "Middle mouse button" msgstr "Middle mouse button" msgid "Edit tracks" msgstr "Edit tracks" msgid "Tooltips" msgstr "Tooltips" msgid "Mouse wheel" msgstr "Mouse wheel" msgid "Scroll horizontally in album view" msgstr "Scroll horizontally in album view" msgid "Modifier key toggles axis" msgstr "Modifier key toggles axis" msgid "Right mouse button toggles axis" msgstr "Right mouse button toggles axis" msgid "Modify volume, scrollbars, letters etc." msgstr "Modify volume, scrollbars, letters etc." msgid "Use multimedia keyboard keys" msgstr "Use multimedia keyboard keys" msgid "Ask on close if playing" msgstr "Ask on close if playing" msgid "Ask before enqueuing multiple tracks" msgstr "Ask before enqueuing multiple tracks" msgid "Ask before clearing the playlist" msgstr "Ask before clearing the playlist" msgid "Ask before changing the rating" msgstr "Ask before changing the rating" #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Backspace" msgid "Space" msgstr "Space" msgid "Up" msgstr "Up" msgid "Left" msgstr "Left" msgid "Right" msgstr "Right" msgid "Down" msgstr "Down" msgid "Print" msgstr "Print" msgid "Ins" msgstr "Ins" msgid "Music selection" msgstr "Music selection" msgid "Numpad" msgstr "Numpad" msgid "Select date and time" msgstr "Select date and time" msgid "Time" msgstr "Time" msgid "contains" msgstr "contains" msgid "does not contain" msgstr "does not contain" msgid "starts with" msgstr "starts with" msgid "does not start with" msgstr "does not start with" msgid "starts simelar to" msgstr "starts simelar to" msgid "ends with" msgstr "ends with" msgid "does not end with" msgstr "does not end with" msgid "on" msgstr "on" msgid "is equal to" msgstr "is equal to" msgid "not on" msgstr "not on" msgid "is unequal to" msgstr "is unequal to" msgid "is simelar to" msgstr "is simelar to" msgid "is after" msgstr "is after" msgid "is greater than" msgstr "is greater than" msgid "is on or after" msgstr "is on or after" msgid "is greater or equal" msgstr "is greater or equal" msgid "is before" msgstr "is before" msgid "is less than" msgstr "is less than" msgid "is on or before" msgstr "is on or before" msgid "is less or equal" msgstr "is less or equal" msgid "is in the last" msgstr "is in the last" msgid "is not in the last" msgstr "is not in the last" msgid "is in the period" msgstr "is in the period" msgid "is in range" msgstr "is in range" msgid "is not in the period" msgstr "is not in the period" msgid "is not in range" msgstr "is not in range" msgid "is set" msgstr "is set" msgid "is unset" msgstr "is unset" msgid "tracks" msgstr "tracks" msgid "albums" msgstr "albums" msgid "minutes" msgstr "minutes" msgid "hours" msgstr "hours" msgid "seconds" msgstr "seconds" msgid "days" msgstr "days" msgid "No rating" msgstr "No rating" msgid "random" msgstr "random" msgid "highest rating" msgstr "highest rating" msgid "lowest rating" msgstr "lowest rating" msgid "most often played" msgstr "most often played" msgid "least often played" msgstr "least often played" msgid "most recently played" msgstr "most recently played" msgid "least recently played" msgstr "least recently played" msgid "most recently added" msgstr "most recently added" msgid "least recently added" msgstr "least recently added" msgid "most recently modified" msgstr "most recently modified" msgid "least recently modified" msgstr "least recently modified" msgid "most recently released" msgstr "most recently released" msgid "least recently released" msgstr "least recently released" msgid "low queue position" msgstr "low queue position" msgid "high queue position" msgstr "high queue position" msgid "Today" msgstr "Today" msgid "Yesterday" msgstr "Yesterday" msgid "Select..." msgstr "Select..." msgid "Show tracks..." msgstr "Show tracks..." msgid "Add tracks from playlist" msgstr "Add tracks from playlist" msgid "Current position" msgstr "Current position" msgid "by" msgstr "by" msgid "to" msgstr "to" msgid "Remove criterion" msgstr "Remove criterion" msgid "Add criterion" msgstr "Add criterion" #, c-format msgid "Tracks included to \"%s\"" msgstr "Tracks included to “%s”" #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Tracks excluded from “%s”" msgid "Saved selections" msgstr "Saved selections" #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Search for %s matching %s of the following criteria:" msgid "tracks|albums" msgstr "tracks|albums" msgid "all|any|none" msgstr "all|any|none" msgid "Close" msgstr "Close" #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "" "Do you want to save your modifications to the music selection “%s”?" msgid "Music selection modified" msgstr "Music selection modified" #, c-format msgid "Edit music selection \"%s\"" msgstr "Edit music selection “%s”" #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Do you really want to delete the music selection “%s”?" msgid "Delete music selection" msgstr "Delete music selection" #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Do you really want to delete the %i selected music selections?" msgid "Delete music selections" msgstr "Delete music selections" #, c-format msgid "No matches found for \"%s\"." msgstr "No matches found for “%s”." #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "" "Do you want to remove the selected track(s) from the music selection “" "%s”?" #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "" "Do you want to add the selected track(s) to the music selection “%s”?" msgid "70's music" msgstr "70's music" msgid "Worst rated" msgstr "Worst rated" msgid "Top rated" msgstr "Top rated" msgid "Top 20" msgstr "Top 20" msgid "Recently played" msgstr "Recently played" msgid "Played today" msgstr "Played today" msgid "Random selection" msgstr "Random selection" msgid "Tracks in queue" msgstr "Tracks in queue" msgid "Untitled Music selection" msgstr "Untitled Music selection" #, c-format msgid "No matches in \"%s\"" msgstr "No matches in “%s”" #, c-format msgid "1 match in \"%s\"" msgstr "1 match in “%s”" #, c-format msgid "%s matches in \"%s\"" msgstr "%s matches in “%s”" msgid "No matches" msgstr "No matches" msgid "1 match" msgstr "1 match" #, c-format msgid "%s matches" msgstr "%s matches" msgid "Search single words" msgstr "Search single words" msgid "Lookup genre on simple search" msgstr "Lookup genre on simple search" msgid "Search while typing" msgstr "Search while typing" msgid "Save modified music selections" msgstr "Save modified music selections" msgid "Ask" msgstr "Ask" msgid "Max. history size" msgstr "Max. history size" #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Search for “%s” in “%s”" #, c-format msgid "Search for \"%s\"" msgstr "Search for “%s”" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgid "<Abstract>" msgstr "<Abstract>" msgid "(Default)" msgstr "(Default)" msgid "Paste image from clipboard" msgstr "Paste image from clipboard" msgid "Browse" msgstr "Browse" msgid "Select cover" msgstr "Select cover" msgid "Search covers on the web" msgstr "Search covers on the web" msgid "Don't rotate" msgstr "Don't rotate" msgid "Rotate/flip" msgstr "Rotate/flip" msgid "Use default images..." msgstr "Use default images..." msgid "Effects/options" msgstr "Effects/options" msgid "Select image" msgstr "Select image" msgid "Save cover" msgstr "Save cover" msgid "Reset all selected alternative images to their default value?" msgstr "Reset all selected alternative images to their default value?" msgid "Search paths" msgstr "Search paths" msgid "The search paths are used for skins, language files and modules." msgstr "The search paths are used for skins, language files and modules." msgid "Add..." msgstr "Add..." msgid "Remove" msgstr "Remove" msgid "Please select the folder to add to the search paths." msgstr "Please select the folder to add to the search paths." msgid "Edit..." msgstr "Edit..." msgid "Command" msgstr "Command" msgid "Shortcut" msgstr "Shortcut" msgid "Option" msgstr "Option" msgid "Value" msgstr "Value" msgid "The following settings are for experienced users only." msgstr "The following settings are for experienced users only." msgid "Customize" msgstr "Customize" msgid "Reset selection" msgstr "Reset selection" #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgid "Shortcuts" msgstr "Shortcuts" msgid "Language" msgstr "Language" msgid "Show files with" msgstr "Show files with" msgid "Instance" msgstr "Instance" #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Use the command-line option --%s=<file> to change this." msgid "Index file" msgstr "Index file" msgid "RAM cache" msgstr "RAM cache" #, c-format msgid "avg. query time: %s" msgstr "avg. query time: %s" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synchronity" msgid "Fast" msgstr "Fast" msgid "Save but slower" msgstr "Save but slower" msgid "Very save and slow" msgstr "Very save and slow" msgid "Image cache" msgstr "Image cache" msgid "Use temporary directory" msgstr "Use temporary directory" msgid "Yes, load images asynchrony" msgstr "Yes, load images asynchrony" msgid "Yes, load images directly and avoid flickering" msgstr "Yes, load images directly and avoid flickering" #, c-format msgid "%i%% used for %i images" msgstr "%i%% used for %i images" msgid "Regard file changes" msgstr "Regard file changes" msgid "Advanced" msgstr "Advanced" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Please restart %s so that the changes can take effect." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Help-system" msgid "n/a" msgstr "n/a" msgid "Internal" msgstr "Internal" msgid "No credit." msgstr "No credit." #, c-format msgid "Credit: %i" msgstr "Credit: %i" msgid "Start" msgstr "Start" msgid "Functions" msgstr "Functions" msgid "Monitors" msgstr "Monitors" msgid "Virtual keyboard" msgstr "Virtual keyboard" msgid "Credit system" msgstr "Credit system" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke provides a so called “kiosk mode” which allows you to run " "the program\n" "full screen with a defined functionality." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Before you enter the kiosk mode by clicking on “Start”, make sure, you " "know how\n" "to exit again:" #, c-format msgid "Exit by hitting %s" msgstr "Exit by hitting %s" msgid "Exit by clicking into two different corners" msgstr "Exit by clicking into two different corners" msgid "Try to set exclusive" msgstr "Try to set exclusive" msgid "Ask for a password on exit" msgstr "Ask for a password on exit" msgid "Change password..." msgstr "Change password..." msgid "Exit action:" msgstr "Exit action:" msgid "Start the kiosk mode with the following functionality:" msgstr "Start the kiosk mode with the following functionality:" msgid "Play/pause" msgstr "Play/pause" msgid "Edit queue" msgstr "Edit queue" msgid "Toggle elements" msgstr "Toggle elements" msgid "Enqueue multiple tracks" msgstr "Enqueue multiple tracks" msgid "All functions" msgstr "All functions" #, c-format msgid "Limit tracks to the music selection %s" msgstr "Limit tracks to the music selection %s" msgid "Please enter the password again for verification." msgstr "Please enter the password again for verification." msgid "Overview:" msgstr "Overview:" msgid "Main window" msgstr "Main window" msgid "Monitor" msgstr "Monitor" msgid "Disable screensaver" msgstr "Disable screensaver" msgid "Disable power management" msgstr "Disable power management" msgid "For more complex layouts, please refer to the command line options." msgstr "For more complex layouts, please refer to the command line options." msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgid "Use the virtual keyboard" msgstr "Use the virtual keyboard" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Also use the virtual keyboard outside the kiosk mode" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(please click into the text control)" msgid "Virtual keyboard layout:" msgstr "Virtual keyboard layout:" msgid "Colour:" msgstr "Colour:" msgid "Black" msgstr "Black" msgid "White" msgstr "White" msgid "Transparency:" msgstr "Transparency:" msgid "Hide cursor" msgstr "Hide cursor" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgid "Use Numpad controls" msgstr "Use Numpad controls" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Also use Numpad controls outside the kiosk mode" msgid "Keys:" msgstr "Keys:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgid "Use credit system" msgstr "Use credit system" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "Credits may be added by DDE, command line or shortcuts" msgid "Keys..." msgstr "Keys..." msgid "Remember credits between program starts" msgstr "Remember credits between program starts" msgid "Current credit:" msgstr "Current credit:" msgid "Please enter your password to exit the kiosk mode." msgstr "Please enter your password to exit the kiosk mode." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Too many tracks in queue,\n" "please try again later." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "This track is already in queue,\n" "please try again later." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" "This track or artist was just played,\n" "please try again later." msgid "Maintenance password" msgstr "Maintenance password" msgid "Exit kiosk mode" msgstr "Exit kiosk mode" msgid "Start kiosk mode" msgstr "Start kiosk mode" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Password:" msgid "Invalid password. Please try again." msgstr "Invalid password. Please try again." msgid "Invalid track number" msgstr "Invalid track number" msgid "Action:" msgstr "Action:" msgid "Shutdown computer" msgstr "Shutdown computer" msgid "Reboot computer" msgstr "Reboot computer" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" "No virtual keyboard found, please add the *.sjk files to the search paths." #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "An album must have at least %s tracks with corresponding %s." msgid "artist/album" msgstr "artist/album" msgid "artist/album or genre" msgstr "artist/album or genre" msgid "directory" msgstr "directory" #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Compilations may contain up to %s tracks of the same artist." msgid "Separate the words using commas, case is ignored" msgstr "Separate the words using commas, case is ignored" msgid "Sort by:" msgstr "Sort by:" msgid "Stop-words for sorting artists:" msgstr "Stop-words for sorting artists:" msgid "Stop-words for sorting albums:" msgstr "Stop-words for sorting albums:" msgid "Show stop-words words at end" msgstr "Show stop-words words at end" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "If selected, eg. “The Rolling Stones” becomes “Rolling Stones, " "The”;\n" "sorting itself is not affected by this option" msgid "Keywords to identify cover image for an album:" msgstr "Keywords to identify cover image for an album:" msgid "Double click on covers" msgstr "Double click on covers" msgid "Select/play album" msgstr "Select/play album" msgid "Combine tracks to albums" msgstr "Combine tracks to albums" msgid "Updating genres..." msgstr "Updating genres..." msgid "Updating groups..." msgstr "Updating groups..." msgid "Combining tracks to albums..." msgstr "Combining tracks to albums..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Do you want to add the following folder(s) to your music library?" #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Yes, leave the image in “%s”" #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Yes, copy the image to “%s”" #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Do you want to use the given image as the cover for “%s”?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "" "“%s” is not in your music library and cannot be edited therefore." #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s tracks on %s albums found for “%s”" #, c-format msgid "%s tracks on %s albums" msgstr "%s tracks on %s albums" msgid "Albums" msgstr "Albums" msgid "All albums" msgstr "All albums" msgid "Unsorted tracks" msgstr "Unsorted tracks" #, c-format msgid "Disk %i" msgstr "Disk %i" msgid "O:" msgstr "O:" msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Stop prelistening" #, c-format msgid "Prelisten \"%s\"" msgstr "Prelisten “%s”" #, c-format msgid "Enqueue \"%s\"" msgstr "Enqueue “%s”" #, c-format msgid "Play \"%s\" now" msgstr "Play “%s” now" #, c-format msgid "Play \"%s\" next" msgstr "Play “%s” next" #, c-format msgid "Unqueue \"%s\"" msgstr "Unqueue “%s”" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "Enqueue %i track" msgstr[1] "Enqueue %i tracks" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Play %i track now" msgstr[1] "Play %i tracks now" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Play %i track next" msgstr[1] "Play %i tracks next" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Unqueue %i track" msgstr[1] "Unqueue %i tracks" #, c-format msgid "\"%s\" on the web" msgstr "“%s” on the web" #, c-format msgid "Average rating: %s" msgstr "Average rating: %s" #, c-format msgid "Rating: %s" msgstr "Rating: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Do you want to change the rating for %i selected track?" msgstr[1] "Do you want to change the rating for %i selected tracks?" msgid "Change rating" msgstr "Change rating" msgid "Click to select all tracks of this album, double-click to play them" msgstr "Click to select all tracks of this album, double-click to play them" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "Click to select all tracks of this artists, double-click to play them" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "Click to select all tracks of this disk, double-click to play them" #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Double-click to enqueue “%s”" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Do you want to enqueue %i selected track?" msgstr[1] "Do you want to enqueue %i selected tracks?" msgid "Size" msgstr "Size" msgid "Gain" msgstr "Gain" msgid "Read music-files from the following folders and sources:" msgstr "Read music-files from the following folders and sources:" msgid "Read music-files from the following sources:" msgstr "Read music-files from the following sources:" msgid "Add source" msgstr "Add source" msgid "Remove source" msgstr "Remove source" msgid "Options" msgstr "Options" msgid "Supported file types" msgstr "Supported file types" msgid "Music library" msgstr "Music library" #, c-format msgid "Options for \"%s\"" msgstr "Options for “%s”" msgid "Options..." msgstr "Options..." msgid "Jukebox" msgstr "Jukebox" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "Please select a playlist, some files or enter a streaming URL" msgid "Append to current playlist" msgstr "Append to current playlist" msgid "Volume control" msgstr "Volume control" msgid "Play all tracks of an album with the same volume" msgstr "Play all tracks of an album with the same volume" msgid "Desired volume:" msgstr "Desired volume:" msgid "Max. gain:" msgstr "Max. gain:" msgid "Current volume:" msgstr "Current volume:" msgid "Fading" msgstr "Fading" msgid "Crossfading" msgstr "Crossfading" msgid "Manual crossfades:" msgstr "Manual crossfades:" msgid "Automatic crossfades:" msgstr "Automatic crossfades:" msgid "Offset to end:" msgstr "Offset to end:" msgid "No crossfades between subsequent tracks of the same album" msgstr "No crossfades between subsequent tracks of the same album" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Only fade out the old track, the new track starts with full volume" msgid "Resume" msgstr "Resume" msgid "Jingles" msgstr "Jingles" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "The following options define the behaviour of the queue. For the “shuffle " "intensity”,\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Kiosk mode: Allow max. %i track waiting in queue" msgstr[1] "Kiosk mode: Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Kiosk mode: Avoid double tracks waiting in queue" #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "Avoid boredom: No track repetition within %i minutes" #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "Avoid boredom: No artist repetition within %i minutes" msgid "Shuffle intensity:" msgstr "Shuffle intensity:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgid "Restore queue" msgstr "Restore queue" msgid "Restore already played tracks" msgstr "Restore already played tracks" msgid "Start playback from last position" msgstr "Start playback from last position" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "AutoPlay: If the playlist is empty, wait %i minutes;" #, c-format msgid "then, play %i tracks from the %s" msgstr "then, play %i tracks from the %s" msgid "Ignore tracks from the music selection" msgstr "Ignore tracks from the music selection" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "Manually enqueued tracks interrupt AutoPlay immediately" msgid "Sleep mode:" msgstr "Sleep mode:" msgid "Stop playback" msgstr "Stop playback" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgid "minutes|o'clock" msgstr "minutes|o'clock" #, c-format msgid "Before this, fade out %i seconds" msgstr "Before this, fade out %i seconds" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgid "If the jukebox is playing, about every" msgstr "If the jukebox is playing, about every" msgid "minutes," msgstr "minutes," msgid "play a track from the music selection" msgstr "play a track from the music selection" msgid "At" msgstr "At" msgid "o'clock," msgstr "o'clock," msgid "Daily" msgstr "Daily" msgid "Wait for end of playing track" msgstr "Wait for end of playing track" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Go to current track after %i minutes of inactivity" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Reset view after %i minutes of inactivity to" #, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Open video screen after %i minutes of inactivity" #, c-format msgid "Close video screen after %i minutes" msgstr "Close video screen after %i minutes" #, c-format msgid "Limit play time to %i seconds" msgstr "Limit play time to %i seconds" msgid "Read folders:" msgstr "Read folders:" msgid "Read file:" msgstr "Read file:" msgid "Ignore music-files and images with the following extensions:" msgstr "Ignore music-files and images with the following extensions:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "(separate the extensions using the comma, case is ignored)" msgid "Include folder to the update process" msgstr "Include folder to the update process" msgid "Read hidden files" msgstr "Read hidden files" msgid "Read hidden folders" msgstr "Read hidden folders" msgid "Read inside ZIP-/TAR-archives" msgstr "Read inside ZIP-/TAR-archives" msgid "Read (ID3)-tags" msgstr "Read (ID3)-tags" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "Path and file pattern for track-information if (ID3-)tags are missing:" msgid "Placeholders:" msgstr "Placeholders:" msgid "Read files and folders" msgstr "Read files and folders" msgid "Add a folder to search for music-files" msgstr "Add a folder to search for music-files" msgid "Add a single music-file" msgstr "Add a single music-file" msgid "Disabled" msgstr "Disabled" msgid "No update" msgstr "No update" #, c-format msgid "Remove \"%s\" from the music library?" msgstr "Remove “%s” from the music library?" msgid "Select a folder with music-files" msgstr "Select a folder with music-files" msgid "Select music-file" msgstr "Select music-file" msgid "Unknown track" msgstr "Unknown track" msgid "Unknown artist" msgstr "Unknown artist" msgid "Add a server containing music-files" msgstr "Add a server containing music-files" msgid "Use server:" msgstr "Use server:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Type" msgid "Login name:" msgstr "Login name:" msgid "Include server to the update process" msgstr "Include server to the update process" msgid "Configuration file" msgstr "Configuration file" #, c-format msgid "Loading %s" msgstr "Loading %s" #, c-format msgid "Error %i" msgstr "Error %i" msgid "Edit track" msgstr "Edit track" msgid "of" msgstr "of" msgid "Write (ID3-)tags" msgstr "Write (ID3-)tags" msgid "File names" msgstr "File names" #, c-format msgid "Show all %s file names..." msgstr "Show all %s file names..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "The shown values are the sum or the average of all single values in the " "given files." msgid "Track" msgstr "Track" msgid "Further information" msgstr "Further information" msgid "URL" msgstr "URL" msgid "Temporary directory" msgstr "Temporary directory" msgid "Further information..." msgstr "Further information..." #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Cannot rename “%s” to “%s”." msgid "Server name" msgstr "Server name" msgid "Query online database" msgstr "Query online database" msgid "more..." msgstr "more..." msgid "Please select one of the following albums:" msgstr "Please select one of the following albums:" msgid "Old file name" msgstr "Old file name" msgid "New file name" msgstr "New file name" msgid "Field" msgstr "Field" msgid "Old value" msgstr "Old value" msgid "New value" msgstr "New value" msgid "<empty>" msgstr "<empty>" msgid "Confirm modifications" msgstr "Confirm modifications" msgid "Delete empty folders" msgstr "Delete empty folders" msgid "Please confirm or edit the following modification:" msgstr "Please confirm or edit the following modification:" #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Please confirm or edit the following %s modifications:" msgid "(lower case)" msgstr "(lower case)" msgid "(upper case)" msgstr "(upper case)" msgid "(n characters)" msgstr "(n characters)" msgid "Rename files" msgstr "Rename files" msgid "Pattern:" msgstr "Pattern:" msgid "Artist (first character)" msgstr "Artist (first character)" msgid "Album (first character)" msgstr "Album (first character)" msgid "Genre (first character)" msgstr "Genre (first character)" msgid "Group (first character)" msgstr "Group (first character)" msgid "Year (4 characters)" msgstr "Year (4 characters)" msgid "Year (2 characters)" msgstr "Year (2 characters)" msgid "Duration (5 characters)" msgstr "Duration (5 characters)" msgid "Directory change" msgstr "Directory change" msgid "File name (8 characters)" msgstr "File name (8 characters)" msgid "File extension" msgstr "File extension" msgid "Example:" msgstr "Example:" msgid "Replace" msgstr "Replace" msgid "Search for:" msgstr "Search for:" msgid "in:" msgstr "in:" msgid "All fields" msgstr "All fields" msgid "Path and file name" msgstr "Path and file name" msgid "Replace with:" msgstr "Replace with:" msgid "Match whole words only" msgstr "Match whole words only" msgid "Match case" msgstr "Match case" msgid "Regular expression" msgstr "Regular expression" #, c-format msgid "\"%s\" not found." msgstr "“%s” not found." msgid "Split field" msgstr "Split field" msgid "Field to split:" msgstr "Field to split:" msgid "Destination fields and pattern:" msgstr "Destination fields and pattern:" msgid "Track number (1 character)" msgstr "Track number (1 character)" msgid "Track number (2 characters)" msgstr "Track number (2 characters)" msgid "Disk number (1 character)" msgstr "Disk number (1 character)" msgid "Disk number (2 characters)" msgstr "Disk number (2 characters)" msgid "Void information" msgstr "Void information" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "With different skins you can change the “look and feel” of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgid "Name" msgstr "Name" msgid "Info..." msgstr "Info..." msgid "Update list" msgstr "Update list" msgid "More skins on the web..." msgstr "More skins on the web..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the “+” " "or “-” keys), both\n" "sizes will grow or shrink proportionally." msgid "Font:" msgstr "Font:" msgid "Font size:" msgstr "Font size:" msgid "Use this font for dialogs, too" msgstr "Use this font for dialogs, too" msgid "Column width:" msgstr "Column width:" msgid "Cover size:" msgstr "Cover size:" msgid "No lyrics found." msgstr "No lyrics found." msgid "Karaoke Prompt" msgstr "Karaoke Prompt" #, c-format msgid "No images found in \"%s\"." msgstr "No images found in “%s”." msgid "Background" msgstr "Background" #, c-format msgid "Use %s-files" msgstr "Use %s-files" msgid "Please select a directory with images" msgstr "Please select a directory with images" msgid "If appropriate, switch over automatically" msgstr "If appropriate, switch over automatically" msgid "Half size" msgstr "Half size" msgid "Spectrum Monitor" msgstr "Spectrum Monitor" msgid "Show spectrum" msgstr "Show spectrum" msgid "Show oscilloscope" msgstr "Show oscilloscope" msgid "Show starfield" msgstr "Show starfield" msgid "Show other figures" msgstr "Show other figures" msgid "Visualization" msgstr "Visualization" msgid "Video output" msgstr "Video output" msgid "Search homepage" msgstr "Search homepage" #, c-format msgid "Lyrics on %s" msgstr "Lyrics on %s" #, c-format msgid "Search with %s" msgstr "Search with %s" #, c-format msgid "Information on %s" msgstr "Information on %s" msgid "Object count:" msgstr "Object count:" msgid "Elapsed time:" msgstr "Elapsed time:" msgid "Message" msgstr "Message" msgid "Scope" msgstr "Scope" msgid "Console" msgstr "Console" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i message" msgstr[1] "%i messages" msgid "Evaluate" msgstr "Evaluate" msgid "Clear" msgstr "Clear" msgid "Open console on errors and warnings" msgstr "Open console on errors and warnings" msgid "Details" msgstr "Details" msgid "Clear all messages?" msgstr "Clear all messages?" #, c-format msgid "Overwrite \"%s\"?" msgstr "Overwrite “%s”?" msgid "Append" msgstr "Append" msgid "State" msgstr "State" #, c-format msgid "%s-files" msgstr "%s-files" #, c-format msgid "%s-audio" msgstr "%s-audio" #, c-format msgid "%s-images" msgstr "%s-images" #, c-format msgid "%s-video" msgstr "%s-video" #, c-format msgid "%s-playlists" msgstr "%s-playlists" msgid "Script-files" msgstr "Script-files" msgid "Silverjuke skin-files" msgstr "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Silverjuke jukebox-files" msgid "Archive-files" msgstr "Archive-files" msgid "Supported file-types" msgstr "Supported file-types" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programs" msgid "Cleanup index..." msgstr "Cleanup index..." msgid "max. size" msgstr "max. size" #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgid "Use maybe errorous objects?" msgstr "Use maybe errorous objects?" msgid "__DATE_TIME_LONG__" msgstr "__DATE_TIME_LONG__" msgid "__DATE_TIME_EDITABLE__" msgstr "__DATE_TIME_EDITABLE__" msgid "__DATE_LONG__" msgstr "__DATE_LONG__" msgid "__DATE_EDITABLE__" msgstr "__DATE_EDITABLE__" msgid "__DATE_SUNDAY_FIRST__" msgstr "__DATE_SUNDAY_FIRST__" msgid "__THIS_LANG__" msgstr "__THIS_LANG__" msgid "__COVER_SEARCH_URLS__" msgstr "__COVER_SEARCH_URLS__" msgid "__ARTIST_INFO_URLS__" msgstr "__ARTIST_INFO_URLS__" msgid "__STOP_ARTISTS__" msgstr "__STOP_ARTISTS__" msgid "__STOP_ALBUMS__" msgstr "__STOP_ALBUMS__" msgid "__COVER_KEYWORDS__" msgstr "__COVER_KEYWORDS__" msgid "__VIRT_KEYBD__" msgstr "__VIRT_KEYBD__" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "," #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i day" msgstr[1] "%i days" #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Invalid regular expression “%s”." msgid "Fatal error" msgstr "Fatal error" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Enlarge window" msgid "Shrink window" msgstr "Shrink window" msgid "Enlarge display" msgstr "Enlarge display" msgid "Shrink display" msgstr "Shrink display" msgid "Services" msgstr "Services" #, c-format msgid "Hide %s" msgstr "Hide %s" msgid "Hide Others" msgstr "Hide Others" msgid "Show All" msgstr "Show All" #, c-format msgid "Quit %s" msgstr "Quit %s" msgid "Extras" msgstr "Extras" msgid "Full screen" msgstr "Full screen" msgid "Modules on the web..." msgstr "Modules on the web..." msgid "Explore" msgstr "Explore" msgid "Reveal in Finder" msgstr "Reveal in Finder" #, c-format msgid "The file \"%s\" does not exist." msgstr "The file “%s” does not exist." #, c-format msgid "Cannot execute \"%s\"." msgstr "Cannot execute “%s”." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" "Please use the operating system to set Silverjuke to an exclusive mode." �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/en@quot.header�����������������������������������������������������������������0000664�0000000�0000000�00000002263�12660066715�0017205�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/en@quot.po���������������������������������������������������������������������0000664�0000000�0000000�00000154202�12660066715�0016374�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# English translations for silverjuke package. # Copyright (C) 2016 Bjoern Petersen Software Design and Development # This file is distributed under the same license as the silverjuke package. # Automatically generated, 2016. # # All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # msgid "" msgstr "" "Project-Id-Version: silverjuke 16.2.3\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2016-02-14 12:51+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en@quot\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" msgid "Sleep mode activated." msgstr "Sleep mode activated." msgid "Sleep mode deactivated." msgstr "Sleep mode deactivated." msgid "Play time exceeded" msgstr "Play time exceeded" msgid "Default" msgstr "Default" msgid "Device" msgstr "Device" msgid "Show covers" msgstr "Show covers" msgid "Duration" msgstr "Duration" msgid "Artist" msgstr "Artist" msgid "Original artist" msgstr "Original artist" msgid "Composer" msgstr "Composer" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Track number" msgid "Automatic track number" msgstr "Automatic track number" msgid "Disk number" msgstr "Disk number" msgid "Genre" msgstr "Genre" msgid "Year" msgstr "Year" msgid "Rating" msgstr "Rating" msgid "Comment" msgstr "Comment" msgid "Show double tracks" msgstr "Show double tracks" msgid "Show different artist names" msgstr "Show different artist names" msgid "Show different album names" msgstr "Show different album names" msgid "Show cover titles" msgstr "Show cover titles" #, c-format msgid "%s tracks" msgstr "%s tracks" msgid "Drag folders with music here." msgstr "Drag folders with music here." msgid "Reset to default values" msgstr "Reset to default values" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "AutoPlay" msgid "Shuffle" msgstr "Shuffle" msgid "Recreating music library" msgstr "Recreating music library" msgid "Updating music library" msgstr "Updating music library" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" "%s is currently playing. Do you want to stop the playing track and exit %s?" #, c-format msgid "Exit %s" msgstr "Exit %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Cannot open “%s”." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "Also install the script to “%s” for permanent use" #, c-format msgid "Execute the script \"%s\"?" msgstr "Execute the script “%s”?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgid "Search" msgstr "Search" msgid "On" msgstr "On" msgid "Off" msgstr "Off" msgid "Repeat playlist" msgstr "Repeat playlist" msgid "Repeat one" msgstr "Repeat one" msgid "Repeat all" msgstr "Repeat all" msgid "Select a track, then start playback." msgstr "Select a track, then start playback." msgid "Stop after this track" msgstr "Stop after this track" msgid "Stop after each track" msgstr "Stop after each track" msgid "Double click play tracks at once" msgstr "Double click play tracks at once" msgid "Start playback on first enqueue" msgstr "Start playback on first enqueue" msgid "Remove played tracks from queue" msgstr "Remove played tracks from queue" msgid "More from current album" msgstr "More from current album" msgid "More from current artist" msgstr "More from current artist" msgid "No more tracks." msgstr "No more tracks." #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "Remove %i track from the queue and stop playback?" msgstr[1] "Remove %i tracks from the queue and stop playback?" msgid "Clear playlist" msgstr "Clear playlist" msgid "Track played, click to reset" msgstr "Track played, click to reset" msgid "Boredom avoided: Track moved down" msgstr "Boredom avoided: Track moved down" msgid "Remove this track" msgstr "Remove this track" msgid "Toggle time mode" msgstr "Toggle time mode" #, c-format msgid "Go to \"%s\"" msgstr "Go to “%s”" msgid "End search" msgstr "End search" msgid "click right for options" msgstr "click right for options" msgid "Volume" msgstr "Volume" msgid "Double-click to enlarge the cover" msgstr "Double-click to enlarge the cover" #, c-format msgid "Close this window and exit %s" msgstr "Close this window and exit %s" msgid "Open main menu" msgstr "Open main menu" msgid "Toggle shuffle mode" msgstr "Toggle shuffle mode" msgid "Repeat all/repeat current" msgstr "Repeat all/repeat current" #, c-format msgid "Search in \"%s\"" msgstr "Search in “%s”" msgid "Help" msgstr "Help" msgid "Add folders and files" msgstr "Add folders and files" msgid "Extensions" msgstr "Extensions" msgid "Show remaining time" msgstr "Show remaining time" msgid "Show elapsed time" msgstr "Show elapsed time" msgid "Show total time" msgstr "Show total time" msgid "Show track number" msgstr "Show track number" msgid "Show artist name" msgstr "Show artist name" msgid "Show AutoPlay" msgstr "Show AutoPlay" msgid "Prefer album- to track-cover" msgstr "Prefer album- to track-cover" msgid "Display" msgstr "Display" msgid "Columns" msgstr "Columns" msgid "Same zoom in all views" msgstr "Same zoom in all views" msgid "Fonts and covers" msgstr "Fonts and covers" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Skins" msgid "Start kiosk mode..." msgstr "Start kiosk mode..." #, c-format msgid "%s on the web" msgstr "%s on the web" msgid "All files" msgstr "All files" #, c-format msgid "About %s" msgstr "About %s" msgid "File" msgstr "File" msgid "Edit" msgstr "Edit" msgid "View" msgstr "View" msgid "Playback" msgstr "Playback" msgid "Video screen" msgstr "Video screen" msgid "Kiosk mode" msgstr "Kiosk mode" msgid "None" msgstr "None" msgid "Further options" msgstr "Further options" msgid "Queue" msgstr "Queue" msgid "Automatic control" msgstr "Automatic control" msgid "Current view" msgstr "Current view" #, c-format msgid "Next track from \"%s\"" msgstr "Next track from “%s”" msgid "Next track" msgstr "Next track" msgid "Search for genre" msgstr "Search for genre" msgid "Search for music selection" msgstr "Search for music selection" msgid "Edit tracks/Get info" msgstr "Edit tracks/Get info" msgid "Show file" msgstr "Show file" msgid "Cover editor" msgstr "Cover editor" msgid "Mix" msgstr "Mix" msgid "Left channel" msgstr "Left channel" msgid "Right channel" msgstr "Right channel" msgid "Explicit output" msgstr "Explicit output" msgid "Prelisten" msgstr "Prelisten" msgid "No" msgstr "No" msgid "Yes" msgstr "Yes" msgid "Only initialize system volume" msgstr "Only initialize system volume" msgid "Output" msgstr "Output" msgid "Use system volume" msgstr "Use system volume" msgid "Several artists" msgstr "Several artists" msgid "Unknown title" msgstr "Unknown title" msgid "Save playlist" msgstr "Save playlist" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Cannot write “%s”." msgid "Open playlist" msgstr "Open playlist" msgid "Title" msgstr "Title" msgid "Track count" msgstr "Track count" msgid "Disk count" msgstr "Disk count" msgid "Group" msgstr "Group" msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Channels" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "File name" msgid "File size" msgstr "File size" msgid "Date added" msgstr "Date added" msgid "Date modified" msgstr "Date modified" msgid "Last played" msgstr "Last played" msgid "Play count" msgstr "Play count" msgid "SQL expression" msgstr "SQL expression" msgid "Limit result to" msgstr "Limit result to" msgid "Title/artist/album" msgstr "Title/artist/album" msgid "File type" msgstr "File type" msgid "Queue position" msgstr "Queue position" msgid "Include tracks" msgstr "Include tracks" msgid "Exclude tracks" msgstr "Exclude tracks" msgid "Random" msgstr "Random" #, c-format msgid "Press \"%s\" in the main window" msgstr "Press “%s” in the main window" msgid "Insert" msgstr "Insert" msgid "Del" msgstr "Del" msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Please enter the date as “dd.mm.yyyy”, you can also add “hh:mm” for the time." msgid "Please enter the text." msgstr "Please enter the text." msgid "Please enter a value." msgstr "Please enter a value." msgid "Please enter a valid value." msgstr "Please enter a valid value." msgid "(second field)" msgstr "(second field)" msgid "No valid criteria defined." msgstr "No valid criteria defined." msgid "The search cannot be started; please check the following fields:" msgstr "The search cannot be started; please check the following fields:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "Note: The operators “equal” and “unequal” are case-sensitive." #, c-format msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Do you want to execute the scripts embedded in the skin “%s”?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Cancel" msgid "Page left" msgstr "Page left" msgid "Page right" msgstr "Page right" msgid "Page up" msgstr "Page up" msgid "Page down" msgstr "Page down" msgid "Menu" msgstr "Menu" msgid "Cursor left" msgstr "Cursor left" msgid "Cursor right" msgstr "Cursor right" msgid "Cursor up" msgstr "Cursor up" msgid "Cursor down" msgstr "Cursor down" msgid "Line left" msgstr "Line left" msgid "Line right" msgstr "Line right" msgid "Line up" msgstr "Line up" msgid "Line down" msgstr "Line down" msgid "Home" msgstr "Home" msgid "End" msgstr "End" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Delete" msgid "Album view" msgstr "Album view" msgid "Cover view" msgstr "Cover view" msgid "List view" msgstr "List view" msgid "Toggle view" msgstr "Toggle view" msgid "Open playlist..." msgstr "Open playlist..." msgid "Unqueue marked tracks" msgstr "Unqueue marked tracks" msgid "Unqueue all but marked tracks" msgstr "Unqueue all but marked tracks" msgid "Save playlist..." msgstr "Save playlist..." msgid "Paste" msgstr "Paste" msgid "Music selection..." msgstr "Music selection..." msgid "Settings" msgstr "Settings" msgid "Update music library" msgstr "Update music library" msgid "Recreate music library" msgstr "Recreate music library" msgid "Enqueue tracks" msgstr "Enqueue tracks" msgid "Play tracks next" msgstr "Play tracks next" msgid "Play tracks now" msgstr "Play tracks now" msgid "Volume up" msgstr "Volume up" msgid "Volume down" msgstr "Volume down" msgid "Unqueue tracks" msgstr "Unqueue tracks" msgid "Edit tracks/Get info..." msgstr "Edit tracks/Get info..." msgid "Play" msgstr "Play" msgid "Pause" msgstr "Pause" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Previous track" msgid "Seek backward" msgstr "Seek backward" msgid "Seek forward" msgstr "Seek forward" msgid "Fade to next" msgstr "Fade to next" msgid "Mute" msgstr "Mute" msgid "Reload skin" msgstr "Reload skin" msgid "Toggle video screen" msgstr "Toggle video screen" msgid "Smooth" msgstr "Smooth" msgid "Select all" msgstr "Select all" msgid "Zoom in" msgstr "Zoom in" msgid "Zoom out" msgstr "Zoom out" msgid "Normal zoom" msgstr "Normal zoom" msgid "Always on top" msgstr "Always on top" msgid "Go to current track" msgstr "Go to current track" msgid "Go to marked track" msgstr "Go to marked track" msgid "Go to random album" msgstr "Go to random album" msgid "Go to previous letter" msgstr "Go to previous letter" msgid "Go to next letter" msgstr "Go to next letter" msgid "Add credit" msgstr "Add credit" msgid "Console..." msgstr "Console..." msgid "Replace..." msgstr "Replace..." msgid "Split field..." msgstr "Split field..." msgid "Rename files..." msgstr "Rename files..." msgid "Query online database..." msgstr "Query online database..." msgid "New music selection..." msgstr "New music selection..." msgid "Save" msgstr "Save" msgid "Save as..." msgstr "Save as..." msgid "Rename..." msgstr "Rename..." msgid "Revert to saved" msgstr "Revert to saved" msgid "Open file..." msgstr "Open file..." msgid "Save cover..." msgstr "Save cover..." msgid "Rotate left" msgstr "Rotate left" msgid "Rotate right" msgstr "Rotate right" msgid "Flip horizontally" msgstr "Flip horizontally" msgid "Flip vertically" msgstr "Flip vertically" msgid "Grayscale" msgstr "Grayscale" msgid "Negative" msgstr "Negative" msgid "Fit to screen" msgstr "Fit to screen" msgid "Decrease brightness" msgstr "Decrease brightness" msgid "Increase brightness" msgstr "Increase brightness" msgid "Decrease contrast" msgstr "Decrease contrast" msgid "Increase contrast" msgstr "Increase contrast" msgid "Normal brightness/contrast" msgstr "Normal brightness/contrast" msgid "Crop" msgstr "Crop" msgid "Please press the shortcut to add." msgstr "Please press the shortcut to add." msgid "System-wide:" msgstr "System-wide:" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Remove shortcut “%s”" msgid "Add system-wide shortcut..." msgstr "Add system-wide shortcut..." #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Add shortcut to “%s”..." #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "The shortcut “%s” is currently assigned to the command “%s”.\n" "\n" "Do you want to assign it to the shortcut “%s” now?" msgid "Mouse" msgstr "Mouse" msgid "Drag window content" msgstr "Drag window content" msgid "Left mouse button" msgstr "Left mouse button" msgid "Drag selected tracks" msgstr "Drag selected tracks" msgid "Second click with the left mouse button" msgstr "Second click with the left mouse button" msgid "Show icons beside mouse cursor" msgstr "Show icons beside mouse cursor" msgid "Middle mouse button" msgstr "Middle mouse button" msgid "Edit tracks" msgstr "Edit tracks" msgid "Tooltips" msgstr "Tooltips" msgid "Mouse wheel" msgstr "Mouse wheel" msgid "Scroll horizontally in album view" msgstr "Scroll horizontally in album view" msgid "Modifier key toggles axis" msgstr "Modifier key toggles axis" msgid "Right mouse button toggles axis" msgstr "Right mouse button toggles axis" msgid "Modify volume, scrollbars, letters etc." msgstr "Modify volume, scrollbars, letters etc." msgid "Use multimedia keyboard keys" msgstr "Use multimedia keyboard keys" msgid "Ask on close if playing" msgstr "Ask on close if playing" msgid "Ask before enqueuing multiple tracks" msgstr "Ask before enqueuing multiple tracks" msgid "Ask before clearing the playlist" msgstr "Ask before clearing the playlist" msgid "Ask before changing the rating" msgstr "Ask before changing the rating" #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Backspace" msgid "Space" msgstr "Space" msgid "Up" msgstr "Up" msgid "Left" msgstr "Left" msgid "Right" msgstr "Right" msgid "Down" msgstr "Down" msgid "Print" msgstr "Print" msgid "Ins" msgstr "Ins" msgid "Music selection" msgstr "Music selection" msgid "Numpad" msgstr "Numpad" msgid "Select date and time" msgstr "Select date and time" msgid "Time" msgstr "Time" msgid "contains" msgstr "contains" msgid "does not contain" msgstr "does not contain" msgid "starts with" msgstr "starts with" msgid "does not start with" msgstr "does not start with" msgid "starts simelar to" msgstr "starts simelar to" msgid "ends with" msgstr "ends with" msgid "does not end with" msgstr "does not end with" msgid "on" msgstr "on" msgid "is equal to" msgstr "is equal to" msgid "not on" msgstr "not on" msgid "is unequal to" msgstr "is unequal to" msgid "is simelar to" msgstr "is simelar to" msgid "is after" msgstr "is after" msgid "is greater than" msgstr "is greater than" msgid "is on or after" msgstr "is on or after" msgid "is greater or equal" msgstr "is greater or equal" msgid "is before" msgstr "is before" msgid "is less than" msgstr "is less than" msgid "is on or before" msgstr "is on or before" msgid "is less or equal" msgstr "is less or equal" msgid "is in the last" msgstr "is in the last" msgid "is not in the last" msgstr "is not in the last" msgid "is in the period" msgstr "is in the period" msgid "is in range" msgstr "is in range" msgid "is not in the period" msgstr "is not in the period" msgid "is not in range" msgstr "is not in range" msgid "is set" msgstr "is set" msgid "is unset" msgstr "is unset" msgid "tracks" msgstr "tracks" msgid "albums" msgstr "albums" msgid "minutes" msgstr "minutes" msgid "hours" msgstr "hours" msgid "seconds" msgstr "seconds" msgid "days" msgstr "days" msgid "No rating" msgstr "No rating" msgid "random" msgstr "random" msgid "highest rating" msgstr "highest rating" msgid "lowest rating" msgstr "lowest rating" msgid "most often played" msgstr "most often played" msgid "least often played" msgstr "least often played" msgid "most recently played" msgstr "most recently played" msgid "least recently played" msgstr "least recently played" msgid "most recently added" msgstr "most recently added" msgid "least recently added" msgstr "least recently added" msgid "most recently modified" msgstr "most recently modified" msgid "least recently modified" msgstr "least recently modified" msgid "most recently released" msgstr "most recently released" msgid "least recently released" msgstr "least recently released" msgid "low queue position" msgstr "low queue position" msgid "high queue position" msgstr "high queue position" msgid "Today" msgstr "Today" msgid "Yesterday" msgstr "Yesterday" msgid "Select..." msgstr "Select..." msgid "Show tracks..." msgstr "Show tracks..." msgid "Add tracks from playlist" msgstr "Add tracks from playlist" msgid "Current position" msgstr "Current position" msgid "by" msgstr "by" msgid "to" msgstr "to" msgid "Remove criterion" msgstr "Remove criterion" msgid "Add criterion" msgstr "Add criterion" #, c-format msgid "Tracks included to \"%s\"" msgstr "Tracks included to “%s”" #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Tracks excluded from “%s”" msgid "Saved selections" msgstr "Saved selections" #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Search for %s matching %s of the following criteria:" msgid "tracks|albums" msgstr "tracks|albums" msgid "all|any|none" msgstr "all|any|none" msgid "Close" msgstr "Close" #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Do you want to save your modifications to the music selection “%s”?" msgid "Music selection modified" msgstr "Music selection modified" #, c-format msgid "Edit music selection \"%s\"" msgstr "Edit music selection “%s”" #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Do you really want to delete the music selection “%s”?" msgid "Delete music selection" msgstr "Delete music selection" #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Do you really want to delete the %i selected music selections?" msgid "Delete music selections" msgstr "Delete music selections" #, c-format msgid "No matches found for \"%s\"." msgstr "No matches found for “%s”." #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "" "Do you want to remove the selected track(s) from the music selection “%s”?" #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "Do you want to add the selected track(s) to the music selection “%s”?" msgid "70's music" msgstr "70's music" msgid "Worst rated" msgstr "Worst rated" msgid "Top rated" msgstr "Top rated" msgid "Top 20" msgstr "Top 20" msgid "Recently played" msgstr "Recently played" msgid "Played today" msgstr "Played today" msgid "Random selection" msgstr "Random selection" msgid "Tracks in queue" msgstr "Tracks in queue" msgid "Untitled Music selection" msgstr "Untitled Music selection" #, c-format msgid "No matches in \"%s\"" msgstr "No matches in “%s”" #, c-format msgid "1 match in \"%s\"" msgstr "1 match in “%s”" #, c-format msgid "%s matches in \"%s\"" msgstr "%s matches in “%s”" msgid "No matches" msgstr "No matches" msgid "1 match" msgstr "1 match" #, c-format msgid "%s matches" msgstr "%s matches" msgid "Search single words" msgstr "Search single words" msgid "Lookup genre on simple search" msgstr "Lookup genre on simple search" msgid "Search while typing" msgstr "Search while typing" msgid "Save modified music selections" msgstr "Save modified music selections" msgid "Ask" msgstr "Ask" msgid "Max. history size" msgstr "Max. history size" #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Search for “%s” in “%s”" #, c-format msgid "Search for \"%s\"" msgstr "Search for “%s”" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgid "<Abstract>" msgstr "<Abstract>" msgid "(Default)" msgstr "(Default)" msgid "Paste image from clipboard" msgstr "Paste image from clipboard" msgid "Browse" msgstr "Browse" msgid "Select cover" msgstr "Select cover" msgid "Search covers on the web" msgstr "Search covers on the web" msgid "Don't rotate" msgstr "Don't rotate" msgid "Rotate/flip" msgstr "Rotate/flip" msgid "Use default images..." msgstr "Use default images..." msgid "Effects/options" msgstr "Effects/options" msgid "Select image" msgstr "Select image" msgid "Save cover" msgstr "Save cover" msgid "Reset all selected alternative images to their default value?" msgstr "Reset all selected alternative images to their default value?" msgid "Search paths" msgstr "Search paths" msgid "The search paths are used for skins, language files and modules." msgstr "The search paths are used for skins, language files and modules." msgid "Add..." msgstr "Add..." msgid "Remove" msgstr "Remove" msgid "Please select the folder to add to the search paths." msgstr "Please select the folder to add to the search paths." msgid "Edit..." msgstr "Edit..." msgid "Command" msgstr "Command" msgid "Shortcut" msgstr "Shortcut" msgid "Option" msgstr "Option" msgid "Value" msgstr "Value" msgid "The following settings are for experienced users only." msgstr "The following settings are for experienced users only." msgid "Customize" msgstr "Customize" msgid "Reset selection" msgstr "Reset selection" #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgid "Shortcuts" msgstr "Shortcuts" msgid "Language" msgstr "Language" msgid "Show files with" msgstr "Show files with" msgid "Instance" msgstr "Instance" #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Use the command-line option --%s=<file> to change this." msgid "Index file" msgstr "Index file" msgid "RAM cache" msgstr "RAM cache" #, c-format msgid "avg. query time: %s" msgstr "avg. query time: %s" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synchronity" msgid "Fast" msgstr "Fast" msgid "Save but slower" msgstr "Save but slower" msgid "Very save and slow" msgstr "Very save and slow" msgid "Image cache" msgstr "Image cache" msgid "Use temporary directory" msgstr "Use temporary directory" msgid "Yes, load images asynchrony" msgstr "Yes, load images asynchrony" msgid "Yes, load images directly and avoid flickering" msgstr "Yes, load images directly and avoid flickering" #, c-format msgid "%i%% used for %i images" msgstr "%i%% used for %i images" msgid "Regard file changes" msgstr "Regard file changes" msgid "Advanced" msgstr "Advanced" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Please restart %s so that the changes can take effect." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Help-system" msgid "n/a" msgstr "n/a" msgid "Internal" msgstr "Internal" msgid "No credit." msgstr "No credit." #, c-format msgid "Credit: %i" msgstr "Credit: %i" msgid "Start" msgstr "Start" msgid "Functions" msgstr "Functions" msgid "Monitors" msgstr "Monitors" msgid "Virtual keyboard" msgstr "Virtual keyboard" msgid "Credit system" msgstr "Credit system" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke provides a so called “kiosk mode” which allows you to run the " "program\n" "full screen with a defined functionality." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Before you enter the kiosk mode by clicking on “Start”, make sure, you know " "how\n" "to exit again:" #, c-format msgid "Exit by hitting %s" msgstr "Exit by hitting %s" msgid "Exit by clicking into two different corners" msgstr "Exit by clicking into two different corners" msgid "Try to set exclusive" msgstr "Try to set exclusive" msgid "Ask for a password on exit" msgstr "Ask for a password on exit" msgid "Change password..." msgstr "Change password..." msgid "Exit action:" msgstr "Exit action:" msgid "Start the kiosk mode with the following functionality:" msgstr "Start the kiosk mode with the following functionality:" msgid "Play/pause" msgstr "Play/pause" msgid "Edit queue" msgstr "Edit queue" msgid "Toggle elements" msgstr "Toggle elements" msgid "Enqueue multiple tracks" msgstr "Enqueue multiple tracks" msgid "All functions" msgstr "All functions" #, c-format msgid "Limit tracks to the music selection %s" msgstr "Limit tracks to the music selection %s" msgid "Please enter the password again for verification." msgstr "Please enter the password again for verification." msgid "Overview:" msgstr "Overview:" msgid "Main window" msgstr "Main window" msgid "Monitor" msgstr "Monitor" msgid "Disable screensaver" msgstr "Disable screensaver" msgid "Disable power management" msgstr "Disable power management" msgid "For more complex layouts, please refer to the command line options." msgstr "For more complex layouts, please refer to the command line options." msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgid "Use the virtual keyboard" msgstr "Use the virtual keyboard" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Also use the virtual keyboard outside the kiosk mode" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(please click into the text control)" msgid "Virtual keyboard layout:" msgstr "Virtual keyboard layout:" msgid "Colour:" msgstr "Colour:" msgid "Black" msgstr "Black" msgid "White" msgstr "White" msgid "Transparency:" msgstr "Transparency:" msgid "Hide cursor" msgstr "Hide cursor" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgid "Use Numpad controls" msgstr "Use Numpad controls" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Also use Numpad controls outside the kiosk mode" msgid "Keys:" msgstr "Keys:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgid "Use credit system" msgstr "Use credit system" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "Credits may be added by DDE, command line or shortcuts" msgid "Keys..." msgstr "Keys..." msgid "Remember credits between program starts" msgstr "Remember credits between program starts" msgid "Current credit:" msgstr "Current credit:" msgid "Please enter your password to exit the kiosk mode." msgstr "Please enter your password to exit the kiosk mode." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Too many tracks in queue,\n" "please try again later." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "This track is already in queue,\n" "please try again later." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" "This track or artist was just played,\n" "please try again later." msgid "Maintenance password" msgstr "Maintenance password" msgid "Exit kiosk mode" msgstr "Exit kiosk mode" msgid "Start kiosk mode" msgstr "Start kiosk mode" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Password:" msgid "Invalid password. Please try again." msgstr "Invalid password. Please try again." msgid "Invalid track number" msgstr "Invalid track number" msgid "Action:" msgstr "Action:" msgid "Shutdown computer" msgstr "Shutdown computer" msgid "Reboot computer" msgstr "Reboot computer" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" "No virtual keyboard found, please add the *.sjk files to the search paths." #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "An album must have at least %s tracks with corresponding %s." msgid "artist/album" msgstr "artist/album" msgid "artist/album or genre" msgstr "artist/album or genre" msgid "directory" msgstr "directory" #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Compilations may contain up to %s tracks of the same artist." msgid "Separate the words using commas, case is ignored" msgstr "Separate the words using commas, case is ignored" msgid "Sort by:" msgstr "Sort by:" msgid "Stop-words for sorting artists:" msgstr "Stop-words for sorting artists:" msgid "Stop-words for sorting albums:" msgstr "Stop-words for sorting albums:" msgid "Show stop-words words at end" msgstr "Show stop-words words at end" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "If selected, eg. “The Rolling Stones” becomes “Rolling Stones, The”;\n" "sorting itself is not affected by this option" msgid "Keywords to identify cover image for an album:" msgstr "Keywords to identify cover image for an album:" msgid "Double click on covers" msgstr "Double click on covers" msgid "Select/play album" msgstr "Select/play album" msgid "Combine tracks to albums" msgstr "Combine tracks to albums" msgid "Updating genres..." msgstr "Updating genres..." msgid "Updating groups..." msgstr "Updating groups..." msgid "Combining tracks to albums..." msgstr "Combining tracks to albums..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Do you want to add the following folder(s) to your music library?" #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Yes, leave the image in “%s”" #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Yes, copy the image to “%s”" #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Do you want to use the given image as the cover for “%s”?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "“%s” is not in your music library and cannot be edited therefore." #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s tracks on %s albums found for “%s”" #, c-format msgid "%s tracks on %s albums" msgstr "%s tracks on %s albums" msgid "Albums" msgstr "Albums" msgid "All albums" msgstr "All albums" msgid "Unsorted tracks" msgstr "Unsorted tracks" #, c-format msgid "Disk %i" msgstr "Disk %i" msgid "O:" msgstr "O:" msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Stop prelistening" #, c-format msgid "Prelisten \"%s\"" msgstr "Prelisten “%s”" #, c-format msgid "Enqueue \"%s\"" msgstr "Enqueue “%s”" #, c-format msgid "Play \"%s\" now" msgstr "Play “%s” now" #, c-format msgid "Play \"%s\" next" msgstr "Play “%s” next" #, c-format msgid "Unqueue \"%s\"" msgstr "Unqueue “%s”" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "Enqueue %i track" msgstr[1] "Enqueue %i tracks" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Play %i track now" msgstr[1] "Play %i tracks now" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Play %i track next" msgstr[1] "Play %i tracks next" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Unqueue %i track" msgstr[1] "Unqueue %i tracks" #, c-format msgid "\"%s\" on the web" msgstr "“%s” on the web" #, c-format msgid "Average rating: %s" msgstr "Average rating: %s" #, c-format msgid "Rating: %s" msgstr "Rating: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Do you want to change the rating for %i selected track?" msgstr[1] "Do you want to change the rating for %i selected tracks?" msgid "Change rating" msgstr "Change rating" msgid "Click to select all tracks of this album, double-click to play them" msgstr "Click to select all tracks of this album, double-click to play them" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "Click to select all tracks of this artists, double-click to play them" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "Click to select all tracks of this disk, double-click to play them" #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Double-click to enqueue “%s”" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Do you want to enqueue %i selected track?" msgstr[1] "Do you want to enqueue %i selected tracks?" msgid "Size" msgstr "Size" msgid "Gain" msgstr "Gain" msgid "Read music-files from the following folders and sources:" msgstr "Read music-files from the following folders and sources:" msgid "Read music-files from the following sources:" msgstr "Read music-files from the following sources:" msgid "Add source" msgstr "Add source" msgid "Remove source" msgstr "Remove source" msgid "Options" msgstr "Options" msgid "Supported file types" msgstr "Supported file types" msgid "Music library" msgstr "Music library" #, c-format msgid "Options for \"%s\"" msgstr "Options for “%s”" msgid "Options..." msgstr "Options..." msgid "Jukebox" msgstr "Jukebox" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "Please select a playlist, some files or enter a streaming URL" msgid "Append to current playlist" msgstr "Append to current playlist" msgid "Volume control" msgstr "Volume control" msgid "Play all tracks of an album with the same volume" msgstr "Play all tracks of an album with the same volume" msgid "Desired volume:" msgstr "Desired volume:" msgid "Max. gain:" msgstr "Max. gain:" msgid "Current volume:" msgstr "Current volume:" msgid "Fading" msgstr "Fading" msgid "Crossfading" msgstr "Crossfading" msgid "Manual crossfades:" msgstr "Manual crossfades:" msgid "Automatic crossfades:" msgstr "Automatic crossfades:" msgid "Offset to end:" msgstr "Offset to end:" msgid "No crossfades between subsequent tracks of the same album" msgstr "No crossfades between subsequent tracks of the same album" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Only fade out the old track, the new track starts with full volume" msgid "Resume" msgstr "Resume" msgid "Jingles" msgstr "Jingles" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "The following options define the behaviour of the queue. For the “shuffle " "intensity”,\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Kiosk mode: Allow max. %i track waiting in queue" msgstr[1] "Kiosk mode: Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Kiosk mode: Avoid double tracks waiting in queue" #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "Avoid boredom: No track repetition within %i minutes" #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "Avoid boredom: No artist repetition within %i minutes" msgid "Shuffle intensity:" msgstr "Shuffle intensity:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgid "Restore queue" msgstr "Restore queue" msgid "Restore already played tracks" msgstr "Restore already played tracks" msgid "Start playback from last position" msgstr "Start playback from last position" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "AutoPlay: If the playlist is empty, wait %i minutes;" #, c-format msgid "then, play %i tracks from the %s" msgstr "then, play %i tracks from the %s" msgid "Ignore tracks from the music selection" msgstr "Ignore tracks from the music selection" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "Manually enqueued tracks interrupt AutoPlay immediately" msgid "Sleep mode:" msgstr "Sleep mode:" msgid "Stop playback" msgstr "Stop playback" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgid "minutes|o'clock" msgstr "minutes|o'clock" #, c-format msgid "Before this, fade out %i seconds" msgstr "Before this, fade out %i seconds" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgid "If the jukebox is playing, about every" msgstr "If the jukebox is playing, about every" msgid "minutes," msgstr "minutes," msgid "play a track from the music selection" msgstr "play a track from the music selection" msgid "At" msgstr "At" msgid "o'clock," msgstr "o'clock," msgid "Daily" msgstr "Daily" msgid "Wait for end of playing track" msgstr "Wait for end of playing track" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Go to current track after %i minutes of inactivity" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Reset view after %i minutes of inactivity to" #, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Open video screen after %i minutes of inactivity" #, c-format msgid "Close video screen after %i minutes" msgstr "Close video screen after %i minutes" #, c-format msgid "Limit play time to %i seconds" msgstr "Limit play time to %i seconds" msgid "Read folders:" msgstr "Read folders:" msgid "Read file:" msgstr "Read file:" msgid "Ignore music-files and images with the following extensions:" msgstr "Ignore music-files and images with the following extensions:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "(separate the extensions using the comma, case is ignored)" msgid "Include folder to the update process" msgstr "Include folder to the update process" msgid "Read hidden files" msgstr "Read hidden files" msgid "Read hidden folders" msgstr "Read hidden folders" msgid "Read inside ZIP-/TAR-archives" msgstr "Read inside ZIP-/TAR-archives" msgid "Read (ID3)-tags" msgstr "Read (ID3)-tags" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "Path and file pattern for track-information if (ID3-)tags are missing:" msgid "Placeholders:" msgstr "Placeholders:" msgid "Read files and folders" msgstr "Read files and folders" msgid "Add a folder to search for music-files" msgstr "Add a folder to search for music-files" msgid "Add a single music-file" msgstr "Add a single music-file" msgid "Disabled" msgstr "Disabled" msgid "No update" msgstr "No update" #, c-format msgid "Remove \"%s\" from the music library?" msgstr "Remove “%s” from the music library?" msgid "Select a folder with music-files" msgstr "Select a folder with music-files" msgid "Select music-file" msgstr "Select music-file" msgid "Unknown track" msgstr "Unknown track" msgid "Unknown artist" msgstr "Unknown artist" msgid "Add a server containing music-files" msgstr "Add a server containing music-files" msgid "Use server:" msgstr "Use server:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Type" msgid "Login name:" msgstr "Login name:" msgid "Include server to the update process" msgstr "Include server to the update process" msgid "Configuration file" msgstr "Configuration file" #, c-format msgid "Loading %s" msgstr "Loading %s" #, c-format msgid "Error %i" msgstr "Error %i" msgid "Edit track" msgstr "Edit track" msgid "of" msgstr "of" msgid "Write (ID3-)tags" msgstr "Write (ID3-)tags" msgid "File names" msgstr "File names" #, c-format msgid "Show all %s file names..." msgstr "Show all %s file names..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "The shown values are the sum or the average of all single values in the " "given files." msgid "Track" msgstr "Track" msgid "Further information" msgstr "Further information" msgid "URL" msgstr "URL" msgid "Temporary directory" msgstr "Temporary directory" msgid "Further information..." msgstr "Further information..." #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Cannot rename “%s” to “%s”." msgid "Server name" msgstr "Server name" msgid "Query online database" msgstr "Query online database" msgid "more..." msgstr "more..." msgid "Please select one of the following albums:" msgstr "Please select one of the following albums:" msgid "Old file name" msgstr "Old file name" msgid "New file name" msgstr "New file name" msgid "Field" msgstr "Field" msgid "Old value" msgstr "Old value" msgid "New value" msgstr "New value" msgid "<empty>" msgstr "<empty>" msgid "Confirm modifications" msgstr "Confirm modifications" msgid "Delete empty folders" msgstr "Delete empty folders" msgid "Please confirm or edit the following modification:" msgstr "Please confirm or edit the following modification:" #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Please confirm or edit the following %s modifications:" msgid "(lower case)" msgstr "(lower case)" msgid "(upper case)" msgstr "(upper case)" msgid "(n characters)" msgstr "(n characters)" msgid "Rename files" msgstr "Rename files" msgid "Pattern:" msgstr "Pattern:" msgid "Artist (first character)" msgstr "Artist (first character)" msgid "Album (first character)" msgstr "Album (first character)" msgid "Genre (first character)" msgstr "Genre (first character)" msgid "Group (first character)" msgstr "Group (first character)" msgid "Year (4 characters)" msgstr "Year (4 characters)" msgid "Year (2 characters)" msgstr "Year (2 characters)" msgid "Duration (5 characters)" msgstr "Duration (5 characters)" msgid "Directory change" msgstr "Directory change" msgid "File name (8 characters)" msgstr "File name (8 characters)" msgid "File extension" msgstr "File extension" msgid "Example:" msgstr "Example:" msgid "Replace" msgstr "Replace" msgid "Search for:" msgstr "Search for:" msgid "in:" msgstr "in:" msgid "All fields" msgstr "All fields" msgid "Path and file name" msgstr "Path and file name" msgid "Replace with:" msgstr "Replace with:" msgid "Match whole words only" msgstr "Match whole words only" msgid "Match case" msgstr "Match case" msgid "Regular expression" msgstr "Regular expression" #, c-format msgid "\"%s\" not found." msgstr "“%s” not found." msgid "Split field" msgstr "Split field" msgid "Field to split:" msgstr "Field to split:" msgid "Destination fields and pattern:" msgstr "Destination fields and pattern:" msgid "Track number (1 character)" msgstr "Track number (1 character)" msgid "Track number (2 characters)" msgstr "Track number (2 characters)" msgid "Disk number (1 character)" msgstr "Disk number (1 character)" msgid "Disk number (2 characters)" msgstr "Disk number (2 characters)" msgid "Void information" msgstr "Void information" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "With different skins you can change the “look and feel” of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgid "Name" msgstr "Name" msgid "Info..." msgstr "Info..." msgid "Update list" msgstr "Update list" msgid "More skins on the web..." msgstr "More skins on the web..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the “+” or “-” " "keys), both\n" "sizes will grow or shrink proportionally." msgid "Font:" msgstr "Font:" msgid "Font size:" msgstr "Font size:" msgid "Use this font for dialogs, too" msgstr "Use this font for dialogs, too" msgid "Column width:" msgstr "Column width:" msgid "Cover size:" msgstr "Cover size:" msgid "No lyrics found." msgstr "No lyrics found." msgid "Karaoke Prompt" msgstr "Karaoke Prompt" #, c-format msgid "No images found in \"%s\"." msgstr "No images found in “%s”." msgid "Background" msgstr "Background" #, c-format msgid "Use %s-files" msgstr "Use %s-files" msgid "Please select a directory with images" msgstr "Please select a directory with images" msgid "If appropriate, switch over automatically" msgstr "If appropriate, switch over automatically" msgid "Half size" msgstr "Half size" msgid "Spectrum Monitor" msgstr "Spectrum Monitor" msgid "Show spectrum" msgstr "Show spectrum" msgid "Show oscilloscope" msgstr "Show oscilloscope" msgid "Show starfield" msgstr "Show starfield" msgid "Show other figures" msgstr "Show other figures" msgid "Visualization" msgstr "Visualization" msgid "Video output" msgstr "Video output" msgid "Search homepage" msgstr "Search homepage" #, c-format msgid "Lyrics on %s" msgstr "Lyrics on %s" #, c-format msgid "Search with %s" msgstr "Search with %s" #, c-format msgid "Information on %s" msgstr "Information on %s" msgid "Object count:" msgstr "Object count:" msgid "Elapsed time:" msgstr "Elapsed time:" msgid "Message" msgstr "Message" msgid "Scope" msgstr "Scope" msgid "Console" msgstr "Console" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i message" msgstr[1] "%i messages" msgid "Evaluate" msgstr "Evaluate" msgid "Clear" msgstr "Clear" msgid "Open console on errors and warnings" msgstr "Open console on errors and warnings" msgid "Details" msgstr "Details" msgid "Clear all messages?" msgstr "Clear all messages?" #, c-format msgid "Overwrite \"%s\"?" msgstr "Overwrite “%s”?" msgid "Append" msgstr "Append" msgid "State" msgstr "State" #, c-format msgid "%s-files" msgstr "%s-files" #, c-format msgid "%s-audio" msgstr "%s-audio" #, c-format msgid "%s-images" msgstr "%s-images" #, c-format msgid "%s-video" msgstr "%s-video" #, c-format msgid "%s-playlists" msgstr "%s-playlists" msgid "Script-files" msgstr "Script-files" msgid "Silverjuke skin-files" msgstr "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Silverjuke jukebox-files" msgid "Archive-files" msgstr "Archive-files" msgid "Supported file-types" msgstr "Supported file-types" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programs" msgid "Cleanup index..." msgstr "Cleanup index..." msgid "max. size" msgstr "max. size" #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgid "Use maybe errorous objects?" msgstr "Use maybe errorous objects?" msgid "__DATE_TIME_LONG__" msgstr "__DATE_TIME_LONG__" msgid "__DATE_TIME_EDITABLE__" msgstr "__DATE_TIME_EDITABLE__" msgid "__DATE_LONG__" msgstr "__DATE_LONG__" msgid "__DATE_EDITABLE__" msgstr "__DATE_EDITABLE__" msgid "__DATE_SUNDAY_FIRST__" msgstr "__DATE_SUNDAY_FIRST__" msgid "__THIS_LANG__" msgstr "__THIS_LANG__" msgid "__COVER_SEARCH_URLS__" msgstr "__COVER_SEARCH_URLS__" msgid "__ARTIST_INFO_URLS__" msgstr "__ARTIST_INFO_URLS__" msgid "__STOP_ARTISTS__" msgstr "__STOP_ARTISTS__" msgid "__STOP_ALBUMS__" msgstr "__STOP_ALBUMS__" msgid "__COVER_KEYWORDS__" msgstr "__COVER_KEYWORDS__" msgid "__VIRT_KEYBD__" msgstr "__VIRT_KEYBD__" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "," #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i day" msgstr[1] "%i days" #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Invalid regular expression “%s”." msgid "Fatal error" msgstr "Fatal error" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Enlarge window" msgid "Shrink window" msgstr "Shrink window" msgid "Enlarge display" msgstr "Enlarge display" msgid "Shrink display" msgstr "Shrink display" msgid "Services" msgstr "Services" #, c-format msgid "Hide %s" msgstr "Hide %s" msgid "Hide Others" msgstr "Hide Others" msgid "Show All" msgstr "Show All" #, c-format msgid "Quit %s" msgstr "Quit %s" msgid "Extras" msgstr "Extras" msgid "Full screen" msgstr "Full screen" msgid "Modules on the web..." msgstr "Modules on the web..." msgid "Explore" msgstr "Explore" msgid "Reveal in Finder" msgstr "Reveal in Finder" #, c-format msgid "The file \"%s\" does not exist." msgstr "The file “%s” does not exist." #, c-format msgid "Cannot execute \"%s\"." msgstr "Cannot execute “%s”." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" "Please use the operating system to set Silverjuke to an exclusive mode." ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/es.po��������������������������������������������������������������������������0000664�0000000�0000000�00000261576�12660066715�0015405�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2015-08-28 14:22+0200\n" "Last-Translator: antonivich <antonivicente@yahoo.es>\n" "Language-Team: antonivich <antonivicente@yahoo.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" "X-Generator: Poedit 1.8.4\n" msgid "Sleep mode activated." msgstr "Activado el modo dormir." msgid "Sleep mode deactivated." msgstr "Desactivado el modo dormir." msgid "Play time exceeded" msgstr "" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "Default" msgstr "Por defecto" msgid "Device" msgstr "Dispositivos" msgid "Show covers" msgstr "Mostrar portadas" msgid "Duration" msgstr "Duración" msgid "Artist" msgstr "Artista" msgid "Original artist" msgstr "Artista Original" msgid "Composer" msgstr "Compositor" msgid "Album" msgstr "Álbum" msgid "Track number" msgstr "Número de pista" msgid "Automatic track number" msgstr "Numerar automáticamente la pista" msgid "Disk number" msgstr "Disco nº" msgid "Genre" msgstr "Género" msgid "Year" msgstr "Año" msgid "Rating" msgstr "Valoración" msgid "Comment" msgstr "Comentario" msgid "Show double tracks" msgstr "Mostrar pistas dobles" msgid "Show different artist names" msgstr "Mostrar diferentes nombres de los artistas" msgid "Show different album names" msgstr "Mostrar diferentes nombres de álbum" #, fuzzy #| msgid "Show covers" msgid "Show cover titles" msgstr "Mostrar portadas" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s pistas" msgid "Drag folders with music here." msgstr "Arrastra aquí las carpetas con música." msgid "Reset to default values" msgstr "Valores por defecto" msgid "Nr." msgstr "Nº" #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Ratio de muestreo" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "Reproducción automática" msgid "Shuffle" msgstr "Mezclar" msgid "Recreating music library" msgstr "Rehacer colección musical" msgid "Updating music library" msgstr "Actualizar colección musical" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Si cancela el proceso no se actualizará su colección musical.\n" "\n" "¿Desea cancelar la actualización?" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" "%s está escuchándose actualmente. ¿Desea parar su reproducción y salir %s?" #, c-format msgid "Exit %s" msgstr "Salir de %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "No se puede abrir \"%s\"." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "También instalar el script \"%s\" para uso permanente" #, c-format msgid "Execute the script \"%s\"?" msgstr "¿Desea ejecutar el script \"%s\"?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "Búsqueda" msgid "On" msgstr "On" msgid "Off" msgstr "Off" msgid "Repeat playlist" msgstr "Repetir lista de reproducción" msgid "Repeat one" msgstr "Repetir una" msgid "Repeat all" msgstr "Repetir todo" msgid "Select a track, then start playback." msgstr "Seleccionar una pista e iniciar la reproducción." msgid "Stop after this track" msgstr "Parar después de esta pista" msgid "Stop after each track" msgstr "Parar después de cada pista" msgid "Double click play tracks at once" msgstr "Doble clic reproduce las pistas una vez" msgid "Start playback on first enqueue" msgstr "Iniciar la escucha desde el principio de la lista" msgid "Remove played tracks from queue" msgstr "Quitar de la lista las pistas reproducidas" msgid "More from current album" msgstr "Más sobre el álbum actual" msgid "More from current artist" msgstr "Más sobre el artista actual" msgid "No more tracks." msgstr "No más pistas." #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "¿Desea quitar de la lista esta %i pista y parar la reproducción?" msgstr[1] "¿Desea quitar de la lista estas %i pistas y parar la reproducción?" msgid "Clear playlist" msgstr "Limpiar la lista de reproducción" msgid "Track played, click to reset" msgstr "Pista reproducida, clic para reiniciar" msgid "Boredom avoided: Track moved down" msgstr "Aburrimiento: Desplazar pista abajo" msgid "Remove this track" msgstr "Quitar esta pista" msgid "Toggle time mode" msgstr "Panel de modo de hora" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Go to \"%s\"" msgstr "Ir a \"%s\"" msgid "End search" msgstr "Fin de búsqueda" msgid "click right for options" msgstr "botón derecho para opciones" msgid "Volume" msgstr "Volumen" msgid "Double-click to enlarge the cover" msgstr "Doble clic para ampliar portada" #, c-format msgid "Close this window and exit %s" msgstr "Cerrar la ventana y salir de %s" msgid "Open main menu" msgstr "Abrir el menú principal" msgid "Toggle shuffle mode" msgstr "Panel de modo de mezcla" msgid "Repeat all/repeat current" msgstr "Repetir todo/repetir actual" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Buscar en \"%s\"" msgid "Help" msgstr "Ayuda" msgid "Add folders and files" msgstr "Añadir archivos y carpetas" #, fuzzy #| msgid "File extension" msgid "Extensions" msgstr "Extensión de archivo" msgid "Show remaining time" msgstr "Mostrar tiempo restante" msgid "Show elapsed time" msgstr "Mostrar tiempo transcurrido" msgid "Show total time" msgstr "Mostrar tiempo total" msgid "Show track number" msgstr "Mostrar número de pista" msgid "Show artist name" msgstr "Mostrar nombre del artista" msgid "Show AutoPlay" msgstr "Mostrar Reproducción automática" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "Visor" #, fuzzy #| msgid "Volume" msgid "Columns" msgstr "Volumen" msgid "Same zoom in all views" msgstr "Mismo zoom en todas las vistas" msgid "Fonts and covers" msgstr "Fuentes y portadas" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Pieles" msgid "Start kiosk mode..." msgstr "Iniciar modo \"Quiosco\"" # %s will be replaced by the name of an artist #, c-format msgid "%s on the web" msgstr "\"%s\" en la web" msgid "All files" msgstr "Todos los archivos" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "Sobre %s" msgid "File" msgstr "Archivo" msgid "Edit" msgstr "Editar" msgid "View" msgstr "Vista" msgid "Playback" msgstr "Reproducción" msgid "Video screen" msgstr "Pantalla de video" msgid "Kiosk mode" msgstr "Modo Quiosco" msgid "None" msgstr "" msgid "Further options" msgstr "Opciones adicionales" msgid "Queue" msgstr "Lista de reproducción" msgid "Automatic control" msgstr "Control automático" msgid "Current view" msgstr "Vista actual" #, c-format msgid "Next track from \"%s\"" msgstr "Pista siguiente de \"%s\"" msgid "Next track" msgstr "Pista siguiente" msgid "Search for genre" msgstr "Buscar por género" msgid "Search for music selection" msgstr "Buscar por selección musical" msgid "Edit tracks/Get info" msgstr "Editar pistas/Obtener información" msgid "Show file" msgstr "Mostrar archivo" msgid "Cover editor" msgstr "Editor de portadas" msgid "Mix" msgstr "" #, fuzzy #| msgid "Channels" msgid "Left channel" msgstr "Canales" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Preaudición" msgid "No" msgstr "No" msgid "Yes" msgstr "Sí" #, fuzzy #| msgid "Only initalize system volume" msgid "Only initialize system volume" msgstr "Solo iniciar volumen de sistema" msgid "Output" msgstr "" msgid "Use system volume" msgstr "Usar volumen de sistema" msgid "Several artists" msgstr "Varios artistas" msgid "Unknown title" msgstr "Título desconocido" msgid "Save playlist" msgstr "Guardar lista de reproducción" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "No se puede escribir \"%s\"." msgid "Open playlist" msgstr "Abrir lista de reproducción" msgid "Title" msgstr "Título" msgid "Track count" msgstr "Nº de pistas" msgid "Disk count" msgstr "Nº de discos" msgid "Group" msgstr "Grupo" msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Canales" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "Nombre de archivo" msgid "File size" msgstr "Tamaño de archivo" msgid "Date added" msgstr "Fecha de alta" msgid "Date modified" msgstr "Fecha de modificación" msgid "Last played" msgstr "Última escucha" msgid "Play count" msgstr "Veces reproducido" msgid "SQL expression" msgstr "Expresión SQL" msgid "Limit result to" msgstr "Limitar resultados a" msgid "Title/artist/album" msgstr "Título/artista/álbum" msgid "File type" msgstr "Tipo de archivo" msgid "Queue position" msgstr "Posición en la lista de reproducción" msgid "Include tracks" msgstr "Incluir pistas" msgid "Exclude tracks" msgstr "Excluir pistas" msgid "Random" msgstr "Aleatorio" # %s will be replaced by a shortcut, eg. "Ins" or "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "Presiona \"%s\" en la ventana principal" msgid "Insert" msgstr "Insertar" msgid "Del" msgstr "Borrar" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Inserte la fecha como \"dd.mm.yyyy\". Puede también añadir \"hh:mm\" para la " "hora." msgid "Please enter the text." msgstr "Escriba el texto" msgid "Please enter a value." msgstr "Escriba un valor" msgid "Please enter a valid value." msgstr "Escriba un valor válido." msgid "(second field)" msgstr "(segundo campo)" msgid "No valid criteria defined." msgstr "No hay definidos criterios válidos." msgid "The search cannot be started; please check the following fields:" msgstr "No se puede comenzar la búsqueda; compruebe los campos siguientes:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" "Nota: Los operadores \"igual\" y \"distinto\" son sensibles a las mayúsculas." # %s will be replaced by the name of a music selection #, fuzzy, c-format #| msgid "Do you really want to delete the music selection \"%s\"?" msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "¿Desea realmente borrar la selección musical \"%s\"?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Cancelar" msgid "Page left" msgstr "Página izquierda" msgid "Page right" msgstr "Página derecha" msgid "Page up" msgstr "Página arriba" msgid "Page down" msgstr "Página abajo" msgid "Menu" msgstr "Menú" msgid "Cursor left" msgstr "Cursor izquierdo" msgid "Cursor right" msgstr "Cursor derecho" msgid "Cursor up" msgstr "Cursor arriba" msgid "Cursor down" msgstr "Cursor abajo" msgid "Line left" msgstr "Línea izquierda" msgid "Line right" msgstr "Línea derecha" msgid "Line up" msgstr "Línea arriba" msgid "Line down" msgstr "Línea abajo" msgid "Home" msgstr "Inicio" msgid "End" msgstr "Fin" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Borrar" msgid "Album view" msgstr "Vista de álbumes" msgid "Cover view" msgstr "Vista de portadas" msgid "List view" msgstr "Vista de listado" msgid "Toggle view" msgstr "Panel de vistas" msgid "Open playlist..." msgstr "Abrir lista de reproducción" msgid "Unqueue marked tracks" msgstr "Quitar de la lista las pista marcadas" msgid "Unqueue all but marked tracks" msgstr "Quitar de la lista todo excepto las pistas marcadas" msgid "Save playlist..." msgstr "Guardar lista de reproducción" msgid "Paste" msgstr "Pegar" msgid "Music selection..." msgstr "Selección musical..." msgid "Settings" msgstr "Preferencias" msgid "Update music library" msgstr "Actualizar colección musical" msgid "Recreate music library" msgstr "Recomponer colección musical" msgid "Enqueue tracks" msgstr "Pistas de la lista de reproducción" msgid "Play tracks next" msgstr "Reproducir pistas siguientes" msgid "Play tracks now" msgstr "Reproducir pistas ahora" msgid "Volume up" msgstr "Subir volumen" msgid "Volume down" msgstr "Bajar volumen" msgid "Unqueue tracks" msgstr "Quitar las pistas de la lista de reproducción" msgid "Edit tracks/Get info..." msgstr "Editar pistas/Obtener información..." msgid "Play" msgstr "Reproducir" msgid "Pause" msgstr "Pausar" msgid "Stop" msgstr "Parar" msgid "Previous track" msgstr "Pista anterior" msgid "Seek backward" msgstr "Buscar atrás" msgid "Seek forward" msgstr "Buscar adelante" msgid "Fade to next" msgstr "Desvanecer siguiente" msgid "Mute" msgstr "Enmudecer" msgid "Reload skin" msgstr "Recargar piel" #, fuzzy #| msgid "Video screen" msgid "Toggle video screen" msgstr "Pantalla de video" msgid "Smooth" msgstr "Borroso" msgid "Select all" msgstr "Seleccionar todo" msgid "Zoom in" msgstr "Ampliar" msgid "Zoom out" msgstr "Reducir" msgid "Normal zoom" msgstr "Tamaño normal" msgid "Always on top" msgstr "Siempre encima" msgid "Go to current track" msgstr "Ir a la pista actual" msgid "Go to marked track" msgstr "Ir a pista marcada" msgid "Go to random album" msgstr "Ir aleatoriamente a álbum" msgid "Go to previous letter" msgstr "Ir a la letra anterior" msgid "Go to next letter" msgstr "Ir a la letra siguiente" msgid "Add credit" msgstr "Añadir crédito" msgid "Console..." msgstr "Consola..." msgid "Replace..." msgstr "Reemplazar..." msgid "Split field..." msgstr "Dividir campo..." msgid "Rename files..." msgstr "Renombrar archivos..." msgid "Query online database..." msgstr "Base de datos en línea..." msgid "New music selection..." msgstr "Nueva selección musical..." msgid "Save" msgstr "Guardar" msgid "Save as..." msgstr "Guardar como..." msgid "Rename..." msgstr "Renombrar..." msgid "Revert to saved" msgstr "Volver a guardar" msgid "Open file..." msgstr "Abrir archivo..." msgid "Save cover..." msgstr "Guardar portada..." msgid "Rotate left" msgstr "Rotar a la izquierda" msgid "Rotate right" msgstr "Rotar a la derecha" msgid "Flip horizontally" msgstr "Voltear horizontalmente" msgid "Flip vertically" msgstr "Voltear verticalmente" msgid "Grayscale" msgstr "Escala de grises" msgid "Negative" msgstr "Negativo" msgid "Fit to screen" msgstr "Ajustar a la pantalla" msgid "Decrease brightness" msgstr "Reducir brillo" msgid "Increase brightness" msgstr "Incrementar brillo" msgid "Decrease contrast" msgstr "Reducir contraste" msgid "Increase contrast" msgstr "Incrementar contraste" msgid "Normal brightness/contrast" msgstr "Brillo/contraste normal" msgid "Crop" msgstr "Recortar" msgid "Please press the shortcut to add." msgstr "Presionar atajo a añadir" msgid "System-wide:" msgstr "Sistema:" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Quitar atajo \"%s\"" msgid "Add system-wide shortcut..." msgstr "Añadir atajo al sistema..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Añadir atajo para \"%s\"..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "El atajo \"%s\" está actualmente asignado al comando \"%s\".\n" "\n" "¿Desea asignarlo a \"%s\"?" msgid "Mouse" msgstr "Ratón" msgid "Drag window content" msgstr "Arrastrar el contenido de la ventana" msgid "Left mouse button" msgstr "Botón izquierdo del ratón" msgid "Drag selected tracks" msgstr "Arrastrar pistas seleccionadas" msgid "Second click with the left mouse button" msgstr "Después clicar con el botón izquierdo del ratón" msgid "Show icons beside mouse cursor" msgstr "Mostrar iconos junto al cursor del ratón" msgid "Middle mouse button" msgstr "Botón central del ratón" msgid "Edit tracks" msgstr "Editar pistas" msgid "Tooltips" msgstr "Sugerencias" msgid "Mouse wheel" msgstr "Rueda del ratón" #, fuzzy #| msgid "Scroll horizontally" msgid "Scroll horizontally in album view" msgstr "Desplegable horizontal" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "Usar teclado multimedia" msgid "Ask on close if playing" msgstr "Preguntar por el cierre cuando está reproduciendo" msgid "Ask before enqueuing multiple tracks" msgstr "Preguntar antes de añadir múltiples pistas a la lista de reproducción" msgid "Ask before clearing the playlist" msgstr "Preguntar antes de limpiar la lista de reproducción" msgid "Ask before changing the rating" msgstr "Preguntar antes de cambiar la valoración" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Nº%s" msgid "Backspace" msgstr "Atrás" msgid "Space" msgstr "Espacio" msgid "Up" msgstr "Arriba" msgid "Left" msgstr "Izquierda" msgid "Right" msgstr "Derecha" msgid "Down" msgstr "Abajo" msgid "Print" msgstr "Imprimir" msgid "Ins" msgstr "Insertar" msgid "Music selection" msgstr "Selección musical" msgid "Numpad" msgstr "Teclado numérico" msgid "Select date and time" msgstr "Selecciona fecha y hora" msgid "Time" msgstr "Hora" msgid "contains" msgstr "contiene" msgid "does not contain" msgstr "no contiene" msgid "starts with" msgstr "empieza con" msgid "does not start with" msgstr "no empieza con" msgid "starts simelar to" msgstr "empieza parecido a" msgid "ends with" msgstr "acaba con" msgid "does not end with" msgstr "no acaba con" msgid "on" msgstr "actual" msgid "is equal to" msgstr "es igual a" msgid "not on" msgstr "no actual" msgid "is unequal to" msgstr "es distinto de" msgid "is simelar to" msgstr "es parecido a" msgid "is after" msgstr "es posterior a" msgid "is greater than" msgstr "es mayor que" msgid "is on or after" msgstr "es actual o posterior a" msgid "is greater or equal" msgstr "es mayor o igual a" msgid "is before" msgstr "es anterior a" msgid "is less than" msgstr "es inferior que" msgid "is on or before" msgstr "es actual o anterior" msgid "is less or equal" msgstr "es inferior o igual" msgid "is in the last" msgstr "está en los últimos" msgid "is not in the last" msgstr "no está entre los últimos" msgid "is in the period" msgstr "está en el período" msgid "is in range" msgstr "está entre" msgid "is not in the period" msgstr "no está en el período" msgid "is not in range" msgstr "no está entre" msgid "is set" msgstr "está seleccionado" msgid "is unset" msgstr "no está seleccionado" msgid "tracks" msgstr "pistas" msgid "albums" msgstr "álbumes" msgid "minutes" msgstr "minutos" msgid "hours" msgstr "horas" msgid "seconds" msgstr "segundos" msgid "days" msgstr "días" msgid "No rating" msgstr "Sin valorar" msgid "random" msgstr "aleatorio" msgid "highest rating" msgstr "alta valoración" msgid "lowest rating" msgstr "baja valoración" msgid "most often played" msgstr "más reproducidos" msgid "least often played" msgstr "menos reproducidos" msgid "most recently played" msgstr "más reproducidos" msgid "least recently played" msgstr "menos reproducidos" msgid "most recently added" msgstr "añadidos recientemente" msgid "least recently added" msgstr "no añadidos recientemente" msgid "most recently modified" msgstr "modificados recientemente" msgid "least recently modified" msgstr "no modificados recientemente" msgid "most recently released" msgstr "publicados recientemente" msgid "least recently released" msgstr "no publicados recientemente" msgid "low queue position" msgstr "baja posición en la lista" msgid "high queue position" msgstr "alta posición en la lista" msgid "Today" msgstr "Hoy" msgid "Yesterday" msgstr "Mañana" msgid "Select..." msgstr "Seleccionar..." msgid "Show tracks..." msgstr "Mostrar pistas..." msgid "Add tracks from playlist" msgstr "Añadir pistas de la lista de reproducción" msgid "Current position" msgstr "Posición actual" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "en" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "para" msgid "Remove criterion" msgstr "Cambiar criterio" msgid "Add criterion" msgstr "Añadir criterio" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "Pistas incluidas en \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Pistas excluidas de \"%s\"" msgid "Saved selections" msgstr "Guardar selección" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Buscar %s coincidencias con %s los criterios siguientes" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "pistas|álbumes" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "todos|alguno de|ninguno de" msgid "Close" msgstr "Cerrar" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "¿Desea guardar los cambios de su selección musical \"%s\"?" msgid "Music selection modified" msgstr "Selección musical modificada" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "Editar selección musical \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "¿Desea realmente borrar la selección musical \"%s\"?" msgid "Delete music selection" msgstr "Borrar selección musical" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "¿Desea realmente borrar las piezas musicales seleccionadas %i?" msgid "Delete music selections" msgstr "Borrar selecciones musicales" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "No hallado nada para \"%s\"." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "¿Desea quitar las pista(s) marcadas de la selección musical \"%s\"?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "¿Desea añadir las pistas marcadas a la selección musical \"%s\"?" # This is the name of a predefined music selection msgid "70's music" msgstr "Música de los 70" # This is the name of a predefined music selection msgid "Worst rated" msgstr "Pero valoradas" # This is the name of a predefined music selection msgid "Top rated" msgstr "Las mejores" # This is the name of a predefined music selection msgid "Top 20" msgstr "Top 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "Recientemente reproducido" # This is the name of a predefined music selection msgid "Played today" msgstr "Reproducido hoy" # This is the name of a predefined music selection msgid "Random selection" msgstr "Selección aleatoria" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Pistas listadas" msgid "Untitled Music selection" msgstr "Selección musical sin nombre" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Nada hallado en \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "Una coincidencia en \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s coincidencias en \"%s\"" msgid "No matches" msgstr "Sin coincidencias" msgid "1 match" msgstr "Una coincidencia" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s coincidencias" # %s will be replaced by the name of a music selection msgid "Search single words" msgstr "Buscar palabras aisladas" msgid "Lookup genre on simple search" msgstr "Buscar género en búsqueda simple" msgid "Search while typing" msgstr "Buscar mientras se teclea" msgid "Save modified music selections" msgstr "Guardar selecciones musicales modificadas" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "Preguntar" msgid "Max. history size" msgstr "Tamaño máximo del historial" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Buscar por \"%s\" en \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Buscar por \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Mantenga pulsado el botón izquierdo del ratón y seleccione el área a marcar " "moviendo el ratón." msgid "<Abstract>" msgstr "<Resumen>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Por defecto)" msgid "Paste image from clipboard" msgstr "Pegar imagen del portapapeles" msgid "Browse" msgstr "Explorar" msgid "Select cover" msgstr "Seleccionar portada" msgid "Search covers on the web" msgstr "Buscar portadas en la web" msgid "Don't rotate" msgstr "No rotar" msgid "Rotate/flip" msgstr "Rotar/Voltear" msgid "Use default images..." msgstr "Usar imágenes por defecto" msgid "Effects/options" msgstr "Efectos/opciones" msgid "Select image" msgstr "Seleccionar imagen" msgid "Save cover" msgstr "Guardar portada" msgid "Reset all selected alternative images to their default value?" msgstr "" "¿Desea restablecer las imágenes alternativas seleccionadas a sus valores por " "defecto?" msgid "Search paths" msgstr "Buscar rutas" msgid "The search paths are used for skins, language files and modules." msgstr "" "Las rutas de búsqueda son usadas por las pieles, archivos de idioma y " "módulos." msgid "Add..." msgstr "Añadir..." msgid "Remove" msgstr "Quitar" msgid "Please select the folder to add to the search paths." msgstr "Seleccione la carpeta a añadir a las rutas de búsqueda" msgid "Edit..." msgstr "Editar..." #, fuzzy #| msgid "Comment" msgid "Command" msgstr "Comentario" msgid "Shortcut" msgstr "Atajo" #, fuzzy #| msgid "Options" msgid "Option" msgstr "Opciones" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "Las siguientes opciones son sólo para usuarios experimentados." msgid "Customize" msgstr "Personalizar" msgid "Reset selection" msgstr "Restablecer selección" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "¿Desea realmente establecer a valores por defecto los %i comandos " "seleccionados y opciones?" #, fuzzy #| msgid "Shortcut" msgid "Shortcuts" msgstr "Atajo" msgid "Language" msgstr "Idioma" msgid "Show files with" msgstr "Mostrar archivos con" msgid "Instance" msgstr "Ejemplo" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Usar el comando %s=<file> para cambiar esto." msgid "Index file" msgstr "Archivo índice" msgid "RAM cache" msgstr "Caché RAM" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "Promedio de tiempo de consulta: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Sincronización" msgid "Fast" msgstr "Rápido" msgid "Save but slower" msgstr "Seguro pero más lento" msgid "Very save and slow" msgstr "Muy seguro pero lento" msgid "Image cache" msgstr "Caché de imágenes" msgid "Use temporary directory" msgstr "Usar directorio temporal" msgid "Yes, load images asynchrony" msgstr "Sí, cargar imágenes asincrónicas" msgid "Yes, load images directly and avoid flickering" msgstr "Sí, cargar imágenes directamente y evitar parpadeos" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% usadas por %i imágenes" msgid "Regard file changes" msgstr "Cambios de archivo" msgid "Advanced" msgstr "Avanzado" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Reiniciar %s para que los cambios surtan efecto." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Ayuda" # String for "Don't know" or "unset" msgid "n/a" msgstr "n/a" msgid "Internal" msgstr "Interno" msgid "No credit." msgstr "Sin crédito." #, c-format msgid "Credit: %i" msgstr "Crédito: %i" msgid "Start" msgstr "Iniciar" #, fuzzy #| msgid "Functionality" msgid "Functions" msgstr "Opciones" msgid "Monitors" msgstr "Monitores" msgid "Virtual keyboard" msgstr "Teclado virtual" msgid "Credit system" msgstr "Crédito" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke dispone del modo \"Quiosco\" para lanzar el programa a pantalla " "completa,\n" "con funciones de protección definidas." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Antes de activar el modo \"Quiosco\" clicando en \"Iniciar\", asegúrese de " "conocer cómo salir:" # %s will be replaced by a shortcut, eg. "F11" #, c-format msgid "Exit by hitting %s" msgstr "Salir presionando %s" msgid "Exit by clicking into two different corners" msgstr "Salir clicando en dos diferentes esquinas" msgid "Try to set exclusive" msgstr "" msgid "Ask for a password on exit" msgstr "Al salir preguntar por la clave" msgid "Change password..." msgstr "Cambiar clave..." msgid "Exit action:" msgstr "Acción al salir:" msgid "Start the kiosk mode with the following functionality:" msgstr "Iniciar el modo \"Quiosco\" con las siguientes funcionalidades:" msgid "Play/pause" msgstr "Reproducir/Pausar" msgid "Edit queue" msgstr "Editar lista de reproducción" msgid "Toggle elements" msgstr "Panel de elementos" msgid "Enqueue multiple tracks" msgstr "Listar múltiples pistas" msgid "All functions" msgstr "Todas las funciones" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Limitar pistas de la selección musical %s" msgid "Please enter the password again for verification." msgstr "Entrar de nuevo la clave para la verificación." msgid "Overview:" msgstr "Vista General:" msgid "Main window" msgstr "Ventana principal" msgid "Monitor" msgstr "Monitor" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB msgid "Disable screensaver" msgstr "Deshabilitar salvapantallas" msgid "Disable power management" msgstr "Deshabilitar administrador de energía" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Puede usar un teclado virtual si no dispone de un teclado físico.\n" "Éste se mostrará cuando clique dentro de cualquier cuadro de texto." msgid "Use the virtual keyboard" msgstr "Usar el teclado virtual" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Usar también el teclado virtual fuera del modo \"Quiosco\"" msgid "Test:" msgstr "Probar:" msgid "(please click into the text control)" msgstr "(por favor, clique dentro del cuadro de texto)" msgid "Virtual keyboard layout:" msgstr "Teclado virtual:" msgid "Colour:" msgstr "Color:" msgid "Black" msgstr "Negro" msgid "White" msgstr "Blanco" msgid "Transparency:" msgstr "Transparencia:" msgid "Hide cursor" msgstr "Ocultar cursor" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Usando el teclado numérico con otras teclas especiales, puede controlar " "completamente Silverjuke\n" "a través del teclado o desde otros dispositivos. En este caso, podrá añadir " "a la lista de reproducción nuevas pistas\n" "marcando el número mostrado antes del nombre del álbum y pista." msgid "Use Numpad controls" msgstr "Usar teclado numérico" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Usar también el teclado numérico fuera del modo \"Quiosco\"" msgid "Keys:" msgstr "Teclas:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "Con el sistema de crédito los usuarios pueden, por ejemplo, echar monedas " "antes de añadir pistas a la lista.\n" "Consulte la ayuda en línea para detalles sobre las posibilidades existentes " "y el hardware soportado." msgid "Use credit system" msgstr "Usar sistema de crédito" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "" "Los créditos pueden añadirse a través de DDE (intercambio dinámico de " "datos), comandos o atajos." msgid "Keys..." msgstr "Claves..." msgid "Remember credits between program starts" msgstr "Recordar créditos mientras el programa funciona" msgid "Current credit:" msgstr "Crédito actual:" msgid "Please enter your password to exit the kiosk mode." msgstr "Por favor, entre la clave para salir del modo \"Quiosco\"." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Demasiadas pistas listadas,\n" "por favor, inténtelo más tarde." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "Esta pista ya está en la lista.\n" "Inténtelo de nuevo más tarde." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" "Esta pista o artista acaba de sonar,\n" "pruebe de nuevo más tarde." msgid "Maintenance password" msgstr "Mantenimiento de clave" msgid "Exit kiosk mode" msgstr "Salir del modo \"Quiosco\"" msgid "Start kiosk mode" msgstr "Iniciar modo \"Quiosco\"" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Clave:" msgid "Invalid password. Please try again." msgstr "Clave no válida. Inténtelo de nuevo." msgid "Invalid track number" msgstr "Número de pista no válido" msgid "Action:" msgstr "Acción:" msgid "Shutdown computer" msgstr "Apagar ordenador" msgid "Reboot computer" msgstr "Reiniciar ordenador" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Mayúscula|AltGr|Borrar|Limpiar\n" "todo|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" "No se ha encontrado ningún teclado virtual. Por favor, añada un archivo *." "sjk a la carpeta del programa." #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Un álbum debe tener al menos %s pistas con sus correspondientes %s." msgid "artist/album" msgstr "artista/álbum" msgid "artist/album or genre" msgstr "artista/álbum o género" msgid "directory" msgstr "directorio" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Las compilaciones pueden contener hasta %s pistas del mismo artista." msgid "Separate the words using commas, case is ignored" msgstr "Separar las palabras con comas; las mayúsculas se ignoran" msgid "Sort by:" msgstr "Clasificar por:" msgid "Stop-words for sorting artists:" msgstr "Ignorar palabras en clasificación por artista:" msgid "Stop-words for sorting albums:" msgstr "Ignorar palabras en clasificación por álbumes" msgid "Show stop-words words at end" msgstr "Mostrar palabras ignoradas y finalizar" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "(\"The Rolling Stones\" devuelve \"Rolling Stones, The\";\n" "Esta opcion no afecta a la clasificación)" msgid "Keywords to identify cover image for an album:" msgstr "Palabras clave para identificar la portada para un álbum:" msgid "Double click on covers" msgstr "Doble clic en portadas" msgid "Select/play album" msgstr "Seleccionar/Reproducir álbum" msgid "Combine tracks to albums" msgstr "Combinar pistas de álbumes" msgid "Updating genres..." msgstr "Actualizar géneros..." msgid "Updating groups..." msgstr "Actualizar grupos..." msgid "Combining tracks to albums..." msgstr "Combinar pistas de álbumes..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "¿Desea añadir la(s) siguiente(s) carpeta(s) a su colección musical?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Sí, dejar la imagen en \"%s\"" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Sí, copiar la imagen en \"%s\"" # %s will be replaced by the album name #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "¿Desea usar la imagen conseguida como portada para \"%s\"?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "" "\"%s\" no está en su colección musical y, por consiguiente, no se puede " "editar." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "Encontradas %s pistas en %s álbumes para \"%s\"" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s pistas en %s álbumes" msgid "Albums" msgstr "Álbumes" msgid "All albums" msgstr "Todos los álbumes" msgid "Unsorted tracks" msgstr "Pistas sin clasificar" # %i will be replaced by the disk number #, c-format msgid "Disk %i" msgstr "Disco %i" # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Parar preescucha" #, c-format msgid "Prelisten \"%s\"" msgstr "Preescuchar \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "Añadir \"%s\" a la lista de reproducción" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "Reproducir \"%s\" ahora" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "Reproducir \"%s\" siguiente" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "Quitar de la lista \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "Añadir la pista a la lista de reproducción %i" msgstr[1] "Añadir las pistas a la lista de reproducción %i" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Reproducir la pista %i ahora" msgstr[1] "Reproducir las pistas %i ahora" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Reproducir la pista %i siguiente" msgstr[1] "Reproducir las pistas %i siguientes" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Quitar la pista %i de la lista de reproducción" msgstr[1] "Quitar las pistas %i de la lista de reproducción" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" en la web" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Promedio de valoración: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Rating: %s" msgstr "Valoración: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "¿Desea cambiar la valoración de la pista seleccionada (%i)?" msgstr[1] "¿Desea cambiar la valoración de las pistas seleccionadas (%i)?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Cambiar valoración" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" "Clicar para seleccionar todas las pistas del álbum; doble clic para " "reproducirlas" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" "Clic para seleccionar todas las pistas del artista; doble clic para " "reproducirlas" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" "Clic para seleccionar todas las pistas del disco; doble clic para " "reproducirlo" # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Doble clic para añadir a la lista de reproducción \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "¿Desea añadir la %i pista seleccionada a la lista de reproducción?" msgstr[1] "" "¿Desea añadir las %i pistas seleccionadas a la lista de reproducción ?" msgid "Size" msgstr "Tamaño" msgid "Gain" msgstr "Ganancia" msgid "Read music-files from the following folders and sources:" msgstr "Leer archivos de música de las siguientes carpetas y fuentes:" msgid "Read music-files from the following sources:" msgstr "Leer archivos musicales de las siguientes fuentes" msgid "Add source" msgstr "Añadir fuente" msgid "Remove source" msgstr "Quitar fuente" msgid "Options" msgstr "Opciones" msgid "Supported file types" msgstr "Tipos de archivo soportados" msgid "Music library" msgstr "Mi música" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Opciones para \"%s\"" msgid "Options..." msgstr "Opciones..." msgid "Jukebox" msgstr "Jukebox" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "" "Por favor, seleccione alguna lista de reproducción, algún archivo o escriba " "alguna URL" msgid "Append to current playlist" msgstr "Unir a la actual lista de reproducción" msgid "Volume control" msgstr "Control de volumen" msgid "Play all tracks of an album with the same volume" msgstr "Reproducir las pistas de un álbum al mismo volumen" msgid "Desired volume:" msgstr "Volumen deseado:" msgid "Max. gain:" msgstr "Ganancia máxima:" msgid "Current volume:" msgstr "Volumen actual:" msgid "Fading" msgstr "Desvanecer" msgid "Crossfading" msgstr "Fundir" msgid "Manual crossfades:" msgstr "Fundidos manuales:" msgid "Automatic crossfades:" msgstr "Fundidos automáticos:" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "No fundir pistas seguidas de un mismo álbum" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Desvanecer sólo la pista vieja e iniciar la nueva a pleno volumen" msgid "Resume" msgstr "" msgid "Jingles" msgstr "Cuñas musicales" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "Las siguientes opciones definen el comportamiento de la lista de " "reproducción.\n" "Pequeños valores producen solo leves variaciones en la reproducción." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "" "Modo \"Quiosco\": Permitir un máximo de %i pista esperando en la lista de " "reproducción" msgstr[1] "" "Modo \"Quiosco\": Permitir un máximo de %i pistas esperando en la lista de " "reproducción" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "" "Modo \"Quiosco\": Evitar pistas repetidas esperando en lista de reproducción" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "Evitar aburrimiento: No repetir pistas durante %i minutos" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "Evitar aburrimiento: No repetir artista en %i minutos" msgid "Shuffle intensity:" msgstr "Intensidad del desorden:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" #, fuzzy #| msgid "Edit queue" msgid "Restore queue" msgstr "Editar lista de reproducción" #, fuzzy #| msgid "Remove played tracks from queue" msgid "Restore already played tracks" msgstr "Quitar de la lista las pistas reproducidas" #, fuzzy #| msgid "Start playback on first enqueue" msgid "Start playback from last position" msgstr "Iniciar la escucha desde el principio de la lista" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Usar las siguientes opciones para definir qué acciones deben realizarse " "automáticamente\n" "después de las pausas." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "Reproducción automática: si la lista está vacía, esperar %i minutos;" #, c-format msgid "then, play %i tracks from the %s" msgstr "entonces, reproducir %i pistas de %s" # %s will be replaced by the name of a music selection msgid "Ignore tracks from the music selection" msgstr "Ignorar pistas de la selección musical" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "Añadir manualmente pistas interrumpe la reproducción automática" msgid "Sleep mode:" msgstr "Modo dormir" msgid "Stop playback" msgstr "Parar reproducción" #, fuzzy #| msgid "in|after|at|always in|always after|always at" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "en|después de|a|siempre|siempre después|siempre al" #, fuzzy #| msgid "minutes" msgid "minutes|o'clock" msgstr "minutos" #, c-format msgid "Before this, fade out %i seconds" msgstr "Antes, desvanecer %i segundos" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" #, fuzzy #| msgid "minutes" msgid "minutes," msgstr "minutos" # %s will be replaced by the name of a music selection #, fuzzy #| msgid "Ignore tracks from the music selection" msgid "play a track from the music selection" msgstr "Ignorar pistas de la selección musical" #, fuzzy #| msgid "Alt" msgid "At" msgstr "Alt" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Ir a la pista actual después de %i minutos de inactividad" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Restablecer vista después de %i minutos de inactividad a" #, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Abrir pantalla de video después de %i minutos de inactividad" #, c-format msgid "Close video screen after %i minutes" msgstr "Cerrar pantalla de video después de %i minutos" #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "Leer carpetas:" msgid "Read file:" msgstr "Leer archivo:" msgid "Ignore music-files and images with the following extensions:" msgstr "Ignorar archivos de música e imágenes con las siguientes extensiones:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "(separar las extensiones con comas; mayúsculas son indiferentes)" msgid "Include folder to the update process" msgstr "Incluir carpeta en la actualización" msgid "Read hidden files" msgstr "Leer archivos ocultos" msgid "Read hidden folders" msgstr "Leer carpetas ocultas" msgid "Read inside ZIP-/TAR-archives" msgstr "Leer dentro de archivos comprimidos ZIP/TAR" msgid "Read (ID3)-tags" msgstr "Leer etiquetas ID3" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "" "Ruta y formato de archivo para información de la pista si no hay etiquetas " "ID3:" msgid "Placeholders:" msgstr "Casillas" msgid "Read files and folders" msgstr "Leer archivos y carpetas" msgid "Add a folder to search for music-files" msgstr "Añadir una carpeta para buscar archivos de música" msgid "Add a single music-file" msgstr "Añadir un archivo de música individual" msgid "Disabled" msgstr "Deshabilitado" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "No actualizar" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "¿Desea quitar \"%s\" de la colección musical?" msgid "Select a folder with music-files" msgstr "Seleccione una carpeta con archivos de música" msgid "Select music-file" msgstr "Seleccione archivo de música" msgid "Unknown track" msgstr "Pista desconocida" msgid "Unknown artist" msgstr "Artista desconocido" msgid "Add a server containing music-files" msgstr "Añadir un servidor que contenga archivos de música" msgid "Use server:" msgstr "Usar servidor:" msgid "Server:" msgstr "Servidor:" msgid "Type" msgstr "Tipo" msgid "Login name:" msgstr "Nombre de contacto:" msgid "Include server to the update process" msgstr "Incluir servidor al actualizar" msgid "Configuration file" msgstr "Archivo de configuración" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #, c-format msgid "Loading %s" msgstr "Cargando %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Error %i" msgid "Edit track" msgstr "Editar pista" msgid "of" msgstr "de" msgid "Write (ID3-)tags" msgstr "Escribir etiquetas ID3" msgid "File names" msgstr "Nombres de archivo" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Mostrar los %s nombres de archivo..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "Los valores mostrados son la suma o el promedio de todos los valores " "individuales de los archivos tomados." msgid "Track" msgstr "Pista" msgid "Further information" msgstr "Información adicional" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "Directorio temporal" msgid "Further information..." msgstr "Información adicional..." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "No se puede renombrar \"%s\" a \"%s\"." msgid "Server name" msgstr "Nombre de servidor" msgid "Query online database" msgstr "Base de datos en línea" msgid "more..." msgstr "más..." msgid "Please select one of the following albums:" msgstr "Seleccione uno de los siguientes álbumes:" msgid "Old file name" msgstr "Antiguo nombre de archivo" msgid "New file name" msgstr "Nuevo nombre de archivo" msgid "Field" msgstr "Campo" msgid "Old value" msgstr "Valor antiguo" msgid "New value" msgstr "Nuevo valor" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<vacío>" msgid "Confirm modifications" msgstr "Confirmar modificaciones" msgid "Delete empty folders" msgstr "Borrar carpetas vacías" msgid "Please confirm or edit the following modification:" msgstr "Confirme o edite la siguiente modificación:" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Confirme o edite las modificaciones siguientes %s :" msgid "(lower case)" msgstr "(minúsculas)" msgid "(upper case)" msgstr "(mayúsculas)" msgid "(n characters)" msgstr "(nº de caracteres)" msgid "Rename files" msgstr "Renombrar archivos" msgid "Pattern:" msgstr "Formato:" #, fuzzy #| msgid "(first character)" msgid "Artist (first character)" msgstr "(primer carácter)" #, fuzzy #| msgid "(first character)" msgid "Album (first character)" msgstr "(primer carácter)" #, fuzzy #| msgid "(first character)" msgid "Genre (first character)" msgstr "(primer carácter)" #, fuzzy #| msgid "(first character)" msgid "Group (first character)" msgstr "(primer carácter)" #, fuzzy #| msgid "(n characters)" msgid "Year (4 characters)" msgstr "(nº de caracteres)" #, fuzzy #| msgid "(n characters)" msgid "Year (2 characters)" msgstr "(nº de caracteres)" #, fuzzy #| msgid "(n characters)" msgid "Duration (5 characters)" msgstr "(nº de caracteres)" msgid "Directory change" msgstr "Cambio de directorio" #, fuzzy #| msgid "(n characters)" msgid "File name (8 characters)" msgstr "(nº de caracteres)" msgid "File extension" msgstr "Extensión de archivo" msgid "Example:" msgstr "Ejemplo:" msgid "Replace" msgstr "Reemplazar" msgid "Search for:" msgstr "Buscar por:" msgid "in:" msgstr "en:" msgid "All fields" msgstr "Todos los campos" msgid "Path and file name" msgstr "Ruta y nombre de archivo" msgid "Replace with:" msgstr "Reemplazar con:" msgid "Match whole words only" msgstr "Sólo palabras enteras" msgid "Match case" msgstr "Mayúscula/Minúscula" msgid "Regular expression" msgstr "Expresión regular" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "Nada encontrado por \"%s\"." msgid "Split field" msgstr "Dividir campo" msgid "Field to split:" msgstr "Campo a dividir:" msgid "Destination fields and pattern:" msgstr "Campos de destino y formato:" #, fuzzy #| msgid "Track number" msgid "Track number (1 character)" msgstr "Número de pista" #, fuzzy #| msgid "(n characters)" msgid "Track number (2 characters)" msgstr "(nº de caracteres)" #, fuzzy #| msgid "(first character)" msgid "Disk number (1 character)" msgstr "(primer carácter)" #, fuzzy #| msgid "(n characters)" msgid "Disk number (2 characters)" msgstr "(nº de caracteres)" msgid "Void information" msgstr "Información vacía" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "Puede cambiar el aspecto de %s aplicando pieles diferentes. Sólo tiene que\n" "seleccionar una piel de la lista de abajo y/o conseguir más pieles en la web." msgid "Name" msgstr "Nombre" msgid "Info..." msgstr "Info..." msgid "Update list" msgstr "Actualizar lista" msgid "More skins on the web..." msgstr "Más pieles en la web..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Puede usar independientemente en la ventana principal un tamaño de fuente y " "portada diferentes\n" "(el tamaño remite a un zoom de 100%)." msgid "Font:" msgstr "Fuente:" msgid "Font size:" msgstr "Tamaño de fuente:" msgid "Use this font for dialogs, too" msgstr "Usar esta fuente también para los diálogos" msgid "Column width:" msgstr "Ancho de columna:" msgid "Cover size:" msgstr "Tamaño de la portada:" msgid "No lyrics found." msgstr "Letra no encontrada" msgid "Karaoke Prompt" msgstr "Karaoke" # %s will be replaced by the name of a music selection #, c-format msgid "No images found in \"%s\"." msgstr "No se han encontrado imágenes en \"%s\"." msgid "Background" msgstr "Fondo" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "Use %s-files" msgstr "Usar archivos %s" msgid "Please select a directory with images" msgstr "Por favor, seleccione un directorio con imágenes" msgid "If appropriate, switch over automatically" msgstr "Si conviene, saltar automático" msgid "Half size" msgstr "Tamaño medio" msgid "Spectrum Monitor" msgstr "Espectroscopio" msgid "Show spectrum" msgstr "Mostrar espectro" msgid "Show oscilloscope" msgstr "Mostrar osciloscopio" msgid "Show starfield" msgstr "Mostar campo de estrellas" msgid "Show other figures" msgstr "Mostar otras formas" #, fuzzy msgid "Visualization" msgstr "Iniciar visualización" msgid "Video output" msgstr "Salida de vídeo" msgid "Search homepage" msgstr "Buscar página de inicio" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Letras de %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "Buscar con %s" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informacion de %s" # Do not forget the ":" at the end of the string. msgid "Object count:" msgstr "Nº de objectos:" # Do not forget the ":" at the end of the string. msgid "Elapsed time:" msgstr "Tiempo transcurrido:" msgid "Message" msgstr "Mensaje" msgid "Scope" msgstr "Alcance" msgid "Console" msgstr "Consola" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i message" msgid_plural "%i messages" msgstr[0] "Mensaje %i" msgstr[1] "Mensajes %i" msgid "Evaluate" msgstr "Evaluar" msgid "Clear" msgstr "Limpiar" msgid "Open console on errors and warnings" msgstr "Abrir consola con errores y advertencias" msgid "Details" msgstr "Detalles" msgid "Clear all messages?" msgstr "¿Desea limpiar los mensajes?" #, c-format msgid "Overwrite \"%s\"?" msgstr "¿Desea sobrescribir \"%s\"?" msgid "Append" msgstr "Anexar" msgid "State" msgstr "Estado" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "archivos %s" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "audio %s" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "imágenes %s" #, c-format msgid "%s-video" msgstr "video %s" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "listas de reproducción %s" msgid "Script-files" msgstr "Scrips" msgid "Silverjuke skin-files" msgstr "Archivos de pieles de Silverjuke" msgid "Silverjuke jukebox-files" msgstr "Archivos de jukebox de Silverjuke" msgid "Archive-files" msgstr "Archivos de almacenamiento" msgid "Supported file-types" msgstr "Tipos de archivo soportados" msgid "Test..." msgstr "Probar..." msgid "Programs" msgstr "Programas" msgid "Cleanup index..." msgstr "Limpiar el índice..." msgid "max. size" msgstr "Tamaño máximo" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "La última vez %s no finalizó correctamente.\n" "Los siguientes objetos estaban en uso antes de la anormal finalización:\n" "\n" "%s\n" "\n" "Si se repite el problema, evite usar estos objetos.\n" "¿Desea usar los objetos ahora?" msgid "Use maybe errorous objects?" msgstr "¿Desea usar objetos posiblemente erróneos?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "__DATE_TIME_LONG__" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "__DATE_TIME_EDITABLE__" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "__DATE_LONG__" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "__DATE_EDITABLE__" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "__DATE_SUNDAY_FIRST__" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "__THIS_LANG__" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "__COVER_SEARCH_URLS__" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "__ARTIST_INFO_URLS__" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "__STOP_ARTISTS__" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "__STOP_ALBUMS__" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "__COVER_KEYWORDS__" msgid "__VIRT_KEYBD__" msgstr "__VIRT_KEYBD__" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "," #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "." #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i día" msgstr[1] "%i días" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Expresión inválida \"%s\"." msgid "Fatal error" msgstr "Error fatal" msgid "Ctrl" msgstr "Control" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Mayúsculas" msgid "Enlarge window" msgstr "Ampliar ventana" msgid "Shrink window" msgstr "Recortar ventana" msgid "Enlarge display" msgstr "Ampliar visor" msgid "Shrink display" msgstr "Recortar pantalla" #, fuzzy #| msgid "Device" msgid "Services" msgstr "Dispositivos" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Hide %s" msgstr "Ocultar %s" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #| msgid "Hide %s" msgid "Hide Others" msgstr "Ocultar %s" #, fuzzy #| msgid "Show file" msgid "Show All" msgstr "Mostrar archivo" #, fuzzy, c-format #| msgid "Exit %s" msgid "Quit %s" msgstr "Salir de %s" msgid "Extras" msgstr "Extras" msgid "Full screen" msgstr "Pantalla completa" msgid "Modules on the web..." msgstr "Módulos en la web..." msgid "Explore" msgstr "Explorar" msgid "Reveal in Finder" msgstr "Pasar al buscador" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "El archivo \"%s\" no existe." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "No se puede ejecutar \"%s\"." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" #~ msgid "Scroll vertically" #~ msgstr "Desplegable vertical" #~ msgid "Context sensitive" #~ msgstr "Contexto sensitivo" #, fuzzy #~| msgid "Exit %s" #~ msgid "Exit" #~ msgstr "Salir de %s" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "Deshabilitar %s " #~ msgid "Disable shutdown" #~ msgstr "Deshabilitar apagado" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Si tiene más de un monitor conectado a su ordenador, puede\n" #~ "asignar ventanas diferentes de Silverjuke a cada uno de ellos aquí." #~ msgid "Monitor for" #~ msgstr "Monitor para" # %s will be replaced by a control for selecting the display resolution #~ msgid "Switch resolution to %s" #~ msgstr "Cambiar resolución a %s" #~ msgid "Calculated volumes:" #~ msgstr "Volumen calculado:" #~ msgid "Skip silence between tracks" #~ msgstr "Saltar silencios entre pistas" #~ msgid "Other fadings" #~ msgstr "Otros desvanecimientos" #~ msgid "Attached window" #~ msgstr "Ventana anexada" #~ msgid "Show album name" #~ msgstr "Mostrar nombre de álbum" #~ msgid "Online help" #~ msgstr "Ayuda en línea" #~ msgid "Jukebox settings..." #~ msgstr "Preferencias del jukebox..." #~ msgid "Advanced settings..." #~ msgstr "Opciones avanzadas..." #~ msgid "Tools" #~ msgstr "Herramientas" #~ msgid "Workspace" #~ msgstr "Área de trabajo" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "" #~ "Beside several options, you can change the shortcuts to use here.\n" #~ "This page is for experienced users only." #~ msgstr "" #~ "Entre otras opciones, puede cambiar los atajos usados en %s desde aquí.\n" #~ "Para modificar una opción, seleccionela en la lista\n" #~ "y clique en \"Personalizar\". Se recomienda sólo a usuarios avanzados." #~ msgid "Command or option" #~ msgstr "Comando u opción" #~ msgid "Setting" #~ msgstr "Preferencias" #~ msgid "Preferred cover" #~ msgstr "Portada preferida" #~ msgid "Album cover" #~ msgstr "Portada de álbum" #~ msgid "Track cover" #~ msgstr "Portada de pista" #~ msgid "Track list" #~ msgstr "Listado de pistas" #~ msgid "Show disk number" #~ msgstr "Mostrar número de disco" #~ msgid "Show original artist" #~ msgstr "Mostrar artista original" #~ msgid "Show composer" #~ msgstr "Mostrar compositor" #~ msgid "Show time" #~ msgstr "Mostrar hora" #~ msgid "Show year" #~ msgstr "Mostrar año" #~ msgid "Show comment" #~ msgstr "Mostrar comentario" #~ msgid "Show genre" #~ msgstr "Mostrar género" #~ msgid "Show rating" #~ msgstr "Mostrar valoración" #~ msgid "Currently, the following file types are read:" #~ msgstr "Actualmente soporta los siguientes archivos:" #~ msgid "minutes|minutes of inactivity|o'clock" #~ msgstr "minutos|minutos de inactividad|en punto" # %i will be replaced by the number of characters #~ msgid "(%i characters)" #~ msgstr "(%i caracteres)" #~ msgid "More layouts on the web..." #~ msgstr "Más teclados en la web..." #, fuzzy #~| msgid "Monitor for" #~ msgid "Monitor for main window" #~ msgstr "Monitor para" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #~ msgid "Initializing %s..." #~ msgstr "Iniciando %s..." #~ msgid "Microphone" #~ msgstr "Microfono" # This is the name of the "First steps" button. Do not add "..." to the string! #~ msgid "First steps" #~ msgstr "Primeros pasos" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Buy %s..." #~ msgstr "Comprar %s..." #~ msgid "Unlicenced version" #~ msgstr "Versión sin registrar" #~ msgid "These options are available if you buy Silverjuke." #~ msgstr "Esta opción sólo está disponible si compre Silverjuke." # The first %s will be replaced by the program name (usually "Silverjuke"), the second and third %s will be replaced by a file type (eg. "MP3"), the fourth %s will be replaced by the URL to search for modules (eg. "http://www.silverjuke.net/en/modules.html". #~ msgid "" #~ "%s has not found an %s-decoder on your system. If you want to play %s-" #~ "files, you should install a module for this purpose.\n" #~ "\n" #~ "Open %s and search for modules now?" #~ msgstr "" #~ "%s no ha encontrado un descodificador de %s en el sistema. Si desea " #~ "reproducir archivos %s, deberá instalar un módulo apropiado.\n" #~ "\n" #~ "¿Abrir %s y buscar módulos ahora?" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Do you want %s to check for missing decoders in future?" #~ msgstr "¿Desea que %s compruebe si hay descodificadores desaparecidos?" # This is a context-menu option that is placed in the "Playback" submenu #~ msgid "Play tracks at once on double click" #~ msgstr "Reproducir las pistas con un doble clic" # The first %s will be replaced by the program name, the second by the name of the licence holder. #~ msgid "%s licenced to %s" #~ msgstr "%s registrado por %s" # %s will be replaced by the name of the licence holder #~ msgid "Licenced to %s" #~ msgstr "Registrado por %s" # %s will be replaced by the shortcut #~ msgid "Cannot register system-wide shortcut \"%s\"." #~ msgstr "No puede registrarse la tecla rápida \"%s\"." #~ msgid "Silverjuke language-files" #~ msgstr "Archivos de idioma sw Silverjuke" # This is the help topic for the "First steps" that are opened if Silverjuke is started the first time. The topic is also reachable through the "About" dialog. You can use _simple_ HTML here: <h1>, <p>, <b>, <i> and <a>. Please refer to one of the example files in the developer network. #~ msgid "__HELP__" #~ msgstr "" #~ "<h1>Primeros pasos</h1><p><b>¡Bienvenido a Silverjuke!</b> Después " #~ "de descargar e iniciar el programa, debe crear su propia Colección " #~ "musical. Para ello, arrastre a la ventana principal de Silverjuke las " #~ "carpetas con archivos de música (puede hacerlo desde el explorador de " #~ "Windows) y clique en “OK”. Silverjuke indizará los archivos de música " #~ "encontrados y los añadirá a su colección musical personal.</" #~ "p><p><b>¡Así de sencillo!</b> Hemos intentado simplificar al máximo " #~ "el uso de Silverjuke, hasta el punto de invitarles a poner a prueba el " #~ "programa.</p><h1>Mi colección musical</h1><p>Encontrará las carpetas " #~ "añadidas anteriormente en la opción <a href=\"dialog:mymusic.lib\">Mi " #~ "música</a>. Se accede a ella clicando con el botón derecho del ratón en " #~ "cualquier parte de la ventana principal de Silverjuke y eligiendo " #~ "“Preferencias” en el menú contextual que aparece. Posteriormente, podrá " #~ "añadir nuevas fuentes o quitarlas a su gusto. Si quita fuentes, sólo " #~ "borrará los índices de Silverjuke y no los archivos de su ordenador.</" #~ "p><h1>Reproducir música</h1><p>En la ventana principal de " #~ "Silverjuke encontrará su colección musical clasificada por álbumes. Si " #~ "hay carátulas en las carpetas o en las etiquetas ID3, también se " #~ "mostrarán. Puede editar las carátulas o añadir otras de su propio " #~ "ordenador o de la web; para ello, clique con el botón derecho del ratón " #~ "en una carátula o arrastre una imagen desde el explorador de Windows al " #~ "álbum.</p><p>Para <b>reproducir una pista</b>, tan sólo debe hacer doble " #~ "clic en su nombre. Si repite esta operación en otras pistas, éstas se " #~ "añadirán a la lista de reproducción y se reproducirán una detrás de otra." #~ "</p><p>Se pueden añadir también <b>múltiples pistas</" #~ "b> a la vez de las siguientes maneras: <ul><li>usando la tecla “" #~ "mayúscula” a la vez que se marcan con el ratón las " #~ "pistas correlativas deseadas y se arrastran a la ventana de " #~ "reproducción;</li> <li>usando la tecla “control” a la " #~ "vez que se marcan con el ratón las pistas alternas deseadas y se " #~ "arrastran a la ventana de reproducción; o</li><li>haciendo doble " #~ "clic en el nombre del álbum o del artista.</li></ul></" #~ "p><h1>Búsqueda</h1><p>Para <b>buscar</b> un artista, un á" #~ "lbum o una pista, escriba el nombre a buscar (o sus primeras letras) en " #~ "la casilla de búsqueda; Silverjuke mostrará los resultados " #~ "obtenidos.</p><p><b>Acabada la búsqueda</b>, si quiere ver todos " #~ "los álbumes de nuevo, limpie el campo de búsqueda o " #~ "presione la tecla “Esc”.</p><p>Para solicitudes más " #~ "complejas, puede usar las “<a href=\"dialog:advsearch.lib" #~ "\">selecciones de música</a>”, aprovechando las ya " #~ "existentes o creando nuevas a su gusto. Para ello, use la opción " #~ "“Selección musical” a la que se accede clicando con el " #~ "botón derecho del ratón en cualquier parte del programa.</" #~ "p><h1>Modo Kiosco</h1><p>Con el <a href=\"dialog:kiosk.lib,0\">Modo " #~ "Kiosko</a> puede lanzar el programa a pantalla completa con " #~ "funcionalidades limitadas, muy útil por ejemplo en fiestas, para " #~ "permitir añadir pistas nuevas sin acceder a opciones de " #~ "configuración del programa. Entre otras opciones, puede usar un <a " #~ "href=\"dialog:kiosk.lib,2\">teclado virtual</a> o controlar totalmente " #~ "Silverjuke desde el <a href=\"dialog:kiosk.lib,3\">teclado numé" #~ "rico</a>.</p><h1>Ampliar Silverjuke</h1><p>Finalmente, puede ampliar " #~ "Silverjuke usando los llamados <a href=\"dialog:basicsettings." #~ "lib,3\">módulos</a>. Estos permiten dar soporte a archivos que se " #~ "presenten en formatos diferentes a los habituales o añadir " #~ "visualizaciones a la vez que se escucha la música. Puede encontrar " #~ "información sobre los módulos soportados en <a href=\"http://www." #~ "silverjuke.net/forum/list-11.html\">www.silverjuke.net</a>.</" #~ "p><h1>Información adicional</h1><p>Hasta aquí una visión general " #~ "de lo que permite Silverjuke. Información más detallada puede encontrar " #~ "en la <a href=\"http://www.silverjuke.net/forum/topic-306.html\">ayuda " #~ "online</a> de Silverjuke y clicando en los hiperenlaces anteriores.</" #~ "p><p>Un fuerte saludo y ¡diviértase con Silverjuke! </" #~ "p><p>Su Equipo de Silverjuke.</p>" #~ msgid "Apply" #~ msgstr "Aplicar" #~ msgid "Check for new Silverjuke version..." #~ msgstr "Comprobar si existe una nueva versión de Silverjuke..." # The first %s will be replaces by the new version, the others %s will be replaced by the URL for downloading it. #~ msgid "" #~ "A new version of Silverjuke (%s) is available for download on %s.\n" #~ "\n" #~ "Do you want to open %s now?" #~ msgstr "" #~ "Hay una nueva versión de Silverjuke (%s) en %s.\n" #~ "\n" #~ "Desea abrir %s ahora?" #~ msgid "Other program" #~ msgstr "Otros programas" #~ msgid "Set markers" #~ msgstr "Establecer marcadores" # %i will be replaced by the number of the marker, %s will be replaced by the marker position or by a control to select the marker position #~ msgid "Show marker %i at %s." #~ msgstr "Mostrar %i marcadores de %s." #~ msgid "Minutes" #~ msgstr "Minutos" #~ msgid "Warn if marker is crossed" #~ msgstr "Advertir si está marcado" #~ msgid "Set markers..." #~ msgstr "Establecer marcadores..." #~ msgid "Burn CD" #~ msgstr "Quemar CD" #~ msgid "Tracks to burn:" #~ msgstr "Pistas para quemar" #~ msgid "Recorder:" #~ msgstr "Grabar:" #~ msgid "Please select an installed and available program" #~ msgstr "Seleccione un programa disponible" # %s will be replaced by the name of a program #~ msgid "Please locate \"%s\"" #~ msgstr "Localize \"%s\"" # %s will be replaced by the name of a program #~ msgid "Arguments for \"%s\"" #~ msgstr "Argumentos de \"%s\"" #~ msgid "Total time" #~ msgstr "Tiempo total" #~ msgid "Cannot calculate the total time" #~ msgstr "No se puede calcular el tiempo total" #~ msgid "" #~ "The size of the selected tracks is larger than the assumed capacity of " #~ "the disk to burn.\n" #~ "\n" #~ "Continue anyway?" #~ msgstr "" #~ "El tamaño de las pistas seleccionadas rebasa la capacidad del disco.\n" #~ "\n" #~ "¿Seguimos?" #~ msgid "Minimize window" #~ msgstr "Minimizar ventana" #~ msgid "Maximize window" #~ msgstr "Maximizar ventana" #~ msgid "Center window" #~ msgstr "Centrar ventana" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Show %s" #~ msgstr "Mostar %s" #~ msgid "System tray" #~ msgstr "Bandeja de sitema" #~ msgid "Show current track" #~ msgstr "Mostrar la pista actual" #~ msgid "Menus" #~ msgstr "Menús" #~ msgid "Show shortcuts" #~ msgstr "Mostrar teclas rápidas" #~ msgid "Show icons" #~ msgstr "Mostrar iconos" #~ msgid "Licence key" #~ msgstr "Clave" #~ msgid "Select the language for the user-interface from the following list:" #~ msgstr "Seleccione un idioma de la siguiente lista:" #~ msgid "Unknown language" #~ msgstr "Idioma desconocido" #~ msgid "More languages on the web..." #~ msgstr "Más idiomas en línea..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Note: Changing the language requires to restart %s." #~ msgstr "Nota: cambiar el idioma requiere reiniciar %s." # %s will be replaced by the program name, usually"Silverjuke" #~ msgid "This is an unlicenced copy of %s!" #~ msgstr "Copia sin licencia de %s." #~ msgid "" #~ "Please enter your name or your company's name and the licence key\n" #~ "you received when purchasing or updating your %s-licence:" #~ msgstr "Entre el nombre y la clave recibida al adquirir la licencia de %s:" #~ msgid "Your name/company:" #~ msgstr "Nombre:" # The first %s will be replaced by the program name, usually "Silverjuke". The second %i will be replaced by the number of evaluation days. The last %s, again, will be replaced by the program name. #~ msgid "" #~ "If you haven't bought a %s-licence, you may test this program %i days for " #~ "free.\n" #~ "After this period, you have to buy a licence for %s if you want to " #~ "continue using\n" #~ "this program." #~ msgstr "" #~ "Puede probar libremente %s durante %i días sin licencia.\n" #~ "Después deberá comprar una si desea seguir usando %s." # The first %s will be replaced by the program name, usually "Silverjuke". The second %s will be replaced by the name of the website, eg. www.silverjuke.net #~ msgid "" #~ "Further information about purchasing %s licences\n" #~ "are available at %s." #~ msgstr "" #~ "Encontrará información adicional sobre cómo adquirir licencias\n" #~ "de %s en %s." # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s..." #~ msgstr "Abrir %s..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Thank you for buying a %s-licence!" #~ msgstr "Gracias por adquirir una licencia de %s" #~ msgid "This copy is licenced to:" #~ msgstr "Esta copia está licenciada a " #~ msgid "" #~ "If this is not your name or the name of your company, you are not using a " #~ "legal licence!" #~ msgstr "Si ese no es su nombre, no está usando una licencia legal!" #~ msgid "Load external modules" #~ msgstr "Cargar módulos externos" #~ msgid "\"Magnetic\" window borders" #~ msgstr "\"Magnetic\" bordes de ventana" #~ msgid "Window" #~ msgstr "Ventana" #~ msgid "Use shaped windows" #~ msgstr "Usar ventana diseñadas" #~ msgid "Automatic version check" #~ msgstr "Comprobar automáticamente versión" # %i will be replaced by the number of days #~ msgid "Every %i days" #~ msgstr "Cada %i días" #~ msgid "FX" #~ msgstr "Efectos" #~ msgid "" #~ "Please select the input and output devices to use. If you encounter any " #~ "problems,\n" #~ "please try a different buffer size and the \"Use hardware\" option." #~ msgstr "" #~ "Seleccione los dispositivos de entrada y salida que desea usar. Si " #~ "encuentra algún problema,\n" #~ " cambie el tamaño del buffer y la opción \"Usar hardware\"." #~ msgid "Audio-output" #~ msgstr "Salidas de audio" #~ msgid "Prelisten audio-output" #~ msgstr "Eschucha previa de salida de audio" #~ msgid "Buffer" #~ msgstr "Buffer" #~ msgid "Use hardware" #~ msgstr "Usar hardware" #~ msgid "" #~ "With these options, you can add jingles (small pieces of sound) between " #~ "tracks.\n" #~ "Add the jingles as normal music-files and decide how often they should be " #~ "played." #~ msgstr "Con estas opciones puede añadir cuñas de sonido entre pistas." #~ msgid "Use jingles" #~ msgstr "Usar cuñas musicales" #~ msgid "Jingles:" #~ msgstr "Cuñas de sonido:" # %s will be replaced by a control to select the number of tracks #~ msgid "Play a jingle about every %s tracks." #~ msgstr "Reproducir una cuña cada %s pistas." #~ msgid "Select jingle(s)" #~ msgstr "Seleccionar cuña musical" #~ msgid "Use separate FX settings" #~ msgstr "Usar los ajustes de efectos separadamente" #~ msgid "" #~ "The \"system tray\" is an area normally placed at the edge of the " #~ "screen.\n" #~ "With the following options, you can add a little symbol with frequently\n" #~ "used functions to this area." #~ msgstr "" #~ "La \"bandeja de sistema\" es un área situada normalmente en un ángulo de " #~ "la pantalla.\n" #~ "Puede controlar el programa con un icono que se alojará en ella." #~ msgid "Never use system tray" #~ msgstr "No usar la bandeja de sistema" #~ msgid "Use system tray for the minimized window" #~ msgstr "Usar la bandeja de sistema al minimizar la ventana" #~ msgid "Always use system tray" #~ msgstr "Usar siempre la bandeja de sistema" #~ msgid "Show current track tooltip for %i seconds" #~ msgstr "Mostrar etiqueta de la pista actual durante %i segundos" #~ msgid "Only if inactive" #~ msgstr "Sólo si está inactivo" #~ msgid "Use this module for the following file extensions:" #~ msgstr "Usar este módulos para las siguientes extensiones de archivo:" #~ msgid "Further options..." #~ msgstr "Opciones adicionales..." # %s will be replaced by a list of extensions, eg. "MP3, MP2, MP1" #~ msgid "" #~ "If you disable this module or change the file types, make sure,\n" #~ "you don't need \"%s\" or they are supported by another module.\n" #~ "\n" #~ "Note: Remember that not every module can play every file type." #~ msgstr "" #~ "Si deshabilita este módulo o cambia el tipo de archivo, asegúrese\n" #~ "de no necesitarlos para reproducir archivos \"%s\" o de soportarlos otro " #~ "módulo.\n" #~ "\n" #~ "Nota: Recuerde que no todos los módulos pueden reproducir todos los tipos " #~ "de archivo." # %s will be replaced by the string an abbreviation should be entered for, eg. "Composer" or "Original artist" #~ msgid "Abbreviation for \"%s\"" #~ msgstr "Abreviatura de \"%s\"" #, fuzzy #~ msgid "Close %s" #~ msgstr "Cerrar" # %s will be replaced by the name of a website, eg. www.silverjuke.net #, fuzzy #~ msgid "Open %s" #~ msgstr "Abrir %s..." #, fuzzy #~ msgid "Selection: %s" #~ msgstr "Guardar selección" #, fuzzy #~ msgid "Select another visualization" #~ msgstr "Iniciar visualización" #~ msgid "Playback mode:" #~ msgstr "Modo Reproducción:" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Interpolation:" #~ msgstr "Interpolación:" #~ msgid "Linear" #~ msgstr "Linear" #~ msgid "Sensitive" #~ msgstr "Sensitivo" #~ msgid "Query settings before start" #~ msgstr "Preguntar por las preferencias antes de iniciar" #~ msgid "DAAP-/iTunes-client" #~ msgstr "DAAP-/cliente de iTunes " #~ msgid "Add a DAAP-/iTunes-server" #~ msgstr "Añadir un DAAP-/servidor de iTunes" #~ msgid "" #~ "With Silverjuke's HTTP server you can access the program and your music " #~ "library from any\n" #~ "browser or other Silverjuke instances in your network." #~ msgstr "" #~ "Con el servidor HTTP de Silverjuke puede acceder al programa y a su " #~ "colección musical desde\n" #~ "cualquier navegador o otra instancia de Silverjuke en red." #~ msgid "Enable HTTP server on port %s" #~ msgstr "Habilitar el servidor HTTP en el puerto %s" #~ msgid "Share my music library over HTTP" #~ msgstr "Compartir mi Mi música en HTTP" #~ msgid "Enable web interface access over HTTP" #~ msgstr "Habilitar interfaz web de acceso a HTTP" #~ msgid "Playlist" #~ msgstr "Lista de reproducción" #~ msgid "Empty" #~ msgstr "Vacio" #~ msgid "Update" #~ msgstr "Actualizar" #~ msgid "Sharing/Web interface" #~ msgstr "Compartir/Interfaz web" #~ msgid "Audio-decoder" #~ msgstr "Descodificador de audio" #~ msgid "Online database" #~ msgstr "Base de datos en línea" # The first %i will be replaced by the current day number in the evaluation period, the second %i will be replaced by the total number of days of the evaluation period (currently 14). #~ msgid "You are on day %i of the %i-days testing period." #~ msgstr "Se encuentra en el día %i del período de prueba de %i días." # This string is shown as a link the the "About" dialog. #~ msgid "Enter licence key now..." #~ msgstr "Entrar licencia ahora..." #~ msgid "Setup" #~ msgstr "Setup" #~ msgid "Show the following effects:" #~ msgstr "Mostrar los siguientes efectos:" #~ msgid "" #~ "To install further effects, just copy the\n" #~ "VST-plugins to one of the search paths." #~ msgstr "" #~ "Para instalar efectos adicionales, tan sólo copia el\n" #~ "plugin-VST en una de las rutas de búsqueda." #~ msgid "FX settings for %s :" #~ msgstr "Ajustes de efectos para %s :" #~ msgid "Normal playback" #~ msgstr "Reproducción normal" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Enable %s" #~ msgstr "Habilitar %s" # %i will be replaced by the number of characters #~ msgid "%s parameters" #~ msgstr "%s parámetros" #~ msgid "Load %s" #~ msgstr "Cargar %s" #~ msgid "Save %s" #~ msgstr "Guardar %s" # %s will be replaced eg. by the name of an effect #~ msgid "%s priority" #~ msgstr "%s prioridad" #~ msgid "Load all" #~ msgstr "Cargar todo" #~ msgid "Save all" #~ msgstr "Guardar todo" #~ msgid "Start visualization/karaoke prompt" #~ msgstr "Iniciar visualización/karaoke" #~ msgid "Stop visualization/karaoke prompt" #~ msgstr "Parar visualización/karaoke" #~ msgid "Drag'n'drop" #~ msgstr "Arrastrar y soltar" #~ msgid "Start visualization after %i minutes of inactivity" #~ msgstr "Iniciar visualización después de %i minutos de inactividad" #~ msgid "Password not set." #~ msgstr "Clave no establecida" #~ msgid "Karaoke, Vis. etc" #~ msgstr "Karaoke, Vis, etc" #~ msgid "Visualization/Karaoke Prompt" #~ msgstr "Visualización/Karaoke" #~ msgid "Please close the \"%s\" configuration window before continuing." #~ msgstr "" #~ "Por favor, cierre la ventana de configuración \"%s\" antes de continuar." ����������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/fr.po��������������������������������������������������������������������������0000664�0000000�0000000�00000276703�12660066715�0015403�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2010-10-04 14:51+0100\n" "Last-Translator: Bjoern Petersen <drsilver@silverjuke.net>\n" "Language-Team: French\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" msgid "Sleep mode activated." msgstr "Mode veille activé" msgid "Sleep mode deactivated." msgstr "Mode veille désactivé" msgid "Play time exceeded" msgstr "" msgid "Default" msgstr "Standard" # dt. "Geräte" #, fuzzy #| msgid "Devices" msgid "Device" msgstr "Périphériques" msgid "Show covers" msgstr "Afficher les pochettes" msgid "Duration" msgstr "Durée" msgid "Artist" msgstr "Artiste" msgid "Original artist" msgstr "Artiste à l'origine" msgid "Composer" msgstr "Compositeur" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Numéro de la piste" msgid "Automatic track number" msgstr "Numéro automatique de piste" msgid "Disk number" msgstr "Numéro du support" msgid "Genre" msgstr "Genre" msgid "Year" msgstr "Année" #, fuzzy #| msgid "My rating" msgid "Rating" msgstr "Ma notation" msgid "Comment" msgstr "Commentaire" msgid "Show double tracks" msgstr "Afficher les titres en double" msgid "Show different artist names" msgstr "Afficher les différents noms d'artiste" msgid "Show different album names" msgstr "Afficher différents noms d'album" #, fuzzy #| msgid "Show covers" msgid "Show cover titles" msgstr "Afficher les pochettes" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s titres" msgid "Drag folders with music here." msgstr "Tirez dans cette fenêtre un répertoire de fichiers musicaux." msgid "Reset to default values" msgstr "Réinitialiser aux valeurs standard " msgid "Nr." msgstr "No" #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "AutoPlay" msgid "Shuffle" msgstr "Lecture aléatoire" msgid "Recreating music library" msgstr "Recréation de la bibliothèque musicale" msgid "Updating music library" msgstr "Actualisation de la bibliothèque musicale" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Si vous interrompez la procédure de mise à jour, la bibliothèque musicale ne " "sera peut-être pas complète.\n" "\n" "Voulez-vous annuler la mise à jour?" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" "%s est en train de lire un titre. Voulez-vous arrêter la lecture et quitter " "%s?" #, c-format msgid "Exit %s" msgstr "Quitter %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Ouverture \"%s\" impossible." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "" #, c-format msgid "Execute the script \"%s\"?" msgstr "" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "Recherche" msgid "On" msgstr "Oui" msgid "Off" msgstr "Non" msgid "Repeat playlist" msgstr "Répéter la playlist" msgid "Repeat one" msgstr "Répéter une fois" msgid "Repeat all" msgstr "Répéter tous" msgid "Select a track, then start playback." msgstr "Sélectionnez d'abord un titre, puis démarrez la lecture." msgid "Stop after this track" msgstr "Stopper après ce titre" msgid "Stop after each track" msgstr "" #, fuzzy #| msgid "Double click on covers" msgid "Double click play tracks at once" msgstr "Double-clic sur les pochettes" msgid "Start playback on first enqueue" msgstr "" # %i will be replaced by a number-selection-control, %s will be replaced by a music-selection-control msgid "Remove played tracks from queue" msgstr "" msgid "More from current album" msgstr "Davantage sur l'album en cours" msgid "More from current artist" msgstr "Davantage sur l'artiste en cours" msgid "No more tracks." msgstr "Pas davantage de titres" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Remove all %i tracks from the queue and stop playback?" msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "" "Supprimer l'ensemble des %i titres de la playlist et stopper la lecture?" msgstr[1] "" "Supprimer l'ensemble des %i titres de la playlist et stopper la lecture?" msgid "Clear playlist" msgstr "Vider la playlist" msgid "Track played, click to reset" msgstr "" msgid "Boredom avoided: Track moved down" msgstr "" msgid "Remove this track" msgstr "Supprimer ce titre de la playlist" msgid "Toggle time mode" msgstr "Afficher la durée courue/restante" # %s will be replaced by a letter or by a number #, c-format msgid "Go to \"%s\"" msgstr "Aller aux \"%s\"" msgid "End search" msgstr "Fin de recherche" msgid "click right for options" msgstr "clic droit pour les options" msgid "Volume" msgstr "Volume" msgid "Double-click to enlarge the cover" msgstr "Double-clic pour agrandir la pochette" #, c-format msgid "Close this window and exit %s" msgstr "Fermer la fenêtre et quitter %s" msgid "Open main menu" msgstr "Ouvrir le menu principal" msgid "Toggle shuffle mode" msgstr "Lecture aléatoire" msgid "Repeat all/repeat current" msgstr "Répéter tous les titres/le titre en cours" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Rechercher dans \"%s\"" msgid "Help" msgstr "Aide" #, fuzzy #| msgid "Read files and folders" msgid "Add folders and files" msgstr "Lire fichiers et répertoires" #, fuzzy #| msgid "File extension" msgid "Extensions" msgstr "Extension de fichier" msgid "Show remaining time" msgstr "Afficher le temps restant" msgid "Show elapsed time" msgstr "Afficher le temps couru" msgid "Show total time" msgstr "Afficher la durée totale" msgid "Show track number" msgstr "Afficher le numéro de piste" msgid "Show artist name" msgstr "Afficher le nom de l'artiste" msgid "Show AutoPlay" msgstr "Afficher AutoPlay" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "Affichage" #, fuzzy #| msgid "Volume" msgid "Columns" msgstr "Volume" msgid "Same zoom in all views" msgstr "Même zoom sur toutes les vues" msgid "Fonts and covers" msgstr "Police de caractères / pochettes" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Skins" #, fuzzy #| msgid "Start kiosk mode" msgid "Start kiosk mode..." msgstr "Démarrer le mode kiosque" # %s will be replaced by the name of an artist #, fuzzy, c-format #| msgid "\"%s\" on the web" msgid "%s on the web" msgstr "\"%s\" sur internet" msgid "All files" msgstr "Tous les fichiers" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "A propos de %s" msgid "File" msgstr "Fichier" # Menu Title (eg. if "Settings/Basic settings/Further options/Window: Use shaped windows" is disabled or on Mac OS X msgid "Edit" msgstr "Editer" # "View" menu title with - optionally - different translations for Microsoft Windows and Mac OS X msgid "View" msgstr "Affichage" msgid "Playback" msgstr "Lecture" #, fuzzy #| msgid "Fit to screen" msgid "Video screen" msgstr "Adapter à l'écran" msgid "Kiosk mode" msgstr "Mode kiosque" msgid "None" msgstr "" msgid "Further options" msgstr "Options supplémentaires" msgid "Queue" msgstr "Playlist" msgid "Automatic control" msgstr "Contrôles automatiques" msgid "Current view" msgstr "Affichage actuel" #, c-format msgid "Next track from \"%s\"" msgstr "Titre suivant de \"%s\"" msgid "Next track" msgstr "Titre suivant" msgid "Search for genre" msgstr "Rechercher genre" msgid "Search for music selection" msgstr "Rechercher sélection de musique" msgid "Edit tracks/Get info" msgstr "Contenu de la piste/Infos" msgid "Show file" msgstr "Voir le fichier" msgid "Cover editor" msgstr "Afficher la pochette" msgid "Mix" msgstr "" #, fuzzy #| msgid "Channels" msgid "Left channel" msgstr "Canaux" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Pré-écoute" msgid "No" msgstr "Non" msgid "Yes" msgstr "Oui" #, fuzzy #| msgid "Only initalize system volume" msgid "Only initialize system volume" msgstr "Initialiser le volume système" msgid "Output" msgstr "" msgid "Use system volume" msgstr "Utiliser le volume système" msgid "Several artists" msgstr "Plusieurs artistes" msgid "Unknown title" msgstr "Titre inconnu" msgid "Save playlist" msgstr "Sauvegarder la playlist" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Ecriture \"%s\" impossible." msgid "Open playlist" msgstr "Ouvrir playlist" msgid "Title" msgstr "Titre" msgid "Track count" msgstr "Nombre de titres" msgid "Disk count" msgstr "Nombre de supports" msgid "Group" msgstr "Groupe" msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Canaux" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "Nom du fichier" msgid "File size" msgstr "Taille du fichier" msgid "Date added" msgstr "Date ajout" msgid "Date modified" msgstr "Date modification" msgid "Last played" msgstr "Dernière lecture" msgid "Play count" msgstr "Nombre de lectures" msgid "SQL expression" msgstr "Expression SQL" msgid "Limit result to" msgstr "Limiter le résultat à" msgid "Title/artist/album" msgstr "Titre/artiste/album" msgid "File type" msgstr "Type de fichier" msgid "Queue position" msgstr "Position dans la playlist" msgid "Include tracks" msgstr "Titres inclus" msgid "Exclude tracks" msgstr "Titres exclus" msgid "Random" msgstr "De manière aléatoire" # %s will be replaced by a shortcut, eg. "Ins" or "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "Appuyez sur \"%s\" dans la fenêtre principale" msgid "Insert" msgstr "Inclure" msgid "Del" msgstr "Supprimer" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Veuillez entrez la date sous la forme \"jj.mm.aaaa\" ; vous pouvez rajouter " "l'heure sous la forme \"hh:mm\" ." msgid "Please enter the text." msgstr "Veuillez entrer le texte." msgid "Please enter a value." msgstr "Veuillez entrer une valeur." msgid "Please enter a valid value." msgstr "Veuillez entrer une valeur plausible." msgid "(second field)" msgstr "(deuxième champ)" msgid "No valid criteria defined." msgstr "Aucun critère valide de défini." msgid "The search cannot be started; please check the following fields:" msgstr "" "La recherche ne peut être réalisée ; veuillez vérifier les champs suivants:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" "Remarque: les opérateurs \"égal\" et \"différent\" ont un impact sur la " "recherche." # %s will be replaced by the name of a music selection #, fuzzy, c-format #| msgid "Do you really want to delete the music selection \"%s\"?" msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Voulez-vous vraiment supprimer la sélection de musique \"%s\"?" msgid "Esc" msgstr "Echap" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Annuler" msgid "Page left" msgstr "Page de gauche" msgid "Page right" msgstr "Page de droite" msgid "Page up" msgstr "Page suivante" msgid "Page down" msgstr "Page précédente" msgid "Menu" msgstr "Menu" msgid "Cursor left" msgstr "Curseur à gauche" msgid "Cursor right" msgstr "Curseur à droite" msgid "Cursor up" msgstr "Curseur haut" msgid "Cursor down" msgstr "Curseur bas" msgid "Line left" msgstr "Ligne à gauche" msgid "Line right" msgstr "Ligne à droite" msgid "Line up" msgstr "Ligne au dessus" msgid "Line down" msgstr "Ligne en dessous" msgid "Home" msgstr "Home" msgid "End" msgstr "Fin" msgid "Enter" msgstr "Entrée" msgid "Delete" msgstr "Supprimer" msgid "Album view" msgstr "Vue de l'album" msgid "Cover view" msgstr "Vue de la pochette" msgid "List view" msgstr "Vue sous forme de liste" msgid "Toggle view" msgstr "Changer de vue" #, fuzzy #| msgid "Open playlist" msgid "Open playlist..." msgstr "Ouvrir playlist" msgid "Unqueue marked tracks" msgstr "Enlever les titres qui sont marqués" msgid "Unqueue all but marked tracks" msgstr "Enlever tous les titres hormis ceux qui sont marqués" #, fuzzy #| msgid "Save playlist" msgid "Save playlist..." msgstr "Sauvegarder la playlist" msgid "Paste" msgstr "Coller" #, fuzzy #| msgid "Music selection" msgid "Music selection..." msgstr "Sélections automatiques" msgid "Settings" msgstr "Préférences" msgid "Update music library" msgstr "Actualiser la bibliothèque musicale" msgid "Recreate music library" msgstr "Recréer la bibliothèque musicale" msgid "Enqueue tracks" msgstr "Copier les titres dans la playlist" msgid "Play tracks next" msgstr "Lire les titres à la suite du titre en cours" msgid "Play tracks now" msgstr "Lire les titres maintenant" msgid "Volume up" msgstr "Augmenter le volume" msgid "Volume down" msgstr "Diminuer le volume" msgid "Unqueue tracks" msgstr "Supprimer les titres de la playlist" #, fuzzy #| msgid "Edit tracks/Get info" msgid "Edit tracks/Get info..." msgstr "Contenu de la piste/Infos" msgid "Play" msgstr "Lecture" msgid "Pause" msgstr "Pause" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Titre précédent" msgid "Seek backward" msgstr "Recherche arrière" msgid "Seek forward" msgstr "Recherche avant" msgid "Fade to next" msgstr "Fondu vers le titre suivant" msgid "Mute" msgstr "Enlever le son" msgid "Reload skin" msgstr "Recharger les skin" #, fuzzy #| msgid "Fit to screen" msgid "Toggle video screen" msgstr "Adapter à l'écran" msgid "Smooth" msgstr "Adoucir la structure de l'image" msgid "Select all" msgstr "Tout sélectionner" msgid "Zoom in" msgstr "Zoom avant" msgid "Zoom out" msgstr "Zoom arrière" msgid "Normal zoom" msgstr "Zoom normal" msgid "Always on top" msgstr "Toujours visible" msgid "Go to current track" msgstr "Aller à la piste en cours" msgid "Go to marked track" msgstr "Aller à la piste marquée" msgid "Go to random album" msgstr "Aller à l'album en mode aléatoire" msgid "Go to previous letter" msgstr "Aller à la lettre précédente" msgid "Go to next letter" msgstr "Aller à la lettre suivante" msgid "Add credit" msgstr "Ajout de jetons" #, fuzzy #| msgid "Console" msgid "Console..." msgstr "Console" #, fuzzy #| msgid "Replace" msgid "Replace..." msgstr "Remplacer" #, fuzzy #| msgid "Split field" msgid "Split field..." msgstr "Décomposer un champ" #, fuzzy #| msgid "Rename files" msgid "Rename files..." msgstr "Renommer les fichiers" # The online database "freedb" can be queried in the Tag editor using the "Menu" button #, fuzzy #| msgid "Query online database" msgid "Query online database..." msgstr "Accéder à la base online" #, fuzzy #| msgid "New music selection" msgid "New music selection..." msgstr "Nouvelle sélection de musique" msgid "Save" msgstr "Enregistrer" #, fuzzy #| msgid "Save as" msgid "Save as..." msgstr "Enregistrer sous" #, fuzzy #| msgid "Rename" msgid "Rename..." msgstr "Renommer" msgid "Revert to saved" msgstr "Annuler les modifications" #, fuzzy #| msgid "Open file" msgid "Open file..." msgstr "Ouvrir le fichier" #, fuzzy #| msgid "Save cover" msgid "Save cover..." msgstr "Enregistrer la pochette" msgid "Rotate left" msgstr "Rotation à gauche" msgid "Rotate right" msgstr "Rotation à droite" msgid "Flip horizontally" msgstr "Miroir horizontal" msgid "Flip vertically" msgstr "Miroir vertical" msgid "Grayscale" msgstr "Niveaux de gris" msgid "Negative" msgstr "Négatif" msgid "Fit to screen" msgstr "Adapter à l'écran" msgid "Decrease brightness" msgstr "Diminuer la luminosité" msgid "Increase brightness" msgstr "Augmenter la luminosité" msgid "Decrease contrast" msgstr "Diminuer le contraste" msgid "Increase contrast" msgstr "Augmenter le contraste" msgid "Normal brightness/contrast" msgstr "Luminosité et contraste par défaut" msgid "Crop" msgstr "Recadrage" msgid "Please press the shortcut to add." msgstr "Pressez sur le raccourci à rajouter." msgid "System-wide:" msgstr "Ensemble du système" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Supprimer le raccourci \"%s\" " msgid "Add system-wide shortcut..." msgstr "Ajouter un raccourci à l'ensemble du système..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Ajouter le raccourci à \"%s\"..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "Le raccourci \"%s\" est actuellement utilisé par la commande \"%s\".\n" "\n" "Voulez-vous attribuer ce raccourci à la commande \"%s\" ?" #, fuzzy msgid "Mouse" msgstr "Enlever le son" msgid "Drag window content" msgstr "Tirer le contenu de la fenêtre" msgid "Left mouse button" msgstr "Clic gauche" msgid "Drag selected tracks" msgstr "Tirer les titres sélectionnés" msgid "Second click with the left mouse button" msgstr "Deuxième clic bouton de gauche" msgid "Show icons beside mouse cursor" msgstr "Afficher les icônes à côté du curseur de la souris" msgid "Middle mouse button" msgstr "Bouton du milieu de la souris" msgid "Edit tracks" msgstr "Editer les titres" msgid "Tooltips" msgstr "Conseils" msgid "Mouse wheel" msgstr "Molette de la souris" #, fuzzy #| msgid "Scroll horizontally" msgid "Scroll horizontally in album view" msgstr "Dérouler horizontalement" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "Utiliser les touches d'un clavier multimédia" msgid "Ask on close if playing" msgstr "En quittant, demander confirmation si en cours de lecture" # This option is shown in the corresponding message box and in "Basic settings/Further options" msgid "Ask before enqueuing multiple tracks" msgstr "Demander avant l'ajout d'un groupe de titres dans la playlist" # This option is shown in the corresponding message box and in "Basic settings/Further options" msgid "Ask before clearing the playlist" msgstr "Demander avant de vider la playlist" # This option is shown in the corresponding message box and in "Basic settings/Further options" #, fuzzy #| msgid "Ask before changing my rating" msgid "Ask before changing the rating" msgstr "Demander avant de modifier ma notation" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Retour arrière" msgid "Space" msgstr "Espace" msgid "Up" msgstr "Haut" msgid "Left" msgstr "Gauche" msgid "Right" msgstr "Droite" msgid "Down" msgstr "Bas" msgid "Print" msgstr "Impr" msgid "Ins" msgstr "Inclure" msgid "Music selection" msgstr "Sélections automatiques" # The name of the numpad area of the keyboard ("Ziffernblock" in german, "Numpad" in english). msgid "Numpad" msgstr "Pavé numérique" msgid "Select date and time" msgstr "Sélectionner la date et l'heure" msgid "Time" msgstr "Durée" msgid "contains" msgstr "contient" msgid "does not contain" msgstr "ne contient pas" msgid "starts with" msgstr "débute avec" msgid "does not start with" msgstr "ne débute pas avec" msgid "starts simelar to" msgstr "début similaire à" msgid "ends with" msgstr "termine par" msgid "does not end with" msgstr "ne termine pas par" msgid "on" msgstr "le" msgid "is equal to" msgstr "est égal à" msgid "not on" msgstr "pas le" msgid "is unequal to" msgstr "est différent de" msgid "is simelar to" msgstr "est similaire à" msgid "is after" msgstr "est après" msgid "is greater than" msgstr "est plus grand que" msgid "is on or after" msgstr "est le ou après" msgid "is greater or equal" msgstr "est supérieur/égal" msgid "is before" msgstr "est avant" msgid "is less than" msgstr "est inférieur à" msgid "is on or before" msgstr "est le ou avant" msgid "is less or equal" msgstr "est inférieur/égal" msgid "is in the last" msgstr "dans les derniers" msgid "is not in the last" msgstr "pas dans les derniers" msgid "is in the period" msgstr "dans la période" msgid "is in range" msgstr "dans la plage" msgid "is not in the period" msgstr "hors de la période" msgid "is not in range" msgstr "hors de la plage" msgid "is set" msgstr "renseigné" msgid "is unset" msgstr "non renseigné" msgid "tracks" msgstr "titres" msgid "albums" msgstr "albums" msgid "minutes" msgstr "minutes" msgid "hours" msgstr "heures" msgid "seconds" msgstr "secondes" msgid "days" msgstr "jours" msgid "No rating" msgstr "Sans notation" msgid "random" msgstr "aléatoire" msgid "highest rating" msgstr "avec meilleure note" msgid "lowest rating" msgstr "avec la note la plus basse" msgid "most often played" msgstr "le plus souvent lus" msgid "least often played" msgstr "très peu lus" msgid "most recently played" msgstr "les plus lus récemment" msgid "least recently played" msgstr "les moins lus récemment" msgid "most recently added" msgstr "les plus ajoutés récemment" msgid "least recently added" msgstr "les moins ajoutés récemment" msgid "most recently modified" msgstr "les plus modifiés récemment" msgid "least recently modified" msgstr "les moins modifiés récemment" msgid "most recently released" msgstr "sorti récemment" msgid "least recently released" msgstr "sorti depuis longtemps" msgid "low queue position" msgstr "en début de la playlist" msgid "high queue position" msgstr "en fin de la playlist" msgid "Today" msgstr "Aujourd'hui" msgid "Yesterday" msgstr "Hier" msgid "Select..." msgstr "Sélection..." msgid "Show tracks..." msgstr "Afficher les titres..." #, fuzzy msgid "Add tracks from playlist" msgstr "Ajouter à playlist" msgid "Current position" msgstr "Position actuelle" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "de" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "à" msgid "Remove criterion" msgstr "Enlever le critère" msgid "Add criterion" msgstr "Ajouter un critère" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "Titres inclus dans \"%s\"l" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Titres exclus de \"%s\"" msgid "Saved selections" msgstr "Sélections enregistrées" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Rechercher %s avec %s des critères suivants:" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "titres|albums" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "tous|certains|aucun" msgid "Close" msgstr "Fermer" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Voulez-vous sauvegarder les modifications à la sélection \"%s\"?" msgid "Music selection modified" msgstr "Sélection de musique modifiée" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "Editer la sélection \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Voulez-vous vraiment supprimer la sélection de musique \"%s\"?" msgid "Delete music selection" msgstr "Supprimer la sélection" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Voulez-vous vraiment supprimer les sélections %i?" msgid "Delete music selections" msgstr "Supprimer la sélection de musique" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "Aucun résultat pour \"%s\" ." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "" "Voulez-vous supprimer les titres sélectionnés de la sélection de musique \"%s" "\"?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "" "Voulez-vous rajouter les titres sélectionnés à la sélection de musique \"%s" "\"?" # This is the name of a predefined music selection msgid "70's music" msgstr "Musique des années 70" # This is the name of a predefined music selection #, fuzzy msgid "Worst rated" msgstr "Meilleure notation" # This is the name of a predefined music selection msgid "Top rated" msgstr "Meilleure notation" # This is the name of a predefined music selection msgid "Top 20" msgstr "Top 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "Derniers lus" # This is the name of a predefined music selection msgid "Played today" msgstr "Lus aujourd'hui" # This is the name of a predefined music selection msgid "Random selection" msgstr "Sélection aléatoire" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Titres dans la playlist" msgid "Untitled Music selection" msgstr "Sélection de musique non définie" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Aucun résultat pour \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "1 trouvé pour \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s résultats pour \"%s\"" msgid "No matches" msgstr "Aucun trouvé" msgid "1 match" msgstr "1 trouvé" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s trouvés" # %s will be replaced by the name of a music selection #, fuzzy msgid "Search single words" msgstr "Rechercher dans \"%s\"" msgid "Lookup genre on simple search" msgstr "Tenir compte du genre dans une recherche simple" msgid "Search while typing" msgstr "Rechercher pendant la saisie" msgid "Save modified music selections" msgstr "Enregistrer les sélections modifiées" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "Demander" msgid "Max. history size" msgstr "Taille maxi de l'historique" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Rechercher \"%s\" dans \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Rechercher \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Veuillez appuyer sur la touche de gauche de la souris et tirez la sélection " "souhaitée avec la souris." # Menu entry name for auto-generated covers, please leave the brackets msgid "<Abstract>" msgstr "<Abstract>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Standard)" msgid "Paste image from clipboard" msgstr "Coller l'image depuis le presse-papier" msgid "Browse" msgstr "Sélection" msgid "Select cover" msgstr "Ouvrir la pochette" msgid "Search covers on the web" msgstr "Rechercher des pochettes sur internet" msgid "Don't rotate" msgstr "Pas de rotation" msgid "Rotate/flip" msgstr "Rotation/miroir" msgid "Use default images..." msgstr "Remettre les images à leur état d'origine..." msgid "Effects/options" msgstr "Effets/options" msgid "Select image" msgstr "Sélectionner l'image" msgid "Save cover" msgstr "Enregistrer la pochette" msgid "Reset all selected alternative images to their default value?" msgstr "Voulez-vous remettre les images modifiées à leur état d'origine?" msgid "Search paths" msgstr "Chemin" msgid "The search paths are used for skins, language files and modules." msgstr "" "Les chemins d'accès sont utilisés pour les skin, fichiers langue et modules." msgid "Add..." msgstr "Ajouter..." msgid "Remove" msgstr "Supprimer" msgid "Please select the folder to add to the search paths." msgstr "" "Veuillez définir le répertoire que vous vouler ajouter au chemin d'accès." msgid "Edit..." msgstr "Editer..." #, fuzzy #| msgid "Comment" msgid "Command" msgstr "Commentaire" msgid "Shortcut" msgstr "Raccourci" #, fuzzy #| msgid "Options" msgid "Option" msgstr "Options" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "" "Les options suivantes sont réservées uniquement aux utilisateurs avertis." msgid "Customize" msgstr "Configurer" msgid "Reset selection" msgstr "Annuler la sélection" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Souhaitez-vous vraiment remettre les valeurs standard aux %i commandes et " "options sélectionnées?" #, fuzzy #| msgid "Shortcut" msgid "Shortcuts" msgstr "Raccourci" msgid "Language" msgstr "Langue" msgid "Show files with" msgstr "Ouvrir le fichier avec" msgid "Instance" msgstr "Instance" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "" "Veuillez utiliser l'option de ligne de commande --%s=<fichier> pour le " "changer." msgid "Index file" msgstr "Fichier index" msgid "RAM cache" msgstr "Cache RAM" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "temps de recherche moyen: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synchronisation" msgid "Fast" msgstr "Rapide" msgid "Save but slower" msgstr "Sûr mais plus lent" msgid "Very save and slow" msgstr "Très sure mais lente" msgid "Image cache" msgstr "Cache image" msgid "Use temporary directory" msgstr "Utiliser un répertoire temporaire" msgid "Yes, load images asynchrony" msgstr "Oui, ouvrir les image en mode asynchrone" msgid "Yes, load images directly and avoid flickering" msgstr "Oui, charger les images directement et éviter le scintillement" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% utilisés pour %i images" #, fuzzy msgid "Regard file changes" msgstr "Lire fichiers et répertoires" msgid "Advanced" msgstr "Avançé" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Veuillez redemarrer %s pour appliquer les modifications réalisées." msgid "Info" msgstr "Infos complémentaires" msgid "Help-system" msgstr "Sytème d'aide" # String for "Don't know" or "unset" msgid "n/a" msgstr "non connu" msgid "Internal" msgstr "Interne" msgid "No credit." msgstr "Pas de jetons" #, c-format msgid "Credit: %i" msgstr "Jetons: %i" msgid "Start" msgstr "Démarrer" #, fuzzy #| msgid "Functionality" msgid "Functions" msgstr "Fonctionnalités" msgid "Monitors" msgstr "Ecrans" # New in 1.03 msgid "Virtual keyboard" msgstr "Clavier virtuel" msgid "Credit system" msgstr "Système de jetons" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke dispose d'un \"Mode Kiosque\" qui vous permet d'exécuter le " "programme\n" "en plein écran avec des fonctionnalités limitées." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Avant d'appuyer sur \"Démarrer\", assurez-vous que vous pouvez de nouveau " "quitter le mode kiosque:" # %s will be replaced by a shortcut, eg. "F11" #, c-format msgid "Exit by hitting %s" msgstr "Terminer avec la touche %s" msgid "Exit by clicking into two different corners" msgstr "Terminer en cliquant dans deux coins différents" msgid "Try to set exclusive" msgstr "" #, fuzzy msgid "Ask for a password on exit" msgstr "En quittant, demander le mot de passe suivant:" #, fuzzy msgid "Change password..." msgstr "Contrôle du mot de passe" msgid "Exit action:" msgstr "Action:" msgid "Start the kiosk mode with the following functionality:" msgstr "Démarrer le mode kiosque avec les fonctionnalités suivantes:" msgid "Play/pause" msgstr "Lecture/pause" msgid "Edit queue" msgstr "Editer la playlist" msgid "Toggle elements" msgstr "" msgid "Enqueue multiple tracks" msgstr "" msgid "All functions" msgstr "Toutes les fonctions" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Limiter la sélection à %s titres" msgid "Please enter the password again for verification." msgstr "" "Pour éviter une erreur de saisie, veuillez entrer de nouveau le mot de passe." msgid "Overview:" msgstr "Vue d'ensemble:" msgid "Main window" msgstr "Fenêtre principale" msgid "Monitor" msgstr "écran" msgid "Disable screensaver" msgstr "" msgid "Disable power management" msgstr "" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Si votre clavier est débranché, vous pouvez utiliser un clavier virtuel.\n" "Ce dernier s'affiche par un clic dans la zone de contrôle des touches." msgid "Use the virtual keyboard" msgstr "Utiliser le clavier virtuel" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Utiliser également le clavier virtuel en dehors du mode kiosque" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(Veuillez cliquer dans la zone de contrôle des touches)" msgid "Virtual keyboard layout:" msgstr "Disposition du clavier virtuel:" msgid "Colour:" msgstr "Couleur:" msgid "Black" msgstr "Noir" msgid "White" msgstr "Blanc" msgid "Transparency:" msgstr "Transparence:" msgid "Hide cursor" msgstr "" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Vous pouvez contrôler intégralement Silverjuke à l'aide du pavé numérique et " "de quelques autres touches,\n" "via le clavier ou un autre périphérique.\n" "\n" "Dans ce cas, pour insérer de nouveaux titres dans la playlist, il y a lieu " "de saisir les numéros uniques\n" "précédant les noms d'album et de titres." msgid "Use Numpad controls" msgstr "Contrôler à l'aide du pavé numérique" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Utiliser également le pavé numérique en dehors du mode kiosque" # "Keys:" in the meanding of keyboard keys here msgid "Keys:" msgstr "Clés:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "Par le système de jetons, les utilisateurs doivent d'abord ajouter des " "pièces avant de pouvoir\n" "transférer des pistes dans la liste de lecture. Veuillez vous référer à " "l'aide online sur les\n" "possibilités et les matériels supportés." msgid "Use credit system" msgstr "Utiliser le système de jetons" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "Des jetons peuvent être rajoutés par DDE, ligne de commande ou clés" msgid "Keys..." msgstr "Clés..." msgid "Remember credits between program starts" msgstr "Mémoriser les jetons entre les exécutions du programme" msgid "Current credit:" msgstr "Jetons disponibles:" msgid "Please enter your password to exit the kiosk mode." msgstr "Veuillez entrer votre mot de passe pour terminer le mode kiosque" msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Trop de titres dans la playlist,\n" "veuillez réessayer plus tard" msgid "" "This track is already in queue,\n" "please try again later." msgstr "Cette piste est déjà en file d'attente,veuillez essayer plus tard." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" msgid "Maintenance password" msgstr "" msgid "Exit kiosk mode" msgstr "Quitter le mode kiosque" msgid "Start kiosk mode" msgstr "Démarrer le mode kiosque" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Mot de passe:" msgid "Invalid password. Please try again." msgstr "Mot de passe invalide, essayez encore une fois." msgid "Invalid track number" msgstr "Numéro de piste invalide" # Eg. the title of the popup for "shutdown", "reboot" etc. msgid "Action:" msgstr "Action:" msgid "Shutdown computer" msgstr "Arrêter l'ordinateur" msgid "Reboot computer" msgstr "Redémarrer l'ordinateur" # These are some special buttons for the virtual keyboard in the kiosk-mode. Separate the buttons using a pipe. You may use up to two lines for a button using a line break, HOWEVER, MAKE SURE, THE NUMBER OF CHARACTERS DO NOT DIFFER SIGNIFICANTALLY as otherwise the text will be to wide for the keyboard layouts. So if needed, use abbreviations. msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Maj|AltGr|Suppr|Tout\n" "suppr|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Un album doit avoir au moins %s titres en correspondance avec %s." msgid "artist/album" msgstr "artiste/album" msgid "artist/album or genre" msgstr "artiste/album ou genre" msgid "directory" msgstr "répertoire" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Les compilations peuvent contenir jusqu'à %s titres du même artiste." msgid "Separate the words using commas, case is ignored" msgstr "" "Séparez les mots par des virgules,\n" "les majuscules/minuscules sont ignorées" msgid "Sort by:" msgstr "Trier par:" msgid "Stop-words for sorting artists:" msgstr "Pour le classement des artistes, ignorer les mots suivants:" msgid "Stop-words for sorting albums:" msgstr "Pour le classement des albums, ignorer les mots suivants:" msgid "Show stop-words words at end" msgstr "Afficher les mots éliminés pour le classement" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "Si sélectionné, par exemple\n" "\n" "\"The Rolling Stones\" devient\n" "\"Rolling Stones, The\"\n" "\n" "Le classement lui-même n'est pas affecté par cette option." msgid "Keywords to identify cover image for an album:" msgstr "Mots-clé permettant d'identifier la pochette d'un album:" msgid "Double click on covers" msgstr "Double-clic sur les pochettes" msgid "Select/play album" msgstr "Délection/lecture album" msgid "Combine tracks to albums" msgstr "Regrouper les titres en albums" msgid "Updating genres..." msgstr "Modification des genres..." msgid "Updating groups..." msgstr "Modifications des groupes..." msgid "Combining tracks to albums..." msgstr "Assemblage de piste en albums..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Voulez-vous ajouter le répertoire suivant à la bibliothèque musicale?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Oui, laisser la pochette dans \"%s\"" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Oui, copier la pochette vers \"%s\"" # %s will be replaced by the album name #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Voulez-vous reprendre l'image comme pochette pour \"%s\" ?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "" "\"%s\" n'est pas dans la bibliothèque musicale et ne peut pas être édité." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s titres ont été trouvés dans %s albums pour \"%s\"" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s titres dans %s albums" msgid "Albums" msgstr "Albums" msgid "All albums" msgstr "Tous les albums" msgid "Unsorted tracks" msgstr "Titres non triés" # %i will be replaced by the disk number #, c-format msgid "Disk %i" msgstr "Support %i " # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Stop pré-écoute" # %s will be replaced by the program name, used eg. in VST-Modules #, c-format msgid "Prelisten \"%s\"" msgstr "Pré-écoute \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "Ajouter \"%s\" dans la playlist" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "Lire \"%s\" maintenant" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "Lire \"%s\" après le titre en cours" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "Supprimer \"%s\" de la playlist" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Enqueue %i tracks" msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "%i à ajouter à la playlist" msgstr[1] "%i à ajouter à la playlist" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks now" msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Lire %i titres maintenant" msgstr[1] "Lire %i titres maintenant" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks next" msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Lire %i titres après celui en cours" msgstr[1] "Lire %i titres après celui en cours" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Unqueue %i tracks" msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Supprimer le titre %i de la playlist" msgstr[1] "Supprimer le titre %i de la playlist" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" sur internet" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Note moyenne: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, fuzzy, c-format #| msgid "My rating: %s" msgid "Rating: %s" msgstr "Ma notation: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to change the rating for all %i selected tracks?" msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Voulez-vous modifier la note pour les %i sélectionnés?" msgstr[1] "Voulez-vous modifier la note pour les %i sélectionnés?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Modifier la notation" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" "Clic pour sélectionner tous les titres de l'album/double-clic pour les lire" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" "Clic pour sélectionner tous les titres de l'artiste / double-clic pour les " "lire" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" "Clic pour sélectionner tous les titres du support/double-clic pour les lire" # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "" "Double-clic: ajouter\n" "\"%s\"\n" "dans la playlist" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to enqueue all %i selected tracks?" msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Voulez-vous transférer les %i titres dans la playlist?" msgstr[1] "Voulez-vous transférer les %i titres dans la playlist?" msgid "Size" msgstr "Taille" msgid "Gain" msgstr "Amplification" msgid "Read music-files from the following folders and sources:" msgstr "" "Lire les fichiers de musique depuis les répertoires et sources ci-après:" msgid "Read music-files from the following sources:" msgstr "Lire les fichiers de musique depuis la source suivante:" msgid "Add source" msgstr "Ajouter une source" msgid "Remove source" msgstr "Supprimer la source" msgid "Options" msgstr "Options" #, fuzzy #| msgid "Supported file-types" msgid "Supported file types" msgstr "Types de fichiers supportés" #, fuzzy #| msgid "My music library" msgid "Music library" msgstr "Ma musique" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Options pour \"%s\"" msgid "Options..." msgstr "Options..." msgid "Jukebox" msgstr "" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "Sélectionnez une playlist, des fichiers ou entrez une URL" msgid "Append to current playlist" msgstr "Ajouter à playlist" msgid "Volume control" msgstr "Diminuer le volume" msgid "Play all tracks of an album with the same volume" msgstr "Lire tous les titres d'un album avec le même niveau de volume" msgid "Desired volume:" msgstr "Volume souhaité:" msgid "Max. gain:" msgstr "Ampli. maximum:" msgid "Current volume:" msgstr "Volume actuel:" msgid "Fading" msgstr "Fondu" msgid "Crossfading" msgstr "Fondu" msgid "Manual crossfades:" msgstr "Fondu ouv/fermeture manuel:" msgid "Automatic crossfades:" msgstr "Fondu ouv/fermeture automatique:" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "Pas de fondu entre les pistes du même album" msgid "Only fade out the old track, the new track starts with full volume" msgstr "" "Fondu de fermeture sur l'ancien titre, le nouveau titre démarre au volume " "normal" msgid "Resume" msgstr "" msgid "Jingles" msgstr "Jingles" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "Avec \"l'intensité du mode aléatoire\", vous pouvez contrôler le déroulement " "de la lecture aléatoire.\n" "Une valeur faible engendre des petites variations dans la playlist,\n" "une valeur importante des variations plus conséquentes." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Au maximum, autoriser %i titres dans la playlist" msgstr[1] "Au maximum, autoriser %i titres dans la playlist" #, fuzzy #| msgid "Avoid double tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Eviter deux titres identiques dans la file d'attente" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "" "Eviter l'ennui : ne pas répéter un titre durant une période de %i minutes" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "" "Eviter l'ennui : ne pas répéter un artiste durant une période de %i minutes" msgid "Shuffle intensity:" msgstr "Intensité du niveau de lecture aléatoire:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" #, fuzzy #| msgid "Edit queue" msgid "Restore queue" msgstr "Editer la playlist" msgid "Restore already played tracks" msgstr "" msgid "Start playback from last position" msgstr "" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Les options suivantes régissent les actions à entreprendre automatiquement\n" "à la fin de durées prédéfinies:" #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "AutoPlay: En l'absence de playlist, attendre %i minutes," # %i will be replaced by a number-selection-control, %s will be replaced by a music-selection-control #, c-format msgid "then, play %i tracks from the %s" msgstr "puis lire %i titres de la %s" # %s will be replaced by the name of a music selection #, fuzzy msgid "Ignore tracks from the music selection" msgstr "Limiter la sélection à %s titres" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "" "Les pistes mises manuellement en file d'attente arrêtent immédiatement la " "lecture automatique" msgid "Sleep mode:" msgstr "Mode veille" msgid "Stop playback" msgstr "Stop lecture" # This string expands to the choice control in "Settings/Playback/Automatic control", note the "|" #, fuzzy #| msgid "in|after|at|always in|always after|always at" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "dans|après|à|toujours dans|toujours après|toujours à" #, fuzzy #| msgid "minutes" msgid "minutes|o'clock" msgstr "minutes" #, c-format msgid "Before this, fade out %i seconds" msgstr "Auparavant, fondu de %i secondes" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" #, fuzzy #| msgid "minutes" msgid "minutes," msgstr "minutes" # %s will be replaced by the name of a music selection #, fuzzy msgid "play a track from the music selection" msgstr "Limiter la sélection à %s titres" #, fuzzy #| msgid "Alt" msgid "At" msgstr "Alt" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" # %s will be replaced by a number-selection-control #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Aller au titre en cours après %i minutes d'inactivité" # %s will be replaced by a number-selection-control #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "" # %s will be replaced by a number-selection-control #, fuzzy, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Aller au titre en cours après %i minutes d'inactivité" # %s will be replaced by a number-selection-control #, fuzzy, c-format msgid "Close video screen after %i minutes" msgstr "Stopper la visualisation après %i minutes" #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "Lire les répertoires:" msgid "Read file:" msgstr "Lire fichier:" msgid "Ignore music-files and images with the following extensions:" msgstr "Ignorer les fichiers musique et images avec les extensions suivantes:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "" "(séparez les extensions par une virgule, les majuscules/minuscules sont " "ignorées)" # This option is found at "Settings/My music library/<Options for a source>" msgid "Include folder to the update process" msgstr "Inclure le répertoire dans le traitement de mise à jour" msgid "Read hidden files" msgstr "Lire les fichiers cachés" #, fuzzy #| msgid "Read hidden files" msgid "Read hidden folders" msgstr "Lire les fichiers cachés" #, fuzzy msgid "Read inside ZIP-/TAR-archives" msgstr "Rechercher à l'intérieur d'archives ZIP" msgid "Read (ID3)-tags" msgstr "Lire les tags (ID3)" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "" "Chemin et structure de fichier pour les titres lorsque les tag (-ID3) ne " "sont pas renseignés:" msgid "Placeholders:" msgstr "Arguments:" msgid "Read files and folders" msgstr "Lire fichiers et répertoires" msgid "Add a folder to search for music-files" msgstr "Ajouter un répertoire de fichiers musicaux" msgid "Add a single music-file" msgstr "Ajouter des fichiers individuels de musique" # This string is eg. added to disabled sources msgid "Disabled" msgstr "Inopérant" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "Pas de mise à jour" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "Supprimer \"%s\" de la bibliothèque de musique?" msgid "Select a folder with music-files" msgstr "Sélectionner un répertoire contenant des fichiers de musique" msgid "Select music-file" msgstr "Sélectionner un fichier de musique" msgid "Unknown track" msgstr "Piste inconnue" msgid "Unknown artist" msgstr "Artiste inconnu" msgid "Add a server containing music-files" msgstr "Ajouter un serveur contenant des fichiers musicaux" msgid "Use server:" msgstr "Utiliser le serveur:" # The online database "freedb" can be queried in the Tag editor using the "Menu" button msgid "Server:" msgstr "Serveur:" msgid "Type" msgstr "Type" msgid "Login name:" msgstr "Nom de login:" # This option is found at "Settings/My music library/<Options for a source>" msgid "Include server to the update process" msgstr "Inclure le serveur dans le processus de mise à jour" msgid "Configuration file" msgstr "Fichier de configuration" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #, c-format msgid "Loading %s" msgstr "Chargement de %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Erreur %i" msgid "Edit track" msgstr "Contenu de la piste" msgid "of" msgstr "de" msgid "Write (ID3-)tags" msgstr "Ecrire les Tags (ID3-)" msgid "File names" msgstr "Noms de fichier" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Afficher les %s noms de fichier..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "Les valeurs indiquées sont la somme ou la moyenne des valeurs individuelles " "pour les fichiers donnés." msgid "Track" msgstr "Piste" msgid "Further information" msgstr "Informations complémentaires" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "Répertoire temporaire" msgid "Further information..." msgstr "Informations complémentaires..." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Impossible de renommer \"%s\" en \"%s\"." # The online database "freedb" can be queried in the Tag editor using the "Menu" button msgid "Server name" msgstr "Serveur" # The online database "freedb" can be queried in the Tag editor using the "Menu" button msgid "Query online database" msgstr "Accéder à la base online" msgid "more..." msgstr "plus..." # The online database "freedb" can be queried in the Tag editor using the "Menu" button msgid "Please select one of the following albums:" msgstr "Sélectionnez un album parmi les suivants:" msgid "Old file name" msgstr "Ancien nom de fichier" msgid "New file name" msgstr "Nouveau nom de fichier" msgid "Field" msgstr "Champ" msgid "Old value" msgstr "Ancienne valeur" msgid "New value" msgstr "Nouvelle valeur" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<vide>" msgid "Confirm modifications" msgstr "Confirmer les modifications" msgid "Delete empty folders" msgstr "Supprimer les répertoires vides" msgid "Please confirm or edit the following modification:" msgstr "Veuillez confirmer ou éditer les modifications suivantes:" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Veuillez confirmer ou éditer les %s modifications suivantes:" msgid "(lower case)" msgstr "(petits caractères)" msgid "(upper case)" msgstr "(grands caractères)" msgid "(n characters)" msgstr "(n caractères)" msgid "Rename files" msgstr "Renommer les fichiers" msgid "Pattern:" msgstr "Modèles:" #, fuzzy #| msgid "(first character)" msgid "Artist (first character)" msgstr "(premier caractère)" #, fuzzy #| msgid "(first character)" msgid "Album (first character)" msgstr "(premier caractère)" #, fuzzy #| msgid "(first character)" msgid "Genre (first character)" msgstr "(premier caractère)" #, fuzzy #| msgid "(first character)" msgid "Group (first character)" msgstr "(premier caractère)" #, fuzzy #| msgid "(n characters)" msgid "Year (4 characters)" msgstr "(n caractères)" #, fuzzy #| msgid "(n characters)" msgid "Year (2 characters)" msgstr "(n caractères)" #, fuzzy #| msgid "(n characters)" msgid "Duration (5 characters)" msgstr "(n caractères)" msgid "Directory change" msgstr "Changement de répertoire" #, fuzzy #| msgid "(n characters)" msgid "File name (8 characters)" msgstr "(n caractères)" msgid "File extension" msgstr "Extension de fichier" msgid "Example:" msgstr "Exemple:" msgid "Replace" msgstr "Remplacer" msgid "Search for:" msgstr "Rechercher d'après:" msgid "in:" msgstr "dans:" msgid "All fields" msgstr "Tous les champs" msgid "Path and file name" msgstr "Chemin et nom de fichier" msgid "Replace with:" msgstr "Remplacer par:" msgid "Match whole words only" msgstr "Seulement les mots entiers" msgid "Match case" msgstr "Tenir compte des majuscules/minuscules" msgid "Regular expression" msgstr "Expression régulière" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "\"%s\" non trouvé." msgid "Split field" msgstr "Décomposer un champ" msgid "Field to split:" msgstr "Champ à décomposer:" msgid "Destination fields and pattern:" msgstr "Destination et modèles:" #, fuzzy #| msgid "Track number" msgid "Track number (1 character)" msgstr "Numéro de la piste" #, fuzzy #| msgid "(n characters)" msgid "Track number (2 characters)" msgstr "(n caractères)" #, fuzzy #| msgid "(first character)" msgid "Disk number (1 character)" msgstr "(premier caractère)" #, fuzzy #| msgid "(n characters)" msgid "Disk number (2 characters)" msgstr "(n caractères)" msgid "Void information" msgstr "Aucune information" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "Avec des skin vous pouvez modifier l'apparence et les fonctionnalités de " "%s.\n" "Sélectionner un skin depuis la liste ou téléchargez d'autres skin sur " "internet." msgid "Name" msgstr "Nom" msgid "Info..." msgstr "Infos..." msgid "Update list" msgstr "Actualiser la liste" msgid "More skins on the web..." msgstr "Plus de skin sur internet..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Vous pouvez définir de manière indépendante la taille des caractères et des " "pochettes\n" "au niveau de l'écran principal.\n" "\n" "La taille correspond à une définition de zoom de 100%. Si vous modifiez le " "zoom (par ex.\n" "avec \"+\" et \"-\"), les deux tailles sont augmentées ou diminuées " "proportionnellement." msgid "Font:" msgstr "Police de caractère:" msgid "Font size:" msgstr "Taille police de caractère:" msgid "Use this font for dialogs, too" msgstr "" msgid "Column width:" msgstr "Taille colonne:" msgid "Cover size:" msgstr "Taille pochette:" msgid "No lyrics found." msgstr "Texte non trouvé" msgid "Karaoke Prompt" msgstr "Karaoke Prompt" #, c-format msgid "No images found in \"%s\"." msgstr "Aucune image trouvée dans \"%s\"." # This is an option in the context menu of the new vis. / karaoke screen; dt. "Hintergrund" msgid "Background" msgstr "Arrière-plan" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "Use %s-files" msgstr "" msgid "Please select a directory with images" msgstr "Veuillez sélectionner un répertoire avec des images" # This is an option in the context menu of the new vis. / karaoke screen; dt. "Bei Bedarf automatisch umschalten" msgid "If appropriate, switch over automatically" msgstr "Si besoin, basculer automatiquement" # This is an option in the context menu of the new vis. / karaoke screen msgid "Half size" msgstr "Réduit à 50%" msgid "Spectrum Monitor" msgstr "Spectrum Monitor" msgid "Show spectrum" msgstr "Afficher le specte" msgid "Show oscilloscope" msgstr "Afficher l'oscilloscope" # This is an option in the context menu of the new vis. / karaoke screen; dt. "Sterne anzeigen" oder so msgid "Show starfield" msgstr "Fonds étoilé" # This is an option in the context menu of the new vis. / karaoke screen; dt. "Sterne anzeigen" oder so #, fuzzy #| msgid "Show starfield" msgid "Show other figures" msgstr "Fonds étoilé" #, fuzzy msgid "Visualization" msgstr "Démarrer la visualisation" #, fuzzy msgid "Video output" msgstr "Sortie audio" msgid "Search homepage" msgstr "Chercher la homepage" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Textes sur %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "avec %s" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informations sur %s" # Do not forget the ":" at the end of the string. msgid "Object count:" msgstr "Nombre d'objets:" # Do not forget the ":" at the end of the string. msgid "Elapsed time:" msgstr "Temps couru:" msgid "Message" msgstr "" msgid "Scope" msgstr "" msgid "Console" msgstr "Console" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i message" msgid_plural "%i messages" msgstr[0] "" msgstr[1] "" msgid "Evaluate" msgstr "" msgid "Clear" msgstr "" msgid "Open console on errors and warnings" msgstr "" msgid "Details" msgstr "Details" msgid "Clear all messages?" msgstr "" #, c-format msgid "Overwrite \"%s\"?" msgstr "" msgid "Append" msgstr "" msgid "State" msgstr "Etat" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "%s-fichiers" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "%s-audio" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "%s-images" #, c-format msgid "%s-video" msgstr "" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "%s-playlist" #, fuzzy #| msgid "Archive-files" msgid "Script-files" msgstr "Fichiers archives" msgid "Silverjuke skin-files" msgstr "Skin de Silverjuke" #, fuzzy #| msgid "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Skin de Silverjuke" msgid "Archive-files" msgstr "Fichiers archives" msgid "Supported file-types" msgstr "Types de fichiers supportés" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programmes" msgid "Cleanup index..." msgstr "Nettoyer l'index..." msgid "max. size" msgstr "taille maxi" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "A la dernière utilisation, %s ne s'est pas terminé correctement.\n" "Les objets (éventuellement corrompus) suivants ont été utilisés avant la fin " "anormale du programme:\n" "\n" "%s\n" "\n" "Si les problèmes persistent, essayer de ne plus utiliser ces objets.\n" "Ces objets doivent-il maintenant être utilisés?" msgid "Use maybe errorous objects?" msgstr "Utiliser des objets éventuellement corrompus?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "%a, %d. %b. %Y, %H:%M:%S" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "%d.%m.%Y %H:%M:%S" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "%a, %d. %b. %Y" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "%d.%m.%Y" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "0" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "fr" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "" "[search]\n" "Amazon.fr=http://www.amazon.fr/exec/obidos/external-search?index=music-" "fr&keyword=%artist%+%album%\n" "eBay.fr=http://search.ebay.fr/search/search.dll?" "MfcISAPICommand=GetResult&krd=1&ht=1&shortcut=4&SortProperty=MetaEndSort&cgiurl=http" "%3A%2F%2Fcgi.ebay.de%2Fws%2F&maxRecordsPerPage=50&st=2&ebaytag1code=77&query=" "%artist%+%album%&x=4&y=15" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "" "[info]\n" "Wikipedia.fr=http://fr.wikipedia.org/wiki/%artist%\n" "Laut.de=http://www.google.fr/search?q=%22%artistutf8%%22+site:www.laut." "de&btnI=1\n" "[lyrics]\n" "Lyrix.at=http://www.google.fr/search?q=%22%artistutf8%%22+site:www.lyrix.at/" "en/&btnI=1" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "0" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "0" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "0" # Use 0 if you do not want to include a virtual keyboard to your locale, otherwise, define the virtual keyboard as described in the developer network on www.silverjuke.net msgid "__VIRT_KEYBD__" msgstr "0" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "." #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "," #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i days" msgid "%i day" msgid_plural "%i days" msgstr[0] "%i jours" msgstr[1] "%i jours" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Expression régulière invalide \"%s\"" msgid "Fatal error" msgstr "Erreur fatale" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Maj" msgid "Enlarge window" msgstr "Agrandir la fenêtre" msgid "Shrink window" msgstr "Diminuer la fenêtre" msgid "Enlarge display" msgstr "Augmenter la taille d'affichage" msgid "Shrink display" msgstr "Diminuer la taille d'affichage" # dt. "Geräte" #, fuzzy #| msgid "Devices" msgid "Services" msgstr "Périphériques" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Hide %s" msgstr "Cacher %s" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #| msgid "Hide %s" msgid "Hide Others" msgstr "Cacher %s" #, fuzzy #| msgid "Show file" msgid "Show All" msgstr "Voir le fichier" #, fuzzy, c-format #| msgid "Exit %s" msgid "Quit %s" msgstr "Quitter %s" msgid "Extras" msgstr "" msgid "Full screen" msgstr "Plein écran" msgid "Modules on the web..." msgstr "Modules sur internet..." msgid "Explore" msgstr "Explore" msgid "Reveal in Finder" msgstr "Afficher dans le Finder" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "Le fichier \"%s\" n'existe pas." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "Ne peut exécuter \"%s\"." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" #~ msgid "Scroll vertically" #~ msgstr "Dérouler verticalement" #~ msgid "Context sensitive" #~ msgstr "Sensible au contexte" #, fuzzy #~| msgid "Exit %s" #~ msgid "Exit" #~ msgstr "Quitter %s" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "Désactiver %s" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable shutdown" #~ msgstr "Désactiver l'arrêt du système" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Si vous avez plus d'un écran connecté à votre système,\n" #~ "vous pouvez ici assigner les différentes fenêtres Silverjuke à ces écrans." # String is followed by the strings "Main window" or "Karaoke, Vis. etc" #~ msgid "Monitor for" #~ msgstr "Ecran pour" # %s will be replaced by a control for selecting the display resolution #~ msgid "Switch resolution to %s" #~ msgstr "Modifier la résolution: %s" #~ msgid "Calculated volumes:" #~ msgstr "Niveaux sonores calculés:" #~ msgid "Skip silence between tracks" #~ msgstr "Sauter le silence entre deux titres" #~ msgid "Other fadings" #~ msgstr "Autres fondus" # This is an option in the context menu of the new vis. / karaoke screen #~ msgid "Attached window" #~ msgstr "Fenêtre attachée" #~ msgid "Show album name" #~ msgstr "Afficher le nom de l'album" #~ msgid "Online help" #~ msgstr "Aide en ligne" #~ msgid "Tools" #~ msgstr "Outils" #~ msgid "Workspace" #~ msgstr "Environnement travail" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #~| msgid "" #~| "Beside several options, you can change the shortcuts to use in %s here. " #~| "You can\n" #~| "also define system-wide shortcuts. To modify an option, select the " #~| "option from the list\n" #~| "and click on \"Customize\". This page is for experienced users only." #~ msgid "" #~ "Beside several options, you can change the shortcuts to use here.\n" #~ "This page is for experienced users only." #~ msgstr "" #~ "Vous pouvez modifier les options et raccourcis de %s.\n" #~ "Il est également possible de définir des raccourcis à appliquer à " #~ "l'ensemble du système.\n" #~ "Pour modifier une ligne, la sélectionner et cliquer sur \"Configurer\".\n" #~ "\n" #~ "Cette page est réservée aux utilisateurs avertis." #~ msgid "Command or option" #~ msgstr "Options et raccourcis" #~ msgid "Setting" #~ msgstr "Codification" #, fuzzy #~ msgid "Album cover" #~ msgstr "Vue de l'album" #, fuzzy #~ msgid "Track cover" #~ msgstr "Nombre de titres" #~ msgid "Track list" #~ msgstr "Liste des titres" #~ msgid "Show disk number" #~ msgstr "Numéro du support" #~ msgid "Show original artist" #~ msgstr "Afficher l'artiste original" #~ msgid "Show composer" #~ msgstr "Afficher le compositeur" #~ msgid "Show time" #~ msgstr "Afficher la durée" #~ msgid "Show year" #~ msgstr "Afficher l'année" #~ msgid "Show comment" #~ msgstr "Afficher le commentaire" #, fuzzy #~| msgid "Currently, the following files are supported:" #~ msgid "Currently, the following file types are read:" #~ msgstr "Actuellement, les extensions suivantes sont supportées:" # This string expands to the choice control in "Settings/Playback/Automatic control", note the "|" #~ msgid "minutes|minutes of inactivity|o'clock" #~ msgstr "minutes|minutes d'inactivité|heure" # %i will be replaced by the number of characters #~ msgid "(%i characters)" #~ msgstr "(%i positions)" #~ msgid "More layouts on the web..." #~ msgstr "D'autres types de clavier sur le web..." # String is followed by the strings "Main window" or "Karaoke, Vis. etc" #, fuzzy #~| msgid "Monitor for" #~ msgid "Monitor for main window" #~ msgstr "Ecran pour" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #~ msgid "Initializing %s..." #~ msgstr "Initialisation %s..." #~ msgid "Microphone" #~ msgstr "Microphone" # This is the name of the "First steps" button. Do not add "..." to the string! #~ msgid "First steps" #~ msgstr "Guide rapide de mise en route" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Buy %s..." #~ msgstr "Acheter %s..." #~ msgid "Unlicenced version" #~ msgstr "Version non enregistrée" #~ msgid "These options are available if you buy Silverjuke." #~ msgstr "" #~ "Cette option n'est opérationnelle que dans la version enregistrée de " #~ "Silverjuke." # The first %s will be replaced by the program name (usually "Silverjuke"), the second and third %s will be replaced by a file type (eg. "MP3"), the fourth %s will be replaced by the URL to search for modules (eg. "http://www.silverjuke.net/en/modules.html". #~ msgid "" #~ "%s has not found an %s-decoder on your system. If you want to play %s-" #~ "files, you should install a module for this purpose.\n" #~ "\n" #~ "Open %s and search for modules now?" #~ msgstr "" #~ "%s n'a pas trouvé de décodeur %s sur le système.\n" #~ "Si vous voulez lire des fichiers %s, vous devez installer un module " #~ "adéquat.\n" #~ "\n" #~ "Ouvrir maintenant %s pour rechercher un module?" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Do you want %s to check for missing decoders in future?" #~ msgstr "" #~ "Souhaitez-vous que %s vérifie à l'avenir si des décodeurs sont manquants?" # This is a context-menu option that is placed in the "Playback" submenu. If the menu entry is (un-)checked, this string is also shown in the display followed by a double point and yes/no #~ msgid "Play tracks at once on double click" #~ msgstr "Lire les pistes immédiatement après un double-clic" # The first %s will be replaced by the program name, the second by the name of the licence holder. #~ msgid "%s licenced to %s" #~ msgstr "%s enregistré à %s" # %s will be replaced by the name of the licence holder #~ msgid "Licenced to %s" #~ msgstr "Enregistré à %s" # %s will be replaced by the shortcut #~ msgid "Cannot register system-wide shortcut \"%s\"." #~ msgstr "" #~ "Impossible de définir le raccourci \"%s\" pour l'ensemble du système." #~ msgid "Silverjuke language-files" #~ msgstr "Fichiers langue de Silverjuke" # This is the help topic for the "First steps" that are opened if Silverjuke is started the first time. The topic is also reachable through the "About" dialog. You can use _simple_ HTML here: <h1>, <p>, <b>, <i> and <a>. Please refer to one of the example files in the developer network. #~ msgid "__HELP__" #~ msgstr "" #~ "<h1>Guide rapide de mise en route</h1><p>\t<b>Bienvenue dans Silverjuke!</" #~ "b>\tAprès l'avoir téléchargé et installé, vous devez à présent configurer " #~ "la\tbibliothèque musicale en y intégrant l'ensemble de vos\tfichiers " #~ "musicaux - tirez tout simplement dans la fenêtre principale\tles " #~ "répertoires de musique à reprendre, par exemple, depuis\tl'explorateur " #~ "windows.</p><p>\tEn confirmant par «Oui», Silverjuke explore le " #~ "répertoire indiqué et\trajoute dans sa bibliothèque musicale tous les " #~ "fichiers de musique\tqu'il a trouvé.</p><p>\t<b>Voilà déjà l'essentiel " #~ "pour démarrer.</b> Nous avons\tfait un effort particulier pour rendre " #~ "l'utilisation\tdu programme aussi simple et intuitive que possible;\tà " #~ "priori, il n'est plus indispensable de lire la suite,\til suffit de s'y " #~ "lancer...</p><h1>Ma bibliothèque musicale</h1><p>\tLes répertoires qui " #~ "ont été sélectionnés se retrouvent dans\tla bibliothèque musicale " #~ "intitulée\t<a href=\"dialog:mymusic.lib\">Ma musique</a>. Vous\tpouvez y " #~ "rajouter d'autres sources ou supprimer des existantes.\tLorsque vous " #~ "supprimez une source, Silverjuke n'efface pas\tles fichiers sur le " #~ "disque, mais seulement les\tréférences internes de ces derniers.</" #~ "p><h1>Lecture des fichiers de musique</h1><p>\tDans la fenêtre " #~ "principale, les fichiers de musique sont\taffichés en mode album; lorsque " #~ "Silverjuke trouve des <b>pochettes</b>\tdans les répertoires ou dans les " #~ "Tags ID3, ces\tdernières sont également affichées. Vous pouvez aussi " #~ "modifier des\tpochettes ou en rechercher d'autres par internet: par\tun " #~ "clic droit sur une pochette ou encore en tirant une\timage depuis " #~ "l'exploreur vers un album.</p><p>\tPour lire un titre, faites un " #~ "<b>double-clic</b> sur le nom\tdu titre. Répétez cette action pour tous " #~ "les titres\tque vous souhaitez écouter. Les titres seront lus dans\tle " #~ "même ordre. Vous pouvez enfin sélectionner\t<b>plusieurs titres</b>, par " #~ "exemple par la touche Maj ou bien par un\tclic sur le nom de l'album, " #~ "puis en les tirant dans la\tfenêtre de la playlist (en haut de la fenêtre " #~ "principale).</p><h1>Recherche</h1><p>\tPour <b>rechercher</b> un artiste, " #~ "un album ou un\ttitre, introduisez simplement le nom dans la fenêtre de" #~ "\trecherche (en haut, à droite); parfois les premiers\tcaractères sont " #~ "déjà suffisants. La confirmation de la\tsaisie n'est pas nécessaire, " #~ "Silverjuke lance la\trecherche automatiquement et affiche les résultats" #~ "\timmédiatement.</p><p>\tPour <b>terminer</b> la procédure de recherche," #~ "\tsupprimez l'entrée ou bien appuyez sur la touche Echap.</p><p>\tPour " #~ "des recherches complexes, notamment pour filtrer des\ttitres dans la " #~ "bibliothèque musicale, la rubrique\t<a href=\"dialog:advsearch.lib" #~ "\">Sélections automatiques...</a> est à votre\tdisposition. Essayez une " #~ "fois les sélections\ttypes déjà installées pour avoir une idée des" #~ "\tpossibilités.</p><h1>Mode Kiosque</h1><p>\tGrâce au <a href=\"dialog:" #~ "kiosk.lib,0\">mode kiosque</a>, vous avez\tla possibilité d'utiliser " #~ "Silverjuke en mode plein écran mais avec\tdes fonctionnalités réduites, " #~ "par exemple en temps\tque Jukebox à une party.\tLà aussi, de nombreuses " #~ "options sont disponibles\tcomme par exemple un <a href=\"dialog:kiosk." #~ "lib,3\">clavier virtuel</a> ou\tencore une programmation du clavier\t(<a " #~ "href=\"dialog:kiosk.lib,4\">pavé numérique</a>).</p><h1>Extensions dans " #~ "Silverjuke</h1><p>\tVous pouvez enfin étendre les fonctionnalités dans" #~ "\tSilverjuke par l'ajout de <a href=\"dialog:basicsettings." #~ "lib,666\">modules</a>\tcomplémentaires, notamment pour lire d'autres " #~ "formats de fichiers\tmusicaux ou bien appliquer une autre visualisation." #~ "\tVous trouvez la liste des modules disponibles sous\t<a href=" #~ "\"web:3\">www.silverjuke.net</a>.</p><h1>Informations complémentaires</" #~ "h1><p>\tCette présentation ne donne qu'un aperçu des\tpossibilités de " #~ "Silverjuke. Des informations\tcomplémentaires ou plus précises sont " #~ "fournies par\tthème dans l'<a href=\"web:9\">aide en ligne</a> prévue " #~ "dans chaque menu\tcontextuel.</p><p>\tNous vous souhaitons encore " #~ "beaucoup de plaisir\tavec Silverjuke!<br />\t<i>Votre Team Silverjuke</" #~ "i></p>" #~ msgid "Apply" #~ msgstr "Appliquer" #~ msgid "Check for new Silverjuke version..." #~ msgstr "Vérifier si une nouvelle version de Silverjuke est disponible..." # The first %s will be replaces by the new version, the others %s will be replaced by the URL for downloading it. #~ msgid "" #~ "A new version of Silverjuke (%s) is available for download on %s.\n" #~ "\n" #~ "Do you want to open %s now?" #~ msgstr "" #~ "Une nouvelle version de Silverjuke (%s) est disponible en téléchargement " #~ "sous %s.\n" #~ "\n" #~ "Voulez-vous vous connecter à %s maintenant?" #~ msgid "Other program" #~ msgstr "Autre programme" #~ msgid "Set markers" #~ msgstr "Définir les marqueurs" # %i will be replaced by the number of the marker, %s will be replaced by the marker position or by a control to select the marker position #~ msgid "Show marker %i at %s." #~ msgstr "Afficher le marquage %i à %s ." #~ msgid "Minutes" #~ msgstr "Minutes" #~ msgid "Warn if marker is crossed" #~ msgstr "Prévenir lorsque le marquage est dépassé" #~ msgid "Set markers..." #~ msgstr "Définir les marqueurs..." #~ msgid "Burn CD" #~ msgstr "Graver un CD" #~ msgid "Tracks to burn:" #~ msgstr "Titres à graver:" #~ msgid "Recorder:" #~ msgstr "Graveur:" #~ msgid "Please select an installed and available program" #~ msgstr "Veuillez sélectionner un programme installé et opérationnel" # %s will be replaced by the name of a program #~ msgid "Please locate \"%s\"" #~ msgstr "Veuillez localiser \"%s\"" # %s will be replaced by the name of a program #~ msgid "Arguments for \"%s\"" #~ msgstr "Arguments pour \"%s\"" #~ msgid "Total time" #~ msgstr "Temps total" #~ msgid "Cannot calculate the total time" #~ msgstr "Le temps total ne peut pas être déterminé" #~ msgid "" #~ "The size of the selected tracks is larger than the assumed capacity of " #~ "the disk to burn.\n" #~ "\n" #~ "Continue anyway?" #~ msgstr "" #~ "La taille des titres sélectionnés est supérieure à la capacité supposée " #~ "du support à graver.\n" #~ "\n" #~ "Voulez-vous quand même continuer?" #~ msgid "Minimize window" #~ msgstr "Réduire la fenêtre" #~ msgid "Maximize window" #~ msgstr "Maximiser la fenêtre" #~ msgid "Center window" #~ msgstr "Centrer la fenêtre" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Show %s" #~ msgstr "Afficher %s" #~ msgid "System tray" #~ msgstr "Barre de notification" #~ msgid "Show current track" #~ msgstr "Afficher la piste en cours" #~ msgid "Menus" #~ msgstr "Menus" #~ msgid "Show shortcuts" #~ msgstr "Afficher les raccourcis clavier" #~ msgid "Show icons" #~ msgstr "Afficher les icônes" #~ msgid "Licence key" #~ msgstr "Clé de licence" #~ msgid "Select the language for the user-interface from the following list:" #~ msgstr "" #~ "Veuillez choisir la langue de l'interface utilisateur parmi celles " #~ "répertoriées ci-dessous:" #~ msgid "Unknown language" #~ msgstr "Langue non référencée" #~ msgid "More languages on the web..." #~ msgstr "Autres langues sur internet..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Note: Changing the language requires to restart %s." #~ msgstr "" #~ "Remarque: La modification de la langue nécessite un redémarrage de %s." # %s will be replaced by the program name, usually"Silverjuke" #~ msgid "This is an unlicenced copy of %s!" #~ msgstr "Ceci est une copie non enregistrée de %s!" #~ msgid "" #~ "Please enter your name or your company's name and the licence key\n" #~ "you received when purchasing or updating your %s-licence:" #~ msgstr "" #~ "Veuillez saisir votre nom et votre clé de licence tels qu'ils vous ont " #~ "été\n" #~ "communiqués au moment de l'achat de votre licence %s." #~ msgid "Your name/company:" #~ msgstr "Votre nom:" # The first %s will be replaced by the program name, usually "Silverjuke". The second %i will be replaced by the number of evaluation days. The last %s, again, will be replaced by the program name. #~ msgid "" #~ "If you haven't bought a %s-licence, you may test this program %i days for " #~ "free.\n" #~ "After this period, you have to buy a licence for %s if you want to " #~ "continue using\n" #~ "this program." #~ msgstr "" #~ "Si vous n'avez pas encore acheté de licence %s, vous pouvez tester ce " #~ "programme gratuitement\n" #~ "pendant %i jours.\n" #~ "Par contre, si vous voulez continuer à utiliser %s à la fin de cette " #~ "période,\n" #~ "vous devez acheter une licence." # The first %s will be replaced by the program name, usually "Silverjuke". The second %s will be replaced by the name of the website, eg. www.silverjuke.net #~ msgid "" #~ "Further information about purchasing %s licences\n" #~ "are available at %s." #~ msgstr "" #~ "Vous trouvez toutes les informations pour l'achat\n" #~ "de licenses %s sous %s." # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s..." #~ msgstr "Ouvrir %s" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Thank you for buying a %s-licence!" #~ msgstr "Merci d'avoir acheté une licence %s!" #~ msgid "This copy is licenced to:" #~ msgstr "Cette copie est enregistrée à:" #~ msgid "" #~ "If this is not your name or the name of your company, you are not using a " #~ "legal licence!" #~ msgstr "Si ce n'est pas votre nom, vous n'utilisez pas une licence légale!" #~ msgid "Load external modules" #~ msgstr "Lancer les modules externes" #~ msgid "\"Magnetic\" window borders" #~ msgstr "Contours de fenêtre \"magnétique\"" #~ msgid "Window" #~ msgstr "Fenêtre" #~ msgid "Use shaped windows" #~ msgstr "Utiliser des fenêtres formatées" #~ msgid "Automatic version check" #~ msgstr "Contrôle automatique de version" # %i will be replaced by the number of days #~ msgid "Every %i days" #~ msgstr "Tous les %i jours" #~ msgid "FX" #~ msgstr "Effets audio" #~ msgid "" #~ "Please select the input and output devices to use. If you encounter any " #~ "problems,\n" #~ "please try a different buffer size and the \"Use hardware\" option." #~ msgstr "" #~ "Veuillez sélectionner les périphériques d'entrée et de sortie à utiliser. " #~ "Si vous rencontrez un problème,\n" #~ "veuillez modifier la taille de la mémoire tampon et l'option \"Utiliser " #~ "le hardware\"." #~ msgid "Audio-output" #~ msgstr "Sortie audio" #~ msgid "Prelisten audio-output" #~ msgstr "Pré-écouter la sortie audio" #~ msgid "Buffer" #~ msgstr "Mémoire tampon" #~ msgid "Use hardware" #~ msgstr "Utiliser le hardware" #~ msgid "" #~ "With these options, you can add jingles (small pieces of sound) between " #~ "tracks.\n" #~ "Add the jingles as normal music-files and decide how often they should be " #~ "played." #~ msgstr "" #~ "Avec cette option, vous pouvez insérer des jingles (petites séquences " #~ "musicales) entre les titres.\n" #~ "Ajoutez de simples fichiers musicaux en temps que jingles et définissez à " #~ "quelle fréquence\n" #~ "ils doivent être lus." #~ msgid "Use jingles" #~ msgstr "Utiliser des jingles" #~ msgid "Jingles:" #~ msgstr "Jingles:" # %s will be replaced by a control to select the number of tracks #~ msgid "Play a jingle about every %s tracks." #~ msgstr "Jouer un jingle approximativement tous les %s titres." #~ msgid "Select jingle(s)" #~ msgstr "Sélectionner un/des jingle(s)" #~ msgid "Use separate FX settings" #~ msgstr "Utiliser d'autres paramétres FX" #~ msgid "" #~ "The \"system tray\" is an area normally placed at the edge of the " #~ "screen.\n" #~ "With the following options, you can add a little symbol with frequently\n" #~ "used functions to this area." #~ msgstr "" #~ "La \"barre de notification\" est généralement affichée dans le coin " #~ "droit, au bas de l'écran.\n" #~ "\n" #~ "Avec les options suivantes, vous pouvez ajouter une icône dans la barre " #~ "de notification\n" #~ "disposant des fonctions généralement utilisées." #~ msgid "Never use system tray" #~ msgstr "Ne jamais utiliser la barre de notification" #~ msgid "Use system tray for the minimized window" #~ msgstr "Réduire dans la barre de notification" #~ msgid "Always use system tray" #~ msgstr "Toujours utiliser la barre de notification" #~ msgid "Show current track tooltip for %i seconds" #~ msgstr "Afficher la bulle d'infos %i secondes" # Used in the systray configuration dialog #~ msgid "Only if inactive" #~ msgstr "Uniquement si inactive" #~ msgid "Use this module for the following file extensions:" #~ msgstr "Assigner ce module aux extensions suivantes:" #~ msgid "Further options..." #~ msgstr "Options supplémentaires" # %s will be replaced by a list of extensions, eg. "MP3, MP2, MP1" #~ msgid "" #~ "If you disable this module or change the file types, make sure,\n" #~ "you don't need \"%s\" or they are supported by another module.\n" #~ "\n" #~ "Note: Remember that not every module can play every file type." #~ msgstr "" #~ "Si vous désactivez ce module ou modifiez des extensions,\n" #~ "contrôlez que vous n'utilisez plus \"%s\" ou qu'il sont supportés\n" #~ "par un autre module.\n" #~ "\n" #~ "Veuillez noter que chaque module ne peut supporter chaque type de fichier" # %s will be replaced by the string an abbreviation should be entered for, eg. #~ msgid "Abbreviation for \"%s\"" #~ msgstr "Abréviation pour \"%s\"" #, fuzzy #~ msgid "Close %s" #~ msgstr "Fermer" # %s will be replaced by the name of a website, eg. www.silverjuke.net #, fuzzy #~ msgid "Open %s" #~ msgstr "Ouvrir %s" #, fuzzy #~ msgid "Selection: %s" #~ msgstr "Sélections enregistrées" #, fuzzy #~ msgid "Select another visualization" #~ msgstr "Démarrer la visualisation" #~ msgid "Playback mode:" #~ msgstr "Mode de lecture:" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Interpolation:" #~ msgstr "Interpolation:" #~ msgid "Linear" #~ msgstr "Linéaire" #~ msgid "Sensitive" #~ msgstr "Sensibilité" #~ msgid "Query settings before start" #~ msgstr "Demander les critères de sélection avant de démarrer" #~ msgid "DAAP-/iTunes-client" #~ msgstr "DAAP-/iTunes-Client" #~ msgid "Add a DAAP-/iTunes-server" #~ msgstr "Ajouter un DAAP-/iTunes-Server" #~ msgid "" #~ "With Silverjuke's HTTP server you can access the program and your music " #~ "library from any\n" #~ "browser or other Silverjuke instances in your network." #~ msgstr "" #~ "Par le serveur HTTP de Silverjuke, vous pouvez accéder au programme et à " #~ "votre bibliothèque musicale\n" #~ "par tout navigateur internet ou d'autres sessions Silverjuke dans votre " #~ "réseau" #~ msgid "Enable HTTP server on port %s" #~ msgstr "Activer le serveur HTTP sur le port %s" #~ msgid "Share my music library over HTTP" #~ msgstr "Partager ma bibliothèque musicale sous HTTP" #~ msgid "Enable web interface access over HTTP" #~ msgstr "Activer l'interface web sous HTTP" # %s will be replaced by the file type, eg. "M3U" or "CUE" #~ msgid "Playlist" #~ msgstr "Liste de lecture" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" #~ msgid "Empty" #~ msgstr "Vide" #~ msgid "Update" #~ msgstr "Actualiser" #~ msgid "Sharing/Web interface" #~ msgstr "Partage interface web" #~ msgid "Audio-decoder" #~ msgstr "Décodeur audio" # The online database "freedb" can be queried in the Tag editor using the "Menu" button #~ msgid "Online database" #~ msgstr "Base de données online" # The first %i will be replaced by the current day number in the evaluation period, the second %i will be replaced by the total number of days of the evaluation period (currently 14). #~ msgid "You are on day %i of the %i-days testing period." #~ msgstr "Vous êtes au %i ieme jour de la période d'essai de %i jours." # This string is shown as a link the the "About" dialog. #~ msgid "Enter licence key now..." #~ msgstr "Entrez la clé de licence maintenant..." #~ msgid "Setup" #~ msgstr "Configurer" #~ msgid "Show the following effects:" #~ msgstr "Montrer les effets suivants:" #~ msgid "" #~ "To install further effects, just copy the\n" #~ "VST-plugins to one of the search paths." #~ msgstr "" #~ "Pour installer des effets supplémentaires, il suffit de copier\n" #~ "les plugins VST dans un des chemins de recherche." # %s will be replaces by a combobox for selecting the scope of the FX-Settings. Note the space before the ":" - this may be useful for layout reasons. #~ msgid "FX settings for %s :" #~ msgstr "Paramétrage FX pour %s:" # This is one possible selection for the FX scope #~ msgid "Normal playback" #~ msgstr "Lecture normale" #~ msgid "Enable %s" #~ msgstr "Activer %s" #~ msgid "%s parameters" #~ msgstr " les paramètres %s" #~ msgid "Load %s" #~ msgstr "Ouvrir %s" #~ msgid "Save %s" #~ msgstr "Enregistrer %s" # %s will be replaced eg. by the name of an effect #~ msgid "%s priority" #~ msgstr "%s priorité" #~ msgid "Load all" #~ msgstr "Ouvrir tous les paramètres" #~ msgid "Save all" #~ msgstr "Enregistrer tous les paramètres" #~ msgid "Start visualization/karaoke prompt" #~ msgstr "Démarrer la visualisation/karaoke prompt" #~ msgid "Stop visualization/karaoke prompt" #~ msgstr "Arrêter visualisation/karaoke prompt" #~ msgid "Drag'n'drop" #~ msgstr "Drag'n'drop" �������������������������������������������������������������silverjuke-16.2.3/po/insert-header.sin��������������������������������������������������������������0000664�0000000�0000000�00000001240�12660066715�0017657�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/nb.po��������������������������������������������������������������������������0000664�0000000�0000000�00000244335�12660066715�0015367�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2010-10-04 14:47+0100\n" "Last-Translator: Bjoern Petersen <drsilver@silverjuke.net>\n" "Language-Team: Norwegian Bokmal\n" "Language: nb\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" msgid "Sleep mode activated." msgstr "sovemodus aktivert" msgid "Sleep mode deactivated." msgstr "Sovemodus deaktivitert" msgid "Play time exceeded" msgstr "" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "Default" msgstr "Standard" #, fuzzy #| msgid "Devices" msgid "Device" msgstr "Utganger" msgid "Show covers" msgstr "Vis omslag" msgid "Duration" msgstr "Tid" msgid "Artist" msgstr "Artist" msgid "Original artist" msgstr "Original artist" msgid "Composer" msgstr "Kompositør" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Spor Nummer" msgid "Automatic track number" msgstr "Automatisk spornummer" msgid "Disk number" msgstr "Plate nummer" msgid "Genre" msgstr "Musikkstil" msgid "Year" msgstr "Tidspunkt" #, fuzzy #| msgid "My rating" msgid "Rating" msgstr "Mine karakterer" msgid "Comment" msgstr "Kommentarer" msgid "Show double tracks" msgstr "Vis doble spor" msgid "Show different artist names" msgstr "Vis andre artisters navn" msgid "Show different album names" msgstr "Vis forskjellige album navn" #, fuzzy #| msgid "Show covers" msgid "Show cover titles" msgstr "Vis omslag" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s spor" msgid "Drag folders with music here." msgstr "Dra musikkfiler hit" msgid "Reset to default values" msgstr "Sette til standardvalg" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "Automatisk Spilling" msgid "Shuffle" msgstr "Stokke" msgid "Recreating music library" msgstr "Gjennskap Musikkbibloteket" msgid "Updating music library" msgstr "Oppdater musikkbibloteket" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Hvis du stopper oppdateringsprosessen, vil ikke ditt musikkbiblotek bli " "oppdatert.\n" "\n" "Stopp oppdateringsprosess?" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "%sspilles. Vil du stoppe denne og avslutte %s?" #, c-format msgid "Exit %s" msgstr "Avslutt %s" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Kan ikke starte \"%s\"." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "Installer skriptet \"%s\" for permanent bruk" #, c-format msgid "Execute the script \"%s\"?" msgstr "Kjør skriptet \"%s\"?" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "Søk" msgid "On" msgstr "På" msgid "Off" msgstr "Av" msgid "Repeat playlist" msgstr "Reperter spillelister" msgid "Repeat one" msgstr "Reperter en" msgid "Repeat all" msgstr "Repertere alle" msgid "Select a track, then start playback." msgstr "Velg ett spor. og start avspilling." msgid "Stop after this track" msgstr "Stopp etter dette sporet" msgid "Stop after each track" msgstr "Stopp etter hvert spor" #, fuzzy #| msgid "Double click on covers" msgid "Double click play tracks at once" msgstr "Dobbelklikk på omslag" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback on first enqueue" msgstr "Begynn å spille køen" msgid "Remove played tracks from queue" msgstr "Fjern spor som er spilt fra køen" msgid "More from current album" msgstr "Mere fra dette album" msgid "More from current artist" msgstr "Mer fra denne artisten" msgid "No more tracks." msgstr "Ingen flere spor" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Remove all %i tracks from the queue and stop playback?" msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "Fjern alle %ispor fra listen og stopp avspilling?" msgstr[1] "Fjern alle %ispor fra listen og stopp avspilling?" msgid "Clear playlist" msgstr "Rens spillelisten" msgid "Track played, click to reset" msgstr "" msgid "Boredom avoided: Track moved down" msgstr "" msgid "Remove this track" msgstr "Fjern dette sporet" msgid "Toggle time mode" msgstr "Velg tidsvisning" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Go to \"%s\"" msgstr "Gå til \"%s\"" msgid "End search" msgstr "Stopp Søk" msgid "click right for options" msgstr "Høyreklikk for valg" msgid "Volume" msgstr "Volum" msgid "Double-click to enlarge the cover" msgstr "Dobbelklikk for maksimere omslaget" #, c-format msgid "Close this window and exit %s" msgstr "steng dette vindu og avslutt %s" msgid "Open main menu" msgstr "Åpne hovedmeny" msgid "Toggle shuffle mode" msgstr "Aktiver stokkemodus" msgid "Repeat all/repeat current" msgstr "Repeter alle/repeter Nåværende" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Let etter i \"%s\"" msgid "Help" msgstr "Hjelp" #, fuzzy #| msgid "Read files and folders" msgid "Add folders and files" msgstr "Les filer og kataloger" #, fuzzy #| msgid "File extension" msgid "Extensions" msgstr "Filendelse" msgid "Show remaining time" msgstr "Vis resterende tid" msgid "Show elapsed time" msgstr "Vis brukt tid" msgid "Show total time" msgstr "Vis total tid" msgid "Show track number" msgstr "Vis spornummer" msgid "Show artist name" msgstr "Vis artistens navn" msgid "Show AutoPlay" msgstr "Vis autospilling" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "Vis" #, fuzzy #| msgid "Volume" msgid "Columns" msgstr "Volum" msgid "Same zoom in all views" msgstr "Samme zoom i alle utseende" msgid "Fonts and covers" msgstr "Fonter og omslag" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Skins" #, fuzzy #| msgid "Start kiosk mode" msgid "Start kiosk mode..." msgstr "Start Festmodus" # %s will be replaced by the name of an artist #, fuzzy, c-format #| msgid "\"%s\" on the web" msgid "%s on the web" msgstr "\"%s\" på nettet" msgid "All files" msgstr "Alle filer" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "Om %s" msgid "File" msgstr "Fil" msgid "Edit" msgstr "Tilpass" msgid "View" msgstr "Utseende" msgid "Playback" msgstr "Spilling" #, fuzzy #| msgid "Fit to screen" msgid "Video screen" msgstr "Tilpass til skjerm" msgid "Kiosk mode" msgstr "Festmodus" msgid "None" msgstr "" msgid "Further options" msgstr "Avanserte valg" msgid "Queue" msgstr "Kø" msgid "Automatic control" msgstr "Automatisk kontroll" msgid "Current view" msgstr "Det du ser nå" #, c-format msgid "Next track from \"%s\"" msgstr "Neste spor fra \"%s\"" msgid "Next track" msgstr "Neste spor" msgid "Search for genre" msgstr "Søk etter musikk-stil" msgid "Search for music selection" msgstr "Se etter etter musikkvalg" msgid "Edit tracks/Get info" msgstr "Editer spor/Se etter informasjon" msgid "Show file" msgstr "Vis fil" msgid "Cover editor" msgstr "Omslagseditor" msgid "Mix" msgstr "" #, fuzzy #| msgid "Channels" msgid "Left channel" msgstr "Kanaler" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Forhåndslytting" msgid "No" msgstr "Nei" msgid "Yes" msgstr "Ja" #, fuzzy #| msgid "Only initalize system volume" msgid "Only initialize system volume" msgstr "Bruk bare systemvolumet" msgid "Output" msgstr "" msgid "Use system volume" msgstr "Bruk system volum" msgid "Several artists" msgstr "Flere artister" msgid "Unknown title" msgstr "Ukjent tittel" msgid "Save playlist" msgstr "Lagre spilleliste" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "kan ikke skrive til \"%s\"." msgid "Open playlist" msgstr "Åpne spilleliste" msgid "Title" msgstr "Tittel" msgid "Track count" msgstr "Antall spor" msgid "Disk count" msgstr "Plate antall" msgid "Group" msgstr "Gruppe" msgid "BPM" msgstr "BMP" msgid "Channels" msgstr "Kanaler" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "Filnavn" msgid "File size" msgstr "Hvor stor er filen" msgid "Date added" msgstr "Dato lagt til" msgid "Date modified" msgstr "Dato modifisert" msgid "Last played" msgstr "Sist spillt" msgid "Play count" msgstr "Antall ganger" msgid "SQL expression" msgstr "SQL Uttrykk" msgid "Limit result to" msgstr "Ta bare med resultat fra" msgid "Title/artist/album" msgstr "Tittel/artist/album" msgid "File type" msgstr "Fil type" msgid "Queue position" msgstr "Posisjon i spilleliste" msgid "Include tracks" msgstr "Inkluder spor" msgid "Exclude tracks" msgstr "Fjern spor" msgid "Random" msgstr "Tilfeldig" # %s will be replaced by a shortcut, eg. "Ins" or "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "trykk \"%s\" i hovedvinduet" msgid "Insert" msgstr "Sett inn" msgid "Del" msgstr "Fjern" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Legg inn dato som \"dd.mm.yyyy\", du kan også legge inn \"hh:mm\" for tiden." msgid "Please enter the text." msgstr "Skriv inn teksten" msgid "Please enter a value." msgstr "Skriv inn en verdi" msgid "Please enter a valid value." msgstr "Skriv inn en gyldig verdi" msgid "(second field)" msgstr "(Andre feltet)" msgid "No valid criteria defined." msgstr "Ikke noe gyldig søkekriteria definert" msgid "The search cannot be started; please check the following fields:" msgstr "Søket kan ikke startes;vennligst sjekk følgende felter:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "Note: The operators \"equal\" and \"unequal\" are " # %s will be replaced by the name of a music selection #, fuzzy, c-format #| msgid "Do you really want to delete the music selection \"%s\"?" msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Vil du virkelig fjerne musikkbibloteket \"%s\"?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Avbryt" msgid "Page left" msgstr "Side venstre" msgid "Page right" msgstr "Side høyre" msgid "Page up" msgstr "Side opp" msgid "Page down" msgstr "Side ned" msgid "Menu" msgstr "Meny" msgid "Cursor left" msgstr "Peker venstre" msgid "Cursor right" msgstr "Peker høyre" msgid "Cursor up" msgstr "Peker opp" msgid "Cursor down" msgstr "Peker ned" msgid "Line left" msgstr "Linje venstre" msgid "Line right" msgstr "Linje høyre" msgid "Line up" msgstr "Linje opp" msgid "Line down" msgstr "Linje ned" msgid "Home" msgstr "Hjem" msgid "End" msgstr "Slutt" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Fjern" msgid "Album view" msgstr "Albumutseende" msgid "Cover view" msgstr "Omslagsutseende" msgid "List view" msgstr "Listeutseende" msgid "Toggle view" msgstr "Skift utseende" #, fuzzy #| msgid "Open playlist" msgid "Open playlist..." msgstr "Åpne spilleliste" msgid "Unqueue marked tracks" msgstr "Fjern markerte spor fra kø" msgid "Unqueue all but marked tracks" msgstr "Fjern allt untatt merkede spor" #, fuzzy #| msgid "Save playlist" msgid "Save playlist..." msgstr "Lagre spilleliste" msgid "Paste" msgstr "im inn" #, fuzzy #| msgid "Music selection" msgid "Music selection..." msgstr "Musikk valg" msgid "Settings" msgstr "Innstillinger" msgid "Update music library" msgstr "Oppdater musikk-biblotek" msgid "Recreate music library" msgstr "Lag nytt musikk-bibliotek" msgid "Enqueue tracks" msgstr "Plasser spor i kø" msgid "Play tracks next" msgstr "Spill spor etter dette" msgid "Play tracks now" msgstr "Spill spor" msgid "Volume up" msgstr "Volum opp" msgid "Volume down" msgstr "Volum ned" msgid "Unqueue tracks" msgstr "Fjern spor" #, fuzzy #| msgid "Edit tracks/Get info" msgid "Edit tracks/Get info..." msgstr "Editer spor/Se etter informasjon" msgid "Play" msgstr "Spill" msgid "Pause" msgstr "Pause" msgid "Stop" msgstr "Stopp" msgid "Previous track" msgstr "Forrige spor" msgid "Seek backward" msgstr "Søk bakover" msgid "Seek forward" msgstr "Søk forover" msgid "Fade to next" msgstr "Gli over til neste" msgid "Mute" msgstr "Demp" msgid "Reload skin" msgstr "Last inn utseende" #, fuzzy #| msgid "Fit to screen" msgid "Toggle video screen" msgstr "Tilpass til skjerm" msgid "Smooth" msgstr "Myk" msgid "Select all" msgstr "Velg alle" msgid "Zoom in" msgstr "Zoom inn" msgid "Zoom out" msgstr "Zoom ut" msgid "Normal zoom" msgstr "Normal zoom" msgid "Always on top" msgstr "Alltid topp" msgid "Go to current track" msgstr "Til spillende spor" msgid "Go to marked track" msgstr "Gå til markert spor" msgid "Go to random album" msgstr "Til tilfeldig album" msgid "Go to previous letter" msgstr "Gå til forrige bokstav" msgid "Go to next letter" msgstr "Gå til neste bokstav" msgid "Add credit" msgstr "Legg til kreditt" #, fuzzy #| msgid "Console" msgid "Console..." msgstr "Konsoll" #, fuzzy #| msgid "Replace" msgid "Replace..." msgstr "Erstatt" #, fuzzy #| msgid "Split field" msgid "Split field..." msgstr "Del felt" #, fuzzy #| msgid "Rename files" msgid "Rename files..." msgstr "Omdøp filer" #, fuzzy #| msgid "Query online database" msgid "Query online database..." msgstr "Spør database på nettet" #, fuzzy #| msgid "New music selection" msgid "New music selection..." msgstr "Nytt musikkvalg" msgid "Save" msgstr "Spar" #, fuzzy #| msgid "Save as" msgid "Save as..." msgstr "Spar som" #, fuzzy #| msgid "Rename" msgid "Rename..." msgstr "Gi nytt navn" msgid "Revert to saved" msgstr "Gå tilbake til lagret" #, fuzzy #| msgid "Open file" msgid "Open file..." msgstr "Åpne fil" #, fuzzy #| msgid "Save cover" msgid "Save cover..." msgstr "Spar omslag" msgid "Rotate left" msgstr "Roter mot venstre" msgid "Rotate right" msgstr "Roter høyre" msgid "Flip horizontally" msgstr "Vend horisontalt" msgid "Flip vertically" msgstr "Vend vertikalt" msgid "Grayscale" msgstr "Gråskala" msgid "Negative" msgstr "Negativ" msgid "Fit to screen" msgstr "Tilpass til skjerm" msgid "Decrease brightness" msgstr "Minsk lysheten" msgid "Increase brightness" msgstr "Øk lysheten" msgid "Decrease contrast" msgstr "Minsk kontrasten" msgid "Increase contrast" msgstr "Øk kontrasten" msgid "Normal brightness/contrast" msgstr "ormal lyshet/Kontrast" msgid "Crop" msgstr "Beskjære" msgid "Please press the shortcut to add." msgstr "Trykk snarveien for å legge til" msgid "System-wide:" msgstr "Over hele systemet:" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Fjern snarvei \"%s\"" msgid "Add system-wide shortcut..." msgstr "Lag snarvei over hele systemet..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Lag snarvei til \"%s\"..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "Snarveien \"%s\" er nå koblet til kommando \"%s\".\n" "\n" "Vil du koble det til snarveien \"%s\" nå?" #, fuzzy msgid "Mouse" msgstr "Demp" msgid "Drag window content" msgstr "Dra vinduets innhold" msgid "Left mouse button" msgstr "Venstre museknapp" msgid "Drag selected tracks" msgstr "Dra valgte spor" msgid "Second click with the left mouse button" msgstr "Andreklikk med venstre museknapp" msgid "Show icons beside mouse cursor" msgstr "Vis koner bak musepeker" msgid "Middle mouse button" msgstr "Mitterste museknapp" msgid "Edit tracks" msgstr "rediger sporene" msgid "Tooltips" msgstr "Verktøytips" msgid "Mouse wheel" msgstr "Musehjul" #, fuzzy #| msgid "Scroll horizontally" msgid "Scroll horizontally in album view" msgstr "Rull horisontalt" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "Bruk multimedatastaturknapper" msgid "Ask on close if playing" msgstr "Spør om stenging hvis man spiller" msgid "Ask before enqueuing multiple tracks" msgstr "Spør før man legger flere filer i kø" msgid "Ask before clearing the playlist" msgstr "Spør før man renser spillelisten" #, fuzzy #| msgid "Ask before changing my rating" msgid "Ask before changing the rating" msgstr "Spør før man forandrer mine karakterer" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Tilbaketast" msgid "Space" msgstr "Mellomrom" msgid "Up" msgstr "Opp" msgid "Left" msgstr "Venstre" msgid "Right" msgstr "Høyre" msgid "Down" msgstr "Ned" msgid "Print" msgstr "Skriv ut" msgid "Ins" msgstr "Ins" msgid "Music selection" msgstr "Musikk valg" msgid "Numpad" msgstr "Numerisk " msgid "Select date and time" msgstr "Velg dato og tid" msgid "Time" msgstr "Tid" msgid "contains" msgstr "Inneholder" msgid "does not contain" msgstr "inneholder ikke" msgid "starts with" msgstr "starter med" msgid "does not start with" msgstr "starter ikke med" msgid "starts simelar to" msgstr "starter likt med" msgid "ends with" msgstr "slutter med" msgid "does not end with" msgstr "slutter ikke med" msgid "on" msgstr "på" msgid "is equal to" msgstr "er lik" msgid "not on" msgstr "ikke på" msgid "is unequal to" msgstr "er ulik" msgid "is simelar to" msgstr "er lik" msgid "is after" msgstr "er etter" msgid "is greater than" msgstr "er større enn" msgid "is on or after" msgstr "er på eller etter" msgid "is greater or equal" msgstr "er større eller lik" msgid "is before" msgstr "er før" msgid "is less than" msgstr "er mindre enn" msgid "is on or before" msgstr "er på eller før" msgid "is less or equal" msgstr "er mindre eller lik" msgid "is in the last" msgstr "er i den siste" msgid "is not in the last" msgstr "er ikke i den siste" msgid "is in the period" msgstr "er i perioden" msgid "is in range" msgstr "er i nivået" msgid "is not in the period" msgstr "etr ikke i perioden" msgid "is not in range" msgstr "er ikke i nivået" msgid "is set" msgstr "er fastsatt" msgid "is unset" msgstr "er ikke fastsatt" msgid "tracks" msgstr "Spor" msgid "albums" msgstr "album" msgid "minutes" msgstr "minutter" msgid "hours" msgstr "timer" msgid "seconds" msgstr "sekunder" msgid "days" msgstr "dager" msgid "No rating" msgstr "Ingen karakterer" msgid "random" msgstr "tilfeldig" msgid "highest rating" msgstr "høyest karakter" msgid "lowest rating" msgstr "lavesrt karakter" msgid "most often played" msgstr "oftest spillt" msgid "least often played" msgstr "sjelden spillt" msgid "most recently played" msgstr "oftest spilt" msgid "least recently played" msgstr "minst sist spilt" msgid "most recently added" msgstr "mest lagt til i siste tiden" msgid "least recently added" msgstr "minst lagt til i siste tiden" msgid "most recently modified" msgstr "mest modifisert i siste tiden" msgid "least recently modified" msgstr "minst lagt til i siste tiden" msgid "most recently released" msgstr "Sist utgitt" msgid "least recently released" msgstr "Eldste utgivelser" msgid "low queue position" msgstr "Lav kø posisjon" msgid "high queue position" msgstr "høy kø posisjon" msgid "Today" msgstr "I dag" msgid "Yesterday" msgstr "i går" msgid "Select..." msgstr "Velg..." msgid "Show tracks..." msgstr "Vis spor" #, fuzzy msgid "Add tracks from playlist" msgstr "Legg til i nåværende spilleliste" msgid "Current position" msgstr "Nåværende posisjon" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "av" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "til" msgid "Remove criterion" msgstr "Fjern kriteria" msgid "Add criterion" msgstr "Legg til kriteria" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "Spor inkludert til \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Spor fjernet fra \"%s\"" msgid "Saved selections" msgstr "Lagrede valg" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Søk etter %s som passer %s av de følgende kriterier:" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "spor|album" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "Alle|noen|ingen" msgid "Close" msgstr "Steng" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Vil du spare dine forandringer til musikkbibloteket \"%s\"?" msgid "Music selection modified" msgstr "Musikkbiblotejk modifisert" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "tilpass musikkbiblotek \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Vil du virkelig fjerne musikkbibloteket \"%s\"?" msgid "Delete music selection" msgstr "Fjern musikkbiblotek" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Vil du virkelig fjerne %i valgte musikkbiblotek?" msgid "Delete music selections" msgstr "Fjern musikkbiblotek" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "Ingen treff for \"%s\"." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "Vil du virkelig fjerne de valgte spor(s) fra musikkbibloteket \"%s\"?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "" "Vil du virkelig legge til de valgte spor(s) til musikkbibloteket \"%s\"?" # This is the name of a predefined music selection msgid "70's music" msgstr "70talls musikk" # This is the name of a predefined music selection #, fuzzy msgid "Worst rated" msgstr "Høyeste karakter" # This is the name of a predefined music selection msgid "Top rated" msgstr "Høyeste karakter" # This is the name of a predefined music selection msgid "Top 20" msgstr "topp 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "Spillt den siste tiden" # This is the name of a predefined music selection msgid "Played today" msgstr "Spillt i dag" # This is the name of a predefined music selection msgid "Random selection" msgstr "Tilfeldig Valg" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Spor i kø" msgid "Untitled Music selection" msgstr "Musikkbiblotek uten navn" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Ingen treff i \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "1 treff i \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s treff i \"%s\"" msgid "No matches" msgstr "Ingen treff" msgid "1 match" msgstr "1 treff" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s treff" # %s will be replaced by the name of a music selection #, fuzzy msgid "Search single words" msgstr "Let etter i \"%s\"" msgid "Lookup genre on simple search" msgstr "Se etter stil eller enkelt søk" msgid "Search while typing" msgstr "Let mens du skriver" msgid "Save modified music selections" msgstr "Lagre modifisert musikkbiblotek" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "Spør" msgid "Max. history size" msgstr "Maks historiestørrelse" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "se etter \"%s\" i \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Se etter \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "Hold nede venstre museknapp. Velg så område ved å bevege musen" msgid "<Abstract>" msgstr "<Abstrakt>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Standard)" msgid "Paste image from clipboard" msgstr "Lim inn bilde fra utklippstavle" msgid "Browse" msgstr "se etter" msgid "Select cover" msgstr "Velg omslag" msgid "Search covers on the web" msgstr "Se etter omslag i webben" msgid "Don't rotate" msgstr "Ikke roter" msgid "Rotate/flip" msgstr "Roter/Snu" msgid "Use default images..." msgstr "Bruk standard bilder..." msgid "Effects/options" msgstr "Effekter/Valg" msgid "Select image" msgstr "Velg Bilde" msgid "Save cover" msgstr "Spar omslag" msgid "Reset all selected alternative images to their default value?" msgstr "Sett alle valgte alternative bilder til standardverdi?" msgid "Search paths" msgstr "Letemuligheter" msgid "The search paths are used for skins, language files and modules." msgstr "Søkestien er brukt for språkfiler, skins og moduler" msgid "Add..." msgstr "Legg til..." msgid "Remove" msgstr "Fjern" msgid "Please select the folder to add to the search paths." msgstr "Vennligst velg katalogen som skal leggees til søkstien." msgid "Edit..." msgstr "Tilpass..." #, fuzzy #| msgid "Comment" msgid "Command" msgstr "Kommentarer" msgid "Shortcut" msgstr "Snarveier" #, fuzzy #| msgid "Options" msgid "Option" msgstr "Valg" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "Disse valgene er bare for erfarne brukere." msgid "Customize" msgstr "Tilpass" msgid "Reset selection" msgstr "Nullstill valg" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Vil du virkelig nullstille %i valgte kommandoer og valg til grunnleggende " "verdier?" #, fuzzy #| msgid "Shortcut" msgid "Shortcuts" msgstr "Snarveier" msgid "Language" msgstr "Språk" msgid "Show files with" msgstr "Vis filer med" msgid "Instance" msgstr "Ganger" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Bruk kommandolinje-valget --%s=<file> for å forandre dette." msgid "Index file" msgstr "Indeksfil" msgid "RAM cache" msgstr "RAM cache" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "Gjenn. søketid: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synkronisering" msgid "Fast" msgstr "rask" msgid "Save but slower" msgstr "Sikker men saktere" msgid "Very save and slow" msgstr "Meget sikker og sakte" msgid "Image cache" msgstr "Bildeminne" msgid "Use temporary directory" msgstr "Bruk temp-biblotek" msgid "Yes, load images asynchrony" msgstr "Ja, last bilder asynkront." msgid "Yes, load images directly and avoid flickering" msgstr "Ja, last bilder direkte og unngå flikkering" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% brukt for %i bilder" #, fuzzy msgid "Regard file changes" msgstr "Les filer og kataloger" msgid "Advanced" msgstr "Avansert" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "Vennligst omstart %s så forandringene kan virke." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Hjelpesystemer" # String for "Don't know" or "unset" msgid "n/a" msgstr "Ikke tilgjengelig" msgid "Internal" msgstr "Internt" msgid "No credit." msgstr "Ingen kreditt" #, c-format msgid "Credit: %i" msgstr "Kreditt: %i" msgid "Start" msgstr "Start" #, fuzzy #| msgid "Functionality" msgid "Functions" msgstr "Funksjonalitet" msgid "Monitors" msgstr "Monitorer" msgid "Virtual keyboard" msgstr "Skjermtastatur" msgid "Credit system" msgstr "Kreditt system" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke har ett såkallt \"Festmodus\"som gjør att du kan kjøre programmet " "i fullt vindu med en\n" "definert funksjonalitet." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Før du går til festmodus ved å klikke på start \"Start\", vær sikker på att " "du vet hvordan\n" "man kan gå ut igjen:" # %s will be replaced by a shortcut, eg. "F11" #, c-format msgid "Exit by hitting %s" msgstr "Avslutt med å trykke %s" msgid "Exit by clicking into two different corners" msgstr "Gå ut ved å klikke i to forskjellige hjørner" msgid "Try to set exclusive" msgstr "" #, fuzzy msgid "Ask for a password on exit" msgstr "Be om følgende passord når du avslutter:" #, fuzzy msgid "Change password..." msgstr "Passord For vedlikehold" msgid "Exit action:" msgstr "Tiltak:" msgid "Start the kiosk mode with the following functionality:" msgstr "Start festmodus med følgende funksjonalitet:" msgid "Play/pause" msgstr "Spill/Pause" msgid "Edit queue" msgstr "Rediger køen" msgid "Toggle elements" msgstr "Slå av og på elementer" msgid "Enqueue multiple tracks" msgstr "Legg til flere spor i kø" msgid "All functions" msgstr "Alle funksjoner" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Bare spor fra musikkvalget %s" msgid "Please enter the password again for verification." msgstr "Slå inn passordet en gang til for verifisering" msgid "Overview:" msgstr "Oversikt:" msgid "Main window" msgstr "Hovedvindu" msgid "Monitor" msgstr "Monitor" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB msgid "Disable screensaver" msgstr "Slå av skjermsparer" msgid "Disable power management" msgstr "Slå av strømstyring" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Har du ikke noe vanlig tastaturt, kan du bruke skjermtastatur;\n" "Dette tastaturet vil da dukke opp hver gang du klikker i ett tekstområde." msgid "Use the virtual keyboard" msgstr "Bruk skjermtastatur" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Bruk også skjermtastaturet utenfor festmodus" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(Vennligst klikk inne i tekstkontrollen)" msgid "Virtual keyboard layout:" msgstr "Skjermtastaturoppsett:" msgid "Colour:" msgstr "Farge:" msgid "Black" msgstr "Svart" msgid "White" msgstr "Hvit" msgid "Transparency:" msgstr "transparang:" # %s will be replaced by the program name, usually "Silverjuke" msgid "Hide cursor" msgstr "Gjem peker" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Ved å bruke talltastaturet og noen andre spesialknapper kan du kontrollere " "Silverjuke\n" "Du etter da inn filene i køen ved å taste inn numrene bak album og spor\n" "." msgid "Use Numpad controls" msgstr "Bruk talltastaturet" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Bruk også talltastaturet utenfor festmodus" msgid "Keys:" msgstr "Nøkler" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "Ved betalingssystemet må de legge på penger før spor blir lagt i kø. " "Vennligst bruk hjelpen på nettet for å se muligheter og maskinvare som " "støttes." msgid "Use credit system" msgstr "Bruk betalingssytem:" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "Betaling kan legges til ved hjelp av DDE, komandolinje eller snarveier" msgid "Keys..." msgstr "Nøkler..." msgid "Remember credits between program starts" msgstr "Husk innbetaling mellom programoppstarter" msgid "Current credit:" msgstr "Innbetalt:" msgid "Please enter your password to exit the kiosk mode." msgstr "Oppgi passord for å gå ut av festmodus." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "for mange spor i køen,\n" "vennligst prøv senere." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "Dette sporet er allerede i køen,\n" "Prøv litt senere." msgid "" "This track or artist was just played,\n" "please try again later." msgstr "Dette sporet eller artisten ble akkurat spillt,Vennligst prøv senere" msgid "Maintenance password" msgstr "Passord For vedlikehold" msgid "Exit kiosk mode" msgstr "Ut fra fest-modus" msgid "Start kiosk mode" msgstr "Start Festmodus" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Passord:" msgid "Invalid password. Please try again." msgstr "Feil Passord. Prøv igjen" msgid "Invalid track number" msgstr "Ugyldig spor nummer" msgid "Action:" msgstr "Tiltak:" msgid "Shutdown computer" msgstr "Slå av datamaskin" msgid "Reboot computer" msgstr "Omstart datamaskin" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Ett album må ha minst %s spor med korsporerende %s." msgid "artist/album" msgstr "artist/album" msgid "artist/album or genre" msgstr "artist/album eller musikksstil" msgid "directory" msgstr "katalog" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Samlinger kan inneholde opp til %s spor av samme artist." msgid "Separate the words using commas, case is ignored" msgstr "separer ordene med komma. ignorer store bokstaver" msgid "Sort by:" msgstr "Sorter etter" msgid "Stop-words for sorting artists:" msgstr "Stopp-ord for å sortere artister:" msgid "Stop-words for sorting albums:" msgstr "Stopp-ord for å sortere album:" msgid "Show stop-words words at end" msgstr "Vis stopp-ord på slutten" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "Hvis valgt, f.eks. \"The Rolling Stones\"blir \"Rolling Stones, Selve\";\n" "sorteringen i seg selv blir ikke berørt" msgid "Keywords to identify cover image for an album:" msgstr "Nøkkelord for å finne album omslag" msgid "Double click on covers" msgstr "Dobbelklikk på omslag" msgid "Select/play album" msgstr "Velg/Spill album" msgid "Combine tracks to albums" msgstr "sett sammen spor til album" msgid "Updating genres..." msgstr "Oppdater musikkstilene" msgid "Updating groups..." msgstr "oppdater grupper..." msgid "Combining tracks to albums..." msgstr "Kombiner spor til album..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Vil du legge følgende katalog(er) til ditt musikkbiblotek?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Ja, spar bildet i \"%s\"" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Ja, kopier bildet til \"%s\"" # %s will be replaced by the album name #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Vil du bruke dette bildet som omslag for \"%s\"?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "\"%s\" er ikke i ditt musikkbiblotek og kan derfor ikke editeres." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s spor på %s album funnet for \"%s\"" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s spor på %s album" msgid "Albums" msgstr "Album" msgid "All albums" msgstr "Alle album" msgid "Unsorted tracks" msgstr "Usorterte spor" # %i will be replaced by the disk number #, c-format msgid "Disk %i" msgstr "Disk %i" # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Stopp forhåndslytting" #, c-format msgid "Prelisten \"%s\"" msgstr "Forhåndslytting \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "Legg til \"%s\"" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "Spill \"%s\" nå" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "Spill \"%s\" som neste" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "Fjern \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Enqueue %i tracks" msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "Legg til %i spor" msgstr[1] "Legg til %i spor" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks now" msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "Spill %i spor nå" msgstr[1] "Spill %i spor nå" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks next" msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "Spill %i som neste" msgstr[1] "Spill %i som neste" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Unqueue %i tracks" msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "Fjern %i spor" msgstr[1] "Fjern %i spor" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" på nettet" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Gjennomsnittelig karakter: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, fuzzy, c-format #| msgid "My rating: %s" msgid "Rating: %s" msgstr "Mine karakterer: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to change the rating for all %i selected tracks?" msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "Vil du bytte karakter for alle %i valgte spor?" msgstr[1] "Vil du bytte karakter for alle %i valgte spor?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Forandre karakter" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" "Klikk for å velge alle spor på dette albumet, dobbelklikk for å spille dem." msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" "Klikk for å velge alle spor av denne artisten, dobbelklikk for å spille dem." msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" "Klikk for å velge alle spor på denne diskent, dobbelklikk for å spille dem." # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Dobbelklikk for å legge til \"%s\"" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to enqueue all %i selected tracks?" msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Vil du legge til alle %i valgte spor?" msgstr[1] "Vil du legge til alle %i valgte spor?" msgid "Size" msgstr "Størrelse" msgid "Gain" msgstr "Gain" msgid "Read music-files from the following folders and sources:" msgstr "Les musikkfiler fra følgende kataloger og kilder:" msgid "Read music-files from the following sources:" msgstr "Les musikkfiler fra følgende kilder:" msgid "Add source" msgstr "Legg til kilde" msgid "Remove source" msgstr "Fjern kilde" msgid "Options" msgstr "Valg" #, fuzzy #| msgid "Supported file-types" msgid "Supported file types" msgstr "Støttede filtyper" #, fuzzy #| msgid "My music library" msgid "Music library" msgstr "Mitt musikkbibliotek" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Valg for \"%s\"" msgid "Options..." msgstr "Valg ..." msgid "Jukebox" msgstr "" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "Vennligst velg en spilleliste, noen filer eller en nettstrøm" msgid "Append to current playlist" msgstr "Legg til i nåværende spilleliste" msgid "Volume control" msgstr "Volumkontroll" msgid "Play all tracks of an album with the same volume" msgstr "Spill alle spor fra ett album med samme volum?" msgid "Desired volume:" msgstr "Ønsket Volum" msgid "Max. gain:" msgstr "Max. gain:" msgid "Current volume:" msgstr "nåværende volum:" msgid "Fading" msgstr "Fading" msgid "Crossfading" msgstr "Gli over" msgid "Manual crossfades:" msgstr "Manuell kryssfading:" msgid "Automatic crossfades:" msgstr "Automatisk kryssfading:" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "Ingen kryssfadinger mellom spor fra samme album" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Bare fade ut gammelt spor, det nye starter med fullt volum" msgid "Resume" msgstr "" msgid "Jingles" msgstr "Lydsnutter" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" "De følgende valg definerer oppførselen til køen. For \"stokkeinsensitet\",\n" "Små variasjoner gir små variasjoner i køen, mens store verdier \n" "lager store variasjoner." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Ha maks. %i spor i køen" msgstr[1] "Ha maks. %i spor i køen" #, fuzzy #| msgid "Avoid double tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Unngå like spor i køen" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "Unngå kjedsomhet: Ikke samme spor i løpet av %i minutter" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "Unngå ensformighet: ikke reperter artisten innen %i minutter " msgid "Shuffle intensity:" msgstr "Stokking insensitet:" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" #, fuzzy #| msgid "Edit queue" msgid "Restore queue" msgstr "Rediger køen" #, fuzzy #| msgid "Remove played tracks from queue" msgid "Restore already played tracks" msgstr "Fjern spor som er spilt fra køen" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback from last position" msgstr "Begynn å spille køen" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Bruk de følgende valg for hva som skal skje automatisk \n" "etter ett bestemt tidsperspektiv." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "Autospilling: Hvis spillelisten er tom,vent %i minutter;" #, c-format msgid "then, play %i tracks from the %s" msgstr "da, spill %i spor fra %s" # %s will be replaced by the name of a music selection #, fuzzy msgid "Ignore tracks from the music selection" msgstr "Bare spor fra musikkvalget %s" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "Manuellt innlagte spor avbryter autospilling med en gang" msgid "Sleep mode:" msgstr "Sovemodus:" msgid "Stop playback" msgstr "Stopp avspilling" #, fuzzy #| msgid "in|after|at|always in|always after|always at" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "in|after|at|always in|always after|always at" #, fuzzy #| msgid "minutes" msgid "minutes|o'clock" msgstr "minutter" #, c-format msgid "Before this, fade out %i seconds" msgstr "Før dette, fadeut %i sekunder" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" #, fuzzy #| msgid "minutes" msgid "minutes," msgstr "minutter" # %s will be replaced by the name of a music selection #, fuzzy msgid "play a track from the music selection" msgstr "Bare spor fra musikkvalget %s" #, fuzzy #| msgid "Alt" msgid "At" msgstr "Alt" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Gå til nåværende spor etter %i minutter uten aktivitet" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "Tilbakestill utseende etter %i minutter av innaktivitet til " #, fuzzy, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Tilbakestill utseende etter %i minutter av innaktivitet til " #, fuzzy, c-format msgid "Close video screen after %i minutes" msgstr "Stopp visulasjon etter %i minutter." #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "Les kataloger:" msgid "Read file:" msgstr "Les fil:" msgid "Ignore music-files and images with the following extensions:" msgstr "Se bort fra musikkfiler og bilder med følgende filendelse:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "(separer endelsene ved hjep av komma, )" msgid "Include folder to the update process" msgstr "Inkluder katalog i oppdateringsprosessen" msgid "Read hidden files" msgstr "Les skjulte filer" #, fuzzy #| msgid "Read hidden files" msgid "Read hidden folders" msgstr "Les skjulte filer" #, fuzzy msgid "Read inside ZIP-/TAR-archives" msgstr "Les inne i ZIP-Filer" msgid "Read (ID3)-tags" msgstr "Les (ID3)-tagger" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "Sti og filnavn for sporinformasjon hvis (ID3-)data mangler:" msgid "Placeholders:" msgstr "Plassholdere:" msgid "Read files and folders" msgstr "Les filer og kataloger" msgid "Add a folder to search for music-files" msgstr "Legg til en katalog for å søke etter musikk-filer" msgid "Add a single music-file" msgstr "Legg til en enkel musikk-fil" msgid "Disabled" msgstr "Frakoblet" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "Ingen oppdatering" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "Fjern \"%s\" fra musikk-biblioteket?" msgid "Select a folder with music-files" msgstr "Velg en mappe med musikkfiler" msgid "Select music-file" msgstr "Velg musikk-fil" msgid "Unknown track" msgstr "Ukjent spor" msgid "Unknown artist" msgstr "Ukjent artist" msgid "Add a server containing music-files" msgstr "Legg til en server som inneholder musikkfiler" msgid "Use server:" msgstr "Bruk server:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Type" msgid "Login name:" msgstr "Innlogginsnavn" msgid "Include server to the update process" msgstr "Inkluder server i oppdateringsprosessen" msgid "Configuration file" msgstr "Konfigurasjonsfil" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #, c-format msgid "Loading %s" msgstr "Laster %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Feil %i" msgid "Edit track" msgstr "Rediger spor" msgid "of" msgstr "Av" msgid "Write (ID3-)tags" msgstr "skriv (ID3-)tags" msgid "File names" msgstr "Filnavn" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Vis alle %s filnavn..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "De viste verdier er summen eller gjennomsnitt av alle enkeltverdier i de " "oppgitte filer." msgid "Track" msgstr "Spor" msgid "Further information" msgstr "Mer informasjon" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "Midlertidlig katalog" msgid "Further information..." msgstr "Ytterligere opplysninger.." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "kan ikke forandre navn på \"%s\" til \"%s\"." msgid "Server name" msgstr "Server navn" msgid "Query online database" msgstr "Spør database på nettet" msgid "more..." msgstr "mer.." msgid "Please select one of the following albums:" msgstr "Vennligst velg ett av de føgende album:" msgid "Old file name" msgstr "Gammelt filnavn" msgid "New file name" msgstr "Nytt filnavn" msgid "Field" msgstr "Felt" msgid "Old value" msgstr "Gammel verdi" msgid "New value" msgstr "Ny verdi" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<tom>" msgid "Confirm modifications" msgstr "Bekreft modifikasjoner" msgid "Delete empty folders" msgstr "Slett tomme mapper" msgid "Please confirm or edit the following modification:" msgstr "Vennligst bekreft eller angre følgende modifikasjon" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Vennligst bekreft eller gjør om følgende %s modifikasjoner:" msgid "(lower case)" msgstr "(Små bokstaver)" msgid "(upper case)" msgstr "(Store bokstaver)" msgid "(n characters)" msgstr "(n karakterer)" msgid "Rename files" msgstr "Omdøp filer" msgid "Pattern:" msgstr "Mønster:" #, fuzzy #| msgid "(first character)" msgid "Artist (first character)" msgstr "(første bokstav)" #, fuzzy #| msgid "(first character)" msgid "Album (first character)" msgstr "(første bokstav)" #, fuzzy #| msgid "(first character)" msgid "Genre (first character)" msgstr "(første bokstav)" #, fuzzy #| msgid "(first character)" msgid "Group (first character)" msgstr "(første bokstav)" #, fuzzy #| msgid "(n characters)" msgid "Year (4 characters)" msgstr "(n karakterer)" #, fuzzy #| msgid "(n characters)" msgid "Year (2 characters)" msgstr "(n karakterer)" #, fuzzy #| msgid "(n characters)" msgid "Duration (5 characters)" msgstr "(n karakterer)" msgid "Directory change" msgstr "forandre katalog" #, fuzzy #| msgid "(n characters)" msgid "File name (8 characters)" msgstr "(n karakterer)" msgid "File extension" msgstr "Filendelse" msgid "Example:" msgstr "Eksempel:" msgid "Replace" msgstr "Erstatt" msgid "Search for:" msgstr "Se etter:" msgid "in:" msgstr "I:" msgid "All fields" msgstr "Alle felt" msgid "Path and file name" msgstr "Sti og filnavn" msgid "Replace with:" msgstr "Erstatt med:" msgid "Match whole words only" msgstr "Finn bare hele ord" msgid "Match case" msgstr "Bruk bokstavstørrelsen" msgid "Regular expression" msgstr "regulært uttrykk" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "\"%s\" ikke funnet." msgid "Split field" msgstr "Del felt" msgid "Field to split:" msgstr "Felt å splitte" msgid "Destination fields and pattern:" msgstr "Målfelter og søkestreng:" #, fuzzy #| msgid "Track number" msgid "Track number (1 character)" msgstr "Spor Nummer" #, fuzzy #| msgid "(n characters)" msgid "Track number (2 characters)" msgstr "(n karakterer)" #, fuzzy #| msgid "(first character)" msgid "Disk number (1 character)" msgstr "(første bokstav)" #, fuzzy #| msgid "(n characters)" msgid "Disk number (2 characters)" msgstr "(n karakterer)" msgid "Void information" msgstr "Tom informasjon" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "Med forskjellige grafiske grensesnitt kan du forandre \"utseende og følelsel" "\" av %s. Bare\n" "velg det grafiske grensesnittet du vil bruke fra listen over her. Du vil " "finne flere på nettet." msgid "Name" msgstr "Navn" msgid "Info..." msgstr "Informasjon..." msgid "Update list" msgstr "Oppdater liste" msgid "More skins on the web..." msgstr "Flere grafiske utseender på nettet..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Du kan sette uavhengige font og omslagstørrelse for bruk i hovedvinduet. " "Størrelse\n" "viser til en zoom på %. Hvis du zoomer inn eller ut (F.eks. ved å bruke \"+" "\"eller \"-\" tastene), Begge\n" "størrelser vil da minske eller øke tilsvarende." msgid "Font:" msgstr "Font:" msgid "Font size:" msgstr "Font Størrelse:" msgid "Use this font for dialogs, too" msgstr "Bruk denne fonten også for dialoger" msgid "Column width:" msgstr "Mappens bredde:" msgid "Cover size:" msgstr "Omslagsstørrelse:" msgid "No lyrics found." msgstr "Tekst ikke funnet" msgid "Karaoke Prompt" msgstr "Karaoke tegn" # %s will be replaced by the name of a music selection #, c-format msgid "No images found in \"%s\"." msgstr "Ingen bilder funnet i \"%s\"." msgid "Background" msgstr "Bakgrunn" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "Use %s-files" msgstr "Bruk %s-filer" msgid "Please select a directory with images" msgstr "Vennligst velg en katalog med bilder" msgid "If appropriate, switch over automatically" msgstr "Hvis mulig, koble over automatisk" msgid "Half size" msgstr "Halv størrelse" msgid "Spectrum Monitor" msgstr "Spektrum Monitor" msgid "Show spectrum" msgstr "Vis spektrum" msgid "Show oscilloscope" msgstr "Vis ocilloskop" msgid "Show starfield" msgstr "Vis stjerneregn" #, fuzzy #| msgid "Show starfield" msgid "Show other figures" msgstr "Vis stjerneregn" #, fuzzy msgid "Visualization" msgstr "Start visulasjon" #, fuzzy msgid "Video output" msgstr "Lydutgang" msgid "Search homepage" msgstr "Se etter i hjemmesiden" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Tekst %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "Se etter med %s" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informasjon %s" # Do not forget the ":" at the end of the string. msgid "Object count:" msgstr "Antall objekter:" # Do not forget the ":" at the end of the string. msgid "Elapsed time:" msgstr "Brukt tid:" msgid "Message" msgstr "Melding" msgid "Scope" msgstr "Scope" msgid "Console" msgstr "Konsoll" #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i message(s)" msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i melding(er)" msgstr[1] "%i melding(er)" msgid "Evaluate" msgstr "Evaluer" msgid "Clear" msgstr "Rens" msgid "Open console on errors and warnings" msgstr "Åpne konsoll ved feil og varsler?" msgid "Details" msgstr "Detaljer" msgid "Clear all messages?" msgstr "Rens alle meldinger?" #, c-format msgid "Overwrite \"%s\"?" msgstr "Skriv over \"%s\"?" msgid "Append" msgstr "Bruk" msgid "State" msgstr "Tillstand" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "%s-filer" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "%s-Lyd" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "%s-bilder" #, c-format msgid "%s-video" msgstr "" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "%s-Spillelister" #, fuzzy #| msgid "Archive-files" msgid "Script-files" msgstr "Arkivfiler" msgid "Silverjuke skin-files" msgstr "Silverjuke utseende-filer" #, fuzzy #| msgid "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Silverjuke utseende-filer" msgid "Archive-files" msgstr "Arkivfiler" msgid "Supported file-types" msgstr "Støttede filtyper" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Program" msgid "Cleanup index..." msgstr "Rens indeks..." msgid "max. size" msgstr "max. størrelse" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "Sist gang %s stoppet var det ikke normalt.\n" "De følgende objekter - kanskje feilaktige - var i bruk før den unormale " "stoppen:\n" "\n" "%s\n" "\n" "Hvis denne feilen fortsetter, prøv å unngå disse objektene.\n" "Vil du bruke disse objektene nå?" msgid "Use maybe errorous objects?" msgstr "Bruke kanskje feilaktige objekter?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "__DATE_TIME_LONG__" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "__DATE_TIME_EDITABLE__" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "__DATE_LONG__" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "__DATE_EDITABLE__" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "__DATE_SUNDAY_FIRST__" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "_THIS_LANG__" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "__COVER_SEARCH_URLS__" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "__ARTIST_INFO_URLS__" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "__STOP_ARTISTS__" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "__STOP_ALBUMS__" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "__COVER_KEYWORDS__" msgid "__VIRT_KEYBD__" msgstr "__VIRT_KEYBD__" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "," #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "." #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i days" msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dager" msgstr[1] "%i dager" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Ugyldig regulær ekspresjon \"%s\"." msgid "Fatal error" msgstr "Alvorlig feil" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Forstørre Vindu" msgid "Shrink window" msgstr "forminsk Vindu" msgid "Enlarge display" msgstr "Forstørre display" msgid "Shrink display" msgstr "Forminsk display" #, fuzzy #| msgid "Devices" msgid "Services" msgstr "Utganger" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Hide %s" msgstr "Gjem %s" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #| msgid "Hide %s" msgid "Hide Others" msgstr "Gjem %s" #, fuzzy #| msgid "Show file" msgid "Show All" msgstr "Vis fil" #, fuzzy, c-format #| msgid "Exit %s" msgid "Quit %s" msgstr "Avslutt %s" msgid "Extras" msgstr "" msgid "Full screen" msgstr "Full skjerm" msgid "Modules on the web..." msgstr "Moduler på nettet.." msgid "Explore" msgstr "Utforsk" msgid "Reveal in Finder" msgstr "Vis i finner" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "Denne filen \"%s\" eksisterer ikke." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "Kan ikke starte \"%s\"." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" #~ msgid "Scroll vertically" #~ msgstr "Rukk vertkalt" #~ msgid "Context sensitive" #~ msgstr "Kontekst følsom" #, fuzzy #~| msgid "Exit %s" #~ msgid "Exit" #~ msgstr "Avslutt %s" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "Koble ut %s" #~ msgid "Disable shutdown" #~ msgstr "koble ut avstenging" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Hvis du har mer enn en skjerm tilkoblet din datamaskin, \n" #~ " kan du sette opp de forskjellige Silverjuke vinduene til forskjellige " #~ "skjermer her." #~ msgid "Monitor for" #~ msgstr "Monitor for" # %s will be replaced by a control for selecting the display resolution #~ msgid "Switch resolution to %s" #~ msgstr "Forandre oppløsning til %s" #~ msgid "Calculated volumes:" #~ msgstr "Kalkulert volum:" #~ msgid "Skip silence between tracks" #~ msgstr "Fjern opphold mellom spor" #~ msgid "Other fadings" #~ msgstr "Andre fadinger" #~ msgid "Attached window" #~ msgstr "Tilkoblet Vindu" #~ msgid "Show album name" #~ msgstr "Vis albumnavn" #~ msgid "Online help" #~ msgstr "Hjelp på nettet" #~ msgid "Tools" #~ msgstr "Verktøy" #~ msgid "Workspace" #~ msgstr "Arbeidsfelt" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #~| msgid "" #~| "Beside several options, you can change the shortcuts to use in %s here. " #~| "You can\n" #~| "also define system-wide shortcuts. To modify an option, select the " #~| "option from the list\n" #~| "and click on \"Customize\". This page is for experienced users only." #~ msgid "" #~ "Beside several options, you can change the shortcuts to use here.\n" #~ "This page is for experienced users only." #~ msgstr "" #~ "Ved siden av flere valg, kan du forandre snarveiene du bruker i %s her. " #~ "Du kan\n" #~ "definere snarveier for systemet. Modifisere ett valg, velg fra listen\n" #~ "og klikk \"Tilpass\". Denne siden er bare for erfarne brukere." #~ msgid "Command or option" #~ msgstr "Kommando eller valg" #~ msgid "Setting" #~ msgstr "Innstillinger" #, fuzzy #~ msgid "Album cover" #~ msgstr "Albumutseende" #, fuzzy #~ msgid "Track cover" #~ msgstr "Antall spor" #~ msgid "Track list" #~ msgstr "Sporliste" #~ msgid "Show disk number" #~ msgstr "Vis platenummer" #~ msgid "Show original artist" #~ msgstr "Vis orginalartist" #~ msgid "Show composer" #~ msgstr "Vis kompositør" #~ msgid "Show time" #~ msgstr "Vis tid" #~ msgid "Show year" #~ msgstr "Vis år" #~ msgid "Show comment" #~ msgstr "Vis kommentar" #~ msgid "Show genre" #~ msgstr "Vis genre" #~ msgid "Show rating" #~ msgstr "Vis karakter" #, fuzzy #~| msgid "Currently, the following files are supported:" #~ msgid "Currently, the following file types are read:" #~ msgstr "Følgende filtyper er for tiden støttet" #~ msgid "minutes|minutes of inactivity|o'clock" #~ msgstr "minutes|minutes of inactivity|o'clock" # %i will be replaced by the number of characters #~ msgid "(%i characters)" #~ msgstr "(%i bokstaver)" #~ msgid "More layouts on the web..." #~ msgstr "Flere oppsett på nettet..." #, fuzzy #~| msgid "Monitor for" #~ msgid "Monitor for main window" #~ msgstr "Monitor for" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #~ msgid "Initializing %s..." #~ msgstr "Starter %s..." #~ msgid "Microphone" #~ msgstr "Mikrofon" # This is the name of the "First steps" button. Do not add "..." to the string! #~ msgid "First steps" #~ msgstr "Første skritt" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Buy %s..." #~ msgstr "Kjøp %s..." #~ msgid "Unlicenced version" #~ msgstr "Ulisensert versjon" #~ msgid "These options are available if you buy Silverjuke." #~ msgstr "Disse valg er tilgjengelig hvis du kjøper Silverjuke" # The first %s will be replaced by the program name (usually "Silverjuke"), the second and third %s will be replaced by a file type (eg. "MP3"), the fourth %s will be replaced by the URL to search for modules (eg. "http://www.silverjuke.net/en/modules.html". #~ msgid "" #~ "%s has not found an %s-decoder on your system. If you want to play %s-" #~ "files, you should install a module for this purpose.\n" #~ "\n" #~ "Open %s and search for modules now?" #~ msgstr "" #~ "%shar ikke funnet %s-dekoderi ditt system. Hvis du vil spille %s-filer, " #~ "må du installere en modul for dette.\n" #~ "\n" #~ "Last inn %s og finne moduler?" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Do you want %s to check for missing decoders in future?" #~ msgstr "Vil du att %s sjekker etter manglende moduler heretter?" # This is a context-menu option that is placed in the "Playback" submenu #~ msgid "Play tracks at once on double click" #~ msgstr "Spill spor med en gang ved dobbeltklikk" # The first %s will be replaced by the program name, the second by the name of the licence holder. #~ msgid "%s licenced to %s" #~ msgstr "%s lisensert til %s" # %s will be replaced by the name of the licence holder #~ msgid "Licenced to %s" #~ msgstr "Lisensert til %s" # %s will be replaced by the shortcut #~ msgid "Cannot register system-wide shortcut \"%s\"." #~ msgstr "Kan ikke registreresnarveier over hele systemet \"%s\"." #~ msgid "Silverjuke language-files" #~ msgstr "Silverjuke språkfiler" # This is the help topic for the "First steps" that are opened if Silverjuke is started the first time. The topic is also reachable through the "About" dialog. You can use _simple_ HTML here: <h1>, <p>, <b>, <i> and <a>. Please refer to one of the example files in the developer network. #~ msgid "__HELP__" #~ msgstr "__HELP__" #~ msgid "Apply" #~ msgstr "Bruk" #~ msgid "Check for new Silverjuke version..." #~ msgstr "Se etter ny versjon av Silverjuke" # The first %s will be replaces by the new version, the others %s will be replaced by the URL for downloading it. #~ msgid "" #~ "A new version of Silverjuke (%s) is available for download on %s.\n" #~ "\n" #~ "Do you want to open %s now?" #~ msgstr "" #~ "En ny versjon av Silverjuke (%s)er tilgjengelig for nedlasting på %s.\n" #~ "\n" #~ "Vil du gå til %s nå?" #~ msgid "Other program" #~ msgstr "Andre program" #~ msgid "Set markers" #~ msgstr "sett merker" # %i will be replaced by the number of the marker, %s will be replaced by the marker position or by a control to select the marker position #~ msgid "Show marker %i at %s." #~ msgstr "sett merker %i ved %s." #~ msgid "Minutes" #~ msgstr "Minutter" #~ msgid "Warn if marker is crossed" #~ msgstr "Varsle hvis der er satt kryss" #~ msgid "Set markers..." #~ msgstr "Sett merker" #~ msgid "Burn CD" #~ msgstr "Brenn CD" #~ msgid "Tracks to burn:" #~ msgstr "spor å brenne" #~ msgid "Recorder:" #~ msgstr "Brenner:" #~ msgid "Please select an installed and available program" #~ msgstr "Vennligst velg ett innstallert og tilgjengelig program" # %s will be replaced by the name of a program #~ msgid "Please locate \"%s\"" #~ msgstr "Vennligst finn \"%s\"" # %s will be replaced by the name of a program #~ msgid "Arguments for \"%s\"" #~ msgstr "Argumenter for \"%s\"" #~ msgid "Total time" #~ msgstr "Total Tid" #~ msgid "Cannot calculate the total time" #~ msgstr "Kan ikke beregne totaltiden" #~ msgid "" #~ "The size of the selected tracks is larger than the assumed capacity of " #~ "the disk to burn.\n" #~ "\n" #~ "Continue anyway?" #~ msgstr "" #~ "Det ser ut som størrelsen på disse filene er større enn disken du skal " #~ "brenne til.\n" #~ "\n" #~ "Fortsette alikevel?" #~ msgid "Minimize window" #~ msgstr "Minimer vindu" #~ msgid "Maximize window" #~ msgstr "Maksimer vindu" #~ msgid "Center window" #~ msgstr "Sentrer vindu" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Show %s" #~ msgstr "Vis %s" #~ msgid "System tray" #~ msgstr "Systemstatusfelt" #~ msgid "Show current track" #~ msgstr "Vis spor som spilles" #~ msgid "Menus" #~ msgstr "Menyer" #~ msgid "Show shortcuts" #~ msgstr "Vis snarveier" #~ msgid "Show icons" #~ msgstr "Vis ikoner" #~ msgid "Licence key" #~ msgstr "Lisensnøkkel" #~ msgid "Select the language for the user-interface from the following list:" #~ msgstr "Velg språk for bruksgrensesnittet fra denne listen :" #~ msgid "Unknown language" #~ msgstr "Ukjent språk" #~ msgid "More languages on the web..." #~ msgstr "Flere språk på nettet" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Note: Changing the language requires to restart %s." #~ msgstr "Husk: Forandring av språk krever omstart %s." # %s will be replaced by the program name, usually"Silverjuke" #~ msgid "This is an unlicenced copy of %s!" #~ msgstr "Dette er en prøveversjon %s!" #~ msgid "" #~ "Please enter your name or your company's name and the licence key\n" #~ "you received when purchasing or updating your %s-licence:" #~ msgstr "" #~ "Vennligst sett inn navn og lisensnøkkelen du fikk når du kjøpte din\n" #~ "%s-lisens:" #~ msgid "Your name/company:" #~ msgstr "Ditt navn:" # The first %s will be replaced by the program name, usually "Silverjuke". The second %i will be replaced by the number of evaluation days. The last %s, again, will be replaced by the program name. #~ msgid "" #~ "If you haven't bought a %s-licence, you may test this program %i days for " #~ "free.\n" #~ "After this period, you have to buy a licence for %s if you want to " #~ "continue using\n" #~ "this program." #~ msgstr "" #~ "Hvis du ikke har kjøpt en %s-lisens,kan du teste programmet i %i dager " #~ "gratis.\n" #~ "Etter denne perioden, må du kjøpe en lisens for programmet %s hvis du vil " #~ "fortsette å bruke\n" #~ " dette programmet." # The first %s will be replaced by the program name, usually "Silverjuke". The second %s will be replaced by the name of the website, eg. www.silverjuke.net #~ msgid "" #~ "Further information about purchasing %s licences\n" #~ "are available at %s." #~ msgstr "" #~ "Videre informasjon om kjøp av %s lisens\n" #~ "er tilgjengelig på %s." # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s..." #~ msgstr "Åpne %s..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Thank you for buying a %s-licence!" #~ msgstr "Takk for att du kjøpte en %s-lisens!" #~ msgid "This copy is licenced to:" #~ msgstr "Dette programmer er lisensert til:" #~ msgid "" #~ "If this is not your name or the name of your company, you are not using a " #~ "legal licence!" #~ msgstr "Hvis dette ikke er deg, har du ikke en gyldig lisens." #~ msgid "Load external modules" #~ msgstr "Last eksterne moduler" #~ msgid "\"Magnetic\" window borders" #~ msgstr "\"Magnetisk\" vindusgrense" #~ msgid "Window" #~ msgstr "Vindu" #~ msgid "Use shaped windows" #~ msgstr "Bruk tilpassede vinduer" #~ msgid "Automatic version check" #~ msgstr "Automatisk versjonssjekk" # %i will be replaced by the number of days #~ msgid "Every %i days" #~ msgstr "Hver %i dager" #~ msgid "FX" #~ msgstr "FX" #~ msgid "" #~ "Please select the input and output devices to use. If you encounter any " #~ "problems,\n" #~ "please try a different buffer size and the \"Use hardware\" option." #~ msgstr "" #~ "Velg hvilken inngang og utgangt du vill bruke. Hvis du støter på " #~ "problemer,\n" #~ "vennligst velg en annen buffert og bruk \"Bruk Maskinvare\" valget." #~ msgid "Audio-output" #~ msgstr "Lydutgang" #~ msgid "Prelisten audio-output" #~ msgstr "Lydutgang for forhåndslytting" #~ msgid "Buffer" #~ msgstr "Buffert" #~ msgid "Use hardware" #~ msgstr "Bruk maskinvare" #~ msgid "" #~ "With these options, you can add jingles (small pieces of sound) between " #~ "tracks.\n" #~ "Add the jingles as normal music-files and decide how often they should be " #~ "played." #~ msgstr "" #~ "Med disse valg kan du legge til jingler (små lydsnutter) mellom spor.\n" #~ "Legg til jinglene som normale musikkspor og bestem hvor ofte de skal " #~ "spilles." #~ msgid "Use jingles" #~ msgstr "Bruk Jingler" #~ msgid "Jingles:" #~ msgstr "Jingles:" # %s will be replaced by a control to select the number of tracks #~ msgid "Play a jingle about every %s tracks." #~ msgstr "spill en jingle ved hvert %s spor." #~ msgid "Select jingle(s)" #~ msgstr "Velg jingle(r)" #~ msgid "Use separate FX settings" #~ msgstr "Bruk separate FX innstillinger" #~ msgid "" #~ "The \"system tray\" is an area normally placed at the edge of the " #~ "screen.\n" #~ "With the following options, you can add a little symbol with frequently\n" #~ "used functions to this area." #~ msgstr "" #~ "Husk \"Systemstatusfelt\"er ett område vanlivis plassert på kanten av " #~ "skjermen.\n" #~ "Med følgende valg,kan du legge til ett symbol med ofte \n" #~ "brukte funksjoner i dette området." #~ msgid "Never use system tray" #~ msgstr "Bruk aldri Systemstatusfelt" #~ msgid "Use system tray for the minimized window" #~ msgstr "Bruk Systemstatusfelt for det forminskede vinduet" #~ msgid "Always use system tray" #~ msgstr "Bruk bestandig Systemstatusfelt" #~ msgid "Show current track tooltip for %i seconds" #~ msgstr "Vis verktøytips for nåværende spor i %i sekunder" #~ msgid "Only if inactive" #~ msgstr "Bare hvis inaktiv" #~ msgid "Use this module for the following file extensions:" #~ msgstr "Bruk denne modulen for disse filendelsene:" #~ msgid "Further options..." #~ msgstr "Videre valg" # %s will be replaced by a list of extensions, eg. "MP3, MP2, MP1" #~ msgid "" #~ "If you disable this module or change the file types, make sure,\n" #~ "you don't need \"%s\" or they are supported by another module.\n" #~ "\n" #~ "Note: Remember that not every module can play every file type." #~ msgstr "" #~ "Hvis du kobler ut eller forandrer denne filtypen,vær sikker på,\n" #~ "att du ikke trenger \"%s\" eller att de blir støttet av en annen modul.\n" #~ "\n" #~ "Husk: Ikke alle moduler kan spille alle filtyper" # %s will be replaced by the string an abbreviation should be entered for, eg. "Composer" or "Original artist" #~ msgid "Abbreviation for \"%s\"" #~ msgstr "Forkortelse for \"%s\"" #, fuzzy #~ msgid "Close %s" #~ msgstr "Steng" # %s will be replaced by the name of a website, eg. www.silverjuke.net #, fuzzy #~ msgid "Open %s" #~ msgstr "Åpne %s..." #, fuzzy #~ msgid "Selection: %s" #~ msgstr "Lagrede valg" #, fuzzy #~ msgid "Select another visualization" #~ msgstr "Start visulasjon" #~ msgid "Playback mode:" #~ msgstr "Spillemodus:" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Interpolation:" #~ msgstr "Interpolasjon:" #~ msgid "Linear" #~ msgstr "Lineær" #~ msgid "Sensitive" #~ msgstr "Følsom" #~ msgid "Query settings before start" #~ msgstr "Spør om innstillinger før start" #~ msgid "DAAP-/iTunes-client" #~ msgstr "DAAP-/iTunes-klient" #~ msgid "Add a DAAP-/iTunes-server" #~ msgstr "Legg til en DAAP-/iTunes-server" #~ msgid "" #~ "With Silverjuke's HTTP server you can access the program and your music " #~ "library from any\n" #~ "browser or other Silverjuke instances in your network." #~ msgstr "" #~ "Med Silverjuke's HTTP server kan du komme til programmet og ditt " #~ "musikkbiblotek fra alle \n" #~ "nettlesere eller andre Silverjuketing i ditt nettverk." #~ msgid "Enable HTTP server on port %s" #~ msgstr "Tillat HTTP server på port %s" #~ msgid "Share my music library over HTTP" #~ msgstr "Del mitt musikkbiblotek over HTTP" #~ msgid "Enable web interface access over HTTP" #~ msgstr "Tillat nettleser-tilgang over HTTP" #~ msgid "Playlist" #~ msgstr "Spilleliste" #~ msgid "Empty" #~ msgstr "Tom" #~ msgid "Update" #~ msgstr "Oppdater" #~ msgid "Sharing/Web interface" #~ msgstr "Del/Web grensesnitt" #~ msgid "Audio-decoder" #~ msgstr "Lyddekoder" #~ msgid "Online database" #~ msgstr "Database på nettet" # The first %i will be replaced by the current day number in the evaluation period, the second %i will be replaced by the total number of days of the evaluation period (currently 14). #~ msgid "You are on day %i of the %i-days testing period." #~ msgstr "Du er på dag %i %i-dagers testperioden" # This string is shown as a link the the "About" dialog. #~ msgid "Enter licence key now..." #~ msgstr "Skriv inn lisensinformasjon nå" #~ msgid "Setup" #~ msgstr "Innstillinger" #~ msgid "Show the following effects:" #~ msgstr "Vis følgende effekter:" #~ msgid "" #~ "To install further effects, just copy the\n" #~ "VST-plugins to one of the search paths." #~ msgstr "" #~ "For å installere flere effekter, kopier\n" #~ "VST-plugin til en av søkestiene." #~ msgid "FX settings for %s :" #~ msgstr "FX instillinger for %s :" #~ msgid "Normal playback" #~ msgstr "Normal spilling" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Enable %s" #~ msgstr "Klargjør %s" # %i will be replaced by the number of characters #~ msgid "%s parameters" #~ msgstr "%s parametere" #~ msgid "Load %s" #~ msgstr "Start %s" #~ msgid "Save %s" #~ msgstr "Lagre %s" #~ msgid "%s priority" #~ msgstr "%s prioritet" #~ msgid "Load all" #~ msgstr "Last alle" #~ msgid "Save all" #~ msgstr "Lagre alle" #~ msgid "Stop visualization/karaoke prompt" #~ msgstr "Stopp visulasjon/Karaoke" #~ msgid "Start visualization/karaoke prompt" #~ msgstr "Start visulasjon/Karaoke " #~ msgid "Drag'n'drop" #~ msgstr "Dra og slipp" #~ msgid "Start visualization after %i minutes of inactivity" #~ msgstr "Start visulasjon etter %i minutter uten aktivitet." #~ msgid "Karaoke, Vis. etc" #~ msgstr "Karaoke, Vis. etc" #~ msgid "Verify password" #~ msgstr "Bekreft passord" #~ msgid "Password not set." #~ msgstr "Passord ikke valgt" #~ msgid "Visualization/Karaoke Prompt" #~ msgstr "Visulasjon/Karaoke Tegn" #~ msgid "Please close the \"%s\" configuration window before continuing." #~ msgstr "Vennligst steng \"%s\"konfigurasjonsvindu før du fortsetter." ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/nl.po��������������������������������������������������������������������������0000664�0000000�0000000�00000265237�12660066715�0015405�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: Silverjuke\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: 2010-10-04 14:49+0100\n" "Last-Translator: Bjoern Petersen <drsilver@silverjuke.net>\n" "Language-Team: Dutch\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" msgid "Sleep mode activated." msgstr "Slaapmodus geactiveerd." msgid "Sleep mode deactivated." msgstr "Slaapmodus niet actief." msgid "Play time exceeded" msgstr "" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "Default" msgstr "Standaard" #, fuzzy #| msgid "Devices" msgid "Device" msgstr "Apparaten" msgid "Show covers" msgstr "Covers weergeven" msgid "Duration" msgstr "Tijdsduur" msgid "Artist" msgstr "Artiest" msgid "Original artist" msgstr "Originele artiest" msgid "Composer" msgstr "Componist" msgid "Album" msgstr "Album" msgid "Track number" msgstr "Track nummer" msgid "Automatic track number" msgstr "Automatisch Tracknummer" msgid "Disk number" msgstr "Disknummer" msgid "Genre" msgstr "Genre" msgid "Year" msgstr "Jaar" #, fuzzy #| msgid "My rating" msgid "Rating" msgstr "Mijn Waardering" msgid "Comment" msgstr "Commentaar" msgid "Show double tracks" msgstr "Dubbele tracks weergeven" msgid "Show different artist names" msgstr "Verschillende artiestnamen weergeven" msgid "Show different album names" msgstr "Verschillende albumnamen weergeven" #, fuzzy #| msgid "Show covers" msgid "Show cover titles" msgstr "Covers weergeven" # %s will be reaplaced by a decimal-point-formatted number #, c-format msgid "%s tracks" msgstr "%s Tracks" msgid "Drag folders with music here." msgstr "Mappen met muziek hierin slepen." msgid "Reset to default values" msgstr "Standaardinstellingen terugzetten" msgid "Nr." msgstr "Nr." #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "bit/s" msgid "Samplerate" msgstr "Samplerate" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "Hz" msgid "AutoPlay" msgstr "Automatisch afspelen" msgid "Shuffle" msgstr "Willekeurig afspelen" msgid "Recreating music library" msgstr "Opnieuw het muziekarchief samenstellen" msgid "Updating music library" msgstr "Muziekarchief bijwerken" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" "Wanneer het bijwerken wordt geannuleerd, is het muziekarchief mogelijk niet " "aktueel.\n" "\n" "Bijwerken annuleren?" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "%s wordt afgespeeld. Wilt u het afspelen stoppen en %s beeindigen?" #, c-format msgid "Exit %s" msgstr "%s beeindigen" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "Kan \"%s\" niet openen." #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "" #, c-format msgid "Execute the script \"%s\"?" msgstr "" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "Zoeken" msgid "On" msgstr "Aan" msgid "Off" msgstr "Uit" msgid "Repeat playlist" msgstr "Afspeellijst herhalen" msgid "Repeat one" msgstr "Een track herhalen" msgid "Repeat all" msgstr "Alles herhalen" msgid "Select a track, then start playback." msgstr "Selecteer een track en start het afspelen." msgid "Stop after this track" msgstr "Stop na deze track" msgid "Stop after each track" msgstr "" #, fuzzy #| msgid "Double click on covers" msgid "Double click play tracks at once" msgstr "Dubbelklik op covers" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback on first enqueue" msgstr "Start afspelen wanneer tracks in afspeellijst worden geplaats" # %s will be replaced by the name of a music selection msgid "Remove played tracks from queue" msgstr "" msgid "More from current album" msgstr "Meer van huidige album" msgid "More from current artist" msgstr "Meer van huidige artiest" msgid "No more tracks." msgstr "Geen tracks meer" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Remove all %i tracks from the queue and stop playback?" msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "" "Wilt u alle %i Tracks uit de afspeellijst verwijderen en het afspelen " "stoppen?" msgstr[1] "" "Wilt u alle %i Tracks uit de afspeellijst verwijderen en het afspelen " "stoppen?" msgid "Clear playlist" msgstr "Afspeellijst wissen" msgid "Track played, click to reset" msgstr "" msgid "Boredom avoided: Track moved down" msgstr "" msgid "Remove this track" msgstr "Track verwijderen" msgid "Toggle time mode" msgstr "Verstreken / Resterend tijd weergeven" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Go to \"%s\"" msgstr "Ga naar \"%s\"" msgid "End search" msgstr "Zoeken stoppen" msgid "click right for options" msgstr "Klik rechtermuisknop voor opties" msgid "Volume" msgstr "Volume" msgid "Double-click to enlarge the cover" msgstr "Dubbelklikken om cover te vergroten" #, c-format msgid "Close this window and exit %s" msgstr "Venster sluiten en %s stoppen" msgid "Open main menu" msgstr "Hoofdmenu openen" msgid "Toggle shuffle mode" msgstr "Willekeurig afspelen" msgid "Repeat all/repeat current" msgstr "Herhaal alles / huidige track" # %s will be replaced by the name of a music selection #, c-format msgid "Search in \"%s\"" msgstr "Zoeken in \"%s\"" msgid "Help" msgstr "Help" #, fuzzy #| msgid "Read files and folders" msgid "Add folders and files" msgstr "Bestanden en mappen lezen" #, fuzzy #| msgid "File extension" msgid "Extensions" msgstr "Bestandstype" msgid "Show remaining time" msgstr "Resterende tijd weergeven" msgid "Show elapsed time" msgstr "Verstreken tijd weergeven" msgid "Show total time" msgstr "Totale tijd tonen" msgid "Show track number" msgstr "Tracknummer weergeven" msgid "Show artist name" msgstr "Artiestnaam weergeven" msgid "Show AutoPlay" msgstr "Toon automatisch afspelen" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "Display" #, fuzzy #| msgid "Volume" msgid "Columns" msgstr "Volume" msgid "Same zoom in all views" msgstr "Zelfde beeldgrootte in alle schermen" msgid "Fonts and covers" msgstr "Lettertypes en Covers" msgid "Zoom" msgstr "Zoom" msgid "Skins" msgstr "Skins" #, fuzzy #| msgid "Start kiosk mode" msgid "Start kiosk mode..." msgstr "Kiosk mode starten" # %s will be replaced by the name of an artist #, fuzzy, c-format #| msgid "\"%s\" on the web" msgid "%s on the web" msgstr "\"%s\" op het Internet" msgid "All files" msgstr "Alle bestanden" # %s will be replaced by the program name, usually "Silverjuke", the string is used for the menu to open the about dialog. Note that "..." is added by Silverjuke, if needed. #, c-format msgid "About %s" msgstr "Over %s" msgid "File" msgstr "Bestand" # Menu Title (eg. if "Settings/Basic settings/Further options/Window: Use shaped windows" is disabled or on Mac OS X msgid "Edit" msgstr "Bewerken" # "View" menu title with - optionally - different translations for Microsoft Windows and Mac OS X msgid "View" msgstr "Beeld" msgid "Playback" msgstr "Afspelen" #, fuzzy #| msgid "Fit to screen" msgid "Video screen" msgstr "Aanpassen aan Beeldschermgrootte" msgid "Kiosk mode" msgstr "Kiosk mode" msgid "None" msgstr "" msgid "Further options" msgstr "Verdere Opties" msgid "Queue" msgstr "" msgid "Automatic control" msgstr "Automatisch uitvoeren" msgid "Current view" msgstr "Huidige weergave" #, c-format msgid "Next track from \"%s\"" msgstr "Volgende Track uit \"%s\"" msgid "Next track" msgstr "Volgende Track" msgid "Search for genre" msgstr "Zoeken op genre" msgid "Search for music selection" msgstr "Zoeken op muziekselectie" msgid "Edit tracks/Get info" msgstr "Track bewerken/Info" msgid "Show file" msgstr "Bestand weergeven" msgid "Cover editor" msgstr "Cover-Editor" msgid "Mix" msgstr "" #, fuzzy #| msgid "Channels" msgid "Left channel" msgstr "Kanalen" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "Voorluisteren" msgid "No" msgstr "Nee" msgid "Yes" msgstr "Ja" #, fuzzy #| msgid "Only initalize system volume" msgid "Only initialize system volume" msgstr "Alleen het systeem volume instellen" msgid "Output" msgstr "" msgid "Use system volume" msgstr "Gebruik systeem volume" msgid "Several artists" msgstr "Verschiedene Artiesten" msgid "Unknown title" msgstr "Onbekende Titel" msgid "Save playlist" msgstr "Afspeellijst opslaan" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "Kan \"%s\" niet opslaan." msgid "Open playlist" msgstr "Open afspeellijst" msgid "Title" msgstr "Titel" msgid "Track count" msgstr "Track aantal" msgid "Disk count" msgstr "Disk aantal" msgid "Group" msgstr "Groep" # This is the abbreviation for "beats per minute" (the number of "quarter notes" per minute which defines the tempo of a track). The string is used in the dailog "Edit tracks/Get info...". If in doubt, just enter "BPM" here. msgid "BPM" msgstr "BPM" msgid "Channels" msgstr "Kanalen" msgid "Bitrate" msgstr "Bitrate" msgid "File name" msgstr "Bestandsnaam" msgid "File size" msgstr "Bestandsgrootte" msgid "Date added" msgstr "Toegevoegd" msgid "Date modified" msgstr "Veranderd" msgid "Last played" msgstr "Laatst afgespeeld" msgid "Play count" msgstr "Aantal keren afgespeeld" msgid "SQL expression" msgstr "SQL expression" msgid "Limit result to" msgstr "Beperken tot" msgid "Title/artist/album" msgstr "Titel/Artiest/Album" msgid "File type" msgstr "Bestandstype" msgid "Queue position" msgstr "Positie in de lijst" msgid "Include tracks" msgstr "Tracks toevoegen" msgid "Exclude tracks" msgstr "Tracks uitsluiten" msgid "Random" msgstr "Willekeurig" # %s will be replaced by a shortcut, eg. "Ins" or "Del" #, c-format msgid "Press \"%s\" in the main window" msgstr "Klikken op \"%s\" in het hoofdvenster" msgid "Insert" msgstr "Invoegen" msgid "Del" msgstr "Wissen" # Use the same date/time format as specified in __DATE_TIME_EDITABLE__ and __DATE_EDITABLE__ - however, you may use a more readable way here. msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" "Datum invoeren als \"dd.mm.jjjj\" ; je kunt \"hh:mm\" toevoegen voor de tijd." msgid "Please enter the text." msgstr "Voer de tekst in" msgid "Please enter a value." msgstr "Voer de waarde in" msgid "Please enter a valid value." msgstr "Voer een geldige waarde in." msgid "(second field)" msgstr "(Tweede Veld)" msgid "No valid criteria defined." msgstr "Geen geldige criteria gedefinieerd." msgid "The search cannot be started; please check the following fields:" msgstr "Het zoeken kan niet starten; Controleer de volgende velden:" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" "Let Op: \"gelijk\" und \"ongelijk\" maakt onderscheid tussen Hoofd en kleine " "letters." # %s will be replaced by the name of a music selection #, fuzzy, c-format #| msgid "Do you really want to delete the music selection \"%s\"?" msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "Muziekselectie \"%s\" wissen?" msgid "Esc" msgstr "Esc" msgid "Tab" msgstr "Tab" msgid "Cancel" msgstr "Annuleren" msgid "Page left" msgstr "Pagina links" msgid "Page right" msgstr "Pagina rechts" msgid "Page up" msgstr "Pagina omhoog" msgid "Page down" msgstr "Pagina omlaag" msgid "Menu" msgstr "Menu" msgid "Cursor left" msgstr "Cursor links" msgid "Cursor right" msgstr "Cursor rechts" msgid "Cursor up" msgstr "Cursor omhoog" msgid "Cursor down" msgstr "Cursur omlaag" msgid "Line left" msgstr "Regel links" msgid "Line right" msgstr "Regel rechts" msgid "Line up" msgstr "Regel omhoog" msgid "Line down" msgstr "Regel omlaag" msgid "Home" msgstr "Home" msgid "End" msgstr "Einde" msgid "Enter" msgstr "Enter" msgid "Delete" msgstr "Wissen" msgid "Album view" msgstr "Album scherm" msgid "Cover view" msgstr "Cover scherm" msgid "List view" msgstr "Lijst scherm" msgid "Toggle view" msgstr "scherm wisselen" #, fuzzy #| msgid "Open playlist" msgid "Open playlist..." msgstr "Open afspeellijst" msgid "Unqueue marked tracks" msgstr "Gemarkeerde tracks uit afspeellijst verwijderen" msgid "Unqueue all but marked tracks" msgstr "Alle tracks, behalve de gemarkeerde, uit afspeellijst verwijderen" #, fuzzy #| msgid "Save playlist" msgid "Save playlist..." msgstr "Afspeellijst opslaan" msgid "Paste" msgstr "Plakken" #, fuzzy #| msgid "Music selection" msgid "Music selection..." msgstr "Muziekselectie" msgid "Settings" msgstr "Instellingen" msgid "Update music library" msgstr "Muziekarchief bijwerken" msgid "Recreate music library" msgstr "Opnieuw het muziekarchief samenstellen" msgid "Enqueue tracks" msgstr "Track in afspeellijst plaatsen" msgid "Play tracks next" msgstr "Tracks als eerstvolgeden afspelen" msgid "Play tracks now" msgstr "Tracks nu afspelen" msgid "Volume up" msgstr "Harder" msgid "Volume down" msgstr "Zachter" msgid "Unqueue tracks" msgstr "Track uit afspeellijst verwijderen" #, fuzzy #| msgid "Edit tracks/Get info" msgid "Edit tracks/Get info..." msgstr "Track bewerken/Info" msgid "Play" msgstr "Afspelen" msgid "Pause" msgstr "Pauze" msgid "Stop" msgstr "Stop" msgid "Previous track" msgstr "Vorige track" msgid "Seek backward" msgstr "achteruit zoeken" msgid "Seek forward" msgstr "Vooruit zoeken" msgid "Fade to next" msgstr "Met mixeffect naar de volgende" msgid "Mute" msgstr "Mute" msgid "Reload skin" msgstr "Skin opnieuw laden" #, fuzzy #| msgid "Fit to screen" msgid "Toggle video screen" msgstr "Aanpassen aan Beeldschermgrootte" msgid "Smooth" msgstr "zacht" msgid "Select all" msgstr "Alles selecteren" msgid "Zoom in" msgstr "Zoom in" msgid "Zoom out" msgstr "Zoom uit" msgid "Normal zoom" msgstr "Normale zoom" msgid "Always on top" msgstr "Altijd op de voorgrond" msgid "Go to current track" msgstr "Ga naar huidige track" msgid "Go to marked track" msgstr "Ga naar gemarkeerde track" msgid "Go to random album" msgstr "Ga naar willekeurig album" msgid "Go to previous letter" msgstr "Ga naar de vorige brief" msgid "Go to next letter" msgstr "Ga naar de volgende brief" msgid "Add credit" msgstr "Tegoed toevoegen" #, fuzzy #| msgid "Console" msgid "Console..." msgstr "Console" #, fuzzy #| msgid "Replace" msgid "Replace..." msgstr "Vervangen" #, fuzzy #| msgid "Split field" msgid "Split field..." msgstr "Veld splitsen" #, fuzzy #| msgid "Rename files" msgid "Rename files..." msgstr "Bestanden hernoemen" #, fuzzy #| msgid "Query online database" msgid "Query online database..." msgstr "Online-Database doorzoeken" #, fuzzy #| msgid "New music selection" msgid "New music selection..." msgstr "Nieuwe muziekselectie" msgid "Save" msgstr "Opslaan" #, fuzzy #| msgid "Save as" msgid "Save as..." msgstr "Opslaan als" #, fuzzy #| msgid "Rename" msgid "Rename..." msgstr "Hernoemen" msgid "Revert to saved" msgstr "Veranderingen ongedaan maken" #, fuzzy #| msgid "Open file" msgid "Open file..." msgstr "Bestand openen" #, fuzzy #| msgid "Save cover" msgid "Save cover..." msgstr "Cover opslaan" msgid "Rotate left" msgstr "Linksom roteren" msgid "Rotate right" msgstr "Rechtsom roteren" msgid "Flip horizontally" msgstr "Horizontaal spiegelen" msgid "Flip vertically" msgstr "Vertikaal spiegelen" msgid "Grayscale" msgstr "Grijswaarden" msgid "Negative" msgstr "Negatief" msgid "Fit to screen" msgstr "Aanpassen aan Beeldschermgrootte" msgid "Decrease brightness" msgstr "Helderheid verlagen" msgid "Increase brightness" msgstr "Helderheid verhogen" msgid "Decrease contrast" msgstr "Contrast verlagen" msgid "Increase contrast" msgstr "Contrast verhogen" msgid "Normal brightness/contrast" msgstr "Normale Helderheid/Contrast" msgid "Crop" msgstr "Uitsnede" msgid "Please press the shortcut to add." msgstr "Op de Sneltoetsen klikken om toe te voegen." msgid "System-wide:" msgstr "Systeembreed:" # %s will be replaced by a shortcut, eg. "CTRL-S" #, c-format msgid "Remove shortcut \"%s\"" msgstr "Sneltoetsen \"%s\" verwijderen" msgid "Add system-wide shortcut..." msgstr "Systeenbrede sneltoetsen toevoegen..." # %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "Sneltoetsen \"%s\" toevoegen..." # The first %s will be replaced by a shortcut, eg. "CTRL-S". The second %s will be replaced by the name of the command, eg. "Edit tracks" or "Enqueue track" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" "De sneltoetsen \"%s\" zijn momenteel toegewezen aan de opdracht \"%s\" .\n" "\n" "Toewijzen aan de sneltoetsen \"%s\"?" #, fuzzy msgid "Mouse" msgstr "Mute" msgid "Drag window content" msgstr "Vensterinhoud verslepen" msgid "Left mouse button" msgstr "Linker muistknop" msgid "Drag selected tracks" msgstr "Geselecteerde tracks verslepen" msgid "Second click with the left mouse button" msgstr "Tweede klik met de linkermuisknop" msgid "Show icons beside mouse cursor" msgstr "Symbolen naast de muispijl weergeven" msgid "Middle mouse button" msgstr "Middelste muisknop" msgid "Edit tracks" msgstr "Tracks bewerken" msgid "Tooltips" msgstr "Tooltips" msgid "Mouse wheel" msgstr "Muiswiel" #, fuzzy #| msgid "Scroll horizontally" msgid "Scroll horizontally in album view" msgstr "Horizontaal scrollen" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "Multimedia-toetsenbord gebruiken" msgid "Ask on close if playing" msgstr "Bij afsluiten bevestigen, wanneer afgespeeld wordt" msgid "Ask before enqueuing multiple tracks" msgstr "Navragen wanneer meerdere tracks worden toegevoegd aan de afspeellijst" msgid "Ask before clearing the playlist" msgstr "Navragen voordat de afspeellijst wordt geschoond" #, fuzzy #| msgid "Ask before changing my rating" msgid "Ask before changing the rating" msgstr "Navragen voordat waardering wordt gewijzigd" # This string should be set to the abbreviation used for "num" on the numpad area of the keyboard. %s is replaced by a digit or a character. #, c-format msgid "Num%s" msgstr "Num%s" msgid "Backspace" msgstr "Backspace" msgid "Space" msgstr "Spatie" msgid "Up" msgstr "Omhoog" msgid "Left" msgstr "Links" msgid "Right" msgstr "Rechts" msgid "Down" msgstr "Omlaag" msgid "Print" msgstr "Afdrukken" msgid "Ins" msgstr "Inv" msgid "Music selection" msgstr "Muziekselectie" msgid "Numpad" msgstr "Nummeriek toetsenbord" msgid "Select date and time" msgstr "Datum en tijd selecteren" msgid "Time" msgstr "Tijd" msgid "contains" msgstr "bevat" msgid "does not contain" msgstr "bevat niet" msgid "starts with" msgstr "begint met" msgid "does not start with" msgstr "begint niet met" msgid "starts simelar to" msgstr "begint zoals" msgid "ends with" msgstr "eindigt met" msgid "does not end with" msgstr "eindigt niet met" msgid "on" msgstr "op" msgid "is equal to" msgstr "is gelijk aan" msgid "not on" msgstr "niet op" msgid "is unequal to" msgstr "is ongelijk aan" msgid "is simelar to" msgstr "is zoals" msgid "is after" msgstr "is na" msgid "is greater than" msgstr "is groter dan" msgid "is on or after" msgstr "is op of na" msgid "is greater or equal" msgstr "is groter of gelijk" msgid "is before" msgstr "is voor" msgid "is less than" msgstr "is kleiner dan" msgid "is on or before" msgstr "is op of voor" msgid "is less or equal" msgstr "is minder of gelijk" msgid "is in the last" msgstr "is in het laatste" msgid "is not in the last" msgstr "is niet in de laatste" msgid "is in the period" msgstr "is in de periode" msgid "is in range" msgstr "is in het bereik" msgid "is not in the period" msgstr "is niet in de periode" msgid "is not in range" msgstr "is niet in het bereik" msgid "is set" msgstr "is gezet" msgid "is unset" msgstr "ist niet gezet" msgid "tracks" msgstr "tracks" msgid "albums" msgstr "albums" msgid "minutes" msgstr "Minuten" msgid "hours" msgstr "uren" msgid "seconds" msgstr "Seconden" msgid "days" msgstr "dagen" msgid "No rating" msgstr "Geen waardering" msgid "random" msgstr "willekeurig" msgid "highest rating" msgstr "hoogste waardering" msgid "lowest rating" msgstr "laagste waardering" msgid "most often played" msgstr "meeste keren gespeeld" msgid "least often played" msgstr "minste keren gespeeld" msgid "most recently played" msgstr "meest recent gespeeld" msgid "least recently played" msgstr "minst recente gespeeld" msgid "most recently added" msgstr "kortst geleden toegevoegd" msgid "least recently added" msgstr "langst geleden toegevoegd" msgid "most recently modified" msgstr "kortst geleden gewijzigd" msgid "least recently modified" msgstr "langst geleden gewijzigd" msgid "most recently released" msgstr "kortst geleden uitgegeven" msgid "least recently released" msgstr "kortst geleden uitgegeven" msgid "low queue position" msgstr "lage afspeellijst-positie" msgid "high queue position" msgstr "hoge afspeellijst-positie" msgid "Today" msgstr "Vandaag" msgid "Yesterday" msgstr "Gisteren" msgid "Select..." msgstr "Selecterenl..." msgid "Show tracks..." msgstr "Tracks weergeven..." #, fuzzy msgid "Add tracks from playlist" msgstr "Naar huidige afspeellijst" msgid "Current position" msgstr "Huidige positie" # This is "by" used eg. in the sentence "Limit tesult to 2 tracks by "Recently played" msgid "by" msgstr "door" # This "to" is used for range definitions, eg, "12 to 16 tracks" msgid "to" msgstr "tot" msgid "Remove criterion" msgstr "Criterium verwijderen" msgid "Add criterion" msgstr "Criterium toevoegen" # %s will be replaced by the name of a music selection #, c-format msgid "Tracks included to \"%s\"" msgstr "Tracks in \"%s\" " # %s will be replaced by the name of a music selection #, c-format msgid "Tracks excluded from \"%s\"" msgstr "Tracks niet in \"%s\" " msgid "Saved selections" msgstr "Opgeslagen selectie" # The first %s will be replaced with one of "tracks|albums". The second %s will be replaced by one of "all|any|none". #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "Zoeken naar %s met %s van de volgende kriteria:" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the two values by the pipe character, "|". msgid "tracks|albums" msgstr "Tracks|Albums" # This value will become a popup in the sentence: "Search for %s matching %s of the following criteria:". Please separate the three values by the pipe character, "|". msgid "all|any|none" msgstr "allen|sommigen|geen" msgid "Close" msgstr "Sluiten" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "Aanpassingen in muziekselectie \"%s\" opslaan?" msgid "Music selection modified" msgstr "Muziekselectie aangepast" # %s will be replaced by the name of a music selection #, c-format msgid "Edit music selection \"%s\"" msgstr "Muziekselectie \"%s\" bewerken" # %s will be replaced by the name of a music selection #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "Muziekselectie \"%s\" wissen?" msgid "Delete music selection" msgstr "Muziekselectiewissen" # %i will be replaced by the number of music selections #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "Alle %i geselecteerde muziekselecties wissen?" msgid "Delete music selections" msgstr "Muziekselecties wissen?" # %s will be replaced by the name of a music selection #, c-format msgid "No matches found for \"%s\"." msgstr "Geen zoekresultaten gevonden voor \"%s\" ." # %s will be replaced by the name of a music selection #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "Geselecteerde tracks verwijderen uit de muziekselectiel \"%s\"?" # %s will be replaced by the name of a music selection #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "Geselecteerde tracks toevoegen aan de muziekselectiel \"%s\"?" # This is the name of a predefined music selection msgid "70's music" msgstr "70's muziek" # This is the name of a predefined music selection #, fuzzy msgid "Worst rated" msgstr "Hoogste waardering" # This is the name of a predefined music selection msgid "Top rated" msgstr "Hoogste waardering" # This is the name of a predefined music selection msgid "Top 20" msgstr "Top 20" # This is the name of a predefined music selection msgid "Recently played" msgstr "Recent afgespeeld" # This is the name of a predefined music selection msgid "Played today" msgstr "Vandaag afgespeeld" # This is the name of a predefined music selection msgid "Random selection" msgstr "Willekeurige selectie" # This is the name of a predefined music selection msgid "Tracks in queue" msgstr "Tracks in afspeellijst" msgid "Untitled Music selection" msgstr "Unbekende muziekselectie" # %s will be replaced by the name of a music selection #, c-format msgid "No matches in \"%s\"" msgstr "Geen zoekresultaten in \"%s\"" # %s will be replaced by the name of a music selection #, c-format msgid "1 match in \"%s\"" msgstr "1 Treffer in \"%s\"" # The first %s will be replaced by the decima-point-formatted number of matched, the seconds %s will be replaced by the name of a music selection #, c-format msgid "%s matches in \"%s\"" msgstr "%s Treffers in \"%s\"" msgid "No matches" msgstr "Geen zoekresultaten" msgid "1 match" msgstr "1 treffer" # %s will be replaced by a decimal-point-formatted number #, c-format msgid "%s matches" msgstr "%s treffers" # %s will be replaced by the name of a music selection #, fuzzy msgid "Search single words" msgstr "Zoeken in \"%s\"" msgid "Lookup genre on simple search" msgstr "Genre zoeken door eenvoudig zoeken" msgid "Search while typing" msgstr "Zoeken tijdens intypen" msgid "Save modified music selections" msgstr "Aangepaste muziekselecties opslaan" # One option for the setting "Save modified music selections" msgid "Ask" msgstr "vragen" msgid "Max. history size" msgstr "Maximale grootte in het verleden" # The first %s will be replaced by the search text as entered in the simple search field, the second %s will be replaced by the name of a music selection. #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "Zoek naar \"%s\" in \"%s\"" # %s will be replaced by the search text as entered in the simple search field #, c-format msgid "Search for \"%s\"" msgstr "Zoek naar \"%s\"" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" "Linker muisknop indrukken en vasthouden. Vervolgens muis bewegen en gewenste " "uitsnede bepalen." msgid "<Abstract>" msgstr "<Abstract>" # This string is added to some options in menus, do not forget to surround the value with brackets. msgid "(Default)" msgstr "(Standaard)" msgid "Paste image from clipboard" msgstr "Afbeelding plakken vanuit het klembord" msgid "Browse" msgstr "Bladeren" msgid "Select cover" msgstr "Selecteer een cover" msgid "Search covers on the web" msgstr "Cover zoeken op internet" msgid "Don't rotate" msgstr "Niet roteren" msgid "Rotate/flip" msgstr "Roteren/Spiegelen" msgid "Use default images..." msgstr "Standaardafbeeldingen gebruiken..." msgid "Effects/options" msgstr "Effecten/Opties" msgid "Select image" msgstr "Afbeelding selecteren" msgid "Save cover" msgstr "Cover opslaan" msgid "Reset all selected alternative images to their default value?" msgstr "Alle alternatieve afbeeldingen resetten naar de standaard instelling?" msgid "Search paths" msgstr "Zoekpad" msgid "The search paths are used for skins, language files and modules." msgstr "De zoekpaden worden voor skins, talen, en modules gebruikt:" msgid "Add..." msgstr "Toevoegen..." msgid "Remove" msgstr "Verwijderen" msgid "Please select the folder to add to the search paths." msgstr "Selecteer de map die toegevoegd moet worden aan de zoekpaden." msgid "Edit..." msgstr "Wijzigen..." #, fuzzy #| msgid "Comment" msgid "Command" msgstr "Commentaar" msgid "Shortcut" msgstr "Sneltoetsen" #, fuzzy #| msgid "Options" msgid "Option" msgstr "Opties" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "De volgende instellingen zijn alleen voor ervaren gebruikers." msgid "Customize" msgstr "Wijzigen" msgid "Reset selection" msgstr "selectie resetten" # %i will be replaced by the number of the selected command or options #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" "Wilt u alle %i geselecteerde commando's of opties resetten naar de algemene " "waarden?" #, fuzzy #| msgid "Shortcut" msgid "Shortcuts" msgstr "Sneltoetsen" msgid "Language" msgstr "Taal" msgid "Show files with" msgstr "Toon bestanden met" msgid "Instance" msgstr "Instance" # %s will be replaced by the name of the option. #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "Gebruik de commando-regel optie --%s=<bestand> om dit te wijzigen." msgid "Index file" msgstr "Index-bestand" msgid "RAM cache" msgstr "RAM-Cache" # %s will be replaced by a formatted time #, c-format msgid "avg. query time: %s" msgstr "gemiddelde zoektijd: %s" # Abbreviation of "Milliseconds" msgid "ms" msgstr "ms" msgid "Synchronity" msgstr "Synchroniteit" msgid "Fast" msgstr "Snel" msgid "Save but slower" msgstr "Veilig maar langzamer" msgid "Very save and slow" msgstr "erg veilig en langzaam" msgid "Image cache" msgstr "Afbeeldings-cache" msgid "Use temporary directory" msgstr "Gebruik tijdelijke directory" msgid "Yes, load images asynchrony" msgstr "Ja, afbeeldingen asynchroon laden" msgid "Yes, load images directly and avoid flickering" msgstr "Ja, afbeeldingen direct laden en flikkering vermijden" # The first %i will be replaced by the used percentage, the seconds %i will be replaced by the number of images. Note the two percent signs "%%" which will be converted to a single one. #, c-format msgid "%i%% used for %i images" msgstr "%i%% voor %i afbeeldingen gebruikt" #, fuzzy msgid "Regard file changes" msgstr "Bestanden en mappen lezen" msgid "Advanced" msgstr "Gevorderden" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "U moet %s opnieuw starten om de veranderingen door te voeren." msgid "Info" msgstr "Info" msgid "Help-system" msgstr "Helpsysteem" # String for "Don't know" or "unset" msgid "n/a" msgstr "n/a" msgid "Internal" msgstr "Intern" msgid "No credit." msgstr "Geen Credits." #, c-format msgid "Credit: %i" msgstr "Credits: %i" msgid "Start" msgstr "Start" #, fuzzy #| msgid "Functionality" msgid "Functions" msgstr "Functionaliteit" msgid "Monitors" msgstr "Monitors" msgid "Virtual keyboard" msgstr "Virtueel toetsenbord" msgid "Credit system" msgstr "Credietsystem" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" "Silverjuke heeft een zo genaamde \"Kiosk mode\", die mogelijk maakt dat het " "programma\n" "in volledig scherm wordt weergegeven met vooraf ingestelde functionaliteit." msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" "Let op: Voordat u de Kiosk mode start door op \"Start\" te klikken, moet " "zeker weten hoe\n" " u de kiosk-mode weer moet verlaten:" # %s will be replaced by a shortcut, eg. "F11" #, c-format msgid "Exit by hitting %s" msgstr "Verlaten door %s" msgid "Exit by clicking into two different corners" msgstr "Verlaten door in twee verschillende hoeken te klikken" msgid "Try to set exclusive" msgstr "" #, fuzzy msgid "Ask for a password on exit" msgstr "Bij beeindigen om password vragen:" #, fuzzy msgid "Change password..." msgstr "Password verifiëren" # Eg. the title of the popup for "shutdown", "reboot" etc. msgid "Exit action:" msgstr "Actie beeindigen" msgid "Start the kiosk mode with the following functionality:" msgstr "Kiosk mode starten met de volgende functionaliteit:" msgid "Play/pause" msgstr "Afspelen/pauzeren" msgid "Edit queue" msgstr "Afspeellijst wijzigen" msgid "Toggle elements" msgstr "" msgid "Enqueue multiple tracks" msgstr "Meerdere tracks in de afspeellijst plaatsen" msgid "All functions" msgstr "Alle functies" # %s will be replaced by the name of a music selection #, c-format msgid "Limit tracks to the music selection %s" msgstr "Alleen tracks toestaan uit muziekselectie %s" msgid "Please enter the password again for verification." msgstr "Toets nogmaals het password in voor controle." msgid "Overview:" msgstr "Overzicht" msgid "Main window" msgstr "Hoofdscherm" msgid "Monitor" msgstr "Monitor" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB msgid "Disable screensaver" msgstr "Screensaver uitschakelen" msgid "Disable power management" msgstr "Energiebeheer uitschakelen" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" "Wanneer geen fysiek toetsenbord aanwezig is, kan een virtueel toetsenbord " "worden gebruikt\n" "Het virtueel toetsenbord wordt weergegeven zodra een tekstveld wordt " "aangeklikt." msgid "Use the virtual keyboard" msgstr "Het virtueel toetsenbord gebruiken" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "Het virtueel toetsenbord ook in Kiosk mode gebruiken" msgid "Test:" msgstr "Test:" msgid "(please click into the text control)" msgstr "(in het tekstveld klikken)" msgid "Virtual keyboard layout:" msgstr "Indeling van het virtueel toetsenbord:" msgid "Colour:" msgstr "Kleur:" msgid "Black" msgstr "Zwart" msgid "White" msgstr "Wit" msgid "Transparency:" msgstr "Transparantie:" msgid "Hide cursor" msgstr "Cursor verbergen" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" "Met het nummerieke deel van het toetsenbord en een paar andere speciale " "toetsen, kan Silverjuke\n" "volledig worden bediend. In dit geval kunnen er nieuwe tracks aan de " "afspeellijst worden toegevoegd\n" "door unieke nummers in te toetsen, die weergegeven worden naast album en " "tracks." msgid "Use Numpad controls" msgstr "Gebruik het nummerieke deel van het toetsenbord" msgid "Also use Numpad controls outside the kiosk mode" msgstr "Nummerieke deel ook buiten Kiosk mode gebruiken" msgid "Keys:" msgstr "Toetsen:" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" "Met het Credit systeem kan het programma zo worden ingesteld dat " "bijvoorbeeld\n" "voor het kiezen van een tracks een munt in een muntautomaat moet worden " "geworpen.\n" "Bekijk de informatie in de online-help voor de mogelijkheden en ondersteunde " "hardware." msgid "Use credit system" msgstr "Credit systeem gebruiken" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "Credits kunnen worden toegevoegd door DDE, commandline of sneltoetsen" msgid "Keys..." msgstr "Toetsen..." msgid "Remember credits between program starts" msgstr "Credits bewaren bij opnieuw opstarten van het programma" msgid "Current credit:" msgstr "Huidige Credits:" msgid "Please enter your password to exit the kiosk mode." msgstr "Voer uw password in om de kiosk mode te verlaten." msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" "Teveel tracks in de afspeellijst,\n" "probeert u het later nog eens." msgid "" "This track is already in queue,\n" "please try again later." msgstr "" "Deze track komt al voor in de afspeellijst,\n" "probeer het later nog eens." #, fuzzy msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" "Deze track komt al voor in de afspeellijst,\n" "probeer het later nog eens." msgid "Maintenance password" msgstr "" msgid "Exit kiosk mode" msgstr "Kiosk mode stoppen" msgid "Start kiosk mode" msgstr "Kiosk mode starten" msgid "OK" msgstr "OK" msgid "Password:" msgstr "Passwort:" msgid "Invalid password. Please try again." msgstr "Ongeldig password, probeer nogmaals." msgid "Invalid track number" msgstr "Ongeldig tracknummer" # Eg. the title of the popup for "shutdown", "reboot" etc. msgid "Action:" msgstr "Aktie:" msgid "Shutdown computer" msgstr "Computer afsluiten" msgid "Reboot computer" msgstr "Computer herstarten" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "Een album moet minimaal %s Tracks bevatten met %s." msgid "artist/album" msgstr "Artiest/Album" msgid "artist/album or genre" msgstr "Artiest/Abum of Genre" msgid "directory" msgstr "map" # %s will be replaced by a control to select the number of tracks #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "Compilaties mogen tot %s Tracks bevatten van dezelfde artiest." msgid "Separate the words using commas, case is ignored" msgstr "" "Woorden scheiden door komma's,\n" "Hoofd of kleine letters maakt niet uit" msgid "Sort by:" msgstr "Sorteren op:" msgid "Stop-words for sorting artists:" msgstr "Stop-woorden bij het sorteren van artiesten:" msgid "Stop-words for sorting albums:" msgstr "Stop-woorden bij het sorteren van albums:" msgid "Show stop-words words at end" msgstr "Stop woorden tonen" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" "Bij selectie wordt bijvoorbeeld \"The Rolling Stones\" als \"Rolling Stones, " "The\" weergegeven;\n" "Het sorteren wordt hierdoor niet beinvloed." msgid "Keywords to identify cover image for an album:" msgstr "Zoekterm, om de cover voor een album te vinden:" msgid "Double click on covers" msgstr "Dubbelklik op covers" msgid "Select/play album" msgstr "Album selecteren/afspelen" msgid "Combine tracks to albums" msgstr "Tracks tot albums combineren" msgid "Updating genres..." msgstr "Genres bijwerken..." msgid "Updating groups..." msgstr "Groepen bijwerken..." msgid "Combining tracks to albums..." msgstr "Tracks tot albums combineren..." msgid "Do you want to add the following folder(s) to your music library?" msgstr "Wilt u deze map(pen) aan het muziekarchief toevoegen?" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "Ja, afbeelding in \"%s\" laten staan" # This is one of the possible answers eg. if the user drags an image to an album row #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "Ja, afbeelding naar \"%s\" kopieren" # %s will be replaced by the album name #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "Wilt u deze afbeelding als Cover voor \"%s\" gebruiken?" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "" "\"%s\" komt niet voor in uw muziekarchief en kan daardoor niet bewerkt " "worden." # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums, the third %s will be replaced by the search text or by the name of a music selection. #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "%s Tracks op %s Albums voor \"%s\" gevonden" # The first %s will be replaced b the number of tracks, the second %s will be replaced by the number of albums. #, c-format msgid "%s tracks on %s albums" msgstr "%s Tracks op %s Albums" msgid "Albums" msgstr "Albums" msgid "All albums" msgstr "Alle Albums" msgid "Unsorted tracks" msgstr "Ongesorteerde Tracks" # %i will be replaced by the disk number. This string is used as headlines in the album browser if an album has several disks (CDs, records and so on). #, c-format msgid "Disk %i" msgstr "Disk %i" # Enter the default abbreviation for "Original artist" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if an original artist is set for a track. msgid "O:" msgstr "O:" # Enter the default abbreviation for "Composer" here, do not use more than 2 characters plus eg. ":". The abbreviation is used in the browser window if a composer is set for a track. msgid "C:" msgstr "C:" msgid "Stop prelistening" msgstr "Voorluisteren stoppen" # %s will be replaced by the track selected for prelistening #, c-format msgid "Prelisten \"%s\"" msgstr "\"%s\" voorluisteren" # %s will be replaced by the name of the track #, c-format msgid "Enqueue \"%s\"" msgstr "\"%s\" in afspeellijst" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" now" msgstr "\"%s\" nu afspelen" # %s will be replaced by the name of the track #, c-format msgid "Play \"%s\" next" msgstr "\"%s\" als eerstvolgende afspelen" # %s will be replaced by the name of the track #, c-format msgid "Unqueue \"%s\"" msgstr "\"%s\" uit afspeellijst verwijderen" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Enqueue %i tracks" msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "%i Tracks in afspeellijst plaatsen" msgstr[1] "%i Tracks in afspeellijst plaatsen" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks now" msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "%i Tracks nu afspelen" msgstr[1] "%i Tracks nu afspelen" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Play %i tracks next" msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "%i Tracks als eerstvolgende afspelen" msgstr[1] "%i Tracks als eerstvolgende afspelen" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Unqueue %i tracks" msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "%i Tracks uit afspeellijst verwijderen" msgstr[1] "%i Tracks uit afspeellijst verwijderen" # %s will be replaced by the name of an artist #, c-format msgid "\"%s\" on the web" msgstr "\"%s\" op het Internet" # %s will be replaced eg. by a number of "+" which represent the user's rating #, c-format msgid "Average rating: %s" msgstr "Gemiddelde waardering: %s" # %s will be replaced eg. by a number of "+" which represent the user's rating #, fuzzy, c-format #| msgid "My rating: %s" msgid "Rating: %s" msgstr "Mijn waardering: %s" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to change the rating for all %i selected tracks?" msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "De waardering voor alle %i geselecteerde tracks wijzigen?" msgstr[1] "De waardering voor alle %i geselecteerde tracks wijzigen?" # This is the button in the confirmation dialog when changing the rating for multiple tracks. msgid "Change rating" msgstr "Waardering wijzigen" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" "Klikken om alle tracks van dit album te selecteren, Dubbelklikken om ze af " "te spelen" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" "Klikken om alle tracks van deze artiest te selecteren, Dubbelklikken om ze " "af te spelen" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" "Klikken om alle tracks van deze disk te selecteren, Dubbelklikken om ze af " "te spelen" # %s will be replaced by the name of the track #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "Dubbelklikken om \"%s\" in de afspeellijst te plaatsen" #. TRANSLATORS: %i will be replaced by the number of tracks #, fuzzy, c-format #| msgid "Do you want to enqueue all %i selected tracks?" msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "Alle %i geselecteerde tracks in de afspeellijst plaatsen?" msgstr[1] "Alle %i geselecteerde tracks in de afspeellijst plaatsen?" msgid "Size" msgstr "grootte" msgid "Gain" msgstr "Versterking" msgid "Read music-files from the following folders and sources:" msgstr "Muziekbestanden lezen in de volgende mappen en bronnen:" msgid "Read music-files from the following sources:" msgstr "Muziekbestanden lezen in de volgende bronnen:" msgid "Add source" msgstr "Bron toevoegen" msgid "Remove source" msgstr "Bron verwijderen" msgid "Options" msgstr "Opties" #, fuzzy #| msgid "Supported file-types" msgid "Supported file types" msgstr "Ondersteunde bestandstypen" #, fuzzy #| msgid "My music library" msgid "Music library" msgstr "Mijn Muziekarchief" # %s will be replaced eg. by a module- or a filename #, c-format msgid "Options for \"%s\"" msgstr "Opties voor \"%s\"" msgid "Options..." msgstr "Opties..." msgid "Jukebox" msgstr "" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "Selecteer een afspeellijst, bestanden of geef een streaming URL" msgid "Append to current playlist" msgstr "Naar huidige afspeellijst" msgid "Volume control" msgstr "Volume controle" msgid "Play all tracks of an album with the same volume" msgstr "Alle Tracks van een album met hetzelfde volume afspelen" msgid "Desired volume:" msgstr "Gewenste volume:" msgid "Max. gain:" msgstr "Max. Volume:" msgid "Current volume:" msgstr "Huidig volume:" msgid "Fading" msgstr "Mixen" msgid "Crossfading" msgstr "mixen" msgid "Manual crossfades:" msgstr "Handmatig mix-effect" msgid "Automatic crossfades:" msgstr "Automatisch mix-effect" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "Geen mixeffect tussen twee opvolgende tracks van hetzelfde album" msgid "Only fade out the old track, the new track starts with full volume" msgstr "Alleen oude track uitmixen, nieuwe track begint met normaal volume" msgid "Resume" msgstr "" msgid "Jingles" msgstr "Jingles" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "Allow max. %i tracks waiting in queue" msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "Max. %i tracks in de afspeellijst toestaan" msgstr[1] "Max. %i tracks in de afspeellijst toestaan" #, fuzzy #| msgid "Avoid double tracks waiting in queue" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "Dubbele tracks in afspeellijst weigeren" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "" "Saaiheid voorkomen: Geen track meerdere keren afspelen binnen %i minuten" # %i will be replaced by a control to select the number of minutes #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "" msgid "Shuffle intensity:" msgstr "Variatie willekeurig afspelen" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" #, fuzzy #| msgid "Edit queue" msgid "Restore queue" msgstr "Afspeellijst wijzigen" msgid "Restore already played tracks" msgstr "" #, fuzzy #| msgid "Start playback on enqueue" msgid "Start playback from last position" msgstr "Start afspelen wanneer tracks in afspeellijst worden geplaats" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" "Gebruik de volgende opties om te bepalen welke acties automatisch worden " "uitgevoerd na een bepaalde tijd." #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "Automatisch afspelen: Als de afspeellijst leeg is, %i minuten wachten;" # %s will be replaced by the name of a music selection #, c-format msgid "then, play %i tracks from the %s" msgstr "daarna %i Tracks afspelen uit %s" # %s will be replaced by the name of a music selection #, fuzzy msgid "Ignore tracks from the music selection" msgstr "Alleen tracks toestaan uit muziekselectie %s" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "" "Handmatig toevoegen van tracks aan de afspeellijst onderbreekt direct het " "automatisch afspelen" msgid "Sleep mode:" msgstr "Slaapmode:" msgid "Stop playback" msgstr "Stop afspelen" #, fuzzy #| msgid "in|after|at|always in|always after|always at" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "in|na|om|altijd in|altijd na|altijd om" #, fuzzy #| msgid "minutes" msgid "minutes|o'clock" msgstr "Minuten" #, c-format msgid "Before this, fade out %i seconds" msgstr "Aan het eind in %i seconden geluid uitfaden" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" #, fuzzy #| msgid "minutes" msgid "minutes," msgstr "Minuten" # %s will be replaced by the name of a music selection #, fuzzy msgid "play a track from the music selection" msgstr "Alleen tracks toestaan uit muziekselectie %s" #, fuzzy #| msgid "Alt" msgid "At" msgstr "Alt" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "Ga naar huidige track na %i minuten geen activiteit" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "" #, fuzzy, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "Ga naar huidige track na %i minuten geen activiteit" # %s will be replaced by the name of a visualization #, fuzzy, c-format msgid "Close video screen after %i minutes" msgstr "Stop visualisering na %i minuten" #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "Mappen doorzoeken:" msgid "Read file:" msgstr "Bestand lezen:" msgid "Ignore music-files and images with the following extensions:" msgstr "Muziek- en afbeeldingsbestanden met de volgende extensies negeren:" msgid "(separate the extensions using the comma, case is ignored)" msgstr "" "(extenties scheiden door een komma, hoofd of kleine letters is niet " "belangrijk)" msgid "Include folder to the update process" msgstr "Map doorzoeken tijdens het bijwerken van het muziekarchef" msgid "Read hidden files" msgstr "Lees verborgen bestanden" #, fuzzy #| msgid "Read hidden files" msgid "Read hidden folders" msgstr "Lees verborgen bestanden" #, fuzzy msgid "Read inside ZIP-/TAR-archives" msgstr "Binnen ZIP-bestanden zoeken" msgid "Read (ID3)-tags" msgstr "Lees (ID3)-tags" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "" "Pad en bestandpatroon voor bestandinformatie, wanneer (ID3-)Tags ontbreken:" # This string is used as a headline before a list of placeholders, see eg. "Settings/My music library/Options for <source>". The placeholders may then be used by the user in the corresponding text field and Silverjuke will replace them by something else afterwards. msgid "Placeholders:" msgstr "Plaatshouders:" msgid "Read files and folders" msgstr "Bestanden en mappen lezen" msgid "Add a folder to search for music-files" msgstr "Map met muziekbestanden toevoegen" msgid "Add a single music-file" msgstr "één muziekbestand toevoegen" # This string is eg. added to disabled sources msgid "Disabled" msgstr "Uitgeschakeld" # If "Include folder to the update process" is disabled, this hint is shown in brackets in the list of sources in the "My music" dialog. msgid "No update" msgstr "Niet bijwerken" # %s will be replaced by the name of a source, eg. a folder, a file or an URL #, c-format msgid "Remove \"%s\" from the music library?" msgstr "\"%s\" uit het muziekarchief verwijderen?" msgid "Select a folder with music-files" msgstr "Map met muziekbestanden selecteren" msgid "Select music-file" msgstr "Muziekbestand selecteren" msgid "Unknown track" msgstr "Onbekende track" msgid "Unknown artist" msgstr "Onbekende artiest" msgid "Add a server containing music-files" msgstr "Server met muziekbestanden toevoegen" msgid "Use server:" msgstr "Server gebruiken:" msgid "Server:" msgstr "Server:" msgid "Type" msgstr "Type" msgid "Login name:" msgstr "Loginnaam:" msgid "Include server to the update process" msgstr "Server meenemen in het bijwerken van het muziekarchief" msgid "Configuration file" msgstr "Configuratiebestand" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #, c-format msgid "Loading %s" msgstr "Inlezen van %s" # %i will be replaced by the error number #, c-format msgid "Error %i" msgstr "Fout %i" msgid "Edit track" msgstr "Track bewerken" msgid "of" msgstr "van" msgid "Write (ID3-)tags" msgstr "(ID3-)Tags bewaren" msgid "File names" msgstr "Bestandsnamen" # %s will be replaced by the decimal-point-formatted number of files #, c-format msgid "Show all %s file names..." msgstr "Toon alle %s bestandsnamen..." msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" "De getoonde waarden zijn de som of het gemiddelde van alle gegeven bestanden." msgid "Track" msgstr "Track" msgid "Further information" msgstr "Verdere informatie" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "Tijdelijke map" msgid "Further information..." msgstr "Verdere informatie..." # The first %s will be replaced by the source file name, the second %s will be replaced by the destination file name #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "Kan de naam van \"%s\" niet wijzigen in \"%s\"." msgid "Server name" msgstr "Server naam" msgid "Query online database" msgstr "Online-Database doorzoeken" msgid "more..." msgstr "meer..." msgid "Please select one of the following albums:" msgstr "Selecteer een van de volgende albums:" msgid "Old file name" msgstr "Oude bestandsnaam" msgid "New file name" msgstr "Nieuwe bestandsnaam" msgid "Field" msgstr "Veld" msgid "Old value" msgstr "Oude waarde" msgid "New value" msgstr "Nieuwe waarde" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" msgid "<empty>" msgstr "<leeg>" msgid "Confirm modifications" msgstr "Wijzigingen bevestigen" msgid "Delete empty folders" msgstr "Lege mappen verwijderen" msgid "Please confirm or edit the following modification:" msgstr "Bevestig of wijzig de volgende verandering:" # %s will be replaced by the number of modifications #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "Bevestig of wijzig de volgende %s verandering:" msgid "(lower case)" msgstr "(Kleine letters)" msgid "(upper case)" msgstr "(Hoofdletters)" msgid "(n characters)" msgstr "(n tekens)" msgid "Rename files" msgstr "Bestanden hernoemen" msgid "Pattern:" msgstr "Patroon:" #, fuzzy #| msgid "(first character)" msgid "Artist (first character)" msgstr "(eerste teken)" #, fuzzy #| msgid "(first character)" msgid "Album (first character)" msgstr "(eerste teken)" #, fuzzy #| msgid "(first character)" msgid "Genre (first character)" msgstr "(eerste teken)" #, fuzzy #| msgid "(first character)" msgid "Group (first character)" msgstr "(eerste teken)" #, fuzzy #| msgid "(n characters)" msgid "Year (4 characters)" msgstr "(n tekens)" #, fuzzy #| msgid "(n characters)" msgid "Year (2 characters)" msgstr "(n tekens)" #, fuzzy #| msgid "(n characters)" msgid "Duration (5 characters)" msgstr "(n tekens)" msgid "Directory change" msgstr "Map-wissel" #, fuzzy #| msgid "(n characters)" msgid "File name (8 characters)" msgstr "(n tekens)" msgid "File extension" msgstr "Bestandstype" msgid "Example:" msgstr "Voorbeeld:" msgid "Replace" msgstr "Vervangen" msgid "Search for:" msgstr "Zoeken naar:" msgid "in:" msgstr "in:" msgid "All fields" msgstr "Alle Velden" msgid "Path and file name" msgstr "Pad en bestandsnaam" msgid "Replace with:" msgstr "Vervangen door:" msgid "Match whole words only" msgstr "Alleen hele woorden" msgid "Match case" msgstr "Hoofd-/Kleine letters moeten overeenkomen" msgid "Regular expression" msgstr "Regular expression" # %s will be replaced by a text the user tried to search for #, c-format msgid "\"%s\" not found." msgstr "\"%s\" niet gevonden." msgid "Split field" msgstr "Veld splitsen" msgid "Field to split:" msgstr "Te splitsen veld:" msgid "Destination fields and pattern:" msgstr "Doelveld en patroon:" #, fuzzy #| msgid "Track number" msgid "Track number (1 character)" msgstr "Track nummer" #, fuzzy #| msgid "(n characters)" msgid "Track number (2 characters)" msgstr "(n tekens)" #, fuzzy #| msgid "(first character)" msgid "Disk number (1 character)" msgstr "(eerste teken)" #, fuzzy #| msgid "(n characters)" msgid "Disk number (2 characters)" msgstr "(n tekens)" msgid "Void information" msgstr "Lege informatie" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" "Door verschillende skins kan het uiterlijk van %s worden veranderd.\n" "Selecteer een skin uit bovenstaande lijst. Meer skins zijn op internet te " "vinden." msgid "Name" msgstr "Naam" msgid "Info..." msgstr "Info..." msgid "Update list" msgstr "Lijst bijwerken" msgid "More skins on the web..." msgstr "Meer skins zijn op internet te vinden..." msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" "Lettertype en Cover grootte kan onafhankelijk worden ingesteld voor het " "hoofdvenster.\n" "De grootte komt overeen met een zoom van 100%. Bij in of uitzoomen (door " "gebruik van de \"+\" or \"-\" toetsen)\n" "zullen beide groottes evenveel toe of afnemen." msgid "Font:" msgstr "Lettertype:" msgid "Font size:" msgstr "" msgid "Use this font for dialogs, too" msgstr "Gebruik dit lettertype ook voor dialogen" msgid "Column width:" msgstr "Kollombreedte" msgid "Cover size:" msgstr "Covergrootte" msgid "No lyrics found." msgstr "Geen songteksten gevonden" msgid "Karaoke Prompt" msgstr "Karaoke prompt" # %s will be replaced by the name of a music selection #, c-format msgid "No images found in \"%s\"." msgstr "Geen afbeeldingen gevonden in \"%s\"." msgid "Background" msgstr "Achtergrond" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "Use %s-files" msgstr "" msgid "Please select a directory with images" msgstr "Selecteer een map met afbeeldingen" msgid "If appropriate, switch over automatically" msgstr "Schakel automatisch over indien mogelijk" msgid "Half size" msgstr "Halve grootte" msgid "Spectrum Monitor" msgstr "Spectrum monitor" msgid "Show spectrum" msgstr "Spectrum weergeven" msgid "Show oscilloscope" msgstr "Oscilloscope weergeven" msgid "Show starfield" msgstr "Toon sterrenhemel" #, fuzzy #| msgid "Show starfield" msgid "Show other figures" msgstr "Toon sterrenhemel" #, fuzzy msgid "Visualization" msgstr "Visualisering starten" #, fuzzy msgid "Video output" msgstr "Audio-uitgang" msgid "Search homepage" msgstr "Homepage zoeken" # %s will be replaced by the name of the website #, c-format msgid "Lyrics on %s" msgstr "Songtekst op %s" # %s will be replaced by the name of the website #, c-format msgid "Search with %s" msgstr "Zoeken met %s" # %s will be replaced by the name of the website #, c-format msgid "Information on %s" msgstr "Informatie op %s" # Do not forget the ":" at the end of the string. msgid "Object count:" msgstr "Aantal Objekten:" # Do not forget the ":" at the end of the string. msgid "Elapsed time:" msgstr "Verstreken tijd:" msgid "Message" msgstr "Bericht" msgid "Scope" msgstr "Scope" msgid "Console" msgstr "Console" #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i message(s)" msgid "%i message" msgid_plural "%i messages" msgstr[0] "%i bericht(en)" msgstr[1] "%i bericht(en)" msgid "Evaluate" msgstr "Evalueren" msgid "Clear" msgstr "Wissen" msgid "Open console on errors and warnings" msgstr "Open console bij fouten en waarschuwingen" msgid "Details" msgstr "Details" msgid "Clear all messages?" msgstr "Alle berichten wissen?" #, c-format msgid "Overwrite \"%s\"?" msgstr "\"%s\" overschrijven?" msgid "Append" msgstr "Voeg toe" msgid "State" msgstr "Status" # %s will be replaced by the file type, eg. "MP3" or "JPG" #, c-format msgid "%s-files" msgstr "%s-bestanden" # %s will be replaced by the file type, eg. "MP3" #, c-format msgid "%s-audio" msgstr "%s-audio" # %s will be replaced by the file type, eg. "JPG" #, c-format msgid "%s-images" msgstr "%s-afbeeldingen" #, c-format msgid "%s-video" msgstr "" # %s will be replaced by the file type, eg. "M3U" or "CUE" #, c-format msgid "%s-playlists" msgstr "%s-afspeellijsten" #, fuzzy #| msgid "Archive-files" msgid "Script-files" msgstr "Archief bestanden" msgid "Silverjuke skin-files" msgstr "Silverjuke Skin-bestanden" #, fuzzy #| msgid "Silverjuke skin-files" msgid "Silverjuke jukebox-files" msgstr "Silverjuke Skin-bestanden" msgid "Archive-files" msgstr "Archief bestanden" msgid "Supported file-types" msgstr "Ondersteunde bestandstypen" msgid "Test..." msgstr "Test..." msgid "Programs" msgstr "Programma's" msgid "Cleanup index..." msgstr "Index opschonen..." msgid "max. size" msgstr "max. grootte" # The first %s is replaces with the program name (usually "Silverjuke"), the seconds %s is replaced by a (maybe complex) error description #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" "De laatste keer is %s niet op normale wijze afgesloten.\n" "De volgende - eventueel foutieve - Objecten werden gebruikt kort voordat het " "niet normale afsluiten:\n" "\n" "%s\n" "\n" "Bij terugkerende problemen kunt u proberen om deze objecten niet meer te " "gebruiken.\n" "Wilt u deze objecten deze keer blijven gebruiken?" msgid "Use maybe errorous objects?" msgstr "Eventueel foutieve objecten gebruiken?" # How should the DATE PLUS TIME be formatted in this locate (long format)? You can use the following placeholders: # ----- # %a = weekday abbreviation (Mon, Tue ...) # %d = day in month (1-31) # %b = month name (January, ...) # %Y = year (4 characters) # %H = hour (00-23) # %I = hour (01-12) # %M = minute (0-59) # %p = "am" or "pm" # ----- # Eg. we use "%a %b %d %Y, %I:%M:%S %p" for english and "%a, %d. %b. %Y, %H:%M:%S" or german here. msgid "__DATE_TIME_LONG__" msgstr "%a, %d. %b. %Y, %H:%M:%S" # Please use only "%d.%m.%Y %H:%M:%S" or "%m/%d/%Y %H:%M:%S" (without the quotes) here as Silverjuke cannot parse other date/time formats. msgid "__DATE_TIME_EDITABLE__" msgstr "%d.%m.%Y %H:%M:%S" # How should the DATE WITHOUT TIME be formatted in this locate (long format)? See __DATE_TIME_LONG__ for a brief overview about the placeholders available. # ----- # Eg. we use "%a %b %d %Y" for english and "%a, %d. %b. %Y" or german here. msgid "__DATE_LONG__" msgstr "%a, %d. %b. %Y" # Please use only "%d.%m.%Y" or "%m/%d/%Y" (without the quotes) here as Silverjuke cannot parse other date formats. msgid "__DATE_EDITABLE__" msgstr "%d.%m.%Y" # Set this value to "1" (with out the quotes) if sunday should be the first day in the week; otherwise, use "0". msgid "__DATE_SUNDAY_FIRST__" msgstr "0" # __THIS_LANG__ defines the languge of this locale, use strings as "de", "en", "fr", "es", "dk" etc. here msgid "__THIS_LANG__" msgstr "nl" # Here you can add additional cover-search URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look like: # ----- # [search] # Google.com=http://images.google.com/images?q=%artistutf8%+%albumutf8% # AllMusic.com=http://www.allmusic.com/cg/amg.dll?P=amg&sql=%album%&opt1=2 # ----- # Do not forget to let the value begin with [search]. You can use the following placeholders for the URL: # %artist% # %artistutf8% # %album% # %albumutf8% # %track% # %trackutf8% # ----- # Again, if you are unsure, just leave this field blank. msgid "__COVER_SEARCH_URLS__" msgstr "" "[search]\n" "Amazon.nl=http://www.amazon.nl/exec/obidos/external-search?" "index=music&keyword=%artist%+%album%\n" "eBay.nl=http://search.ebay.nl/search/search.dll?" "MfcISAPICommand=GetResult&krd=1&ht=1&shortcut=4&SortProperty=MetaEndSort&cgiurl=http" "%3A%2F%2Fcgi.ebay.de%2Fws%2F&maxRecordsPerPage=50&st=2&ebaytag1code=77&query=" "%artist%+%album%&x=4&y=15" # Here you can add additional artist-info URLs for your locale or for your country. If you are already lucky with the predifined URLs, leave this field empty. Otherwise the value should look simelar to __COVER_SEARCH_URLS__ but has the following sections: # ----- # [homepage] # [info] # [lyrics] # [search] # ----- # Again, if you are unsure, just leave this field blank. msgid "__ARTIST_INFO_URLS__" msgstr "" "[info]\n" "Wikipedia.nl=http://nl.wikipedia.org/wiki/%artist%\n" "[lyrics]\n" "Lyrix.at=http://www.google.nl/search?q=%22%artistutf8%%22+site:www.lyrix." "at&btnI=1" # Locale-dependent default stop-words to omit at the beginning of an artist. However, you should also include the english stop words here. # ----- # The predefined stop words are: the, der, die, die happy, das msgid "__STOP_ARTISTS__" msgstr "0" # Locale-dependent default stop-words to omit at the beginning of an artist. # ----- # There are no predefined album stopwords, so you may also decide to leave this field blank or enter "0" here. msgid "__STOP_ALBUMS__" msgstr "0" # Default cover keywords for your locale. The predefined cover keywords for english are: front, vorn, outside, cover msgid "__COVER_KEYWORDS__" msgstr "0" # Virtual keyboard layout definitions here. See our Developer Network for more information. To use the layout "US International", enter "0" here. msgid "__VIRT_KEYBD__" msgstr "0" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "." #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "," #. TRANSLATORS: %i will be replaced by a number #, fuzzy, c-format #| msgid "%i days" msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dagen" msgstr[1] "%i dagen" # %s will be replaced by the text of the invalid reguar expression #, c-format msgid "Invalid regular expression \"%s\"." msgstr "Ongeldige normale uitdrukking \"%s\"" msgid "Fatal error" msgstr "Fatale Fout" msgid "Ctrl" msgstr "Ctrl" msgid "Alt" msgstr "Alt" msgid "Shift" msgstr "Shift" msgid "Enlarge window" msgstr "Venster vergroten" msgid "Shrink window" msgstr "Venster verkleinen" msgid "Enlarge display" msgstr "Display vergroten" msgid "Shrink display" msgstr "Display verkleinen" #, fuzzy #| msgid "Devices" msgid "Services" msgstr "Apparaten" # %s will be replaced by the program name, usually "Silverjuke" #, c-format msgid "Hide %s" msgstr "%s verbergen" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #| msgid "Hide %s" msgid "Hide Others" msgstr "%s verbergen" #, fuzzy #| msgid "Show file" msgid "Show All" msgstr "Bestand weergeven" #, fuzzy, c-format #| msgid "Exit %s" msgid "Quit %s" msgstr "%s beeindigen" msgid "Extras" msgstr "" msgid "Full screen" msgstr "Volledig scherm" msgid "Modules on the web..." msgstr "Module op Internet..." msgid "Explore" msgstr "Verkennen" msgid "Reveal in Finder" msgstr "In Finder weergeven" # %s will be replaced by the file name #, c-format msgid "The file \"%s\" does not exist." msgstr "Het bestand \"%s\" bestaat niet." # %s will the replaced by the program-file that cannot be executed. #, c-format msgid "Cannot execute \"%s\"." msgstr "Kan \"%s\" niet uitvoeren." msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" #~ msgid "Scroll vertically" #~ msgstr "Vertikaal scrollen" #~ msgid "Context sensitive" #~ msgstr "Context gevoelig" #, fuzzy #~| msgid "Exit %s" #~ msgid "Exit" #~ msgstr "%s beeindigen" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable %s" #~ msgstr "%s uitschakelen" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Disable shutdown" #~ msgstr "Afsluiten uitschakelen" #~ msgid "" #~ "If you have more than one monitor connected to your computer,\n" #~ "you can assign the different Silverjuke windows to different monitors " #~ "here." #~ msgstr "" #~ "Wanneer meerdere monitoren zijn aangesloten op de computer,\n" #~ " kunnen verschillende Silverjuke schermen toegewezen worden aan " #~ "verschillende monitoren." #~ msgid "Monitor for" #~ msgstr "Monitor voor" # %s will be replaced by a control for selecting the display resolution #~ msgid "Switch resolution to %s" #~ msgstr "Schakel resolutie naar %s" #~ msgid "Calculated volumes:" #~ msgstr "Berekende volume:" #~ msgid "Skip silence between tracks" #~ msgstr "Stilte tussen twee tracks overslaan" #~ msgid "Other fadings" #~ msgstr "Andere mix-effecten" #~ msgid "Attached window" #~ msgstr "Gekoppeld scherm" #~ msgid "Show album name" #~ msgstr "Albumnaam weergeven" #~ msgid "Online help" #~ msgstr "Online-Help" #~ msgid "Tools" #~ msgstr "Tools" #~ msgid "Workspace" #~ msgstr "Werkruimte" # %s will be replaced by the program name, usually "Silverjuke" #, fuzzy #~| msgid "" #~| "Beside several options, you can change the shortcuts to use in %s here. " #~| "You can\n" #~| "also define system-wide shortcuts. To modify an option, select the " #~| "option from the list\n" #~| "and click on \"Customize\". This page is for experienced users only." #~ msgid "" #~ "Beside several options, you can change the shortcuts to use here.\n" #~ "This page is for experienced users only." #~ msgstr "" #~ "Naast verschillende opties, kun je de sneltoetsen voor %s hier wijzigen.\n" #~ "Ook kunnen systeembrede sneltoetsen worden ingesteld. Om een optie te " #~ "wijzigen,\n" #~ "selecteer de optie in de lijst en klik op \"Wijzigen\". Deze pagina is " #~ "voor gevorderde gebruikers." #~ msgid "Command or option" #~ msgstr "Commando of optie" #~ msgid "Setting" #~ msgstr "instelling" #, fuzzy #~ msgid "Album cover" #~ msgstr "Album scherm" #, fuzzy #~ msgid "Track cover" #~ msgstr "Track aantal" #~ msgid "Track list" #~ msgstr "Track lijst" #~ msgid "Show disk number" #~ msgstr "Disknummer weergeven" #~ msgid "Show original artist" #~ msgstr "Originele artiest weergeven" #~ msgid "Show composer" #~ msgstr "Componist weergeven" #~ msgid "Show time" #~ msgstr "Tijd weergeven" #~ msgid "Show year" #~ msgstr "Jaar weergeven" #, fuzzy #~| msgid "Currently, the following files are supported:" #~ msgid "Currently, the following file types are read:" #~ msgstr "Momenteel worden de volgende bestandsformaten ondersteund:" #~ msgid "minutes|minutes of inactivity|o'clock" #~ msgstr "minuten|minuten Inactief|uur" # %i will be replaced by the number of characters #~ msgid "(%i characters)" #~ msgstr "(%i-tekens)" #~ msgid "More layouts on the web..." #~ msgstr "Meer indelingen op Internet..." #, fuzzy #~| msgid "Monitor for" #~ msgid "Monitor for main window" #~ msgstr "Monitor voor" # %s will be replaced by the stuff that's currently loaded; i.e. this is a filename #~ msgid "Initializing %s..." #~ msgstr "Initialiseren %s..." #~ msgid "Microphone" #~ msgstr "Microfoon" # This is the name of the "First steps" button. Do not add "..." to the string! #~ msgid "First steps" #~ msgstr "Eerste stappen" # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Buy %s..." #~ msgstr "%s kopen..." #~ msgid "Unlicenced version" #~ msgstr "Ongeregistreerde Versie" #~ msgid "These options are available if you buy Silverjuke." #~ msgstr "Deze opties zijn beschikbaar als Silverjuke wordt gekocht" # The first %s will be replaced by the program name (usually "Silverjuke"), the second and third %s will be replaced by a file type (eg. "MP3"), the fourth %s will be replaced by the URL to search for modules (eg. "http://www.silverjuke.net/en/modules.html". #~ msgid "" #~ "%s has not found an %s-decoder on your system. If you want to play %s-" #~ "files, you should install a module for this purpose.\n" #~ "\n" #~ "Open %s and search for modules now?" #~ msgstr "" #~ "%s heeft geen %s-Decoder op uw system gevonden. Wilt u %s-bestanden " #~ "afspelen, dan moet een module geinstalleerd worden.\n" #~ "\n" #~ "Open %s om naar Modules te zoeken?" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Do you want %s to check for missing decoders in future?" #~ msgstr "Wilt u dat %s voortaan naar ontbrekende modules zoekt?" # This is a context-menu option that is placed in the "Playback" submenu #~ msgid "Play tracks at once on double click" #~ msgstr "Direct een Track afspelen bij dubbelklikken" # The first %s will be replaced by the program name, the second by the name of the licence holder. #~ msgid "%s licenced to %s" #~ msgstr "%s geregistreerd door %s" # %s will be replaced by the name of the licence holder #~ msgid "Licenced to %s" #~ msgstr "Geregistreerd door %s" # %s will be replaced by the shortcut #~ msgid "Cannot register system-wide shortcut \"%s\"." #~ msgstr "Kan systembrede sneltoets \"%s\" niet toewijzen." #~ msgid "Silverjuke language-files" #~ msgstr "Silverjuke taalbestanden" # This is the help topic for the "First steps" that are opened if Silverjuke is started the first time. The topic is also reachable through the "About" dialog. You can use _simple_ HTML here: <h1>, <p>, <b>, <i> and <a>. Please refer to one of the example files in the developer network. #~ msgid "__HELP__" #~ msgstr "" #~ "<h1>Eerste stappen</h1><p>\t<b>Welkom bij Silverjuke!</b> Nadat je het " #~ "programma hebt gedownload en opgestart, \tmoeten je muziekbestanden " #~ "toegevoegd worden aan het muziekarchief. Dit \tkun je eenvoudig doen door " #~ "de map met muziekbestanden bijvoorbeeld vanuit de \tWindows Verkenner in " #~ "het hoofdvenster van Silverjuke te slepen.</p><p>\tSilverjuke doorzoekt " #~ "na het klikken op \"OK\" de betreffende map op muziekbestanden en voegt " #~ "alle gevonden muziekbestanden toe aan het muziekarchief.</p><p>\t<b>Dat " #~ "is alles!</b> We hebben geprobeerd om het gebruik van Silverjuke zo " #~ "gemakkelijk mogelijk te maken - misschien kun je zelfs nu al stoppen met " #~ "lezen en het programma gewoon gaan uitproberen... </p><h1>Mijn " #~ "muziekarchief</h1><p>\tDe mappen die je hebt toegevoegd zoals hierboven " #~ "beschreven, vindt je terug in \thet <a href=\"dialog:mymusic.lib" #~ "\">muziekarchief</a>. Hier kun je nog andere bronnen toevoegen of weer " #~ "verwijderen. Wanneer je bronnen verwijdert, zullen alleen de verwijzingen " #~ "uit Silverjuke worden verwijderd. De muziekbestanden zelf worden niet " #~ "gewist. </p><h1>Muziek afspelen</h1><p>\tIn het hoofdscherm vindt je al " #~ "je muziek gesorteerd op album. Wanneer Silverjuke covers vindt in de " #~ "mappen of ID3-tags zullen deze afgebeeld worden. Je kunt deze covers " #~ "bewerken of verschillende covers bijvoorbeeld van Internet halen - klik " #~ "hiervoor met de rechtermuisknop op de cover of sleep een afbeelding van " #~ "bijvoorbeeld de verkenner naar een album. </p><p>\tEen track afspelen kun " #~ "je doen door op de naam te klikken. Wanneer je dit voor meerdere tracks " #~ "doet, dan worden deze na elkaar afgespeeld. Je kunt ook meerdere tracks " #~ "tegelijk selecteren (door gebruik van de shift-toets of door op de " #~ "albumnaam te klikken) en sleep deze samen naar het scherm voor de " #~ "afspeellijst. </p><h1>Zoeken</h1><p>\tVoor het zoeken naar een artiest, " #~ "album of track kun je gewoon de naam in het zoekveld (rechtsboven) " #~ "intikken - mogelijk zijn de eerste letters van de naam al voldoende. " #~ "Silverjuke begint tijdens het intikken al met zoeken en geeft de " #~ "resultaten direct weer. </p><p>\tWanneer je het zoeken wilt stoppen en " #~ "weer alle albums wilt zien, kun je het zoekveld leegmaken door klikken op " #~ "het kruisje ernaast of gebruik de \"Esc\" toets. </p><p>\tVoor meer " #~ "complexe zoekopdrachten, die je ook kunt gebruiken om binnen het " #~ "muziekarchief te filteren, \tkun je de <a href=\"dialog:advsearch.lib" #~ "\">dialoog muziekselectie</a> gebruiken (klik op het driehoekje in het " #~ "zoekveld). Probeer de verschillende standaardinstellingen gewoon uit om " #~ "een idee te krijgen van de mogelijkheden. </p><h1>Kiosk mode</h1><p>\tIn " #~ "de <a href=\"dialog:kiosk.lib,0\">kiosk mode</a> kun je Silverjuke met " #~ "volledige \tschermgrootte gebruiken en met beperkte functionaliteit. " #~ "Hierdoor kun je \tSilverjuke bijvoorbeeld gebruiken als jukebox op een " #~ "feestje. \tNaast diverse andere opties kun je een <a href=\"dialog:kiosk." #~ "lib,3\">virtueel toetsenbord</a> gebruiken of je kunt \tSilverjuke " #~ "volledig bedienen met een <a href=\"dialog:kiosk.lib,4\">numerieke " #~ "toetsenbord</a>. </p><h1>Silverjuke uitbreiden</h1><p>\tTot slot, kun je " #~ "Silverjuke uitbreiden met <a href=\"dialog:basicsettings." #~ "lib,666\">modules</a> voor het gebruik van verschillende " #~ "\tbestandsformaten of het toevoegen van nieuwe visualisering. Een " #~ "overzicht van de beschikbare \tmodules kan worden gevonden op <a href=" #~ "\"web:3\">www.silverjuke.net</a>. </p><h1>Meer informatie</h1><p>\tDeze " #~ "tekst geeft alleen een algemene indruk van de mogelijkheden van " #~ "Silverjuke. Meer gedetailleerde informatie kan worden gevonden in de " #~ "context-gevoelige online help, die kan worden geopend door de \t<a href=" #~ "\"web:9\">\"online help\"</a> knop te gebruiken in de diverse schermen. </" #~ "p><p>\tRest ons alleen nog - je veel plezier te wensen met het gebruik " #~ "van Silverjuke!<br />\t<i>Het Silverjuke Team</i></p>" #~ msgid "Apply" #~ msgstr "Toepassen" #~ msgid "Check for new Silverjuke version..." #~ msgstr "Controleer op een nieuwe versie van Silverjuke..." # The first %s will be replaces by the new version, the others %s will be replaced by the URL for downloading it. #~ msgid "" #~ "A new version of Silverjuke (%s) is available for download on %s.\n" #~ "\n" #~ "Do you want to open %s now?" #~ msgstr "" #~ "Er is een nieuwe versie van Silverjuke (%s) beschikbaar.\n" #~ "Deze is te downloaden op%s.\n" #~ "\n" #~ "Wilt u %s nu openen?" #~ msgid "Other program" #~ msgstr "Ander Programma" #~ msgid "Set markers" #~ msgstr "Markers plaatsen" # %i will be replaced by the number of the marker, %s will be replaced by the marker position or by a control to select the marker position #~ msgid "Show marker %i at %s." #~ msgstr "Marker %i op %s tonen" #~ msgid "Minutes" #~ msgstr "Minuten" #~ msgid "Warn if marker is crossed" #~ msgstr "Waarschuwen, als de marker wordt overschreden" #~ msgid "Set markers..." #~ msgstr "Markeringen instellen..." #~ msgid "Burn CD" #~ msgstr "CD branden" #~ msgid "Tracks to burn:" #~ msgstr "Te branden tracks:" #~ msgid "Recorder:" #~ msgstr "Recorder:" #~ msgid "Please select an installed and available program" #~ msgstr "Selecteer een geinstalleerd en beschikbaar programma" # %s will be replaced by the name of a program #~ msgid "Please locate \"%s\"" #~ msgstr "Geef aan waar \"%s\" staat" # %s will be replaced by the name of a program #~ msgid "Arguments for \"%s\"" #~ msgstr "Argumenten voor \"%s\"" #~ msgid "Total time" #~ msgstr "Totale tijd" #~ msgid "Cannot calculate the total time" #~ msgstr "Totale tijd kan niet worden berekend" #~ msgid "" #~ "The size of the selected tracks is larger than the assumed capacity of " #~ "the disk to burn.\n" #~ "\n" #~ "Continue anyway?" #~ msgstr "" #~ "De geselecteerde tracks passen naar verwachting niet op de te branden " #~ "schijf.\n" #~ "\n" #~ "Wilt u toch doorgaan?" #~ msgid "Minimize window" #~ msgstr "Venster minimaliseren" #~ msgid "Maximize window" #~ msgstr "Venster maximaliseren" #~ msgid "Center window" #~ msgstr "Venster centeren" # %s will be replaced by the program name (usually "Silverjuke") #~ msgid "Show %s" #~ msgstr "%s weergeven" #~ msgid "System tray" #~ msgstr "Systeemvak" #~ msgid "Show current track" #~ msgstr "Huidig track weergeven" #~ msgid "Menus" #~ msgstr "Menus" #~ msgid "Show shortcuts" #~ msgstr "Sneltoetsen weergeven" #~ msgid "Show icons" #~ msgstr "Symbolen weergeven" #~ msgid "Licence key" #~ msgstr "Licentie code" #~ msgid "Select the language for the user-interface from the following list:" #~ msgstr "Selecteer de taal uit de volgende lijst:" #~ msgid "Unknown language" #~ msgstr "Onbekende taal" #~ msgid "More languages on the web..." #~ msgstr "Meer talen op internet..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Note: Changing the language requires to restart %s." #~ msgstr "" #~ "Let op: Na het wijzigen van de taal moet %s opnieuw worden gestart om de " #~ "taal te laden." # %s will be replaced by the program name, usually"Silverjuke" #~ msgid "This is an unlicenced copy of %s!" #~ msgstr "Dit is een ongeregistreerde kopie van %s!" #~ msgid "" #~ "Please enter your name or your company's name and the licence key\n" #~ "you received when purchasing or updating your %s-licence:" #~ msgstr "" #~ "Voer uw naam en de licentie code die u heeft ontvangen bij aanschaf van " #~ "uw\n" #~ "%s licentie:" #~ msgid "Your name/company:" #~ msgstr "Uw naam:" # The first %s will be replaced by the program name, usually "Silverjuke". The second %i will be replaced by the number of evaluation days. The last %s, again, will be replaced by the program name. #~ msgid "" #~ "If you haven't bought a %s-licence, you may test this program %i days for " #~ "free.\n" #~ "After this period, you have to buy a licence for %s if you want to " #~ "continue using\n" #~ "this program." #~ msgstr "" #~ "Wanneer u nog geen %s-Licentie heeft gekocht, mag u dit programma\n" #~ "%i dagen gratis uitproberen. Na afloop van deze periode moet u een " #~ "licentie\n" #~ " aanschaffen wanneer u %s wilt blijven gebruiken." # The first %s will be replaced by the program name, usually "Silverjuke". The second %s will be replaced by the name of the website, eg. www.silverjuke.net #~ msgid "" #~ "Further information about purchasing %s licences\n" #~ "are available at %s." #~ msgstr "" #~ "Meer informatie over de aanschaf van een %s-licentie\n" #~ "kunt u vinden op %s." # %s will be replaced by the name of a website, eg. www.silverjuke.net #~ msgid "Open %s..." #~ msgstr "Open %s..." # %s will be replaced by the program name, usually "Silverjuke" #~ msgid "Thank you for buying a %s-licence!" #~ msgstr "Bedankt voor de aanschaf van een %s-licentie !" #~ msgid "This copy is licenced to:" #~ msgstr "Deze kopie is geregistreerd door:" #~ msgid "" #~ "If this is not your name or the name of your company, you are not using a " #~ "legal licence!" #~ msgstr "Wanneer dit niet uw naam is, gebruikt u geen legale licentie!" #~ msgid "Load external modules" #~ msgstr "externe modules laden" #~ msgid "\"Magnetic\" window borders" #~ msgstr "\"Magnetische\" vensterranden" #~ msgid "Window" #~ msgstr "Venster" #~ msgid "Use shaped windows" #~ msgstr "gebruik gevormde vensters" #~ msgid "Automatic version check" #~ msgstr "Automatische versiecontrole" # %i will be replaced by the number of days #~ msgid "Every %i days" #~ msgstr "Iedere %i dagen" #~ msgid "FX" #~ msgstr "Effecten" #~ msgid "" #~ "Please select the input and output devices to use. If you encounter any " #~ "problems,\n" #~ "please try a different buffer size and the \"Use hardware\" option." #~ msgstr "" #~ "Selecteer een ingangs- en uitgangsapparaat. Probeer bij problemen een " #~ "andere\n" #~ " buffergrootte en gebruik de \"Gebruik hardware\" optie." #~ msgid "Audio-output" #~ msgstr "Audio-uitgang" #~ msgid "Prelisten audio-output" #~ msgstr "Voorluister audiouitgang" #~ msgid "Buffer" #~ msgstr "Buffer" #~ msgid "Use hardware" #~ msgstr "Gebruik hardware" #~ msgid "" #~ "With these options, you can add jingles (small pieces of sound) between " #~ "tracks.\n" #~ "Add the jingles as normal music-files and decide how often they should be " #~ "played." #~ msgstr "" #~ "Met deze Optie kunnen Jingles tussen de tracks worden afgespeeld\n" #~ "Voeg de jingles toe als normale muziekbestanden en geef aan hoe vaak ze " #~ "afgespeeld moeten worden." #~ msgid "Use jingles" #~ msgstr "Jingles gebruiken" #~ msgid "Jingles:" #~ msgstr "Jingles:" # %s will be replaced by a control to select the number of tracks #~ msgid "Play a jingle about every %s tracks." #~ msgstr "Ongeveer iedere %s Tracks een jingle afspelen." #~ msgid "Select jingle(s)" #~ msgstr "Jingle(s) selecteren" #~ msgid "Use separate FX settings" #~ msgstr "Gebruik afzonderlijke effectinstellingen" #~ msgid "" #~ "The \"system tray\" is an area normally placed at the edge of the " #~ "screen.\n" #~ "With the following options, you can add a little symbol with frequently\n" #~ "used functions to this area." #~ msgstr "" #~ "Het \"Systeemvak\" is een klein gebied rechtsonder aan de rand van het " #~ "scherm.\n" #~ "Met de volgende Opties kan een klein symbool aan de system Trayl\n" #~ "worden toegevoegd met vaak gebruikte functies." #~ msgid "Never use system tray" #~ msgstr "Systeemvak nooit gebruiken" #~ msgid "Use system tray for the minimized window" #~ msgstr "Systeemvak bij geminimaliseerd venster gebruiken" #~ msgid "Always use system tray" #~ msgstr "Systeemvak altijd gebruiken" #~ msgid "Show current track tooltip for %i seconds" #~ msgstr "Tooltip van huidige Track %i seconden tonen" #~ msgid "Only if inactive" #~ msgstr "alleen wanneer niet actief" #~ msgid "Use this module for the following file extensions:" #~ msgstr "Deze module voor de volgende bestands-extenties gebruiken:" #~ msgid "Further options..." #~ msgstr "Verdere opties..." # %s will be replaced by a list of extensions, eg. "MP3, MP2, MP1" #~ msgid "" #~ "If you disable this module or change the file types, make sure,\n" #~ "you don't need \"%s\" or they are supported by another module.\n" #~ "\n" #~ "Note: Remember that not every module can play every file type." #~ msgstr "" #~ "Wanneer u deze module uitschakelt of de bestandsformaat verandert, \n" #~ "let dan op dat u \"%s\" niet gebruikt of dat deze ondersteund zijn door\n" #~ "een andere module.\n" #~ "\n" #~ "Let op: Niet iedere module kan ieder bestandsformaat afspelen." # %s will be replaced by the string an abbreviation should be entered for, eg. "Composer" or "Original artist" #~ msgid "Abbreviation for \"%s\"" #~ msgstr "Afkorting voor \"%s\"" #, fuzzy #~ msgid "Close %s" #~ msgstr "Sluiten" # %s will be replaced by the name of a website, eg. www.silverjuke.net #, fuzzy #~ msgid "Open %s" #~ msgstr "Open %s..." #, fuzzy #~ msgid "Selection: %s" #~ msgstr "Opgeslagen selectie" #, fuzzy #~ msgid "Select another visualization" #~ msgstr "Visualisering starten" #~ msgid "Playback mode:" #~ msgstr "Afspeel modus:" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Interpolation:" #~ msgstr "Interpolatie:" #~ msgid "Linear" #~ msgstr "Linear" #~ msgid "Sensitive" #~ msgstr "Gevoelig" #~ msgid "Query settings before start" #~ msgstr "Instellingen bevestigen voor het starten" #~ msgid "DAAP-/iTunes-client" #~ msgstr "DAAP-/iTunes-Client" #~ msgid "Add a DAAP-/iTunes-server" #~ msgstr "DAAP-/iTunes-Server toevoegen" #~ msgid "" #~ "With Silverjuke's HTTP server you can access the program and your music " #~ "library from any\n" #~ "browser or other Silverjuke instances in your network." #~ msgstr "" #~ "Met Silverjuke's HTTP-Server kan het programma en het muziekarchief " #~ "vanuit iedere\n" #~ "browser of Silverjuke-locatie in het netwerk worden benaderd." #~ msgid "Enable HTTP server on port %s" #~ msgstr "HTTP-Server op poort %s inschakelen" #~ msgid "Share my music library over HTTP" #~ msgstr "Mijnn Muziekarchief over HTTP delen" #~ msgid "Enable web interface access over HTTP" #~ msgstr "Web-Interface over HTTP inschakelen" # %s will be replaced by the file type, eg. "M3U" or "CUE" #~ msgid "Playlist" #~ msgstr "Afspeellijst" # This string is used eg. for unused effect slots, please surround the string by "<" and ">" #~ msgid "Empty" #~ msgstr "Leeg" #~ msgid "Update" #~ msgstr "Bijwerken" #~ msgid "Sharing/Web interface" #~ msgstr "Sharing/Web interface" #~ msgid "Audio-decoder" #~ msgstr "Audio-decoder" #~ msgid "Online database" #~ msgstr "Online database" # The first %i will be replaced by the current day number in the evaluation period, the second %i will be replaced by the total number of days of the evaluation period (currently 14). #~ msgid "You are on day %i of the %i-days testing period." #~ msgstr "Dit is dag %i van totaal %i dagen van uw testperiode." # This string is shown as a link the the "About" dialog. #~ msgid "Enter licence key now..." #~ msgstr "Toets uw licentie code in..." #~ msgid "Setup" #~ msgstr "Setup" #~ msgid "Show the following effects:" #~ msgstr "Toon de volgende effecten:" #~ msgid "" #~ "To install further effects, just copy the\n" #~ "VST-plugins to one of the search paths." #~ msgstr "" #~ "Om overige effecten te installeren, kopier de \n" #~ " VST-plugins naar een van de zoekpaden." #~ msgid "FX settings for %s :" #~ msgstr "Effecten instellingen voor %s" #~ msgid "Normal playback" #~ msgstr "Normaal afspelen" # %s will be replaced by a shortcut, eg. CTRL-ALT-DEL or ALT-TAB #~ msgid "Enable %s" #~ msgstr "%s inschakelen" # %i will be replaced by the number of characters #~ msgid "%s parameters" #~ msgstr "%s parameters" #~ msgid "Load %s" #~ msgstr "%s laden" #~ msgid "Save %s" #~ msgstr "%s opslaan" #~ msgid "%s priority" #~ msgstr "%s prioriteit" #~ msgid "Load all" #~ msgstr "Alles laden" #~ msgid "Save all" #~ msgstr "Alles opslaan" #~ msgid "Start visualization/karaoke prompt" #~ msgstr "Start visualisatie/karaoke prompt" #~ msgid "Stop visualization/karaoke prompt" #~ msgstr "Stop visualisatie/karaoke prompt" #~ msgid "Drag'n'drop" #~ msgstr "Drag'n'Drop" #~ msgid "Start visualization after %i minutes of inactivity" #~ msgstr "Start visualisering na %i minuten geen activiteit" #~ msgid "Password not set." #~ msgstr "Password niet ingesteld" #~ msgid "Karaoke, Vis. etc" #~ msgstr "Karaoke, Vis, etc." #~ msgid "Visualization/Karaoke Prompt" #~ msgstr "Visualisatie/karaoke prompt" #~ msgid "Please close the \"%s\" configuration window before continuing." #~ msgstr "Sluit het \"%s\" instellingen scherm voordat u verder gaat." �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/quot.sed�����������������������������������������������������������������������0000664�0000000�0000000�00000000231�12660066715�0016076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/po/remove-potcdate.sin������������������������������������������������������������0000664�0000000�0000000�00000000660�12660066715�0020230�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } ��������������������������������������������������������������������������������silverjuke-16.2.3/po/silverjuke.pot�����������������������������������������������������������������0000664�0000000�0000000�00000107466�12660066715�0017342�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Bjoern Petersen Software Design and Development # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: silverjuke 16.2.3\n" "Report-Msgid-Bugs-To: r10s@b44t.com\n" "POT-Creation-Date: 2016-02-14 12:51+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" msgid "Sleep mode activated." msgstr "" msgid "Sleep mode deactivated." msgstr "" msgid "Play time exceeded" msgstr "" msgid "Default" msgstr "" msgid "Device" msgstr "" msgid "Show covers" msgstr "" msgid "Duration" msgstr "" msgid "Artist" msgstr "" msgid "Original artist" msgstr "" msgid "Composer" msgstr "" msgid "Album" msgstr "" msgid "Track number" msgstr "" msgid "Automatic track number" msgstr "" msgid "Disk number" msgstr "" msgid "Genre" msgstr "" msgid "Year" msgstr "" msgid "Rating" msgstr "" msgid "Comment" msgstr "" msgid "Show double tracks" msgstr "" msgid "Show different artist names" msgstr "" msgid "Show different album names" msgstr "" msgid "Show cover titles" msgstr "" #, c-format msgid "%s tracks" msgstr "" msgid "Drag folders with music here." msgstr "" msgid "Reset to default values" msgstr "" msgid "Nr." msgstr "" #. TRANSLATORS: Abbreviation of "Bits per second" msgid "bit/s" msgstr "" msgid "Samplerate" msgstr "" #. TRANSLATORS: Abbreviation of "Hertz" msgid "Hz" msgstr "" msgid "AutoPlay" msgstr "" msgid "Shuffle" msgstr "" msgid "Recreating music library" msgstr "" msgid "Updating music library" msgstr "" msgid "" "If you cancel the update process, your music library may not be up to date.\n" "\n" "Cancel the update process?" msgstr "" #, c-format msgid "" "%s is currently playing. Do you want to stop the playing track and exit %s?" msgstr "" #, c-format msgid "Exit %s" msgstr "" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot open \"%s\"." msgstr "" #, c-format msgid "Also install the script to \"%s\" for permanent use" msgstr "" #, c-format msgid "Execute the script \"%s\"?" msgstr "" msgid "" "CAUTION: Scripts may slow down Silverjuke or damage your data. Please use " "only scripts you trust." msgstr "" msgid "Search" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Repeat playlist" msgstr "" msgid "Repeat one" msgstr "" msgid "Repeat all" msgstr "" msgid "Select a track, then start playback." msgstr "" msgid "Stop after this track" msgstr "" msgid "Stop after each track" msgstr "" msgid "Double click play tracks at once" msgstr "" msgid "Start playback on first enqueue" msgstr "" msgid "Remove played tracks from queue" msgstr "" msgid "More from current album" msgstr "" msgid "More from current artist" msgstr "" msgid "No more tracks." msgstr "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Remove %i track from the queue and stop playback?" msgid_plural "Remove %i tracks from the queue and stop playback?" msgstr[0] "" msgstr[1] "" msgid "Clear playlist" msgstr "" msgid "Track played, click to reset" msgstr "" msgid "Boredom avoided: Track moved down" msgstr "" msgid "Remove this track" msgstr "" msgid "Toggle time mode" msgstr "" #, c-format msgid "Go to \"%s\"" msgstr "" msgid "End search" msgstr "" msgid "click right for options" msgstr "" msgid "Volume" msgstr "" msgid "Double-click to enlarge the cover" msgstr "" #, c-format msgid "Close this window and exit %s" msgstr "" msgid "Open main menu" msgstr "" msgid "Toggle shuffle mode" msgstr "" msgid "Repeat all/repeat current" msgstr "" #, c-format msgid "Search in \"%s\"" msgstr "" msgid "Help" msgstr "" msgid "Add folders and files" msgstr "" msgid "Extensions" msgstr "" msgid "Show remaining time" msgstr "" msgid "Show elapsed time" msgstr "" msgid "Show total time" msgstr "" msgid "Show track number" msgstr "" msgid "Show artist name" msgstr "" msgid "Show AutoPlay" msgstr "" msgid "Prefer album- to track-cover" msgstr "" msgid "Display" msgstr "" msgid "Columns" msgstr "" msgid "Same zoom in all views" msgstr "" msgid "Fonts and covers" msgstr "" msgid "Zoom" msgstr "" msgid "Skins" msgstr "" msgid "Start kiosk mode..." msgstr "" #, c-format msgid "%s on the web" msgstr "" msgid "All files" msgstr "" #, c-format msgid "About %s" msgstr "" msgid "File" msgstr "" msgid "Edit" msgstr "" msgid "View" msgstr "" msgid "Playback" msgstr "" msgid "Video screen" msgstr "" msgid "Kiosk mode" msgstr "" msgid "None" msgstr "" msgid "Further options" msgstr "" msgid "Queue" msgstr "" msgid "Automatic control" msgstr "" msgid "Current view" msgstr "" #, c-format msgid "Next track from \"%s\"" msgstr "" msgid "Next track" msgstr "" msgid "Search for genre" msgstr "" msgid "Search for music selection" msgstr "" msgid "Edit tracks/Get info" msgstr "" msgid "Show file" msgstr "" msgid "Cover editor" msgstr "" msgid "Mix" msgstr "" msgid "Left channel" msgstr "" msgid "Right channel" msgstr "" msgid "Explicit output" msgstr "" msgid "Prelisten" msgstr "" msgid "No" msgstr "" msgid "Yes" msgstr "" msgid "Only initialize system volume" msgstr "" msgid "Output" msgstr "" msgid "Use system volume" msgstr "" msgid "Several artists" msgstr "" msgid "Unknown title" msgstr "" msgid "Save playlist" msgstr "" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "Cannot write \"%s\"." msgstr "" msgid "Open playlist" msgstr "" msgid "Title" msgstr "" msgid "Track count" msgstr "" msgid "Disk count" msgstr "" msgid "Group" msgstr "" msgid "BPM" msgstr "" msgid "Channels" msgstr "" msgid "Bitrate" msgstr "" msgid "File name" msgstr "" msgid "File size" msgstr "" msgid "Date added" msgstr "" msgid "Date modified" msgstr "" msgid "Last played" msgstr "" msgid "Play count" msgstr "" msgid "SQL expression" msgstr "" msgid "Limit result to" msgstr "" msgid "Title/artist/album" msgstr "" msgid "File type" msgstr "" msgid "Queue position" msgstr "" msgid "Include tracks" msgstr "" msgid "Exclude tracks" msgstr "" msgid "Random" msgstr "" #, c-format msgid "Press \"%s\" in the main window" msgstr "" msgid "Insert" msgstr "" msgid "Del" msgstr "" msgid "" "Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the " "time." msgstr "" msgid "Please enter the text." msgstr "" msgid "Please enter a value." msgstr "" msgid "Please enter a valid value." msgstr "" msgid "(second field)" msgstr "" msgid "No valid criteria defined." msgstr "" msgid "The search cannot be started; please check the following fields:" msgstr "" msgid "Note: The operators \"equal\" and \"unequal\" are case-sensitive." msgstr "" #, c-format msgid "Do you want to execute the scripts embedded in the skin \"%s\"?" msgstr "" msgid "Esc" msgstr "" msgid "Tab" msgstr "" msgid "Cancel" msgstr "" msgid "Page left" msgstr "" msgid "Page right" msgstr "" msgid "Page up" msgstr "" msgid "Page down" msgstr "" msgid "Menu" msgstr "" msgid "Cursor left" msgstr "" msgid "Cursor right" msgstr "" msgid "Cursor up" msgstr "" msgid "Cursor down" msgstr "" msgid "Line left" msgstr "" msgid "Line right" msgstr "" msgid "Line up" msgstr "" msgid "Line down" msgstr "" msgid "Home" msgstr "" msgid "End" msgstr "" msgid "Enter" msgstr "" msgid "Delete" msgstr "" msgid "Album view" msgstr "" msgid "Cover view" msgstr "" msgid "List view" msgstr "" msgid "Toggle view" msgstr "" msgid "Open playlist..." msgstr "" msgid "Unqueue marked tracks" msgstr "" msgid "Unqueue all but marked tracks" msgstr "" msgid "Save playlist..." msgstr "" msgid "Paste" msgstr "" msgid "Music selection..." msgstr "" msgid "Settings" msgstr "" msgid "Update music library" msgstr "" msgid "Recreate music library" msgstr "" msgid "Enqueue tracks" msgstr "" msgid "Play tracks next" msgstr "" msgid "Play tracks now" msgstr "" msgid "Volume up" msgstr "" msgid "Volume down" msgstr "" msgid "Unqueue tracks" msgstr "" msgid "Edit tracks/Get info..." msgstr "" msgid "Play" msgstr "" msgid "Pause" msgstr "" msgid "Stop" msgstr "" msgid "Previous track" msgstr "" msgid "Seek backward" msgstr "" msgid "Seek forward" msgstr "" msgid "Fade to next" msgstr "" msgid "Mute" msgstr "" msgid "Reload skin" msgstr "" msgid "Toggle video screen" msgstr "" msgid "Smooth" msgstr "" msgid "Select all" msgstr "" msgid "Zoom in" msgstr "" msgid "Zoom out" msgstr "" msgid "Normal zoom" msgstr "" msgid "Always on top" msgstr "" msgid "Go to current track" msgstr "" msgid "Go to marked track" msgstr "" msgid "Go to random album" msgstr "" msgid "Go to previous letter" msgstr "" msgid "Go to next letter" msgstr "" msgid "Add credit" msgstr "" msgid "Console..." msgstr "" msgid "Replace..." msgstr "" msgid "Split field..." msgstr "" msgid "Rename files..." msgstr "" msgid "Query online database..." msgstr "" msgid "New music selection..." msgstr "" msgid "Save" msgstr "" msgid "Save as..." msgstr "" msgid "Rename..." msgstr "" msgid "Revert to saved" msgstr "" msgid "Open file..." msgstr "" msgid "Save cover..." msgstr "" msgid "Rotate left" msgstr "" msgid "Rotate right" msgstr "" msgid "Flip horizontally" msgstr "" msgid "Flip vertically" msgstr "" msgid "Grayscale" msgstr "" msgid "Negative" msgstr "" msgid "Fit to screen" msgstr "" msgid "Decrease brightness" msgstr "" msgid "Increase brightness" msgstr "" msgid "Decrease contrast" msgstr "" msgid "Increase contrast" msgstr "" msgid "Normal brightness/contrast" msgstr "" msgid "Crop" msgstr "" msgid "Please press the shortcut to add." msgstr "" msgid "System-wide:" msgstr "" #, c-format msgid "Remove shortcut \"%s\"" msgstr "" msgid "Add system-wide shortcut..." msgstr "" #, c-format msgid "Add shortcut to \"%s\"..." msgstr "" #, c-format msgid "" "The shortcut \"%s\" is currently assigned to the command \"%s\".\n" "\n" "Do you want to assign it to the shortcut \"%s\" now?" msgstr "" msgid "Mouse" msgstr "" msgid "Drag window content" msgstr "" msgid "Left mouse button" msgstr "" msgid "Drag selected tracks" msgstr "" msgid "Second click with the left mouse button" msgstr "" msgid "Show icons beside mouse cursor" msgstr "" msgid "Middle mouse button" msgstr "" msgid "Edit tracks" msgstr "" msgid "Tooltips" msgstr "" msgid "Mouse wheel" msgstr "" msgid "Scroll horizontally in album view" msgstr "" msgid "Modifier key toggles axis" msgstr "" msgid "Right mouse button toggles axis" msgstr "" msgid "Modify volume, scrollbars, letters etc." msgstr "" msgid "Use multimedia keyboard keys" msgstr "" msgid "Ask on close if playing" msgstr "" msgid "Ask before enqueuing multiple tracks" msgstr "" msgid "Ask before clearing the playlist" msgstr "" msgid "Ask before changing the rating" msgstr "" #, c-format msgid "Num%s" msgstr "" msgid "Backspace" msgstr "" msgid "Space" msgstr "" msgid "Up" msgstr "" msgid "Left" msgstr "" msgid "Right" msgstr "" msgid "Down" msgstr "" msgid "Print" msgstr "" msgid "Ins" msgstr "" msgid "Music selection" msgstr "" msgid "Numpad" msgstr "" msgid "Select date and time" msgstr "" msgid "Time" msgstr "" msgid "contains" msgstr "" msgid "does not contain" msgstr "" msgid "starts with" msgstr "" msgid "does not start with" msgstr "" msgid "starts simelar to" msgstr "" msgid "ends with" msgstr "" msgid "does not end with" msgstr "" msgid "on" msgstr "" msgid "is equal to" msgstr "" msgid "not on" msgstr "" msgid "is unequal to" msgstr "" msgid "is simelar to" msgstr "" msgid "is after" msgstr "" msgid "is greater than" msgstr "" msgid "is on or after" msgstr "" msgid "is greater or equal" msgstr "" msgid "is before" msgstr "" msgid "is less than" msgstr "" msgid "is on or before" msgstr "" msgid "is less or equal" msgstr "" msgid "is in the last" msgstr "" msgid "is not in the last" msgstr "" msgid "is in the period" msgstr "" msgid "is in range" msgstr "" msgid "is not in the period" msgstr "" msgid "is not in range" msgstr "" msgid "is set" msgstr "" msgid "is unset" msgstr "" msgid "tracks" msgstr "" msgid "albums" msgstr "" msgid "minutes" msgstr "" msgid "hours" msgstr "" msgid "seconds" msgstr "" msgid "days" msgstr "" msgid "No rating" msgstr "" msgid "random" msgstr "" msgid "highest rating" msgstr "" msgid "lowest rating" msgstr "" msgid "most often played" msgstr "" msgid "least often played" msgstr "" msgid "most recently played" msgstr "" msgid "least recently played" msgstr "" msgid "most recently added" msgstr "" msgid "least recently added" msgstr "" msgid "most recently modified" msgstr "" msgid "least recently modified" msgstr "" msgid "most recently released" msgstr "" msgid "least recently released" msgstr "" msgid "low queue position" msgstr "" msgid "high queue position" msgstr "" msgid "Today" msgstr "" msgid "Yesterday" msgstr "" msgid "Select..." msgstr "" msgid "Show tracks..." msgstr "" msgid "Add tracks from playlist" msgstr "" msgid "Current position" msgstr "" msgid "by" msgstr "" msgid "to" msgstr "" msgid "Remove criterion" msgstr "" msgid "Add criterion" msgstr "" #, c-format msgid "Tracks included to \"%s\"" msgstr "" #, c-format msgid "Tracks excluded from \"%s\"" msgstr "" msgid "Saved selections" msgstr "" #, c-format msgid "Search for %s matching %s of the following criteria:" msgstr "" msgid "tracks|albums" msgstr "" msgid "all|any|none" msgstr "" msgid "Close" msgstr "" #, c-format msgid "Do you want to save your modifications to the music selection \"%s\"?" msgstr "" msgid "Music selection modified" msgstr "" #, c-format msgid "Edit music selection \"%s\"" msgstr "" #, c-format msgid "Do you really want to delete the music selection \"%s\"?" msgstr "" msgid "Delete music selection" msgstr "" #, c-format msgid "Do you really want to delete the %i selected music selections?" msgstr "" msgid "Delete music selections" msgstr "" #, c-format msgid "No matches found for \"%s\"." msgstr "" #, c-format msgid "" "Do you want to remove the selected track(s) from the music selection \"%s\"?" msgstr "" #, c-format msgid "Do you want to add the selected track(s) to the music selection \"%s\"?" msgstr "" msgid "70's music" msgstr "" msgid "Worst rated" msgstr "" msgid "Top rated" msgstr "" msgid "Top 20" msgstr "" msgid "Recently played" msgstr "" msgid "Played today" msgstr "" msgid "Random selection" msgstr "" msgid "Tracks in queue" msgstr "" msgid "Untitled Music selection" msgstr "" #, c-format msgid "No matches in \"%s\"" msgstr "" #, c-format msgid "1 match in \"%s\"" msgstr "" #, c-format msgid "%s matches in \"%s\"" msgstr "" msgid "No matches" msgstr "" msgid "1 match" msgstr "" #, c-format msgid "%s matches" msgstr "" msgid "Search single words" msgstr "" msgid "Lookup genre on simple search" msgstr "" msgid "Search while typing" msgstr "" msgid "Save modified music selections" msgstr "" msgid "Ask" msgstr "" msgid "Max. history size" msgstr "" #, c-format msgid "Search for \"%s\" in \"%s\"" msgstr "" #, c-format msgid "Search for \"%s\"" msgstr "" msgid "" "Please press and hold the left mouse button. Then, select the area to crop " "by moving the mouse." msgstr "" msgid "<Abstract>" msgstr "" msgid "(Default)" msgstr "" msgid "Paste image from clipboard" msgstr "" msgid "Browse" msgstr "" msgid "Select cover" msgstr "" msgid "Search covers on the web" msgstr "" msgid "Don't rotate" msgstr "" msgid "Rotate/flip" msgstr "" msgid "Use default images..." msgstr "" msgid "Effects/options" msgstr "" msgid "Select image" msgstr "" msgid "Save cover" msgstr "" msgid "Reset all selected alternative images to their default value?" msgstr "" msgid "Search paths" msgstr "" msgid "The search paths are used for skins, language files and modules." msgstr "" msgid "Add..." msgstr "" msgid "Remove" msgstr "" msgid "Please select the folder to add to the search paths." msgstr "" msgid "Edit..." msgstr "" msgid "Command" msgstr "" msgid "Shortcut" msgstr "" msgid "Option" msgstr "" msgid "Value" msgstr "" msgid "The following settings are for experienced users only." msgstr "" msgid "Customize" msgstr "" msgid "Reset selection" msgstr "" #, c-format msgid "" "Do you really want to reset all %i selected commands and options to their " "default values?" msgstr "" msgid "Shortcuts" msgstr "" msgid "Language" msgstr "" msgid "Show files with" msgstr "" msgid "Instance" msgstr "" #, c-format msgid "Use the command-line option --%s=<file> to change this." msgstr "" msgid "Index file" msgstr "" msgid "RAM cache" msgstr "" #, c-format msgid "avg. query time: %s" msgstr "" msgid "ms" msgstr "" msgid "Synchronity" msgstr "" msgid "Fast" msgstr "" msgid "Save but slower" msgstr "" msgid "Very save and slow" msgstr "" msgid "Image cache" msgstr "" msgid "Use temporary directory" msgstr "" msgid "Yes, load images asynchrony" msgstr "" msgid "Yes, load images directly and avoid flickering" msgstr "" #, c-format msgid "%i%% used for %i images" msgstr "" msgid "Regard file changes" msgstr "" msgid "Advanced" msgstr "" #, c-format msgid "Please restart %s so that the changes can take effect." msgstr "" msgid "Info" msgstr "" msgid "Help-system" msgstr "" msgid "n/a" msgstr "" msgid "Internal" msgstr "" msgid "No credit." msgstr "" #, c-format msgid "Credit: %i" msgstr "" msgid "Start" msgstr "" msgid "Functions" msgstr "" msgid "Monitors" msgstr "" msgid "Virtual keyboard" msgstr "" msgid "Credit system" msgstr "" msgid "" "Silverjuke provides a so called \"kiosk mode\" which allows you to run the " "program\n" "full screen with a defined functionality." msgstr "" msgid "" "Before you enter the kiosk mode by clicking on \"Start\", make sure, you " "know how\n" "to exit again:" msgstr "" #, c-format msgid "Exit by hitting %s" msgstr "" msgid "Exit by clicking into two different corners" msgstr "" msgid "Try to set exclusive" msgstr "" msgid "Ask for a password on exit" msgstr "" msgid "Change password..." msgstr "" msgid "Exit action:" msgstr "" msgid "Start the kiosk mode with the following functionality:" msgstr "" msgid "Play/pause" msgstr "" msgid "Edit queue" msgstr "" msgid "Toggle elements" msgstr "" msgid "Enqueue multiple tracks" msgstr "" msgid "All functions" msgstr "" #, c-format msgid "Limit tracks to the music selection %s" msgstr "" msgid "Please enter the password again for verification." msgstr "" msgid "Overview:" msgstr "" msgid "Main window" msgstr "" msgid "Monitor" msgstr "" msgid "Disable screensaver" msgstr "" msgid "Disable power management" msgstr "" msgid "For more complex layouts, please refer to the command line options." msgstr "" msgid "" "If no physical keyboard is present, you can use our virtual keyboard;\n" "the virtual keyboard then is shown whenever you click into a text control." msgstr "" msgid "Use the virtual keyboard" msgstr "" msgid "Also use the virtual keyboard outside the kiosk mode" msgstr "" msgid "Test:" msgstr "" msgid "(please click into the text control)" msgstr "" msgid "Virtual keyboard layout:" msgstr "" msgid "Colour:" msgstr "" msgid "Black" msgstr "" msgid "White" msgstr "" msgid "Transparency:" msgstr "" msgid "Hide cursor" msgstr "" msgid "" "Using the Numpad plus some other special keys, you can control Silverjuke " "completely\n" "by the keyboard or some other hardware buttons. In this case, you'll enqueue " "new\n" "tracks by entering the unique numbers shown beside the album and track names." msgstr "" msgid "Use Numpad controls" msgstr "" msgid "Also use Numpad controls outside the kiosk mode" msgstr "" msgid "Keys:" msgstr "" msgid "" "With the credit system, users must eg. add coins before tracks can be " "enqueued. Please\n" "refer to the online help for details about the possibilities and the " "supported hardware." msgstr "" msgid "Use credit system" msgstr "" msgid "Credits may be added by DDE, command line or shortcuts" msgstr "" msgid "Keys..." msgstr "" msgid "Remember credits between program starts" msgstr "" msgid "Current credit:" msgstr "" msgid "Please enter your password to exit the kiosk mode." msgstr "" msgid "" "Too many tracks in queue,\n" "please try again later." msgstr "" msgid "" "This track is already in queue,\n" "please try again later." msgstr "" msgid "" "This track or artist was just played,\n" "please try again later." msgstr "" msgid "Maintenance password" msgstr "" msgid "Exit kiosk mode" msgstr "" msgid "Start kiosk mode" msgstr "" msgid "OK" msgstr "" msgid "Password:" msgstr "" msgid "Invalid password. Please try again." msgstr "" msgid "Invalid track number" msgstr "" msgid "Action:" msgstr "" msgid "Shutdown computer" msgstr "" msgid "Reboot computer" msgstr "" msgid "" "Shift|AltGr|Delete|Clear\n" "all|OK" msgstr "" msgid "" "No virtual keyboard found, please add the *.sjk files to the search paths." msgstr "" #, c-format msgid "An album must have at least %s tracks with corresponding %s." msgstr "" msgid "artist/album" msgstr "" msgid "artist/album or genre" msgstr "" msgid "directory" msgstr "" #, c-format msgid "Compilations may contain up to %s tracks of the same artist." msgstr "" msgid "Separate the words using commas, case is ignored" msgstr "" msgid "Sort by:" msgstr "" msgid "Stop-words for sorting artists:" msgstr "" msgid "Stop-words for sorting albums:" msgstr "" msgid "Show stop-words words at end" msgstr "" msgid "" "If selected, eg. \"The Rolling Stones\" becomes \"Rolling Stones, The\";\n" "sorting itself is not affected by this option" msgstr "" msgid "Keywords to identify cover image for an album:" msgstr "" msgid "Double click on covers" msgstr "" msgid "Select/play album" msgstr "" msgid "Combine tracks to albums" msgstr "" msgid "Updating genres..." msgstr "" msgid "Updating groups..." msgstr "" msgid "Combining tracks to albums..." msgstr "" msgid "Do you want to add the following folder(s) to your music library?" msgstr "" #, c-format msgid "Yes, leave the image in \"%s\"" msgstr "" #, c-format msgid "Yes, copy the image to \"%s\"" msgstr "" #, c-format msgid "Do you want to use the given image as the cover for \"%s\"?" msgstr "" #. TRANSLATORS: %s will be replaced by a filename #, c-format msgid "\"%s\" is not in your music library and cannot be edited therefore." msgstr "" #, c-format msgid "%s tracks on %s albums found for \"%s\"" msgstr "" #, c-format msgid "%s tracks on %s albums" msgstr "" msgid "Albums" msgstr "" msgid "All albums" msgstr "" msgid "Unsorted tracks" msgstr "" #, c-format msgid "Disk %i" msgstr "" msgid "O:" msgstr "" msgid "C:" msgstr "" msgid "Stop prelistening" msgstr "" #, c-format msgid "Prelisten \"%s\"" msgstr "" #, c-format msgid "Enqueue \"%s\"" msgstr "" #, c-format msgid "Play \"%s\" now" msgstr "" #, c-format msgid "Play \"%s\" next" msgstr "" #, c-format msgid "Unqueue \"%s\"" msgstr "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Enqueue %i track" msgid_plural "Enqueue %i tracks" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track now" msgid_plural "Play %i tracks now" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Play %i track next" msgid_plural "Play %i tracks next" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Unqueue %i track" msgid_plural "Unqueue %i tracks" msgstr[0] "" msgstr[1] "" #, c-format msgid "\"%s\" on the web" msgstr "" #, c-format msgid "Average rating: %s" msgstr "" #, c-format msgid "Rating: %s" msgstr "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to change the rating for %i selected track?" msgid_plural "Do you want to change the rating for %i selected tracks?" msgstr[0] "" msgstr[1] "" msgid "Change rating" msgstr "" msgid "Click to select all tracks of this album, double-click to play them" msgstr "" msgid "Click to select all tracks of this artists, double-click to play them" msgstr "" msgid "Click to select all tracks of this disk, double-click to play them" msgstr "" #, c-format msgid "Double-click to enqueue \"%s\"" msgstr "" #. TRANSLATORS: %i will be replaced by the number of tracks #, c-format msgid "Do you want to enqueue %i selected track?" msgid_plural "Do you want to enqueue %i selected tracks?" msgstr[0] "" msgstr[1] "" msgid "Size" msgstr "" msgid "Gain" msgstr "" msgid "Read music-files from the following folders and sources:" msgstr "" msgid "Read music-files from the following sources:" msgstr "" msgid "Add source" msgstr "" msgid "Remove source" msgstr "" msgid "Options" msgstr "" msgid "Supported file types" msgstr "" msgid "Music library" msgstr "" #, c-format msgid "Options for \"%s\"" msgstr "" msgid "Options..." msgstr "" msgid "Jukebox" msgstr "" msgid "Please select a playlist, some files or enter a streaming URL" msgstr "" msgid "Append to current playlist" msgstr "" msgid "Volume control" msgstr "" msgid "Play all tracks of an album with the same volume" msgstr "" msgid "Desired volume:" msgstr "" msgid "Max. gain:" msgstr "" msgid "Current volume:" msgstr "" msgid "Fading" msgstr "" msgid "Crossfading" msgstr "" msgid "Manual crossfades:" msgstr "" msgid "Automatic crossfades:" msgstr "" msgid "Offset to end:" msgstr "" msgid "No crossfades between subsequent tracks of the same album" msgstr "" msgid "Only fade out the old track, the new track starts with full volume" msgstr "" msgid "Resume" msgstr "" msgid "Jingles" msgstr "" msgid "" "The following options define the behaviour of the queue. For the \"shuffle " "intensity\",\n" "small values create only slight variations of the queue order, whereas large " "values\n" "cause major variations." msgstr "" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "Kiosk mode: Allow max. %i track waiting in queue" msgid_plural "Kiosk mode: Allow max. %i tracks waiting in queue" msgstr[0] "" msgstr[1] "" msgid "Kiosk mode: Avoid double tracks waiting in queue" msgstr "" #, c-format msgid "Avoid boredom: No track repetition within %i minutes" msgstr "" #, c-format msgid "Avoid boredom: No artist repetition within %i minutes" msgstr "" msgid "Shuffle intensity:" msgstr "" msgid "" "Here you can decide whether to restore the queue after a restart of " "Silverjuke.\n" "You can restore all or only unplayed titles." msgstr "" msgid "Restore queue" msgstr "" msgid "Restore already played tracks" msgstr "" msgid "Start playback from last position" msgstr "" msgid "" "Use the following options to define which actions should be done " "automatically\n" "after given timeouts." msgstr "" #, c-format msgid "AutoPlay: If the playlist is empty, wait %i minutes;" msgstr "" #, c-format msgid "then, play %i tracks from the %s" msgstr "" msgid "Ignore tracks from the music selection" msgstr "" msgid "Manually enqueued tracks interrupt AutoPlay immediately" msgstr "" msgid "Sleep mode:" msgstr "" msgid "Stop playback" msgstr "" msgid "" "in|after inactivity of|at|always in|always after inactivity of|always at" msgstr "" msgid "minutes|o'clock" msgstr "" #, c-format msgid "Before this, fade out %i seconds" msgstr "" msgid "" "Jingles are normal tracks from your music library that are played\n" "under certain conditions." msgstr "" msgid "If the jukebox is playing, about every" msgstr "" msgid "minutes," msgstr "" msgid "play a track from the music selection" msgstr "" msgid "At" msgstr "" msgid "o'clock," msgstr "" msgid "Daily" msgstr "" msgid "Wait for end of playing track" msgstr "" #, c-format msgid "Go to current track after %i minutes of inactivity" msgstr "" #, c-format msgid "Reset view after %i minutes of inactivity to" msgstr "" #, c-format msgid "Open video screen after %i minutes of inactivity" msgstr "" #, c-format msgid "Close video screen after %i minutes" msgstr "" #, c-format msgid "Limit play time to %i seconds" msgstr "" msgid "Read folders:" msgstr "" msgid "Read file:" msgstr "" msgid "Ignore music-files and images with the following extensions:" msgstr "" msgid "(separate the extensions using the comma, case is ignored)" msgstr "" msgid "Include folder to the update process" msgstr "" msgid "Read hidden files" msgstr "" msgid "Read hidden folders" msgstr "" msgid "Read inside ZIP-/TAR-archives" msgstr "" msgid "Read (ID3)-tags" msgstr "" msgid "Path and file pattern for track-information if (ID3-)tags are missing:" msgstr "" msgid "Placeholders:" msgstr "" msgid "Read files and folders" msgstr "" msgid "Add a folder to search for music-files" msgstr "" msgid "Add a single music-file" msgstr "" msgid "Disabled" msgstr "" msgid "No update" msgstr "" #, c-format msgid "Remove \"%s\" from the music library?" msgstr "" msgid "Select a folder with music-files" msgstr "" msgid "Select music-file" msgstr "" msgid "Unknown track" msgstr "" msgid "Unknown artist" msgstr "" msgid "Add a server containing music-files" msgstr "" msgid "Use server:" msgstr "" msgid "Server:" msgstr "" msgid "Type" msgstr "" msgid "Login name:" msgstr "" msgid "Include server to the update process" msgstr "" msgid "Configuration file" msgstr "" #, c-format msgid "Loading %s" msgstr "" #, c-format msgid "Error %i" msgstr "" msgid "Edit track" msgstr "" msgid "of" msgstr "" msgid "Write (ID3-)tags" msgstr "" msgid "File names" msgstr "" #, c-format msgid "Show all %s file names..." msgstr "" msgid "" "The shown values are the sum or the average of all single values in the " "given files." msgstr "" msgid "Track" msgstr "" msgid "Further information" msgstr "" msgid "URL" msgstr "" msgid "Temporary directory" msgstr "" msgid "Further information..." msgstr "" #, c-format msgid "Cannot rename \"%s\" to \"%s\"." msgstr "" msgid "Server name" msgstr "" msgid "Query online database" msgstr "" msgid "more..." msgstr "" msgid "Please select one of the following albums:" msgstr "" msgid "Old file name" msgstr "" msgid "New file name" msgstr "" msgid "Field" msgstr "" msgid "Old value" msgstr "" msgid "New value" msgstr "" msgid "<empty>" msgstr "" msgid "Confirm modifications" msgstr "" msgid "Delete empty folders" msgstr "" msgid "Please confirm or edit the following modification:" msgstr "" #, c-format msgid "Please confirm or edit the following %s modifications:" msgstr "" msgid "(lower case)" msgstr "" msgid "(upper case)" msgstr "" msgid "(n characters)" msgstr "" msgid "Rename files" msgstr "" msgid "Pattern:" msgstr "" msgid "Artist (first character)" msgstr "" msgid "Album (first character)" msgstr "" msgid "Genre (first character)" msgstr "" msgid "Group (first character)" msgstr "" msgid "Year (4 characters)" msgstr "" msgid "Year (2 characters)" msgstr "" msgid "Duration (5 characters)" msgstr "" msgid "Directory change" msgstr "" msgid "File name (8 characters)" msgstr "" msgid "File extension" msgstr "" msgid "Example:" msgstr "" msgid "Replace" msgstr "" msgid "Search for:" msgstr "" msgid "in:" msgstr "" msgid "All fields" msgstr "" msgid "Path and file name" msgstr "" msgid "Replace with:" msgstr "" msgid "Match whole words only" msgstr "" msgid "Match case" msgstr "" msgid "Regular expression" msgstr "" #, c-format msgid "\"%s\" not found." msgstr "" msgid "Split field" msgstr "" msgid "Field to split:" msgstr "" msgid "Destination fields and pattern:" msgstr "" msgid "Track number (1 character)" msgstr "" msgid "Track number (2 characters)" msgstr "" msgid "Disk number (1 character)" msgstr "" msgid "Disk number (2 characters)" msgstr "" msgid "Void information" msgstr "" #, c-format msgid "" "With different skins you can change the \"look and feel\" of %s. Just\n" "select the skin to use from the list above. You'll find more skins on the " "web." msgstr "" msgid "Name" msgstr "" msgid "Info..." msgstr "" msgid "Update list" msgstr "" msgid "More skins on the web..." msgstr "" msgid "" "You can set independent font and cover sizes to use in the main window. The " "sizes\n" "refer to a zoom of 100%. If you zoom in or out (eg. by using the \"+\" or \"-" "\" keys), both\n" "sizes will grow or shrink proportionally." msgstr "" msgid "Font:" msgstr "" msgid "Font size:" msgstr "" msgid "Use this font for dialogs, too" msgstr "" msgid "Column width:" msgstr "" msgid "Cover size:" msgstr "" msgid "No lyrics found." msgstr "" msgid "Karaoke Prompt" msgstr "" #, c-format msgid "No images found in \"%s\"." msgstr "" msgid "Background" msgstr "" #, c-format msgid "Use %s-files" msgstr "" msgid "Please select a directory with images" msgstr "" msgid "If appropriate, switch over automatically" msgstr "" msgid "Half size" msgstr "" msgid "Spectrum Monitor" msgstr "" msgid "Show spectrum" msgstr "" msgid "Show oscilloscope" msgstr "" msgid "Show starfield" msgstr "" msgid "Show other figures" msgstr "" msgid "Visualization" msgstr "" msgid "Video output" msgstr "" msgid "Search homepage" msgstr "" #, c-format msgid "Lyrics on %s" msgstr "" #, c-format msgid "Search with %s" msgstr "" #, c-format msgid "Information on %s" msgstr "" msgid "Object count:" msgstr "" msgid "Elapsed time:" msgstr "" msgid "Message" msgstr "" msgid "Scope" msgstr "" msgid "Console" msgstr "" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i message" msgid_plural "%i messages" msgstr[0] "" msgstr[1] "" msgid "Evaluate" msgstr "" msgid "Clear" msgstr "" msgid "Open console on errors and warnings" msgstr "" msgid "Details" msgstr "" msgid "Clear all messages?" msgstr "" #, c-format msgid "Overwrite \"%s\"?" msgstr "" msgid "Append" msgstr "" msgid "State" msgstr "" #, c-format msgid "%s-files" msgstr "" #, c-format msgid "%s-audio" msgstr "" #, c-format msgid "%s-images" msgstr "" #, c-format msgid "%s-video" msgstr "" #, c-format msgid "%s-playlists" msgstr "" msgid "Script-files" msgstr "" msgid "Silverjuke skin-files" msgstr "" msgid "Silverjuke jukebox-files" msgstr "" msgid "Archive-files" msgstr "" msgid "Supported file-types" msgstr "" msgid "Test..." msgstr "" msgid "Programs" msgstr "" msgid "Cleanup index..." msgstr "" msgid "max. size" msgstr "" #, c-format msgid "" "Last time %s did not terminate normally.\n" "The following - maybe errorous - objects were in use just before the " "abnormal termination:\n" "\n" "%s\n" "\n" "On continuous problems, try to avoid using these objects.\n" "Do you want to use the objects this time?" msgstr "" msgid "Use maybe errorous objects?" msgstr "" msgid "__DATE_TIME_LONG__" msgstr "" msgid "__DATE_TIME_EDITABLE__" msgstr "" msgid "__DATE_LONG__" msgstr "" msgid "__DATE_EDITABLE__" msgstr "" msgid "__DATE_SUNDAY_FIRST__" msgstr "" msgid "__THIS_LANG__" msgstr "" msgid "__COVER_SEARCH_URLS__" msgstr "" msgid "__ARTIST_INFO_URLS__" msgstr "" msgid "__STOP_ARTISTS__" msgstr "" msgid "__STOP_ALBUMS__" msgstr "" msgid "__COVER_KEYWORDS__" msgstr "" msgid "__VIRT_KEYBD__" msgstr "" #. TRANSLATORS: This is the thousands separator, used for e.g. 10,000 msgid "," msgstr "" #. TRANSLATORS: This is the decimal point, used for e.g. 3.1415926 msgid "." msgstr "" #. TRANSLATORS: %i will be replaced by a number #, c-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #, c-format msgid "Invalid regular expression \"%s\"." msgstr "" msgid "Fatal error" msgstr "" msgid "Ctrl" msgstr "" msgid "Alt" msgstr "" msgid "Shift" msgstr "" msgid "Enlarge window" msgstr "" msgid "Shrink window" msgstr "" msgid "Enlarge display" msgstr "" msgid "Shrink display" msgstr "" msgid "Services" msgstr "" #, c-format msgid "Hide %s" msgstr "" msgid "Hide Others" msgstr "" msgid "Show All" msgstr "" #, c-format msgid "Quit %s" msgstr "" msgid "Extras" msgstr "" msgid "Full screen" msgstr "" msgid "Modules on the web..." msgstr "" msgid "Explore" msgstr "" msgid "Reveal in Finder" msgstr "" #, c-format msgid "The file \"%s\" does not exist." msgstr "" #, c-format msgid "Cannot execute \"%s\"." msgstr "" msgid "Please use the operating system to set Silverjuke to an exclusive mode." msgstr "" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/silverjuke.desktop����������������������������������������������������������������0000664�0000000�0000000�00000001022�12660066715�0017550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Desktop Entry] Version=1.0 Type=Application Name=Silverjuke GenericName=Music Player GenericName[de]=Musikabspieler Comment=Play and organize music in an easy-to-use jukebox style Comment[de]=Abspielen und sortieren von Musik mit einer einfach zu benutzenden Jukebox Keywords=player;mp3;audio;cd;podcast;playlist;karaoke;kiosk mode;musicbox;party; Keywords[de]=abspieler;mp3;audio;cd;podcast;playlist;karaoke;kiosk modus;musicbox;party; TryExec=silverjuke Exec=silverjuke Icon=silverjuke Categories=AudioVideo;Audio;Player;Music ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/silverjuke.spec�������������������������������������������������������������������0000664�0000000�0000000�00000004031�12660066715�0017034�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # spec file for package silverjuke # # cobbled together by thb@documentfoundation.org # # 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 3 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, see http://www.gnu.org/licenses/ . # Name: silverjuke Version: 15.1.5 Release: 0 Summary: Jukebox application to play your music and videos License: GPL-3.0+ Group: Productivity/Multimedia/Sound/Players Url: https://github.com/r10s/silverjuke/archive/v15.1-beta.5.tar.gz Source: silverjuke-v15.1-beta.5.tar.gz BuildRequires: gcc-c++ BuildRequires: libtool BuildRequires: make BuildRequires: pkgconfig BuildRequires: wxWidgets-wxcontainer-devel BuildRequires: xine-devel BuildRoot: %{_tmppath}/%{name}-%{version}-build %description Silverjuke is the easy-to-use jukebox with more than ten yeas of experience, see http://silverjuke.net for further information. %prep %setup -q -n silverjuke-15.1-beta.5 %build ./autogen.sh --prefix=/usr --docdir=%{_docdir}/silverjuke make %{?_smp_mflags} %install %makeinstall %files %defattr(-,root,root,-) %docdir %{_docdir} %dir %{_docdir}/silverjuke %{_docdir}/silverjuke/CHANGES.md %{_docdir}/silverjuke/LICENSE %{_docdir}/silverjuke/README.md %{_docdir}/silverjuke/command-line.md %{_docdir}/silverjuke/dde.md %{_docdir}/silverjuke/localization.md %{_docdir}/silverjuke/plugins.md %{_docdir}/silverjuke/scripting.md %{_docdir}/silverjuke/skinning.md %{_docdir}/silverjuke/user-guide.md %{_docdir}/silverjuke/virtual-keyboards.md %{_bindir}/silverjuke %changelog �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0014566�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/���������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0016376�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/CHANGELOG������������������������������������������������������������0000775�0000000�0000000�00000011716�12660066715�0017621�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������1.3.0 2012-07-18 removed non-standard malloc.h from kiss_fft.h moved -lm to end of link line checked various return values converted python Numeric code to NumPy fixed test of int32_t on 64 bit OS added padding in a couple of places to allow SIMD alignment of structs 1.2.9 2010-05-27 threadsafe ( including OpenMP ) first edition of kissfft.hh the C++ template fft engine 1.2.8 Changed memory.h to string.h -- apparently more standard Added openmp extensions. This can have fairly linear speedups for larger FFT sizes. 1.2.7 Shrank the real-fft memory footprint. Thanks to Galen Seitz. 1.2.6 (Nov 14, 2006) The "thanks to GenArts" release. Added multi-dimensional real-optimized FFT, see tools/kiss_fftndr Thanks go to GenArts, Inc. for sponsoring the development. 1.2.5 (June 27, 2006) The "release for no good reason" release. Changed some harmless code to make some compilers' warnings go away. Added some more digits to pi -- why not. Added kiss_fft_next_fast_size() function to help people decide how much to pad. Changed multidimensional test from 8 dimensions to only 3 to avoid testing problems with fixed point (sorry Buckaroo Banzai). 1.2.4 (Oct 27, 2005) The "oops, inverse fixed point real fft was borked" release. Fixed scaling bug for inverse fixed point real fft -- also fixed test code that should've been failing. Thanks to Jean-Marc Valin for bug report. Use sys/types.h for more portable types than short,int,long => int16_t,int32_t,int64_t If your system does not have these, you may need to define them -- but at least it breaks in a loud and easily fixable way -- unlike silently using the wrong size type. Hopefully tools/psdpng.c is fixed -- thanks to Steve Kellog for pointing out the weirdness. 1.2.3 (June 25, 2005) The "you want to use WHAT as a sample" release. Added ability to use 32 bit fixed point samples -- requires a 64 bit intermediate result, a la 'long long' Added ability to do 4 FFTs in parallel by using SSE SIMD instructions. This is accomplished by using the __m128 (vector of 4 floats) as kiss_fft_scalar. Define USE_SIMD to use this. I know, I know ... this is drifting a bit from the "kiss" principle, but the speed advantages make it worth it for some. Also recent gcc makes it SOO easy to use vectors of 4 floats like a POD type. 1.2.2 (May 6, 2005) The Matthew release Replaced fixed point division with multiply&shift. Thanks to Jean-Marc Valin for discussions regarding. Considerable speedup for fixed-point. Corrected overflow protection in real fft routines when using fixed point. Finder's Credit goes to Robert Oschler of robodance for pointing me at the bug. This also led to the CHECK_OVERFLOW_OP macro. 1.2.1 (April 4, 2004) compiles cleanly with just about every -W warning flag under the sun reorganized kiss_fft_state so it could be read-only/const. This may be useful for embedded systems that are willing to predeclare twiddle factors, factorization. Fixed C_MUL,S_MUL on 16-bit platforms. tmpbuf will only be allocated if input & output buffers are same scratchbuf will only be allocated for ffts that are not multiples of 2,3,5 NOTE: The tmpbuf,scratchbuf changes may require synchronization code for multi-threaded apps. 1.2 (Feb 23, 2004) interface change -- cfg object is forward declaration of struct instead of void* This maintains type saftey and lets the compiler warn/error about stupid mistakes. (prompted by suggestion from Erik de Castro Lopo) small speed improvements added psdpng.c -- sample utility that will create png spectrum "waterfalls" from an input file ( not terribly useful yet) 1.1.1 (Feb 1, 2004 ) minor bug fix -- only affects odd rank, in-place, multi-dimensional FFTs 1.1 : (Jan 30,2004) split sample_code/ into test/ and tools/ Removed 2-D fft and added N-D fft (arbitrary) modified fftutil.c to allow multi-d FFTs Modified core fft routine to allow an input stride via kiss_fft_stride() (eased support of multi-D ffts) Added fast convolution filtering (FIR filtering using overlap-scrap method, with tail scrap) Add kfc.[ch]: the KISS FFT Cache. It takes care of allocs for you ( suggested by Oscar Lesta ). 1.0.1 (Dec 15, 2003) fixed bug that occurred when nfft==1. Thanks to Steven Johnson. 1.0 : (Dec 14, 2003) changed kiss_fft function from using a single buffer, to two buffers. If the same buffer pointer is supplied for both in and out, kiss will manage the buffer copies. added kiss_fft2d and kiss_fftr as separate source files (declarations in kiss_fft.h ) 0.4 :(Nov 4,2003) optimized for radix 2,3,4,5 0.3 :(Oct 28, 2003) woops, version 2 didn't actually factor out any radices other than 2. Thanks to Steven Johnson for finding this one. 0.2 :(Oct 27, 2003) added mixed radix, only radix 2,4 optimized versions 0.1 :(May 19 2003) initial release, radix 2 only ��������������������������������������������������silverjuke-16.2.3/src/kiss_fft/COPYING��������������������������������������������������������������0000775�0000000�0000000�00000002703�12660066715�0017436�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c) 2003-2010 Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. �������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/Makefile�������������������������������������������������������������0000775�0000000�0000000�00000002635�12660066715�0020047�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������KFVER=130 doc: @echo "Start by reading the README file. If you want to build and test lots of stuff, do a 'make testall'" @echo "but be aware that 'make testall' has dependencies that the basic kissfft software does not." @echo "It is generally unneeded to run these tests yourself, unless you plan on changing the inner workings" @echo "of kissfft and would like to make use of its regression tests." testall: # The simd and int32_t types may or may not work on your machine make -C test DATATYPE=simd CFLAGADD="$(CFLAGADD)" test make -C test DATATYPE=int32_t CFLAGADD="$(CFLAGADD)" test make -C test DATATYPE=int16_t CFLAGADD="$(CFLAGADD)" test make -C test DATATYPE=float CFLAGADD="$(CFLAGADD)" test make -C test DATATYPE=double CFLAGADD="$(CFLAGADD)" test echo "all tests passed" tarball: clean hg archive -r v$(KFVER) -t tgz kiss_fft$(KFVER).tar.gz hg archive -r v$(KFVER) -t zip kiss_fft$(KFVER).zip clean: cd test && make clean cd tools && make clean rm -f kiss_fft*.tar.gz *~ *.pyc kiss_fft*.zip asm: kiss_fft.s kiss_fft.s: kiss_fft.c kiss_fft.h _kiss_fft_guts.h [ -e kiss_fft.s ] && mv kiss_fft.s kiss_fft.s~ || true gcc -S kiss_fft.c -O3 -mtune=native -ffast-math -fomit-frame-pointer -unroll-loops -dA -fverbose-asm gcc -o kiss_fft_short.s -S kiss_fft.c -O3 -mtune=native -ffast-math -fomit-frame-pointer -dA -fverbose-asm -DFIXED_POINT [ -e kiss_fft.s~ ] && diff kiss_fft.s~ kiss_fft.s || true ���������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/README���������������������������������������������������������������0000775�0000000�0000000�00000012773�12660066715�0017273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������KISS FFT - A mixed-radix Fast Fourier Transform based up on the principle, "Keep It Simple, Stupid." There are many great fft libraries already around. Kiss FFT is not trying to be better than any of them. It only attempts to be a reasonably efficient, moderately useful FFT that can use fixed or floating data types and can be incorporated into someone's C program in a few minutes with trivial licensing. USAGE: The basic usage for 1-d complex FFT is: #include "kiss_fft.h" kiss_fft_cfg cfg = kiss_fft_alloc( nfft ,is_inverse_fft ,0,0 ); while ... ... // put kth sample in cx_in[k].r and cx_in[k].i kiss_fft( cfg , cx_in , cx_out ); ... // transformed. DC is in cx_out[0].r and cx_out[0].i free(cfg); Note: frequency-domain data is stored from dc up to 2pi. so cx_out[0] is the dc bin of the FFT and cx_out[nfft/2] is the Nyquist bin (if exists) Declarations are in "kiss_fft.h", along with a brief description of the functions you'll need to use. Code definitions for 1d complex FFTs are in kiss_fft.c. You can do other cool stuff with the extras you'll find in tools/ * multi-dimensional FFTs * real-optimized FFTs (returns the positive half-spectrum: (nfft/2+1) complex frequency bins) * fast convolution FIR filtering (not available for fixed point) * spectrum image creation The core fft and most tools/ code can be compiled to use float, double, Q15 short or Q31 samples. The default is float. BACKGROUND: I started coding this because I couldn't find a fixed point FFT that didn't use assembly code. I started with floating point numbers so I could get the theory straight before working on fixed point issues. In the end, I had a little bit of code that could be recompiled easily to do ffts with short, float or double (other types should be easy too). Once I got my FFT working, I was curious about the speed compared to a well respected and highly optimized fft library. I don't want to criticize this great library, so let's call it FFT_BRANDX. During this process, I learned: 1. FFT_BRANDX has more than 100K lines of code. The core of kiss_fft is about 500 lines (cpx 1-d). 2. It took me an embarrassingly long time to get FFT_BRANDX working. 3. A simple program using FFT_BRANDX is 522KB. A similar program using kiss_fft is 18KB (without optimizing for size). 4. FFT_BRANDX is roughly twice as fast as KISS FFT in default mode. It is wonderful that free, highly optimized libraries like FFT_BRANDX exist. But such libraries carry a huge burden of complexity necessary to extract every last bit of performance. Sometimes simpler is better, even if it's not better. FREQUENTLY ASKED QUESTIONS: Q: Can I use kissfft in a project with a ___ license? A: Yes. See LICENSE below. Q: Why don't I get the output I expect? A: The two most common causes of this are 1) scaling : is there a constant multiplier between what you got and what you want? 2) mixed build environment -- all code must be compiled with same preprocessor definitions for FIXED_POINT and kiss_fft_scalar Q: Will you write/debug my code for me? A: Probably not unless you pay me. I am happy to answer pointed and topical questions, but I may refer you to a book, a forum, or some other resource. PERFORMANCE: (on Athlon XP 2100+, with gcc 2.96, float data type) Kiss performed 10000 1024-pt cpx ffts in .63 s of cpu time. For comparison, it took md5sum twice as long to process the same amount of data. Transforming 5 minutes of CD quality audio takes less than a second (nfft=1024). DO NOT: ... use Kiss if you need the Fastest Fourier Transform in the World ... ask me to add features that will bloat the code UNDER THE HOOD: Kiss FFT uses a time decimation, mixed-radix, out-of-place FFT. If you give it an input buffer and output buffer that are the same, a temporary buffer will be created to hold the data. No static data is used. The core routines of kiss_fft are thread-safe (but not all of the tools directory). No scaling is done for the floating point version (for speed). Scaling is done both ways for the fixed-point version (for overflow prevention). Optimized butterflies are used for factors 2,3,4, and 5. The real (i.e. not complex) optimization code only works for even length ffts. It does two half-length FFTs in parallel (packed into real&imag), and then combines them via twiddling. The result is nfft/2+1 complex frequency bins from DC to Nyquist. If you don't know what this means, search the web. The fast convolution filtering uses the overlap-scrap method, slightly modified to put the scrap at the tail. LICENSE: Revised BSD License, see COPYING for verbiage. Basically, "free to use&change, give credit where due, no guarantees" Note this license is compatible with GPL at one end of the spectrum and closed, commercial software at the other end. See http://www.fsf.org/licensing/licenses A commercial license is available which removes the requirement for attribution. Contact me for details. TODO: *) Add real optimization for odd length FFTs *) Document/revisit the input/output fft scaling *) Make doc describing the overlap (tail) scrap fast convolution filtering in kiss_fastfir.c *) Test all the ./tools/ code with fixed point (kiss_fastfir.c doesn't work, maybe others) AUTHOR: Mark Borgerding Mark@Borgerding.net �����silverjuke-16.2.3/src/kiss_fft/README.simd����������������������������������������������������������0000775�0000000�0000000�00000004563�12660066715�0020224�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������If you are reading this, it means you think you may be interested in using the SIMD extensions in kissfft to do 4 *separate* FFTs at once. Beware! Beyond here there be dragons! This API is not easy to use, is not well documented, and breaks the KISS principle. Still reading? Okay, you may get rewarded for your patience with a considerable speedup (2-3x) on intel x86 machines with SSE if you are willing to jump through some hoops. The basic idea is to use the packed 4 float __m128 data type as a scalar element. This means that the format is pretty convoluted. It performs 4 FFTs per fft call on signals A,B,C,D. For complex data, the data is interlaced as follows: rA0,rB0,rC0,rD0, iA0,iB0,iC0,iD0, rA1,rB1,rC1,rD1, iA1,iB1,iC1,iD1 ... where "rA0" is the real part of the zeroth sample for signal A Real-only data is laid out: rA0,rB0,rC0,rD0, rA1,rB1,rC1,rD1, ... Compile with gcc flags something like -O3 -mpreferred-stack-boundary=4 -DUSE_SIMD=1 -msse Be aware of SIMD alignment. This is the most likely cause of segfaults. The code within kissfft uses scratch variables on the stack. With SIMD, these must have addresses on 16 byte boundaries. Search on "SIMD alignment" for more info. Robin at Divide Concept was kind enough to share his code for formatting to/from the SIMD kissfft. I have not run it -- use it at your own risk. It appears to do 4xN and Nx4 transpositions (out of place). void SSETools::pack128(float* target, float* source, unsigned long size128) { __m128* pDest = (__m128*)target; __m128* pDestEnd = pDest+size128; float* source0=source; float* source1=source0+size128; float* source2=source1+size128; float* source3=source2+size128; while(pDest<pDestEnd) { *pDest=_mm_set_ps(*source3,*source2,*source1,*source0); source0++; source1++; source2++; source3++; pDest++; } } void SSETools::unpack128(float* target, float* source, unsigned long size128) { float* pSrc = source; float* pSrcEnd = pSrc+size128*4; float* target0=target; float* target1=target0+size128; float* target2=target1+size128; float* target3=target2+size128; while(pSrc<pSrcEnd) { *target0=pSrc[0]; *target1=pSrc[1]; *target2=pSrc[2]; *target3=pSrc[3]; target0++; target1++; target2++; target3++; pSrc+=4; } } ���������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/TIPS�����������������������������������������������������������������0000775�0000000�0000000�00000004116�12660066715�0017105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Speed: * If you want to use multiple cores, then compile with -openmp or -fopenmp (see your compiler docs). Realize that larger FFTs will reap more benefit than smaller FFTs. This generally uses more CPU time, but less wall time. * experiment with compiler flags Special thanks to Oscar Lesta. He suggested some compiler flags for gcc that make a big difference. They shave 10-15% off execution time on some systems. Try some combination of: -march=pentiumpro -ffast-math -fomit-frame-pointer * If the input data has no imaginary component, use the kiss_fftr code under tools/. Real ffts are roughly twice as fast as complex. * If you can rearrange your code to do 4 FFTs in parallel and you are on a recent Intel or AMD machine, then you might want to experiment with the USE_SIMD code. See README.simd Reducing code size: * remove some of the butterflies. There are currently butterflies optimized for radices 2,3,4,5. It is worth mentioning that you can still use FFT sizes that contain other factors, they just won't be quite as fast. You can decide for yourself whether to keep radix 2 or 4. If you do some work in this area, let me know what you find. * For platforms where ROM/code space is more plentiful than RAM, consider creating a hardcoded kiss_fft_state. In other words, decide which FFT size(s) you want and make a structure with the correct factors and twiddles. * Frank van der Hulst offered numerous suggestions for smaller code size and correct operation on embedded targets. "I'm happy to help anyone who is trying to implement KISSFFT on a micro" Some of these were rolled into the mainline code base: - using long casts to promote intermediate results of short*short multiplication - delaying allocation of buffers that are sometimes unused. In some cases, it may be desirable to limit capability in order to better suit the target: - predefining the twiddle tables for the desired fft size. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/_kiss_fft_guts.h�����������������������������������������������������0000775�0000000�0000000�00000013246�12660066715�0021571�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2010, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" #include <limits.h> #define MAXFACTORS 32 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ struct kiss_fft_state{ int nfft; int inverse; int factors[2*MAXFACTORS]; kiss_fft_cpx twiddles[1]; }; /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #if (FIXED_POINT==32) # define FRACBITS 31 # define SAMPPROD int64_t #define SAMP_MAX 2147483647 #else # define FRACBITS 15 # define SAMPPROD int32_t #define SAMP_MAX 32767 #endif #define SAMP_MIN -SAMP_MAX #if defined(CHECK_OVERFLOW) # define CHECK_OVERFLOW_OP(a,op,b) \ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } #endif # define smul(a,b) ( (SAMPPROD)(a)*(b) ) # define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) # define S_MUL(a,b) sround( smul(a,b) ) # define C_MUL(m,a,b) \ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) # define DIVSCALAR(x,k) \ (x) = sround( smul( x, SAMP_MAX/k ) ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = sround( smul( (c).r , s ) ) ;\ (c).i = sround( smul( (c).i , s ) ) ; }while(0) #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #ifdef FIXED_POINT # define KISS_FFT_COS(phase) floor(.5+SAMP_MAX * cos (phase)) # define KISS_FFT_SIN(phase) floor(.5+SAMP_MAX * sin (phase)) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) /* a debugging function */ #define pcpx(c)\ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) #ifdef KISS_FFT_USE_ALLOCA // define this to allow use of alloca instead of malloc for temporary buffers // Temporary buffers are used in two case: // 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 // 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. #include <alloca.h> #define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) #define KISS_FFT_TMP_FREE(ptr) #else #define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) #define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/kiss_fft.c�����������������������������������������������������������0000775�0000000�0000000�00000030564�12660066715�0020365�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2010, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include "_kiss_fft_guts.h" /* The guts header contains all the multiplication and addition macros that are defined for fixed or floating point complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx * Fout2; kiss_fft_cpx * tw1 = st->twiddles; kiss_fft_cpx t; Fout2 = Fout + m; do{ C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2); C_MUL (t, *Fout2 , *tw1); tw1 += fstride; C_SUB( *Fout2 , *Fout , t ); C_ADDTO( *Fout , t ); ++Fout2; ++Fout; }while (--m); } static void kf_bfly4( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, const size_t m ) { kiss_fft_cpx *tw1,*tw2,*tw3; kiss_fft_cpx scratch[6]; size_t k=m; const size_t m2=2*m; const size_t m3=3*m; tw3 = tw2 = tw1 = st->twiddles; do { C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4); C_MUL(scratch[0],Fout[m] , *tw1 ); C_MUL(scratch[1],Fout[m2] , *tw2 ); C_MUL(scratch[2],Fout[m3] , *tw3 ); C_SUB( scratch[5] , *Fout, scratch[1] ); C_ADDTO(*Fout, scratch[1]); C_ADD( scratch[3] , scratch[0] , scratch[2] ); C_SUB( scratch[4] , scratch[0] , scratch[2] ); C_SUB( Fout[m2], *Fout, scratch[3] ); tw1 += fstride; tw2 += fstride*2; tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); if(st->inverse) { Fout[m].r = scratch[5].r - scratch[4].i; Fout[m].i = scratch[5].i + scratch[4].r; Fout[m3].r = scratch[5].r + scratch[4].i; Fout[m3].i = scratch[5].i - scratch[4].r; }else{ Fout[m].r = scratch[5].r + scratch[4].i; Fout[m].i = scratch[5].i - scratch[4].r; Fout[m3].r = scratch[5].r - scratch[4].i; Fout[m3].i = scratch[5].i + scratch[4].r; } ++Fout; }while(--k); } static void kf_bfly3( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, size_t m ) { size_t k=m; const size_t m2 = 2*m; kiss_fft_cpx *tw1,*tw2; kiss_fft_cpx scratch[5]; kiss_fft_cpx epi3; epi3 = st->twiddles[fstride*m]; tw1=tw2=st->twiddles; do{ C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int u; kiss_fft_cpx scratch[13]; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx *tw; kiss_fft_cpx ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=st->twiddles; for ( u=0; u<m; ++u ) { C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5); scratch[0] = *Fout0; C_MUL(scratch[1] ,*Fout1, tw[u*fstride]); C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]); C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]); C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]); C_ADD( scratch[7],scratch[1],scratch[4]); C_SUB( scratch[10],scratch[1],scratch[4]); C_ADD( scratch[8],scratch[2],scratch[3]); C_SUB( scratch[9],scratch[2],scratch[3]); Fout0->r += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } /* perform the butterfly for one stage of a mixed radix FFT */ static void kf_bfly_generic( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p ) { int u,k,q1,q; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx t; int Norig = st->nfft; kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p); for ( u=0; u<m; ++u ) { k=u; for ( q1=0 ; q1<p ; ++q1 ) { scratch[q1] = Fout[ k ]; C_FIXDIV(scratch[q1],p); k += m; } k=u; for ( q1=0 ; q1<p ; ++q1 ) { int twidx=0; Fout[ k ] = scratch[0]; for (q=1;q<p;++q ) { twidx += fstride * k; if (twidx>=Norig) twidx-=Norig; C_MUL(t,scratch[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } KISS_FFT_TMP_FREE(scratch); } static void kf_work( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride, int in_stride, int * factors, const kiss_fft_cfg st ) { kiss_fft_cpx * Fout_beg=Fout; const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ const kiss_fft_cpx * Fout_end = Fout + p*m; #ifdef _OPENMP // use openmp extensions at the // top-level (not recursive) if (fstride==1 && p<=5) { int k; // execute the p different work units in different threads # pragma omp parallel for for (k=0;k<p;++k) kf_work( Fout +k*m, f+ fstride*in_stride*k,fstride*p,in_stride,factors,st); // all threads have joined by this point switch (p) { case 2: kf_bfly2(Fout,fstride,st,m); break; case 3: kf_bfly3(Fout,fstride,st,m); break; case 4: kf_bfly4(Fout,fstride,st,m); break; case 5: kf_bfly5(Fout,fstride,st,m); break; default: kf_bfly_generic(Fout,fstride,st,m,p); break; } return; } #endif if (m==1) { do{ *Fout = *f; f += fstride*in_stride; }while(++Fout != Fout_end ); }else{ do{ // recursive call: // DFT of size m*p performed by doing // p instances of smaller DFTs of size m, // each one takes a decimated version of the input kf_work( Fout , f, fstride*p, in_stride, factors,st); f += fstride*in_stride; }while( (Fout += m) != Fout_end ); } Fout=Fout_beg; // recombine the p smaller DFTs switch (p) { case 2: kf_bfly2(Fout,fstride,st,m); break; case 3: kf_bfly3(Fout,fstride,st,m); break; case 4: kf_bfly4(Fout,fstride,st,m); break; case 5: kf_bfly5(Fout,fstride,st,m); break; default: kf_bfly_generic(Fout,fstride,st,m,p); break; } } /* facbuf is populated by p1,m1,p2,m2, ... where p[i] * m[i] = m[i-1] m0 = n */ static void kf_factor(int n,int * facbuf) { int p=4; double floor_sqrt; floor_sqrt = floor( sqrt((double)n) ); /*factor out powers of 4, powers of 2, then any remaining primes */ do { while (n % p) { switch (p) { case 4: p = 2; break; case 2: p = 3; break; default: p += 2; break; } if (p > floor_sqrt) p = n; /* no more factors, skip to end */ } n /= p; *facbuf++ = p; *facbuf++ = n; } while (n > 1); } /* * * User-callable function to allocate all necessary storage space for the fft. * * The return value is a contiguous block of memory, allocated with malloc. As such, * It can be freed with free(), rather than a kiss_fft-specific function. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) { kiss_fft_cfg st=NULL; size_t memneeded = sizeof(struct kiss_fft_state) + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ if ( lenmem==NULL ) { st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); }else{ if (mem != NULL && *lenmem >= memneeded) st = (kiss_fft_cfg)mem; *lenmem = memneeded; } if (st) { int i; st->nfft=nfft; st->inverse = inverse_fft; for (i=0;i<nfft;++i) { const double pi=3.141592653589793238462643383279502884197169399375105820974944; double phase = -2*pi*i / nfft; if (st->inverse) phase *= -1; kf_cexp(st->twiddles+i, phase ); } kf_factor(nfft,st->factors); } return st; } void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { //NOTE: this is not really an in-place FFT algorithm. //It just performs an out-of-place FFT into a temp buffer kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft); kf_work(tmpbuf,fin,1,in_stride, st->factors,st); memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); KISS_FFT_TMP_FREE(tmpbuf); }else{ kf_work( fout, fin, 1,in_stride, st->factors,st ); } } void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_fft_stride(cfg,fin,fout,1); } void kiss_fft_cleanup(void) { // nothing needed any more } int kiss_fft_next_fast_size(int n) { while(1) { int m=n; while ( (m%2) == 0 ) m/=2; while ( (m%3) == 0 ) m/=3; while ( (m%5) == 0 ) m/=5; if (m<=1) break; /* n is completely factorable by twos, threes, and fives */ n++; } return n; } ��������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/kiss_fft.h�����������������������������������������������������������0000775�0000000�0000000�00000006345�12660066715�0020372�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef KISS_FFT_H #define KISS_FFT_H #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #ifdef __cplusplus extern "C" { #endif /* ATTENTION! If you would like a : -- a utility that will handle the caching of fft objects -- real-only (no imaginary time component ) FFT -- a multi-dimensional FFT -- a command-line utility to perform ffts -- a command-line utility to perform fast-convolution filtering Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c in the tools/ directory. */ #ifdef USE_SIMD # include <xmmintrin.h> # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) #define KISS_FFT_FREE _mm_free #else #define KISS_FFT_MALLOC malloc #define KISS_FFT_FREE free #endif #ifdef FIXED_POINT #include <sys/types.h> # if (FIXED_POINT == 32) # define kiss_fft_scalar int32_t # else # define kiss_fft_scalar int16_t # endif #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # endif #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct kiss_fft_state* kiss_fft_cfg; /* * kiss_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); /* * kiss_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); /* A more generic version of the above function. It reads its input from every Nth sample. * */ void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); /* If kiss_fft_alloc allocated a buffer, it is one contiguous buffer and can be simply free()d when no longer needed*/ #define kiss_fft_free free /* Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up your compiler output to call this before you exit. */ void kiss_fft_cleanup(void); /* * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) */ int kiss_fft_next_fast_size(int n); /* for real ffts, we need an even size */ #define kiss_fftr_next_fast_size_real(n) \ (kiss_fft_next_fast_size( ((n)+1)>>1)<<1) #ifdef __cplusplus } #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/kissfft.hh�����������������������������������������������������������0000775�0000000�0000000�00000024575�12660066715�0020410�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef KISSFFT_CLASS_HH #include <complex> #include <vector> namespace kissfft_utils { template <typename T_scalar> struct traits { typedef T_scalar scalar_type; typedef std::complex<scalar_type> cpx_type; void fill_twiddles( std::complex<T_scalar> * dst ,int nfft,bool inverse) { T_scalar phinc = (inverse?2:-2)* acos( (T_scalar) -1) / nfft; for (int i=0;i<nfft;++i) dst[i] = exp( std::complex<T_scalar>(0,i*phinc) ); } void prepare( std::vector< std::complex<T_scalar> > & dst, int nfft,bool inverse, std::vector<int> & stageRadix, std::vector<int> & stageRemainder ) { _twiddles.resize(nfft); fill_twiddles( &_twiddles[0],nfft,inverse); dst = _twiddles; //factorize //start factoring out 4's, then 2's, then 3,5,7,9,... int n= nfft; int p=4; do { while (n % p) { switch (p) { case 4: p = 2; break; case 2: p = 3; break; default: p += 2; break; } if (p*p>n) p=n;// no more factors } n /= p; stageRadix.push_back(p); stageRemainder.push_back(n); }while(n>1); } std::vector<cpx_type> _twiddles; const cpx_type twiddle(int i) { return _twiddles[i]; } }; } template <typename T_Scalar, typename T_traits=kissfft_utils::traits<T_Scalar> > class kissfft { public: typedef T_traits traits_type; typedef typename traits_type::scalar_type scalar_type; typedef typename traits_type::cpx_type cpx_type; kissfft(int nfft,bool inverse,const traits_type & traits=traits_type() ) :_nfft(nfft),_inverse(inverse),_traits(traits) { _traits.prepare(_twiddles, _nfft,_inverse ,_stageRadix, _stageRemainder); } void transform(const cpx_type * src , cpx_type * dst) { kf_work(0, dst, src, 1,1); } private: void kf_work( int stage,cpx_type * Fout, const cpx_type * f, size_t fstride,size_t in_stride) { int p = _stageRadix[stage]; int m = _stageRemainder[stage]; cpx_type * Fout_beg = Fout; cpx_type * Fout_end = Fout + p*m; if (m==1) { do{ *Fout = *f; f += fstride*in_stride; }while(++Fout != Fout_end ); }else{ do{ // recursive call: // DFT of size m*p performed by doing // p instances of smaller DFTs of size m, // each one takes a decimated version of the input kf_work(stage+1, Fout , f, fstride*p,in_stride); f += fstride*in_stride; }while( (Fout += m) != Fout_end ); } Fout=Fout_beg; // recombine the p smaller DFTs switch (p) { case 2: kf_bfly2(Fout,fstride,m); break; case 3: kf_bfly3(Fout,fstride,m); break; case 4: kf_bfly4(Fout,fstride,m); break; case 5: kf_bfly5(Fout,fstride,m); break; default: kf_bfly_generic(Fout,fstride,m,p); break; } } // these were #define macros in the original kiss_fft void C_ADD( cpx_type & c,const cpx_type & a,const cpx_type & b) { c=a+b;} void C_MUL( cpx_type & c,const cpx_type & a,const cpx_type & b) { c=a*b;} void C_SUB( cpx_type & c,const cpx_type & a,const cpx_type & b) { c=a-b;} void C_ADDTO( cpx_type & c,const cpx_type & a) { c+=a;} void C_FIXDIV( cpx_type & ,int ) {} // NO-OP for float types scalar_type S_MUL( const scalar_type & a,const scalar_type & b) { return a*b;} scalar_type HALF_OF( const scalar_type & a) { return a*.5;} void C_MULBYSCALAR(cpx_type & c,const scalar_type & a) {c*=a;} void kf_bfly2( cpx_type * Fout, const size_t fstride, int m) { for (int k=0;k<m;++k) { cpx_type t = Fout[m+k] * _traits.twiddle(k*fstride); Fout[m+k] = Fout[k] - t; Fout[k] += t; } } void kf_bfly4( cpx_type * Fout, const size_t fstride, const size_t m) { cpx_type scratch[7]; int negative_if_inverse = _inverse * -2 +1; for (size_t k=0;k<m;++k) { scratch[0] = Fout[k+m] * _traits.twiddle(k*fstride); scratch[1] = Fout[k+2*m] * _traits.twiddle(k*fstride*2); scratch[2] = Fout[k+3*m] * _traits.twiddle(k*fstride*3); scratch[5] = Fout[k] - scratch[1]; Fout[k] += scratch[1]; scratch[3] = scratch[0] + scratch[2]; scratch[4] = scratch[0] - scratch[2]; scratch[4] = cpx_type( scratch[4].imag()*negative_if_inverse , -scratch[4].real()* negative_if_inverse ); Fout[k+2*m] = Fout[k] - scratch[3]; Fout[k] += scratch[3]; Fout[k+m] = scratch[5] + scratch[4]; Fout[k+3*m] = scratch[5] - scratch[4]; } } void kf_bfly3( cpx_type * Fout, const size_t fstride, const size_t m) { size_t k=m; const size_t m2 = 2*m; cpx_type *tw1,*tw2; cpx_type scratch[5]; cpx_type epi3; epi3 = _twiddles[fstride*m]; tw1=tw2=&_twiddles[0]; do{ C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m] = cpx_type( Fout->real() - HALF_OF(scratch[3].real() ) , Fout->imag() - HALF_OF(scratch[3].imag() ) ); C_MULBYSCALAR( scratch[0] , epi3.imag() ); C_ADDTO(*Fout,scratch[3]); Fout[m2] = cpx_type( Fout[m].real() + scratch[0].imag() , Fout[m].imag() - scratch[0].real() ); C_ADDTO( Fout[m] , cpx_type( -scratch[0].imag(),scratch[0].real() ) ); ++Fout; }while(--k); } void kf_bfly5( cpx_type * Fout, const size_t fstride, const size_t m) { cpx_type *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; size_t u; cpx_type scratch[13]; cpx_type * twiddles = &_twiddles[0]; cpx_type *tw; cpx_type ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=twiddles; for ( u=0; u<m; ++u ) { C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5); scratch[0] = *Fout0; C_MUL(scratch[1] ,*Fout1, tw[u*fstride]); C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]); C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]); C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]); C_ADD( scratch[7],scratch[1],scratch[4]); C_SUB( scratch[10],scratch[1],scratch[4]); C_ADD( scratch[8],scratch[2],scratch[3]); C_SUB( scratch[9],scratch[2],scratch[3]); C_ADDTO( *Fout0, scratch[7]); C_ADDTO( *Fout0, scratch[8]); scratch[5] = scratch[0] + cpx_type( S_MUL(scratch[7].real(),ya.real() ) + S_MUL(scratch[8].real() ,yb.real() ), S_MUL(scratch[7].imag(),ya.real()) + S_MUL(scratch[8].imag(),yb.real()) ); scratch[6] = cpx_type( S_MUL(scratch[10].imag(),ya.imag()) + S_MUL(scratch[9].imag(),yb.imag()), -S_MUL(scratch[10].real(),ya.imag()) - S_MUL(scratch[9].real(),yb.imag()) ); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11] = scratch[0] + cpx_type( S_MUL(scratch[7].real(),yb.real()) + S_MUL(scratch[8].real(),ya.real()), S_MUL(scratch[7].imag(),yb.real()) + S_MUL(scratch[8].imag(),ya.real()) ); scratch[12] = cpx_type( -S_MUL(scratch[10].imag(),yb.imag()) + S_MUL(scratch[9].imag(),ya.imag()), S_MUL(scratch[10].real(),yb.imag()) - S_MUL(scratch[9].real(),ya.imag()) ); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } /* perform the butterfly for one stage of a mixed radix FFT */ void kf_bfly_generic( cpx_type * Fout, const size_t fstride, int m, int p ) { int u,k,q1,q; cpx_type * twiddles = &_twiddles[0]; cpx_type t; int Norig = _nfft; cpx_type scratchbuf[p]; for ( u=0; u<m; ++u ) { k=u; for ( q1=0 ; q1<p ; ++q1 ) { scratchbuf[q1] = Fout[ k ]; C_FIXDIV(scratchbuf[q1],p); k += m; } k=u; for ( q1=0 ; q1<p ; ++q1 ) { int twidx=0; Fout[ k ] = scratchbuf[0]; for (q=1;q<p;++q ) { twidx += fstride * k; if (twidx>=Norig) twidx-=Norig; C_MUL(t,scratchbuf[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } } int _nfft; bool _inverse; std::vector<cpx_type> _twiddles; std::vector<int> _stageRadix; std::vector<int> _stageRemainder; traits_type _traits; }; #endif �����������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/����������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0017355�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/Makefile��������������������������������������������������������0000775�0000000�0000000�00000005204�12660066715�0021021�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ WARNINGS=-W -Wall -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return \ -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast \ -Wwrite-strings CFLAGS=-O3 -I.. -I../tools $(WARNINGS) CFLAGS+=-ffast-math -fomit-frame-pointer #CFLAGS+=-funroll-loops #CFLAGS+=-march=prescott #CFLAGS+= -mtune=native # TIP: try adding -openmp or -fopenmp to enable OPENMP directives and use of multiple cores #CFLAGS+=-fopenmp CFLAGS+= $(CFLAGADD) ifeq "$(NFFT)" "" NFFT=1800 endif ifeq "$(NUMFFTS)" "" NUMFFTS=10000 endif ifeq "$(DATATYPE)" "" DATATYPE=float endif BENCHKISS=bm_kiss_$(DATATYPE) BENCHFFTW=bm_fftw_$(DATATYPE) SELFTEST=st_$(DATATYPE) TESTREAL=tr_$(DATATYPE) TESTKFC=tkfc_$(DATATYPE) FASTFILTREAL=ffr_$(DATATYPE) SELFTESTSRC=twotonetest.c TYPEFLAGS=-Dkiss_fft_scalar=$(DATATYPE) ifeq "$(DATATYPE)" "int16_t" TYPEFLAGS=-DFIXED_POINT=16 endif ifeq "$(DATATYPE)" "int32_t" TYPEFLAGS=-DFIXED_POINT=32 endif ifeq "$(DATATYPE)" "simd" TYPEFLAGS=-DUSE_SIMD=1 -msse endif ifeq "$(DATATYPE)" "float" # fftw needs to be built with --enable-float to build this lib FFTWLIB=-lfftw3f else FFTWLIB=-lfftw3 endif FFTWLIBDIR=-L/usr/local/lib/ SRCFILES=../kiss_fft.c ../tools/kiss_fftnd.c ../tools/kiss_fftr.c pstats.c ../tools/kfc.c ../tools/kiss_fftndr.c all: tools $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(TESTKFC) tools: cd ../tools && make all $(SELFTEST): $(SELFTESTSRC) $(SRCFILES) $(CC) -o $@ $(CFLAGS) $(TYPEFLAGS) $+ -lm $(TESTKFC): $(SRCFILES) $(CC) -o $@ $(CFLAGS) -DKFC_TEST $(TYPEFLAGS) $+ -lm $(TESTREAL): test_real.c $(SRCFILES) $(CC) -o $@ $(CFLAGS) $(TYPEFLAGS) $+ -lm $(BENCHKISS): benchkiss.c $(SRCFILES) $(CC) -o $@ $(CFLAGS) $(TYPEFLAGS) $+ -lm $(BENCHFFTW): benchfftw.c pstats.c @echo "======attempting to build FFTW benchmark" @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) $+ $(FFTWLIB) $(FFTWLIBDIR) -lm || echo "FFTW not available for comparison" test: all @./$(TESTKFC) @echo "======1d & 2-d complex fft self test (type= $(DATATYPE) )" @./$(SELFTEST) @echo "======real FFT (type= $(DATATYPE) )" @./$(TESTREAL) @echo "======timing test (type=$(DATATYPE))" @./$(BENCHKISS) -x $(NUMFFTS) -n $(NFFT) @[ -x ./$(BENCHFFTW) ] && ./$(BENCHFFTW) -x $(NUMFFTS) -n $(NFFT) ||true @echo "======higher dimensions type=$(DATATYPE))" @./testkiss.py selftest.c: ./mk_test.py 10 12 14 > selftest.c selftest_short.c: ./mk_test.py -s 10 12 14 > selftest_short.c CXXFLAGS=-O3 -ffast-math -fomit-frame-pointer -I.. -I../tools -W -Wall testcpp: testcpp.cc ../kissfft.hh $(CXX) -o $@ $(CXXFLAGS) testcpp.cc -lm clean: rm -f *~ bm_* st_* tr_* kf_* tkfc_* ff_* ffr_* *.pyc *.pyo *.dat testcpp ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/benchfftw.c�����������������������������������������������������0000775�0000000�0000000�00000003620�12660066715�0021473�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include <fftw3.h> #include <unistd.h> #include "pstats.h" #ifdef DATATYPEdouble #define CPXTYPE fftw_complex #define PLAN fftw_plan #define FFTMALLOC fftw_malloc #define MAKEPLAN fftw_plan_dft_1d #define DOFFT fftw_execute #define DESTROYPLAN fftw_destroy_plan #define FFTFREE fftw_free #elif defined(DATATYPEfloat) #define CPXTYPE fftwf_complex #define PLAN fftwf_plan #define FFTMALLOC fftwf_malloc #define MAKEPLAN fftwf_plan_dft_1d #define DOFFT fftwf_execute #define DESTROYPLAN fftwf_destroy_plan #define FFTFREE fftwf_free #endif #ifndef CPXTYPE int main(void) { fprintf(stderr,"Datatype not available in FFTW\n" ); return 0; } #else int main(int argc,char ** argv) { int nfft=1024; int isinverse=0; int numffts=1000,i; CPXTYPE * in=NULL; CPXTYPE * out=NULL; PLAN p; pstats_init(); while (1) { int c = getopt (argc, argv, "n:ix:h"); if (c == -1) break; switch (c) { case 'n': nfft = atoi (optarg); break; case 'x': numffts = atoi (optarg); break; case 'i': isinverse = 1; break; case 'h': case '?': default: fprintf(stderr,"options:\n-n N: complex fft length\n-i: inverse\n-x N: number of ffts to compute\n" ""); } } in=FFTMALLOC(sizeof(CPXTYPE) * nfft); out=FFTMALLOC(sizeof(CPXTYPE) * nfft); for (i=0;i<nfft;++i ) { in[i][0] = rand() - RAND_MAX/2; in[i][1] = rand() - RAND_MAX/2; } if ( isinverse ) p = MAKEPLAN(nfft, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); else p = MAKEPLAN(nfft, in, out, FFTW_FORWARD, FFTW_ESTIMATE); for (i=0;i<numffts;++i) DOFFT(p); DESTROYPLAN(p); FFTFREE(in); FFTFREE(out); fprintf(stderr,"fftw\tnfft=%d\tnumffts=%d\n", nfft,numffts); pstats_report(); return 0; } #endif ����������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/benchkiss.c�����������������������������������������������������0000775�0000000�0000000�00000006335�12660066715�0021504�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include <sys/times.h> #include <unistd.h> #include "kiss_fft.h" #include "kiss_fftr.h" #include "kiss_fftnd.h" #include "kiss_fftndr.h" #include "pstats.h" static int getdims(int * dims, char * arg) { char *s; int ndims=0; while ( (s=strtok( arg , ",") ) ) { dims[ndims++] = atoi(s); //printf("%s=%d\n",s,dims[ndims-1]); arg=NULL; } return ndims; } int main(int argc,char ** argv) { int k; int nfft[32]; int ndims = 1; int isinverse=0; int numffts=1000,i; kiss_fft_cpx * buf; kiss_fft_cpx * bufout; int real = 0; nfft[0] = 1024;// default while (1) { int c = getopt (argc, argv, "n:ix:r"); if (c == -1) break; switch (c) { case 'r': real = 1; break; case 'n': ndims = getdims(nfft, optarg ); if (nfft[0] != kiss_fft_next_fast_size(nfft[0]) ) { int ng = kiss_fft_next_fast_size(nfft[0]); fprintf(stderr,"warning: %d might be a better choice for speed than %d\n",ng,nfft[0]); } break; case 'x': numffts = atoi (optarg); break; case 'i': isinverse = 1; break; } } int nbytes = sizeof(kiss_fft_cpx); for (k=0;k<ndims;++k) nbytes *= nfft[k]; #ifdef USE_SIMD numffts /= 4; fprintf(stderr,"since SIMD implementation does 4 ffts at a time, numffts is being reduced to %d\n",numffts); #endif buf=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes); bufout=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes); memset(buf,0,nbytes); pstats_init(); if (ndims==1) { if (real) { kiss_fftr_cfg st = kiss_fftr_alloc( nfft[0] ,isinverse ,0,0); if (isinverse) for (i=0;i<numffts;++i) kiss_fftri( st ,(kiss_fft_cpx*)buf,(kiss_fft_scalar*)bufout ); else for (i=0;i<numffts;++i) kiss_fftr( st ,(kiss_fft_scalar*)buf,(kiss_fft_cpx*)bufout ); free(st); }else{ kiss_fft_cfg st = kiss_fft_alloc( nfft[0] ,isinverse ,0,0); for (i=0;i<numffts;++i) kiss_fft( st ,buf,bufout ); free(st); } }else{ if (real) { kiss_fftndr_cfg st = kiss_fftndr_alloc( nfft,ndims ,isinverse ,0,0); if (isinverse) for (i=0;i<numffts;++i) kiss_fftndri( st ,(kiss_fft_cpx*)buf,(kiss_fft_scalar*)bufout ); else for (i=0;i<numffts;++i) kiss_fftndr( st ,(kiss_fft_scalar*)buf,(kiss_fft_cpx*)bufout ); free(st); }else{ kiss_fftnd_cfg st= kiss_fftnd_alloc(nfft,ndims,isinverse ,0,0); for (i=0;i<numffts;++i) kiss_fftnd( st ,buf,bufout ); free(st); } } free(buf); free(bufout); fprintf(stderr,"KISS\tnfft="); for (k=0;k<ndims;++k) fprintf(stderr, "%d,",nfft[k]); fprintf(stderr,"\tnumffts=%d\n" ,numffts); pstats_report(); kiss_fft_cleanup(); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/compfft.py������������������������������������������������������0000775�0000000�0000000�00000004213�12660066715�0021370�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # use FFTPACK as a baseline import FFT from Numeric import * import math import random import sys import struct import fft pi=math.pi e=math.e j=complex(0,1) lims=(-32768,32767) def randbuf(n,cpx=1): res = array( [ random.uniform( lims[0],lims[1] ) for i in range(n) ] ) if cpx: res = res + j*randbuf(n,0) return res def main(): from getopt import getopt import popen2 opts,args = getopt( sys.argv[1:],'u:n:Rt:' ) opts=dict(opts) exitcode=0 util = opts.get('-u','./kf_float') try: dims = [ int(d) for d in opts['-n'].split(',')] cpx = opts.get('-R') is None fmt=opts.get('-t','f') except KeyError: sys.stderr.write(""" usage: compfft.py -n d1[,d2,d3...] : FFT dimension(s) -u utilname : see sample_code/fftutil.c, default = ./kf_float -R : real-optimized version\n""") sys.exit(1) x = fft.make_random( dims ) cmd = '%s -n %s ' % ( util, ','.join([ str(d) for d in dims]) ) if cpx: xout = FFT.fftnd(x) xout = reshape(xout,(size(xout),)) else: cmd += '-R ' xout = FFT.real_fft(x) proc = popen2.Popen3( cmd , bufsize=len(x) ) proc.tochild.write( dopack( x , fmt ,cpx ) ) proc.tochild.close() xoutcomp = dounpack( proc.fromchild.read( ) , fmt ,1 ) #xoutcomp = reshape( xoutcomp , dims ) sig = xout * conjugate(xout) sigpow = sum( sig ) diff = xout-xoutcomp noisepow = sum( diff * conjugate(diff) ) snr = 10 * math.log10(abs( sigpow / noisepow ) ) if snr<100: print xout print xoutcomp exitcode=1 print 'NFFT=%s,SNR = %f dB' % (str(dims),snr) sys.exit(exitcode) def dopack(x,fmt,cpx): x = reshape( x, ( size(x),) ) if cpx: s = ''.join( [ struct.pack('ff',c.real,c.imag) for c in x ] ) else: s = ''.join( [ struct.pack('f',c) for c in x ] ) return s def dounpack(x,fmt,cpx): uf = fmt * ( len(x) / 4 ) s = struct.unpack(uf,x) if cpx: return array(s[::2]) + array( s[1::2] )*j else: return array(s ) if __name__ == "__main__": main() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/doit.c����������������������������������������������������������0000775�0000000�0000000�00000010273�12660066715�0020466�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* this program is in the public domain A program that helps the authors of the fine fftw library benchmark kiss */ #include "bench-user.h" #include <math.h> #include "kiss_fft.h" #include "kiss_fftnd.h" #include "kiss_fftr.h" BEGIN_BENCH_DOC BENCH_DOC("name", "kissfft") BENCH_DOC("version", "1.0.1") BENCH_DOC("year", "2004") BENCH_DOC("author", "Mark Borgerding") BENCH_DOC("language", "C") BENCH_DOC("url", "http://sourceforge.net/projects/kissfft/") BENCH_DOC("copyright", "Copyright (c) 2003,4 Mark Borgerding\n" "\n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n" "\n" " * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n" " * 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.\n" " * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n" "\n" "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.\n") END_BENCH_DOC int can_do(struct problem *p) { if (p->rank == 1) { if (p->kind == PROBLEM_REAL) { return (p->n[0] & 1) == 0; /* only even real is okay */ } else { return 1; } } else { return p->kind == PROBLEM_COMPLEX; } } static kiss_fft_cfg cfg=NULL; static kiss_fftr_cfg cfgr=NULL; static kiss_fftnd_cfg cfgnd=NULL; #define FAILIF( c ) \ if ( c ) do {\ fprintf(stderr,\ "kissfft: " #c " (file=%s:%d errno=%d %s)\n",\ __FILE__,__LINE__ , errno,strerror( errno ) ) ;\ exit(1);\ }while(0) void setup(struct problem *p) { size_t i; /* fprintf(stderr,"%s %s %d-d ", (p->sign == 1)?"Inverse":"Forward", p->kind == PROBLEM_COMPLEX?"Complex":"Real", p->rank); */ if (p->rank == 1) { if (p->kind == PROBLEM_COMPLEX) { cfg = kiss_fft_alloc (p->n[0], (p->sign == 1), 0, 0); FAILIF(cfg==NULL); }else{ cfgr = kiss_fftr_alloc (p->n[0], (p->sign == 1), 0, 0); FAILIF(cfgr==NULL); } }else{ int dims[5]; for (i=0;i<p->rank;++i){ dims[i] = p->n[i]; } /* multi-dimensional */ if (p->kind == PROBLEM_COMPLEX) { cfgnd = kiss_fftnd_alloc( dims , p->rank, (p->sign == 1), 0, 0 ); FAILIF(cfgnd==NULL); } } } void doit(int iter, struct problem *p) { int i; void *in = p->in; void *out = p->out; if (p->in_place) out = p->in; if (p->rank == 1) { if (p->kind == PROBLEM_COMPLEX){ for (i = 0; i < iter; ++i) kiss_fft (cfg, in, out); } else { /* PROBLEM_REAL */ if (p->sign == -1) /* FORWARD */ for (i = 0; i < iter; ++i) kiss_fftr (cfgr, in, out); else for (i = 0; i < iter; ++i) kiss_fftri (cfgr, in, out); } }else{ /* multi-dimensional */ for (i = 0; i < iter; ++i) kiss_fftnd(cfgnd,in,out); } } void done(struct problem *p) { free(cfg); cfg=NULL; free(cfgr); cfgr=NULL; free(cfgnd); cfgnd=NULL; UNUSED(p); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/fastfir.py������������������������������������������������������0000775�0000000�0000000�00000005066�12660066715�0021377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python from Numeric import * from FFT import * def make_random(len): import random res=[] for i in range(int(len)): r=random.uniform(-1,1) i=random.uniform(-1,1) res.append( complex(r,i) ) return res def slowfilter(sig,h): translen = len(h)-1 return convolve(sig,h)[translen:-translen] def nextpow2(x): return 2 ** math.ceil(math.log(x)/math.log(2)) def fastfilter(sig,h,nfft=None): if nfft is None: nfft = int( nextpow2( 2*len(h) ) ) H = fft( h , nfft ) scraplen = len(h)-1 keeplen = nfft-scraplen res=[] isdone = 0 lastidx = nfft idx0 = 0 while not isdone: idx1 = idx0 + nfft if idx1 >= len(sig): idx1 = len(sig) lastidx = idx1-idx0 if lastidx <= scraplen: break isdone = 1 Fss = fft(sig[idx0:idx1],nfft) fm = Fss * H m = inverse_fft(fm) res.append( m[scraplen:lastidx] ) idx0 += keeplen return concatenate( res ) def main(): import sys from getopt import getopt opts,args = getopt(sys.argv[1:],'rn:l:') opts=dict(opts) siglen = int(opts.get('-l',1e4 ) ) hlen =50 nfft = int(opts.get('-n',128) ) usereal = opts.has_key('-r') print 'nfft=%d'%nfft # make a signal sig = make_random( siglen ) # make an impulse response h = make_random( hlen ) #h=[1]*2+[0]*3 if usereal: sig=[c.real for c in sig] h=[c.real for c in h] # perform MAC filtering yslow = slowfilter(sig,h) #print '<YSLOW>',yslow,'</YSLOW>' #yfast = fastfilter(sig,h,nfft) yfast = utilfastfilter(sig,h,nfft,usereal) #print yfast print 'len(yslow)=%d'%len(yslow) print 'len(yfast)=%d'%len(yfast) diff = yslow-yfast snr = 10*log10( abs( vdot(yslow,yslow) / vdot(diff,diff) ) ) print 'snr=%s' % snr if snr < 10.0: print 'h=',h print 'sig=',sig[:5],'...' print 'yslow=',yslow[:5],'...' print 'yfast=',yfast[:5],'...' def utilfastfilter(sig,h,nfft,usereal): import compfft import os open( 'sig.dat','w').write( compfft.dopack(sig,'f',not usereal) ) open( 'h.dat','w').write( compfft.dopack(h,'f',not usereal) ) if usereal: util = './fastconvr' else: util = './fastconv' cmd = 'time %s -n %d -i sig.dat -h h.dat -o out.dat' % (util, nfft) print cmd ec = os.system(cmd) print 'exited->',ec return compfft.dounpack(open('out.dat').read(),'f',not usereal) if __name__ == "__main__": main() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/fft.py����������������������������������������������������������0000775�0000000�0000000�00000011272�12660066715�0020514�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import math import sys import random pi=math.pi e=math.e j=complex(0,1) def fft(f,inv): n=len(f) if n==1: return f for p in 2,3,5: if n%p==0: break else: raise Exception('%s not factorable ' % n) m = n/p Fout=[] for q in range(p): # 0,1 fp = f[q::p] # every p'th time sample Fp = fft( fp ,inv) Fout.extend( Fp ) for u in range(m): scratch = Fout[u::m] # u to end in strides of m for q1 in range(p): k = q1*m + u # indices to Fout above that became scratch Fout[ k ] = scratch[0] # cuz e**0==1 in loop below for q in range(1,p): if inv: t = e ** ( j*2*pi*k*q/n ) else: t = e ** ( -j*2*pi*k*q/n ) Fout[ k ] += scratch[q] * t return Fout def rifft(F): N = len(F) - 1 Z = [0] * (N) for k in range(N): Fek = ( F[k] + F[-k-1].conjugate() ) Fok = ( F[k] - F[-k-1].conjugate() ) * e ** (j*pi*k/N) Z[k] = Fek + j*Fok fp = fft(Z , 1) f = [] for c in fp: f.append(c.real) f.append(c.imag) return f def real_fft( f,inv ): if inv: return rifft(f) N = len(f) / 2 res = f[::2] ims = f[1::2] fp = [ complex(r,i) for r,i in zip(res,ims) ] print 'fft input ', fp Fp = fft( fp ,0 ) print 'fft output ', Fp F = [ complex(0,0) ] * ( N+1 ) F[0] = complex( Fp[0].real + Fp[0].imag , 0 ) for k in range(1,N/2+1): tw = e ** ( -j*pi*(.5+float(k)/N ) ) F1k = Fp[k] + Fp[N-k].conjugate() F2k = Fp[k] - Fp[N-k].conjugate() F2k *= tw F[k] = ( F1k + F2k ) * .5 F[N-k] = ( F1k - F2k ).conjugate() * .5 #F[N-k] = ( F1kp + e ** ( -j*pi*(.5+float(N-k)/N ) ) * F2kp ) * .5 #F[N-k] = ( F1k.conjugate() - tw.conjugate() * F2k.conjugate() ) * .5 F[N] = complex( Fp[0].real - Fp[0].imag , 0 ) return F def main(): #fft_func = fft fft_func = real_fft tvec = [0.309655,0.815653,0.768570,0.591841,0.404767,0.637617,0.007803,0.012665] Ftvec = [ complex(r,i) for r,i in zip( [3.548571,-0.378761,-0.061950,0.188537,-0.566981,0.188537,-0.061950,-0.378761], [0.000000,-1.296198,-0.848764,0.225337,0.000000,-0.225337,0.848764,1.296198] ) ] F = fft_func( tvec,0 ) nerrs= 0 for i in range(len(Ftvec)/2 + 1): if abs( F[i] - Ftvec[i] )> 1e-5: print 'F[%d]: %s != %s' % (i,F[i],Ftvec[i]) nerrs += 1 print '%d errors in forward fft' % nerrs if nerrs: return trec = fft_func( F , 1 ) for i in range(len(trec) ): trec[i] /= len(trec) for i in range(len(tvec) ): if abs( trec[i] - tvec[i] )> 1e-5: print 't[%d]: %s != %s' % (i,tvec[i],trec[i]) nerrs += 1 print '%d errors in reverse fft' % nerrs def make_random(dims=[1]): import Numeric res = [] for i in range(dims[0]): if len(dims)==1: r=random.uniform(-1,1) i=random.uniform(-1,1) res.append( complex(r,i) ) else: res.append( make_random( dims[1:] ) ) return Numeric.array(res) def flatten(x): import Numeric ntotal = Numeric.product(Numeric.shape(x)) return Numeric.reshape(x,(ntotal,)) def randmat( ndims ): dims=[] for i in range( ndims ): curdim = int( random.uniform(2,4) ) dims.append( curdim ) return make_random(dims ) def test_fftnd(ndims=3): import FFT import Numeric x=randmat( ndims ) print 'dimensions=%s' % str( Numeric.shape(x) ) #print 'x=%s' %str(x) xver = FFT.fftnd(x) x2=myfftnd(x) err = xver - x2 errf = flatten(err) xverf = flatten(xver) errpow = Numeric.vdot(errf,errf)+1e-10 sigpow = Numeric.vdot(xverf,xverf)+1e-10 snr = 10*math.log10(abs(sigpow/errpow) ) if snr<80: print xver print x2 print 'SNR=%sdB' % str( snr ) def myfftnd(x): import Numeric xf = flatten(x) Xf = fftndwork( xf , Numeric.shape(x) ) return Numeric.reshape(Xf,Numeric.shape(x) ) def fftndwork(x,dims): import Numeric dimprod=Numeric.product( dims ) for k in range( len(dims) ): cur_dim=dims[ k ] stride=dimprod/cur_dim next_x = [complex(0,0)]*len(x) for i in range(stride): next_x[i*cur_dim:(i+1)*cur_dim] = fft(x[i:(i+cur_dim)*stride:stride],0) x = next_x return x if __name__ == "__main__": try: nd = int(sys.argv[1]) except: nd=None if nd: test_fftnd( nd ) else: sys.exit(0) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/mk_test.py������������������������������������������������������0000775�0000000�0000000�00000005701�12660066715�0021403�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import FFT import sys import random import re j=complex(0,1) def randvec(n,iscomplex): if iscomplex: return [ int(random.uniform(-32768,32767) ) + j*int(random.uniform(-32768,32767) ) for i in range(n) ] else: return [ int(random.uniform(-32768,32767) ) for i in range(n) ] def c_format(v,round=0): if round: return ','.join( [ '{%d,%d}' %(int(c.real),int(c.imag) ) for c in v ] ) else: s= ','.join( [ '{%.60f ,%.60f }' %(c.real,c.imag) for c in v ] ) return re.sub(r'\.?0+ ',' ',s) def test_cpx( n,inverse ,short): v = randvec(n,1) scale = 1 if short: minsnr=30 else: minsnr=100 if inverse: tvecout = FFT.inverse_fft(v) if short: scale = 1 else: scale = len(v) else: tvecout = FFT.fft(v) if short: scale = 1.0/len(v) tvecout = [ c * scale for c in tvecout ] s="""#define NFFT %d""" % len(v) + """ { double snr; kiss_fft_cpx test_vec_in[NFFT] = { """ + c_format(v) + """}; kiss_fft_cpx test_vec_out[NFFT] = {""" + c_format( tvecout ) + """}; kiss_fft_cpx testbuf[NFFT]; void * cfg = kiss_fft_alloc(NFFT,%d,0,0);""" % inverse + """ kiss_fft(cfg,test_vec_in,testbuf); snr = snr_compare(test_vec_out,testbuf,NFFT); printf("DATATYPE=" xstr(kiss_fft_scalar) ", FFT n=%d, inverse=%d, snr = %g dB\\n",NFFT,""" + str(inverse) + """,snr); if (snr<""" + str(minsnr) + """) exit_code++; free(cfg); } #undef NFFT """ return s def compare_func(): s=""" #define xstr(s) str(s) #define str(s) #s double snr_compare( kiss_fft_cpx * test_vec_out,kiss_fft_cpx * testbuf, int n) { int k; double sigpow,noisepow,err,snr,scale=0; kiss_fft_cpx err; sigpow = noisepow = .000000000000000000000000000001; for (k=0;k<n;++k) { sigpow += test_vec_out[k].r * test_vec_out[k].r + test_vec_out[k].i * test_vec_out[k].i; C_SUB(err,test_vec_out[k],testbuf[k].r); noisepow += err.r * err.r + err.i + err.i; if (test_vec_out[k].r) scale += testbuf[k].r / test_vec_out[k].r; } snr = 10*log10( sigpow / noisepow ); scale /= n; if (snr<10) printf( "\\npoor snr, try a scaling factor %f\\n" , scale ); return snr; } """ return s def main(): from getopt import getopt opts,args = getopt(sys.argv[1:],'s') opts = dict(opts) short = int( opts.has_key('-s') ) fftsizes = args if not fftsizes: fftsizes = [ 1800 ] print '#include "kiss_fft.h"' print compare_func() print "int main() { int exit_code=0;\n" for n in fftsizes: n = int(n) print test_cpx(n,0,short) print test_cpx(n,1,short) print """ return exit_code; } """ if __name__ == "__main__": main() ���������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/pstats.c��������������������������������������������������������0000775�0000000�0000000�00000002146�12660066715�0021045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include <sys/times.h> #include <sys/types.h> #include <unistd.h> #include "pstats.h" static struct tms tms_beg; static struct tms tms_end; static int has_times = 0; void pstats_init(void) { has_times = times(&tms_beg) != -1; } static void tms_report(void) { double cputime; if (! has_times ) return; times(&tms_end); cputime = ( ((float)tms_end.tms_utime + tms_end.tms_stime + tms_end.tms_cutime + tms_end.tms_cstime ) - ((float)tms_beg.tms_utime + tms_beg.tms_stime + tms_beg.tms_cutime + tms_beg.tms_cstime ) ) / sysconf(_SC_CLK_TCK); fprintf(stderr,"\tcputime=%.3f\n" , cputime); } static void ps_report(void) { char buf[1024]; #ifdef __APPLE__ /* MAC OS X */ sprintf(buf,"ps -o command,majflt,minflt,rss,pagein,vsz -p %d 1>&2",getpid() ); #else /* GNU/Linux */ sprintf(buf,"ps -o comm,majflt,minflt,rss,drs,pagein,sz,trs,vsz %d 1>&2",getpid() ); #endif if (system( buf )==-1) { perror("system call to ps failed"); } } void pstats_report() { ps_report(); tms_report(); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/pstats.h��������������������������������������������������������0000775�0000000�0000000�00000000136�12660066715�0021047�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef PSTATS_H #define PSTATS_H void pstats_init(void); void pstats_report(void); #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/tailscrap.m�����������������������������������������������������0000775�0000000�0000000�00000001215�12660066715�0021517�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������function maxabsdiff=tailscrap() % test code for circular convolution with the scrapped portion % at the tail of the buffer, rather than the front % % The idea is to rotate the zero-padded h (impulse response) buffer % to the left nh-1 samples, rotating the junk samples as well. % This could be very handy in avoiding buffer copies during fast filtering. nh=10; nfft=256; h=rand(1,nh); x=rand(1,nfft); hpad=[ h(nh) zeros(1,nfft-nh) h(1:nh-1) ]; % baseline comparison y1 = filter(h,1,x); y1_notrans = y1(nh:nfft); % fast convolution y2 = ifft( fft(hpad) .* fft(x) ); y2_notrans=y2(1:nfft-nh+1); maxabsdiff = max(abs(y2_notrans - y1_notrans)) end �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/test_real.c�����������������������������������������������������0000775�0000000�0000000�00000011062�12660066715�0021506�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "kiss_fftr.h" #include "_kiss_fft_guts.h" #include <sys/times.h> #include <time.h> #include <unistd.h> static double cputime(void) { struct tms t; times(&t); return (double)(t.tms_utime + t.tms_stime)/ sysconf(_SC_CLK_TCK) ; } static kiss_fft_scalar rand_scalar(void) { #ifdef USE_SIMD return _mm_set1_ps(rand()-RAND_MAX/2); #else kiss_fft_scalar s = (kiss_fft_scalar)(rand() -RAND_MAX/2); return s/2; #endif } static double snr_compare( kiss_fft_cpx * vec1,kiss_fft_cpx * vec2, int n) { int k; double sigpow=1e-10,noisepow=1e-10,err,snr,scale=0; #ifdef USE_SIMD float *fv1 = (float*)vec1; float *fv2 = (float*)vec2; for (k=0;k<8*n;++k) { sigpow += *fv1 * *fv1; err = *fv1 - *fv2; noisepow += err*err; ++fv1; ++fv2; } #else for (k=0;k<n;++k) { sigpow += (double)vec1[k].r * (double)vec1[k].r + (double)vec1[k].i * (double)vec1[k].i; err = (double)vec1[k].r - (double)vec2[k].r; noisepow += err * err; err = (double)vec1[k].i - (double)vec2[k].i; noisepow += err * err; if (vec1[k].r) scale +=(double) vec2[k].r / (double)vec1[k].r; } #endif snr = 10*log10( sigpow / noisepow ); scale /= n; if (snr<10) { printf( "\npoor snr, try a scaling factor %f\n" , scale ); exit(1); } return snr; } #ifndef NUMFFTS #define NUMFFTS 10000 #endif int main(int argc,char ** argv) { int nfft = 8*3*5; double ts,tfft,trfft; int i; if (argc>1) nfft = atoi(argv[1]); kiss_fft_cpx cin[nfft]; kiss_fft_cpx cout[nfft]; kiss_fft_cpx sout[nfft]; kiss_fft_cfg kiss_fft_state; kiss_fftr_cfg kiss_fftr_state; kiss_fft_scalar rin[nfft+2]; kiss_fft_scalar rout[nfft+2]; kiss_fft_scalar zero; memset(&zero,0,sizeof(zero) ); // ugly way of setting short,int,float,double, or __m128 to zero srand(time(0)); for (i=0;i<nfft;++i) { rin[i] = rand_scalar(); cin[i].r = rin[i]; cin[i].i = zero; } kiss_fft_state = kiss_fft_alloc(nfft,0,0,0); kiss_fftr_state = kiss_fftr_alloc(nfft,0,0,0); kiss_fft(kiss_fft_state,cin,cout); kiss_fftr(kiss_fftr_state,rin,sout); /* printf(" results from kiss_fft : (%f,%f), (%f,%f), (%f,%f) ...\n " , (float)cout[0].r , (float)cout[0].i , (float)cout[1].r , (float)cout[1].i , (float)cout[2].r , (float)cout[2].i); printf(" results from kiss_fftr: (%f,%f), (%f,%f), (%f,%f) ...\n " , (float)sout[0].r , (float)sout[0].i , (float)sout[1].r , (float)sout[1].i , (float)sout[2].r , (float)sout[2].i); */ printf( "nfft=%d, inverse=%d, snr=%g\n", nfft,0, snr_compare(cout,sout,(nfft/2)+1) ); ts = cputime(); for (i=0;i<NUMFFTS;++i) { kiss_fft(kiss_fft_state,cin,cout); } tfft = cputime() - ts; ts = cputime(); for (i=0;i<NUMFFTS;++i) { kiss_fftr( kiss_fftr_state, rin, cout ); /* kiss_fftri(kiss_fftr_state,cout,rin); */ } trfft = cputime() - ts; printf("%d complex ffts took %gs, real took %gs\n",NUMFFTS,tfft,trfft); free(kiss_fft_state); free(kiss_fftr_state); kiss_fft_state = kiss_fft_alloc(nfft,1,0,0); kiss_fftr_state = kiss_fftr_alloc(nfft,1,0,0); memset(cin,0,sizeof(cin)); #if 1 for (i=1;i< nfft/2;++i) { //cin[i].r = (kiss_fft_scalar)(rand()-RAND_MAX/2); cin[i].r = rand_scalar(); cin[i].i = rand_scalar(); } #else cin[0].r = 12000; cin[3].r = 12000; cin[nfft/2].r = 12000; #endif // conjugate symmetry of real signal for (i=1;i< nfft/2;++i) { cin[nfft-i].r = cin[i].r; cin[nfft-i].i = - cin[i].i; } kiss_fft(kiss_fft_state,cin,cout); kiss_fftri(kiss_fftr_state,cin,rout); /* printf(" results from inverse kiss_fft : (%f,%f), (%f,%f), (%f,%f), (%f,%f), (%f,%f) ...\n " , (float)cout[0].r , (float)cout[0].i , (float)cout[1].r , (float)cout[1].i , (float)cout[2].r , (float)cout[2].i , (float)cout[3].r , (float)cout[3].i , (float)cout[4].r , (float)cout[4].i ); printf(" results from inverse kiss_fftr: %f,%f,%f,%f,%f ... \n" ,(float)rout[0] ,(float)rout[1] ,(float)rout[2] ,(float)rout[3] ,(float)rout[4]); */ for (i=0;i<nfft;++i) { sout[i].r = rout[i]; sout[i].i = zero; } printf( "nfft=%d, inverse=%d, snr=%g\n", nfft,1, snr_compare(cout,sout,nfft/2) ); free(kiss_fft_state); free(kiss_fftr_state); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/test_vs_dft.c���������������������������������������������������0000775�0000000�0000000�00000003215�12660066715�0022051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "kiss_fft.h" void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0; for (bin=0;bin<nfft;++bin) { double ansr = 0; double ansi = 0; double difr; double difi; for (k=0;k<nfft;++k) { double phase = -2*M_PI*bin*k/nfft; double re = cos(phase); double im = sin(phase); if (isinverse) im = -im; #ifdef FIXED_POINT re /= nfft; im /= nfft; #endif ansr += in[k].r * re - in[k].i * im; ansi += in[k].r * im + in[k].i * re; } difr = ansr - out[bin].r; difi = ansi - out[bin].i; errpow += difr*difr + difi*difi; sigpow += ansr*ansr+ansi*ansi; } printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,10*log10(sigpow/errpow) ); } void test1d(int nfft,int isinverse) { size_t buflen = sizeof(kiss_fft_cpx)*nfft; kiss_fft_cpx * in = (kiss_fft_cpx*)malloc(buflen); kiss_fft_cpx * out= (kiss_fft_cpx*)malloc(buflen); kiss_fft_cfg cfg = kiss_fft_alloc(nfft,isinverse,0,0); int k; for (k=0;k<nfft;++k) { in[k].r = (rand() % 65536) - 32768; in[k].i = (rand() % 65536) - 32768; } kiss_fft(cfg,in,out); check(in,out,nfft,isinverse); free(in); free(out); free(cfg); } int main(int argc,char ** argv) { if (argc>1) { int k; for (k=1;k<argc;++k) { test1d(atoi(argv[k]),0); test1d(atoi(argv[k]),1); } }else{ test1d(32,0); test1d(32,1); } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/testcpp.cc������������������������������������������������������0000775�0000000�0000000�00000004020�12660066715�0021345�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "kissfft.hh" #include <iostream> #include <cstdlib> #include <typeinfo> #include <sys/time.h> static inline double curtime(void) { struct timeval tv; gettimeofday(&tv, NULL); return (double)tv.tv_sec + (double)tv.tv_usec*.000001; } using namespace std; template <class T> void dotest(int nfft) { typedef kissfft<T> FFT; typedef std::complex<T> cpx_type; cout << "type:" << typeid(T).name() << " nfft:" << nfft; FFT fft(nfft,false); vector<cpx_type> inbuf(nfft); vector<cpx_type> outbuf(nfft); for (int k=0;k<nfft;++k) inbuf[k]= cpx_type( (T)(rand()/(double)RAND_MAX - .5), (T)(rand()/(double)RAND_MAX - .5) ); fft.transform( &inbuf[0] , &outbuf[0] ); long double totalpower=0; long double difpower=0; for (int k0=0;k0<nfft;++k0) { complex<long double> acc = 0; long double phinc = 2*k0* M_PIl / nfft; for (int k1=0;k1<nfft;++k1) { complex<long double> x(inbuf[k1].real(),inbuf[k1].imag()); acc += x * exp( complex<long double>(0,-k1*phinc) ); } totalpower += norm(acc); complex<long double> x(outbuf[k0].real(),outbuf[k0].imag()); complex<long double> dif = acc - x; difpower += norm(dif); } cout << " RMSE:" << sqrt(difpower/totalpower) << "\t"; double t0 = curtime(); int nits=20e6/nfft; for (int k=0;k<nits;++k) { fft.transform( &inbuf[0] , &outbuf[0] ); } double t1 = curtime(); cout << " MSPS:" << ( (nits*nfft)*1e-6/ (t1-t0) ) << endl; } int main(int argc,char ** argv) { if (argc>1) { for (int k=1;k<argc;++k) { int nfft = atoi(argv[k]); dotest<float>(nfft); dotest<double>(nfft); dotest<long double>(nfft); } }else{ dotest<float>(32); dotest<double>(32); dotest<long double>(32); dotest<float>(1024); dotest<double>(1024); dotest<long double>(1024); dotest<float>(840); dotest<double>(840); dotest<long double>(840); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/test/testkiss.py�����������������������������������������������������0000775�0000000�0000000�00000006767�12660066715�0021623�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import math import sys import os import random import struct import popen2 import getopt import numpy pi=math.pi e=math.e j=complex(0,1) doreal=0 datatype = os.environ.get('DATATYPE','float') util = '../tools/fft_' + datatype minsnr=90 if datatype == 'double': fmt='d' elif datatype=='int16_t': fmt='h' minsnr=10 elif datatype=='int32_t': fmt='i' elif datatype=='simd': fmt='4f' sys.stderr.write('testkiss.py does not yet test simd') sys.exit(0) elif datatype=='float': fmt='f' else: sys.stderr.write('unrecognized datatype %s\n' % datatype) sys.exit(1) def dopack(x,cpx=1): x = numpy.reshape( x, ( numpy.size(x),) ) if cpx: s = ''.join( [ struct.pack(fmt*2,c.real,c.imag) for c in x ] ) else: s = ''.join( [ struct.pack(fmt,c.real) for c in x ] ) return s def dounpack(x,cpx): uf = fmt * ( len(x) / struct.calcsize(fmt) ) s = struct.unpack(uf,x) if cpx: return numpy.array(s[::2]) + numpy.array( s[1::2] )*j else: return numpy.array(s ) def make_random(dims=[1]): res = [] for i in range(dims[0]): if len(dims)==1: r=random.uniform(-1,1) if doreal: res.append( r ) else: i=random.uniform(-1,1) res.append( complex(r,i) ) else: res.append( make_random( dims[1:] ) ) return numpy.array(res) def flatten(x): ntotal = numpy.size(x) return numpy.reshape(x,(ntotal,)) def randmat( ndims ): dims=[] for i in range( ndims ): curdim = int( random.uniform(2,5) ) if doreal and i==(ndims-1): curdim = int(curdim/2)*2 # force even last dimension if real dims.append( curdim ) return make_random(dims ) def test_fft(ndims): x=randmat( ndims ) if doreal: xver = numpy.fft.rfftn(x) else: xver = numpy.fft.fftn(x) open('/tmp/fftexp.dat','w').write(dopack( flatten(xver) , True ) ) x2=dofft(x,doreal) err = xver - x2 errf = flatten(err) xverf = flatten(xver) errpow = numpy.vdot(errf,errf)+1e-10 sigpow = numpy.vdot(xverf,xverf)+1e-10 snr = 10*math.log10(abs(sigpow/errpow) ) print 'SNR (compared to NumPy) : %.1fdB' % float(snr) if snr<minsnr: print 'xver=',xver print 'x2=',x2 print 'err',err sys.exit(1) def dofft(x,isreal): dims=list( numpy.shape(x) ) x = flatten(x) scale=1 if datatype=='int16_t': x = 32767 * x scale = len(x) / 32767.0 elif datatype=='int32_t': x = 2147483647.0 * x scale = len(x) / 2147483647.0 cmd='%s -n ' % util cmd += ','.join([str(d) for d in dims]) if doreal: cmd += ' -R ' print cmd p = popen2.Popen3(cmd ) open('/tmp/fftin.dat','w').write(dopack( x , isreal==False ) ) p.tochild.write( dopack( x , isreal==False ) ) p.tochild.close() res = dounpack( p.fromchild.read() , 1 ) open('/tmp/fftout.dat','w').write(dopack( flatten(res) , True ) ) if doreal: dims[-1] = int( dims[-1]/2 ) + 1 res = scale * res p.wait() return numpy.reshape(res,dims) def main(): opts,args = getopt.getopt(sys.argv[1:],'r') opts=dict(opts) global doreal doreal = opts.has_key('-r') if doreal: print 'Testing multi-dimensional real FFTs' else: print 'Testing multi-dimensional FFTs' for dim in range(1,4): test_fft( dim ) if __name__ == "__main__": main() ���������silverjuke-16.2.3/src/kiss_fft/test/twotonetest.c���������������������������������������������������0000775�0000000�0000000�00000005177�12660066715�0022135�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdlib.h> #include <string.h> #include <stdio.h> #include "kiss_fft.h" #include "kiss_fftr.h" #include <limits.h> static double two_tone_test( int nfft, int bin1,int bin2) { kiss_fftr_cfg cfg = NULL; kiss_fft_cpx *kout = NULL; kiss_fft_scalar *tbuf = NULL; int i; double f1 = bin1*2*M_PI/nfft; double f2 = bin2*2*M_PI/nfft; double sigpow=0; double noisepow=0; #if FIXED_POINT==32 long maxrange = LONG_MAX; #else long maxrange = SHRT_MAX;/* works fine for float too*/ #endif cfg = kiss_fftr_alloc(nfft , 0, NULL, NULL); tbuf = KISS_FFT_MALLOC(nfft * sizeof(kiss_fft_scalar)); kout = KISS_FFT_MALLOC(nfft * sizeof(kiss_fft_cpx)); /* generate a signal with two tones*/ for (i = 0; i < nfft; i++) { #ifdef USE_SIMD tbuf[i] = _mm_set1_ps( (maxrange>>1)*cos(f1*i) + (maxrange>>1)*cos(f2*i) ); #else tbuf[i] = (maxrange>>1)*cos(f1*i) + (maxrange>>1)*cos(f2*i); #endif } kiss_fftr(cfg, tbuf, kout); for (i=0;i < (nfft/2+1);++i) { #ifdef USE_SIMD double tmpr = (double)*(float*)&kout[i].r / (double)maxrange; double tmpi = (double)*(float*)&kout[i].i / (double)maxrange; #else double tmpr = (double)kout[i].r / (double)maxrange; double tmpi = (double)kout[i].i / (double)maxrange; #endif double mag2 = tmpr*tmpr + tmpi*tmpi; if (i!=0 && i!= nfft/2) mag2 *= 2; /* all bins except DC and Nyquist have symmetric counterparts implied*/ /* if there is power in one of the expected bins, it is signal, otherwise noise*/ if ( i!=bin1 && i != bin2 ) noisepow += mag2; else sigpow += mag2; } kiss_fft_cleanup(); /*printf("TEST %d,%d,%d noise @ %fdB\n",nfft,bin1,bin2,10*log10(noisepow/sigpow +1e-30) );*/ return 10*log10(sigpow/(noisepow+1e-50) ); } int main(int argc,char ** argv) { int nfft = 4*2*2*3*5; if (argc>1) nfft = atoi(argv[1]); int i,j; double minsnr = 500; double maxsnr = -500; double snr; for (i=0;i<nfft/2;i+= (nfft>>4)+1) { for (j=i;j<nfft/2;j+=(nfft>>4)+7) { snr = two_tone_test(nfft,i,j); if (snr<minsnr) { minsnr=snr; } if (snr>maxsnr) { maxsnr=snr; } } } snr = two_tone_test(nfft,nfft/2,nfft/2); if (snr<minsnr) minsnr=snr; if (snr>maxsnr) maxsnr=snr; printf("TwoToneTest: snr ranges from %ddB to %ddB\n",(int)minsnr,(int)maxsnr); printf("sizeof(kiss_fft_scalar) = %d\n",(int)sizeof(kiss_fft_scalar) ); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/���������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0017536�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/fftutil.c������������������������������������������������������0000775�0000000�0000000�00000014506�12660066715�0021370�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include <stdlib.h> #include <math.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include "kiss_fft.h" #include "kiss_fftndr.h" static void fft_file(FILE * fin,FILE * fout,int nfft,int isinverse) { kiss_fft_cfg st; kiss_fft_cpx * buf; kiss_fft_cpx * bufout; buf = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * nfft ); bufout = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * nfft ); st = kiss_fft_alloc( nfft ,isinverse ,0,0); while ( fread( buf , sizeof(kiss_fft_cpx) * nfft ,1, fin ) > 0 ) { kiss_fft( st , buf ,bufout); fwrite( bufout , sizeof(kiss_fft_cpx) , nfft , fout ); } free(st); free(buf); free(bufout); } static void fft_filend(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse) { kiss_fftnd_cfg st; kiss_fft_cpx *buf; int dimprod=1,i; for (i=0;i<ndims;++i) dimprod *= dims[i]; buf = (kiss_fft_cpx *) malloc (sizeof (kiss_fft_cpx) * dimprod); st = kiss_fftnd_alloc (dims, ndims, isinverse, 0, 0); while (fread (buf, sizeof (kiss_fft_cpx) * dimprod, 1, fin) > 0) { kiss_fftnd (st, buf, buf); fwrite (buf, sizeof (kiss_fft_cpx), dimprod, fout); } free (st); free (buf); } static void fft_filend_real(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse) { int dimprod=1,i; kiss_fftndr_cfg st; void *ibuf; void *obuf; int insize,outsize; // size in bytes for (i=0;i<ndims;++i) dimprod *= dims[i]; insize = outsize = dimprod; int rdim = dims[ndims-1]; if (isinverse) insize = insize*2*(rdim/2+1)/rdim; else outsize = outsize*2*(rdim/2+1)/rdim; ibuf = malloc(insize*sizeof(kiss_fft_scalar)); obuf = malloc(outsize*sizeof(kiss_fft_scalar)); st = kiss_fftndr_alloc(dims, ndims, isinverse, 0, 0); while ( fread (ibuf, sizeof(kiss_fft_scalar), insize, fin) > 0) { if (isinverse) { kiss_fftndri(st, (kiss_fft_cpx*)ibuf, (kiss_fft_scalar*)obuf); }else{ kiss_fftndr(st, (kiss_fft_scalar*)ibuf, (kiss_fft_cpx*)obuf); } fwrite (obuf, sizeof(kiss_fft_scalar), outsize,fout); } free(st); free(ibuf); free(obuf); } static void fft_file_real(FILE * fin,FILE * fout,int nfft,int isinverse) { kiss_fftr_cfg st; kiss_fft_scalar * rbuf; kiss_fft_cpx * cbuf; rbuf = (kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar) * nfft ); cbuf = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * (nfft/2+1) ); st = kiss_fftr_alloc( nfft ,isinverse ,0,0); if (isinverse==0) { while ( fread( rbuf , sizeof(kiss_fft_scalar) * nfft ,1, fin ) > 0 ) { kiss_fftr( st , rbuf ,cbuf); fwrite( cbuf , sizeof(kiss_fft_cpx) , (nfft/2 + 1) , fout ); } }else{ while ( fread( cbuf , sizeof(kiss_fft_cpx) * (nfft/2+1) ,1, fin ) > 0 ) { kiss_fftri( st , cbuf ,rbuf); fwrite( rbuf , sizeof(kiss_fft_scalar) , nfft , fout ); } } free(st); free(rbuf); free(cbuf); } static int get_dims(char * arg,int * dims) { char *p0; int ndims=0; do{ p0 = strchr(arg,','); if (p0) *p0++ = '\0'; dims[ndims++] = atoi(arg); // fprintf(stderr,"dims[%d] = %d\n",ndims-1,dims[ndims-1]); arg = p0; }while (p0); return ndims; } int main(int argc,char ** argv) { int isinverse=0; int isreal=0; FILE *fin=stdin; FILE *fout=stdout; int ndims=1; int dims[32]; dims[0] = 1024; /*default fft size*/ while (1) { int c=getopt(argc,argv,"n:iR"); if (c==-1) break; switch (c) { case 'n': ndims = get_dims(optarg,dims); break; case 'i':isinverse=1;break; case 'R':isreal=1;break; case '?': fprintf(stderr,"usage options:\n" "\t-n d1[,d2,d3...]: fft dimension(s)\n" "\t-i : inverse\n" "\t-R : real input samples, not complex\n"); exit (1); default:fprintf(stderr,"bad %c\n",c);break; } } if ( optind < argc ) { if (strcmp("-",argv[optind]) !=0) fin = fopen(argv[optind],"rb"); ++optind; } if ( optind < argc ) { if ( strcmp("-",argv[optind]) !=0 ) fout = fopen(argv[optind],"wb"); ++optind; } if (ndims==1) { if (isreal) fft_file_real(fin,fout,dims[0],isinverse); else fft_file(fin,fout,dims[0],isinverse); }else{ if (isreal) fft_filend_real(fin,fout,dims,ndims,isinverse); else fft_filend(fin,fout,dims,ndims,isinverse); } if (fout!=stdout) fclose(fout); if (fin!=stdin) fclose(fin); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kfc.c����������������������������������������������������������0000775�0000000�0000000�00000007206�12660066715�0020455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "kfc.h" /* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ typedef struct cached_fft *kfc_cfg; struct cached_fft { int nfft; int inverse; kiss_fft_cfg cfg; kfc_cfg next; }; static kfc_cfg cache_root=NULL; static int ncached=0; static kiss_fft_cfg find_cached_fft(int nfft,int inverse) { size_t len; kfc_cfg cur=cache_root; kfc_cfg prev=NULL; while ( cur ) { if ( cur->nfft == nfft && inverse == cur->inverse ) break;/*found the right node*/ prev = cur; cur = prev->next; } if (cur== NULL) { /* no cached node found, need to create a new one*/ kiss_fft_alloc(nfft,inverse,0,&len); #ifdef USE_SIMD int padding = (16-sizeof(struct cached_fft)) & 15; // make sure the cfg aligns on a 16 byte boundary len += padding; #endif cur = (kfc_cfg)KISS_FFT_MALLOC((sizeof(struct cached_fft) + len )); if (cur == NULL) return NULL; cur->cfg = (kiss_fft_cfg)(cur+1); #ifdef USE_SIMD cur->cfg = (kiss_fft_cfg) ((char*)(cur+1)+padding); #endif kiss_fft_alloc(nfft,inverse,cur->cfg,&len); cur->nfft=nfft; cur->inverse=inverse; cur->next = NULL; if ( prev ) prev->next = cur; else cache_root = cur; ++ncached; } return cur->cfg; } void kfc_cleanup(void) { kfc_cfg cur=cache_root; kfc_cfg next=NULL; while (cur){ next = cur->next; free(cur); cur=next; } ncached=0; cache_root = NULL; } void kfc_fft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout) { kiss_fft( find_cached_fft(nfft,0),fin,fout ); } void kfc_ifft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout) { kiss_fft( find_cached_fft(nfft,1),fin,fout ); } #ifdef KFC_TEST static void check(int nc) { if (ncached != nc) { fprintf(stderr,"ncached should be %d,but it is %d\n",nc,ncached); exit(1); } } int main(void) { kiss_fft_cpx buf1[1024],buf2[1024]; memset(buf1,0,sizeof(buf1)); check(0); kfc_fft(512,buf1,buf2); check(1); kfc_fft(512,buf1,buf2); check(1); kfc_ifft(512,buf1,buf2); check(2); kfc_cleanup(); check(0); return 0; } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kfc.h����������������������������������������������������������0000775�0000000�0000000�00000002356�12660066715�0020463�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef KFC_H #define KFC_H #include "kiss_fft.h" #ifdef __cplusplus extern "C" { #endif /* KFC -- Kiss FFT Cache Not needing to deal with kiss_fft_alloc and a config object may be handy for a lot of programs. KFC uses the underlying KISS FFT functions, but caches the config object. The first time kfc_fft or kfc_ifft for a given FFT size, the cfg object is created for it. All subsequent calls use the cached configuration object. NOTE: You should probably not use this if your program will be using a lot of various sizes of FFTs. There is a linear search through the cached objects. If you are only using one or two FFT sizes, this will be negligible. Otherwise, you may want to use another method of managing the cfg objects. There is no automated cleanup of the cached objects. This could lead to large memory usage in a program that uses a lot of *DIFFERENT* sized FFTs. If you want to force all cached cfg objects to be freed, call kfc_cleanup. */ /*forward complex FFT */ void kfc_fft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout); /*reverse complex FFT */ void kfc_ifft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout); /*free all cached objects*/ void kfc_cleanup(void); #ifdef __cplusplus } #endif #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fastfir.c�������������������������������������������������0000775�0000000�0000000�00000032635�12660066715�0022405�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include "_kiss_fft_guts.h" /* Some definitions that allow real or complex filtering */ #ifdef REAL_FASTFIR #define MIN_FFT_LEN 2048 #include "kiss_fftr.h" typedef kiss_fft_scalar kffsamp_t; typedef kiss_fftr_cfg kfcfg_t; #define FFT_ALLOC kiss_fftr_alloc #define FFTFWD kiss_fftr #define FFTINV kiss_fftri #else #define MIN_FFT_LEN 1024 typedef kiss_fft_cpx kffsamp_t; typedef kiss_fft_cfg kfcfg_t; #define FFT_ALLOC kiss_fft_alloc #define FFTFWD kiss_fft #define FFTINV kiss_fft #endif typedef struct kiss_fastfir_state *kiss_fastfir_cfg; kiss_fastfir_cfg kiss_fastfir_alloc(const kffsamp_t * imp_resp,size_t n_imp_resp, size_t * nfft,void * mem,size_t*lenmem); /* see do_file_filter for usage */ size_t kiss_fastfir( kiss_fastfir_cfg cfg, kffsamp_t * inbuf, kffsamp_t * outbuf, size_t n, size_t *offset); static int verbose=0; struct kiss_fastfir_state{ size_t nfft; size_t ngood; kfcfg_t fftcfg; kfcfg_t ifftcfg; kiss_fft_cpx * fir_freq_resp; kiss_fft_cpx * freqbuf; size_t n_freq_bins; kffsamp_t * tmpbuf; }; kiss_fastfir_cfg kiss_fastfir_alloc( const kffsamp_t * imp_resp,size_t n_imp_resp, size_t *pnfft, /* if <= 0, an appropriate size will be chosen */ void * mem,size_t*lenmem) { kiss_fastfir_cfg st = NULL; size_t len_fftcfg,len_ifftcfg; size_t memneeded = sizeof(struct kiss_fastfir_state); char * ptr; size_t i; size_t nfft=0; float scale; int n_freq_bins; if (pnfft) nfft=*pnfft; if (nfft<=0) { /* determine fft size as next power of two at least 2x the impulse response length*/ i=n_imp_resp-1; nfft=2; do{ nfft<<=1; }while (i>>=1); #ifdef MIN_FFT_LEN if ( nfft < MIN_FFT_LEN ) nfft=MIN_FFT_LEN; #endif } if (pnfft) *pnfft = nfft; #ifdef REAL_FASTFIR n_freq_bins = nfft/2 + 1; #else n_freq_bins = nfft; #endif /*fftcfg*/ FFT_ALLOC (nfft, 0, NULL, &len_fftcfg); memneeded += len_fftcfg; /*ifftcfg*/ FFT_ALLOC (nfft, 1, NULL, &len_ifftcfg); memneeded += len_ifftcfg; /* tmpbuf */ memneeded += sizeof(kffsamp_t) * nfft; /* fir_freq_resp */ memneeded += sizeof(kiss_fft_cpx) * n_freq_bins; /* freqbuf */ memneeded += sizeof(kiss_fft_cpx) * n_freq_bins; if (lenmem == NULL) { st = (kiss_fastfir_cfg) malloc (memneeded); } else { if (*lenmem >= memneeded) st = (kiss_fastfir_cfg) mem; *lenmem = memneeded; } if (!st) return NULL; st->nfft = nfft; st->ngood = nfft - n_imp_resp + 1; st->n_freq_bins = n_freq_bins; ptr=(char*)(st+1); st->fftcfg = (kfcfg_t)ptr; ptr += len_fftcfg; st->ifftcfg = (kfcfg_t)ptr; ptr += len_ifftcfg; st->tmpbuf = (kffsamp_t*)ptr; ptr += sizeof(kffsamp_t) * nfft; st->freqbuf = (kiss_fft_cpx*)ptr; ptr += sizeof(kiss_fft_cpx) * n_freq_bins; st->fir_freq_resp = (kiss_fft_cpx*)ptr; ptr += sizeof(kiss_fft_cpx) * n_freq_bins; FFT_ALLOC (nfft,0,st->fftcfg , &len_fftcfg); FFT_ALLOC (nfft,1,st->ifftcfg , &len_ifftcfg); memset(st->tmpbuf,0,sizeof(kffsamp_t)*nfft); /*zero pad in the middle to left-rotate the impulse response This puts the scrap samples at the end of the inverse fft'd buffer */ st->tmpbuf[0] = imp_resp[ n_imp_resp - 1 ]; for (i=0;i<n_imp_resp - 1; ++i) { st->tmpbuf[ nfft - n_imp_resp + 1 + i ] = imp_resp[ i ]; } FFTFWD(st->fftcfg,st->tmpbuf,st->fir_freq_resp); /* TODO: this won't work for fixed point */ scale = 1.0 / st->nfft; for ( i=0; i < st->n_freq_bins; ++i ) { #ifdef USE_SIMD st->fir_freq_resp[i].r *= _mm_set1_ps(scale); st->fir_freq_resp[i].i *= _mm_set1_ps(scale); #else st->fir_freq_resp[i].r *= scale; st->fir_freq_resp[i].i *= scale; #endif } return st; } static void fastconv1buf(const kiss_fastfir_cfg st,const kffsamp_t * in,kffsamp_t * out) { size_t i; /* multiply the frequency response of the input signal by that of the fir filter*/ FFTFWD( st->fftcfg, in , st->freqbuf ); for ( i=0; i<st->n_freq_bins; ++i ) { kiss_fft_cpx tmpsamp; C_MUL(tmpsamp,st->freqbuf[i],st->fir_freq_resp[i]); st->freqbuf[i] = tmpsamp; } /* perform the inverse fft*/ FFTINV(st->ifftcfg,st->freqbuf,out); } /* n : the size of inbuf and outbuf in samples return value: the number of samples completely processed n-retval samples should be copied to the front of the next input buffer */ static size_t kff_nocopy( kiss_fastfir_cfg st, const kffsamp_t * inbuf, kffsamp_t * outbuf, size_t n) { size_t norig=n; while (n >= st->nfft ) { fastconv1buf(st,inbuf,outbuf); inbuf += st->ngood; outbuf += st->ngood; n -= st->ngood; } return norig - n; } static size_t kff_flush(kiss_fastfir_cfg st,const kffsamp_t * inbuf,kffsamp_t * outbuf,size_t n) { size_t zpad=0,ntmp; ntmp = kff_nocopy(st,inbuf,outbuf,n); n -= ntmp; inbuf += ntmp; outbuf += ntmp; zpad = st->nfft - n; memset(st->tmpbuf,0,sizeof(kffsamp_t)*st->nfft ); memcpy(st->tmpbuf,inbuf,sizeof(kffsamp_t)*n ); fastconv1buf(st,st->tmpbuf,st->tmpbuf); memcpy(outbuf,st->tmpbuf,sizeof(kffsamp_t)*( st->ngood - zpad )); return ntmp + st->ngood - zpad; } size_t kiss_fastfir( kiss_fastfir_cfg vst, kffsamp_t * inbuf, kffsamp_t * outbuf, size_t n_new, size_t *offset) { size_t ntot = n_new + *offset; if (n_new==0) { return kff_flush(vst,inbuf,outbuf,ntot); }else{ size_t nwritten = kff_nocopy(vst,inbuf,outbuf,ntot); *offset = ntot - nwritten; /*save the unused or underused samples at the front of the input buffer */ memcpy( inbuf , inbuf+nwritten , *offset * sizeof(kffsamp_t) ); return nwritten; } } #ifdef FAST_FILT_UTIL #include <unistd.h> #include <sys/types.h> #include <sys/mman.h> #include <assert.h> static void direct_file_filter( FILE * fin, FILE * fout, const kffsamp_t * imp_resp, size_t n_imp_resp) { size_t nlag = n_imp_resp - 1; const kffsamp_t *tmph; kffsamp_t *buf, *circbuf; kffsamp_t outval; size_t nread; size_t nbuf; size_t oldestlag = 0; size_t k, tap; #ifndef REAL_FASTFIR kffsamp_t tmp; #endif nbuf = 4096; buf = (kffsamp_t *) malloc ( sizeof (kffsamp_t) * nbuf); circbuf = (kffsamp_t *) malloc (sizeof (kffsamp_t) * nlag); if (!circbuf || !buf) { perror("circbuf allocation"); exit(1); } if ( fread (circbuf, sizeof (kffsamp_t), nlag, fin) != nlag ) { perror ("insufficient data to overcome transient"); exit (1); } do { nread = fread (buf, sizeof (kffsamp_t), nbuf, fin); if (nread <= 0) break; for (k = 0; k < nread; ++k) { tmph = imp_resp+nlag; #ifdef REAL_FASTFIR # ifdef USE_SIMD outval = _mm_set1_ps(0); #else outval = 0; #endif for (tap = oldestlag; tap < nlag; ++tap) outval += circbuf[tap] * *tmph--; for (tap = 0; tap < oldestlag; ++tap) outval += circbuf[tap] * *tmph--; outval += buf[k] * *tmph; #else # ifdef USE_SIMD outval.r = outval.i = _mm_set1_ps(0); #else outval.r = outval.i = 0; #endif for (tap = oldestlag; tap < nlag; ++tap){ C_MUL(tmp,circbuf[tap],*tmph); --tmph; C_ADDTO(outval,tmp); } for (tap = 0; tap < oldestlag; ++tap) { C_MUL(tmp,circbuf[tap],*tmph); --tmph; C_ADDTO(outval,tmp); } C_MUL(tmp,buf[k],*tmph); C_ADDTO(outval,tmp); #endif circbuf[oldestlag++] = buf[k]; buf[k] = outval; if (oldestlag == nlag) oldestlag = 0; } if (fwrite (buf, sizeof (buf[0]), nread, fout) != nread) { perror ("short write"); exit (1); } } while (nread); free (buf); free (circbuf); } static void do_file_filter( FILE * fin, FILE * fout, const kffsamp_t * imp_resp, size_t n_imp_resp, size_t nfft ) { int fdout; size_t n_samps_buf; kiss_fastfir_cfg cfg; kffsamp_t *inbuf,*outbuf; int nread,nwrite; size_t idx_inbuf; fdout = fileno(fout); cfg=kiss_fastfir_alloc(imp_resp,n_imp_resp,&nfft,0,0); /* use length to minimize buffer shift*/ n_samps_buf = 8*4096/sizeof(kffsamp_t); n_samps_buf = nfft + 4*(nfft-n_imp_resp+1); if (verbose) fprintf(stderr,"bufsize=%d\n",(int)(sizeof(kffsamp_t)*n_samps_buf) ); /*allocate space and initialize pointers */ inbuf = (kffsamp_t*)malloc(sizeof(kffsamp_t)*n_samps_buf); outbuf = (kffsamp_t*)malloc(sizeof(kffsamp_t)*n_samps_buf); idx_inbuf=0; do{ /* start reading at inbuf[idx_inbuf] */ nread = fread( inbuf + idx_inbuf, sizeof(kffsamp_t), n_samps_buf - idx_inbuf,fin ); /* If nread==0, then this is a flush. The total number of samples in input is idx_inbuf + nread . */ nwrite = kiss_fastfir(cfg, inbuf, outbuf,nread,&idx_inbuf) * sizeof(kffsamp_t); /* kiss_fastfir moved any unused samples to the front of inbuf and updated idx_inbuf */ if ( write(fdout, outbuf, nwrite) != nwrite ) { perror("short write"); exit(1); } }while ( nread ); free(cfg); free(inbuf); free(outbuf); } int main(int argc,char**argv) { kffsamp_t * h; int use_direct=0; size_t nh,nfft=0; FILE *fin=stdin; FILE *fout=stdout; FILE *filtfile=NULL; while (1) { int c=getopt(argc,argv,"n:h:i:o:vd"); if (c==-1) break; switch (c) { case 'v': verbose=1; break; case 'n': nfft=atoi(optarg); break; case 'i': fin = fopen(optarg,"rb"); if (fin==NULL) { perror(optarg); exit(1); } break; case 'o': fout = fopen(optarg,"w+b"); if (fout==NULL) { perror(optarg); exit(1); } break; case 'h': filtfile = fopen(optarg,"rb"); if (filtfile==NULL) { perror(optarg); exit(1); } break; case 'd': use_direct=1; break; case '?': fprintf(stderr,"usage options:\n" "\t-n nfft: fft size to use\n" "\t-d : use direct FIR filtering, not fast convolution\n" "\t-i filename: input file\n" "\t-o filename: output(filtered) file\n" "\t-n nfft: fft size to use\n" "\t-h filename: impulse response\n"); exit (1); default:fprintf(stderr,"bad %c\n",c);break; } } if (filtfile==NULL) { fprintf(stderr,"You must supply the FIR coeffs via -h\n"); exit(1); } fseek(filtfile,0,SEEK_END); nh = ftell(filtfile) / sizeof(kffsamp_t); if (verbose) fprintf(stderr,"%d samples in FIR filter\n",(int)nh); h = (kffsamp_t*)malloc(sizeof(kffsamp_t)*nh); fseek(filtfile,0,SEEK_SET); if (fread(h,sizeof(kffsamp_t),nh,filtfile) != nh) fprintf(stderr,"short read on filter file\n"); fclose(filtfile); if (use_direct) direct_file_filter( fin, fout, h,nh); else do_file_filter( fin, fout, h,nh,nfft); if (fout!=stdout) fclose(fout); if (fin!=stdin) fclose(fin); return 0; } #endif ���������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fftnd.c���������������������������������������������������0000775�0000000�0000000�00000015501�12660066715�0022041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include "kiss_fftnd.h" #include "_kiss_fft_guts.h" struct kiss_fftnd_state{ int dimprod; /* dimsum would be mighty tasty right now */ int ndims; int *dims; kiss_fft_cfg *states; /* cfg states for each dimension */ kiss_fft_cpx * tmpbuf; /*buffer capable of hold the entire input */ }; kiss_fftnd_cfg kiss_fftnd_alloc(const int *dims,int ndims,int inverse_fft,void*mem,size_t*lenmem) { kiss_fftnd_cfg st = NULL; int i; int dimprod=1; size_t memneeded = sizeof(struct kiss_fftnd_state); char * ptr; for (i=0;i<ndims;++i) { size_t sublen=0; kiss_fft_alloc (dims[i], inverse_fft, NULL, &sublen); memneeded += sublen; /* st->states[i] */ dimprod *= dims[i]; } memneeded += sizeof(int) * ndims;/* st->dims */ memneeded += sizeof(void*) * ndims;/* st->states */ memneeded += sizeof(kiss_fft_cpx) * dimprod; /* st->tmpbuf */ if (lenmem == NULL) {/* allocate for the caller*/ st = (kiss_fftnd_cfg) malloc (memneeded); } else { /* initialize supplied buffer if big enough */ if (*lenmem >= memneeded) st = (kiss_fftnd_cfg) mem; *lenmem = memneeded; /*tell caller how big struct is (or would be) */ } if (!st) return NULL; /*malloc failed or buffer too small */ st->dimprod = dimprod; st->ndims = ndims; ptr=(char*)(st+1); st->states = (kiss_fft_cfg *)ptr; ptr += sizeof(void*) * ndims; st->dims = (int*)ptr; ptr += sizeof(int) * ndims; st->tmpbuf = (kiss_fft_cpx*)ptr; ptr += sizeof(kiss_fft_cpx) * dimprod; for (i=0;i<ndims;++i) { size_t len; st->dims[i] = dims[i]; kiss_fft_alloc (st->dims[i], inverse_fft, NULL, &len); st->states[i] = kiss_fft_alloc (st->dims[i], inverse_fft, ptr,&len); ptr += len; } /* Hi there! If you're looking at this particular code, it probably means you've got a brain-dead bounds checker that thinks the above code overwrites the end of the array. It doesn't. -- Mark P.S. The below code might give you some warm fuzzies and help convince you. */ if ( ptr - (char*)st != (int)memneeded ) { fprintf(stderr, "################################################################################\n" "Internal error! Memory allocation miscalculation\n" "################################################################################\n" ); } return st; } /* This works by tackling one dimension at a time. In effect, Each stage starts out by reshaping the matrix into a DixSi 2d matrix. A Di-sized fft is taken of each column, transposing the matrix as it goes. Here's a 3-d example: Take a 2x3x4 matrix, laid out in memory as a contiguous buffer [ [ [ a b c d ] [ e f g h ] [ i j k l ] ] [ [ m n o p ] [ q r s t ] [ u v w x ] ] ] Stage 0 ( D=2): treat the buffer as a 2x12 matrix [ [a b ... k l] [m n ... w x] ] FFT each column with size 2. Transpose the matrix at the same time using kiss_fft_stride. [ [ a+m a-m ] [ b+n b-n] ... [ k+w k-w ] [ l+x l-x ] ] Note fft([x y]) == [x+y x-y] Stage 1 ( D=3) treats the buffer (the output of stage D=2) as an 3x8 matrix, [ [ a+m a-m b+n b-n c+o c-o d+p d-p ] [ e+q e-q f+r f-r g+s g-s h+t h-t ] [ i+u i-u j+v j-v k+w k-w l+x l-x ] ] And perform FFTs (size=3) on each of the columns as above, transposing the matrix as it goes. The output of stage 1 is (Legend: ap = [ a+m e+q i+u ] am = [ a-m e-q i-u ] ) [ [ sum(ap) fft(ap)[0] fft(ap)[1] ] [ sum(am) fft(am)[0] fft(am)[1] ] [ sum(bp) fft(bp)[0] fft(bp)[1] ] [ sum(bm) fft(bm)[0] fft(bm)[1] ] [ sum(cp) fft(cp)[0] fft(cp)[1] ] [ sum(cm) fft(cm)[0] fft(cm)[1] ] [ sum(dp) fft(dp)[0] fft(dp)[1] ] [ sum(dm) fft(dm)[0] fft(dm)[1] ] ] Stage 2 ( D=4) treats this buffer as a 4*6 matrix, [ [ sum(ap) fft(ap)[0] fft(ap)[1] sum(am) fft(am)[0] fft(am)[1] ] [ sum(bp) fft(bp)[0] fft(bp)[1] sum(bm) fft(bm)[0] fft(bm)[1] ] [ sum(cp) fft(cp)[0] fft(cp)[1] sum(cm) fft(cm)[0] fft(cm)[1] ] [ sum(dp) fft(dp)[0] fft(dp)[1] sum(dm) fft(dm)[0] fft(dm)[1] ] ] Then FFTs each column, transposing as it goes. The resulting matrix is the 3d FFT of the 2x3x4 input matrix. Note as a sanity check that the first element of the final stage's output (DC term) is sum( [ sum(ap) sum(bp) sum(cp) sum(dp) ] ) , i.e. the summation of all 24 input elements. */ void kiss_fftnd(kiss_fftnd_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { int i,k; const kiss_fft_cpx * bufin=fin; kiss_fft_cpx * bufout; /*arrange it so the last bufout == fout*/ if ( st->ndims & 1 ) { bufout = fout; if (fin==fout) { memcpy( st->tmpbuf, fin, sizeof(kiss_fft_cpx) * st->dimprod ); bufin = st->tmpbuf; } }else bufout = st->tmpbuf; for ( k=0; k < st->ndims; ++k) { int curdim = st->dims[k]; int stride = st->dimprod / curdim; for ( i=0 ; i<stride ; ++i ) kiss_fft_stride( st->states[k], bufin+i , bufout+i*curdim, stride ); /*toggle back and forth between the two buffers*/ if (bufout == st->tmpbuf){ bufout = fout; bufin = st->tmpbuf; }else{ bufout = st->tmpbuf; bufin = fout; } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fftnd.h���������������������������������������������������0000775�0000000�0000000�00000000572�12660066715�0022050�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef KISS_FFTND_H #define KISS_FFTND_H #include "kiss_fft.h" #ifdef __cplusplus extern "C" { #endif typedef struct kiss_fftnd_state * kiss_fftnd_cfg; kiss_fftnd_cfg kiss_fftnd_alloc(const int *dims,int ndims,int inverse_fft,void*mem,size_t*lenmem); void kiss_fftnd(kiss_fftnd_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); #ifdef __cplusplus } #endif #endif ��������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fftndr.c��������������������������������������������������0000775�0000000�0000000�00000011015�12660066715�0022217�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include "kiss_fftndr.h" #include "_kiss_fft_guts.h" #define MAX(x,y) ( ( (x)<(y) )?(y):(x) ) struct kiss_fftndr_state { int dimReal; int dimOther; kiss_fftr_cfg cfg_r; kiss_fftnd_cfg cfg_nd; void * tmpbuf; }; static int prod(const int *dims, int ndims) { int x=1; while (ndims--) x *= *dims++; return x; } kiss_fftndr_cfg kiss_fftndr_alloc(const int *dims,int ndims,int inverse_fft,void*mem,size_t*lenmem) { kiss_fftndr_cfg st = NULL; size_t nr=0 , nd=0,ntmp=0; int dimReal = dims[ndims-1]; int dimOther = prod(dims,ndims-1); size_t memneeded; (void)kiss_fftr_alloc(dimReal,inverse_fft,NULL,&nr); (void)kiss_fftnd_alloc(dims,ndims-1,inverse_fft,NULL,&nd); ntmp = MAX( 2*dimOther , dimReal+2) * sizeof(kiss_fft_scalar) // freq buffer for one pass + dimOther*(dimReal+2) * sizeof(kiss_fft_scalar); // large enough to hold entire input in case of in-place memneeded = sizeof( struct kiss_fftndr_state ) + nr + nd + ntmp; if (lenmem==NULL) { st = (kiss_fftndr_cfg) malloc(memneeded); }else{ if (*lenmem >= memneeded) st = (kiss_fftndr_cfg)mem; *lenmem = memneeded; } if (st==NULL) return NULL; memset( st , 0 , memneeded); st->dimReal = dimReal; st->dimOther = dimOther; st->cfg_r = kiss_fftr_alloc( dimReal,inverse_fft,st+1,&nr); st->cfg_nd = kiss_fftnd_alloc(dims,ndims-1,inverse_fft, ((char*) st->cfg_r)+nr,&nd); st->tmpbuf = (char*)st->cfg_nd + nd; return st; } void kiss_fftndr(kiss_fftndr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) { int k1,k2; int dimReal = st->dimReal; int dimOther = st->dimOther; int nrbins = dimReal/2+1; kiss_fft_cpx * tmp1 = (kiss_fft_cpx*)st->tmpbuf; kiss_fft_cpx * tmp2 = tmp1 + MAX(nrbins,dimOther); // timedata is N0 x N1 x ... x Nk real // take a real chunk of data, fft it and place the output at correct intervals for (k1=0;k1<dimOther;++k1) { kiss_fftr( st->cfg_r, timedata + k1*dimReal , tmp1 ); // tmp1 now holds nrbins complex points for (k2=0;k2<nrbins;++k2) tmp2[ k2*dimOther+k1 ] = tmp1[k2]; } for (k2=0;k2<nrbins;++k2) { kiss_fftnd(st->cfg_nd, tmp2+k2*dimOther, tmp1); // tmp1 now holds dimOther complex points for (k1=0;k1<dimOther;++k1) freqdata[ k1*(nrbins) + k2] = tmp1[k1]; } } void kiss_fftndri(kiss_fftndr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata) { int k1,k2; int dimReal = st->dimReal; int dimOther = st->dimOther; int nrbins = dimReal/2+1; kiss_fft_cpx * tmp1 = (kiss_fft_cpx*)st->tmpbuf; kiss_fft_cpx * tmp2 = tmp1 + MAX(nrbins,dimOther); for (k2=0;k2<nrbins;++k2) { for (k1=0;k1<dimOther;++k1) tmp1[k1] = freqdata[ k1*(nrbins) + k2 ]; kiss_fftnd(st->cfg_nd, tmp1, tmp2+k2*dimOther); } for (k1=0;k1<dimOther;++k1) { for (k2=0;k2<nrbins;++k2) tmp1[k2] = tmp2[ k2*dimOther+k1 ]; kiss_fftri( st->cfg_r,tmp1,timedata + k1*dimReal); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fftndr.h��������������������������������������������������0000775�0000000�0000000�00000001664�12660066715�0022235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef KISS_NDR_H #define KISS_NDR_H #include "kiss_fft.h" #include "kiss_fftr.h" #include "kiss_fftnd.h" #ifdef __cplusplus extern "C" { #endif typedef struct kiss_fftndr_state *kiss_fftndr_cfg; kiss_fftndr_cfg kiss_fftndr_alloc(const int *dims,int ndims,int inverse_fft,void*mem,size_t*lenmem); /* dims[0] must be even If you don't care to allocate space, use mem = lenmem = NULL */ void kiss_fftndr( kiss_fftndr_cfg cfg, const kiss_fft_scalar *timedata, kiss_fft_cpx *freqdata); /* input timedata has dims[0] X dims[1] X ... X dims[ndims-1] scalar points output freqdata has dims[0] X dims[1] X ... X dims[ndims-1]/2+1 complex points */ void kiss_fftndri( kiss_fftndr_cfg cfg, const kiss_fft_cpx *freqdata, kiss_fft_scalar *timedata); /* input and output dimensions are the exact opposite of kiss_fftndr */ #define kiss_fftr_free free #ifdef __cplusplus } #endif #endif ����������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fftr.c����������������������������������������������������0000775�0000000�0000000�00000013466�12660066715�0021711�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include "kiss_fftr.h" #include "../_kiss_fft_guts.h" struct kiss_fftr_state{ kiss_fft_cfg substate; kiss_fft_cpx * tmpbuf; kiss_fft_cpx * super_twiddles; #ifdef USE_SIMD void * pad; #endif }; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) { int i; kiss_fftr_cfg st = NULL; size_t subsize, memneeded; if (nfft & 1) { fprintf(stderr,"Real FFT optimization must be even.\n"); return NULL; } nfft >>= 1; kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize); memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 3 / 2); if (lenmem == NULL) { st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); } else { if (*lenmem >= memneeded) st = (kiss_fftr_cfg) mem; *lenmem = memneeded; } if (!st) return NULL; st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize); st->super_twiddles = st->tmpbuf + nfft; kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); for (i = 0; i < nfft/2; ++i) { double phase = -3.14159265358979323846264338327 * ((double) (i+1) / nfft + .5); if (inverse_fft) phase *= -1; kf_cexp (st->super_twiddles+i,phase); } return st; } void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx fpnk,fpk,f1k,f2k,tw,tdc; if ( st->substate->inverse) { fprintf(stderr,"kiss fft usage error: improper alloc\n"); exit(1); } ncfft = st->substate->nfft; /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = st->tmpbuf[0].r; tdc.i = st->tmpbuf[0].i; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0].r = tdc.r + tdc.i; freqdata[ncfft].r = tdc.r - tdc.i; #ifdef USE_SIMD freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); #else freqdata[ncfft].i = freqdata[0].i = 0; #endif for ( k=1;k <= ncfft/2 ; ++k ) { fpk = st->tmpbuf[k]; fpnk.r = st->tmpbuf[ncfft-k].r; fpnk.i = - st->tmpbuf[ncfft-k].i; C_FIXDIV(fpk,2); C_FIXDIV(fpnk,2); C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( tw , f2k , st->super_twiddles[k-1]); freqdata[k].r = HALF_OF(f1k.r + tw.r); freqdata[k].i = HALF_OF(f1k.i + tw.i); freqdata[ncfft-k].r = HALF_OF(f1k.r - tw.r); freqdata[ncfft-k].i = HALF_OF(tw.i - f1k.i); } } void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; if (st->substate->inverse == 0) { fprintf (stderr, "kiss fft usage error: improper alloc\n"); exit (1); } ncfft = st->substate->nfft; st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; C_FIXDIV(st->tmpbuf[0],2); for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk = freqdata[k]; fnkc.r = freqdata[ncfft - k].r; fnkc.i = -freqdata[ncfft - k].i; C_FIXDIV( fk , 2 ); C_FIXDIV( fnkc , 2 ); C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k-1]); C_ADD (st->tmpbuf[k], fek, fok); C_SUB (st->tmpbuf[ncfft - k], fek, fok); #ifdef USE_SIMD st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); #else st->tmpbuf[ncfft - k].i *= -1; #endif } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/kiss_fftr.h����������������������������������������������������0000775�0000000�0000000�00000001535�12660066715�0021710�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef KISS_FTR_H #define KISS_FTR_H #include "../kiss_fft.h" #ifdef __cplusplus extern "C" { #endif /* Real optimized version can save about 45% cpu time vs. complex fft of a real seq. */ typedef struct kiss_fftr_state *kiss_fftr_cfg; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); /* nfft must be even If you don't care to allocate space, use mem = lenmem = NULL */ void kiss_fftr(kiss_fftr_cfg cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); /* input timedata has nfft scalar points output freqdata has nfft/2+1 complex points */ void kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); /* input freqdata has nfft/2+1 complex points output timedata has nfft scalar points */ #define kiss_fftr_free free #ifdef __cplusplus } #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/kiss_fft/tools/psdpng.c�������������������������������������������������������0000775�0000000�0000000�00000015755�12660066715�0021215�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any 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. */ #include <stdlib.h> #include <math.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <png.h> #include "kiss_fft.h" #include "kiss_fftr.h" int nfft=1024; FILE * fin=NULL; FILE * fout=NULL; int navg=20; int remove_dc=0; int nrows=0; float * vals=NULL; int stereo=0; static void config(int argc,char** argv) { while (1) { int c = getopt (argc, argv, "n:r:as"); if (c == -1) break; switch (c) { case 'n': nfft=(int)atoi(optarg);break; case 'r': navg=(int)atoi(optarg);break; case 'a': remove_dc=1;break; case 's': stereo=1;break; case '?': fprintf (stderr, "usage options:\n" "\t-n d: fft dimension(s) [1024]\n" "\t-r d: number of rows to average [20]\n" "\t-a : remove average from each fft buffer\n" "\t-s : input is stereo, channels will be combined before fft\n" "16 bit machine format real input is assumed\n" ); default: fprintf (stderr, "bad %c\n", c); exit (1); break; } } if ( optind < argc ) { if (strcmp("-",argv[optind]) !=0) fin = fopen(argv[optind],"rb"); ++optind; } if ( optind < argc ) { if ( strcmp("-",argv[optind]) !=0 ) fout = fopen(argv[optind],"wb"); ++optind; } if (fin==NULL) fin=stdin; if (fout==NULL) fout=stdout; } #define CHECKNULL(p) if ( (p)==NULL ) do { fprintf(stderr,"CHECKNULL failed @ %s(%d): %s\n",__FILE__,__LINE__,#p );exit(1);} while(0) typedef struct { png_byte r; png_byte g; png_byte b; } rgb_t; static void val2rgb(float x,rgb_t *p) { const double pi = 3.14159265358979; p->g = (int)(255*sin(x*pi)); p->r = (int)(255*abs(sin(x*pi*3/2))); p->b = (int)(255*abs(sin(x*pi*5/2))); //fprintf(stderr,"%.2f : %d,%d,%d\n",x,(int)p->r,(int)p->g,(int)p->b); } static void cpx2pixels(rgb_t * res,const float * fbuf,size_t n) { size_t i; float minval,maxval,valrange; minval=maxval=fbuf[0]; for (i = 0; i < n; ++i) { if (fbuf[i] > maxval) maxval = fbuf[i]; if (fbuf[i] < minval) minval = fbuf[i]; } fprintf(stderr,"min ==%f,max=%f\n",minval,maxval); valrange = maxval-minval; if (valrange == 0) { fprintf(stderr,"min == max == %f\n",minval); exit (1); } for (i = 0; i < n; ++i) val2rgb( (fbuf[i] - minval)/valrange , res+i ); } static void transform_signal(void) { short *inbuf; kiss_fftr_cfg cfg=NULL; kiss_fft_scalar *tbuf; kiss_fft_cpx *fbuf; float *mag2buf; int i; int n; int avgctr=0; int nfreqs=nfft/2+1; CHECKNULL( cfg=kiss_fftr_alloc(nfft,0,0,0) ); CHECKNULL( inbuf=(short*)malloc(sizeof(short)*2*nfft ) ); CHECKNULL( tbuf=(kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar)*nfft ) ); CHECKNULL( fbuf=(kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*nfreqs ) ); CHECKNULL( mag2buf=(float*)malloc(sizeof(float)*nfreqs ) ); memset(mag2buf,0,sizeof(mag2buf)*nfreqs); while (1) { if (stereo) { n = fread(inbuf,sizeof(short)*2,nfft,fin); if (n != nfft ) break; for (i=0;i<nfft;++i) tbuf[i] = inbuf[2*i] + inbuf[2*i+1]; }else{ n = fread(inbuf,sizeof(short),nfft,fin); if (n != nfft ) break; for (i=0;i<nfft;++i) tbuf[i] = inbuf[i]; } if (remove_dc) { float avg = 0; for (i=0;i<nfft;++i) avg += tbuf[i]; avg /= nfft; for (i=0;i<nfft;++i) tbuf[i] -= (kiss_fft_scalar)avg; } /* do FFT */ kiss_fftr(cfg,tbuf,fbuf); for (i=0;i<nfreqs;++i) mag2buf[i] += fbuf[i].r * fbuf[i].r + fbuf[i].i * fbuf[i].i; if (++avgctr == navg) { avgctr=0; ++nrows; vals = (float*)realloc(vals,sizeof(float)*nrows*nfreqs); float eps = 1; for (i=0;i<nfreqs;++i) vals[(nrows - 1) * nfreqs + i] = 10 * log10 ( mag2buf[i] / navg + eps ); memset(mag2buf,0,sizeof(mag2buf[0])*nfreqs); } } free(cfg); free(inbuf); free(tbuf); free(fbuf); free(mag2buf); } static void make_png(void) { png_bytepp row_pointers=NULL; rgb_t * row_data=NULL; int i; int nfreqs = nfft/2+1; png_structp png_ptr=NULL; png_infop info_ptr=NULL; CHECKNULL( png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING,0,0,0) ); CHECKNULL( info_ptr = png_create_info_struct(png_ptr) ); png_init_io(png_ptr, fout ); png_set_IHDR(png_ptr, info_ptr ,nfreqs,nrows,8,PNG_COLOR_TYPE_RGB,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT ); row_data = (rgb_t*)malloc(sizeof(rgb_t) * nrows * nfreqs) ; cpx2pixels(row_data, vals, nfreqs*nrows ); row_pointers = realloc(row_pointers, nrows*sizeof(png_bytep)); for (i=0;i<nrows;++i) { row_pointers[i] = (png_bytep)(row_data + i*nfreqs); } png_set_rows(png_ptr, info_ptr, row_pointers); fprintf(stderr,"creating %dx%d png\n",nfreqs,nrows); fprintf(stderr,"bitdepth %d \n",png_get_bit_depth(png_ptr,info_ptr ) ); png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY , NULL); } int main(int argc,char ** argv) { config(argc,argv); transform_signal(); make_png(); if (fout!=stdout) fclose(fout); if (fin!=stdin) fclose(fin); return 0; } �������������������silverjuke-16.2.3/src/prjm/�������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0015536�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/AUTHORS.txt��������������������������������������������������������������0000775�0000000�0000000�00000003010�12660066715�0017421�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������projectM -- Milkdrop-esque visualisation SDK Copyright (C)2003-2007 projectM Team This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA See 'LICENSE.txt' included within this release For the purposes of the copyright statement in the preamble of each source code file comprising projectM, the projectM team are: Carmelo Piccione Parser Evaluator Pulse Audio support (projectM-pulseaudio) Qt GUI (projectM-qt) Peter Sperl Beat Detection Rendering XMMS Support (projectM-xmms) libvisual Support (projectM-libvisual) Alligator Descartes Media Player Support (iTunes, Winamp, Windows Media Player) Test application frameworks (projectM-wxvis, projectM-sdlvis) DVD application (projectM-movie) Win32 screensaver (projectM-screensaver) Roger Dannenburg Advice & Support Matthias Klumpp CMake build system Distro integration Bug fixes ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/COPYING.txt��������������������������������������������������������������0000775�0000000�0000000�00000063463�12660066715�0017426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the library's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. <signature of Ty Coon>, 1 April 1990 Ty Coon, President of Vice That's all there is to it! �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/FAQ.txt������������������������������������������������������������������0000775�0000000�0000000�00000012324�12660066715�0016713�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ projectM -- Milkdrop-esque visualisation SDK Copyright (C)2003-2007 projectM Team This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA See 'LICENSE.txt' included within this release --------------------------------------------------- projectM v.0.94.20 FAQ ------------------ written by Peter Sperl and Carmelo Piccione --------------------------------------------------- Q1: What is projectM? Q2: What? This preset doesn't look like it does on Milkdrop. Q3: Where can I get more presets? Q4: What are the system requirements? Q5: Why is projectM so slow!!! Q6: How can I increase the rendering quality to make projectM look better? Q7: How can I configure projectM? (where's the config file?) Q8: Where are the presets? Q1: What is projectM? -------------------- A: projectM makes pretty pictures from music in realtime. Specifically it uses iterative image-based rendering techniques which are hardware accelerated via OpenGL. projectM was developed with cross-platform support in mind, using SDL and OpenGL. The only port right now is Linux/XMMS, but it should be easy to plug-in to other music players on other platforms (even windows and Mac OS X). projectM aims for compatability with MilkDrop's latest release (1.04b at this time), but we have always intended to surpass it. This program was inspired by Ryan Geiss' wonderful program MilkDrop. www.geisswerks.com Q2: What? This preset doesn't look like it does on Milkdrop. ----------------------------------------------------------- A: We know. Some of the simple waveforms (1,2,3,4,5) are not even close to correct. They are similiar, but not exactly the same. Also, the solarize, brighten, and darken filters aren't done yet either. Sometimes things just don't look right because we might, for example, draw shapes a tiny bit too big or small. Small errors propagate and become HUGE after a few manipulations. But who knows because it takes forever to tweak things like this. Q3: Where can I get more presets? -------------------------------- A: www.milkdrop.co.uk is a great place to start. However, all their presets are packaged in self-unzipping .exe's for win32. I extracted them with wine and it worked wonderfully. Check out the milkdrop forums at www.winamp.com to find new presets daily. The URL is below http://forums.winamp.com/forumdisplay.php?forumid=81 Q4: What are the system requirements? ------------------------------------ A: To run projectM you need a Linux system w/a sound card and a video card with OpenGL hardware acceleration. We find that projectM runs MUCH better with the 2.6 series kernel and ALSA sound. What does that mean? Well... projectM has only been tested prior to me writing this on 4 computers. All those computers used some form of Redhat (8,9, & Fedora 1), although this should make no differance if you run a differant distro. Also, all of them used Nvidia (Geforce 3 Ti200, Geforce 4 MX440 & Ti4200) WE STRONGLY RECCOMEND THE USE OF ALSA AND THE 2.6 SERIES KERNEL Q5: Why is projectM so slow!!! ----------------------------- A: If projectM is slow for you all the time, and not just on a select few presets, you can try lowering the rendering quality, and this will speed things up A LOT. To do this, lower the texsize and gridsize (gx,gy) in /etc/projectM/config Texsize controls the size of the rendered image. If you think your video card is too slow or doesn't have enough memory, then change this. A middle value for texsize is 512. 1024 is nice looking, and 256 is for VERY slow computers. If your processor is the bottleneck, then lower gx and gy. gx and gy control the size of the interpolated per-pixel mesh. 24/18 is a low-middle value. I run at 48/32 some times on my Athlon 64 3200, and I could probably go higher, although some presets slow down for me at this VERY high setting. Certain presets can be processor hogs and slow the framerate down to almost 0. In this situation my best advice is not to use those presets. All the presets that come with projectM should be slim enough to run on nearly all machines capable of running projectM in the first place. Q6:How can I increase the rendering quality to make projectM look better? ------------------------------------------------------------------------- A: Read Q5 and do the opposite! Q7: How can I configure projectM? (where's the config file?) ------------------------------------------------------------ A: /etc/projectM/config Q8: Where are the presets? -------------------------- A: /usr/share/projectM/presets ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/README-PRJM.md�����������������������������������������������������������0000664�0000000�0000000�00000001703�12660066715�0017564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Prjm - projectM fork for Silverjuke ================================================================================ This directory contains "Prjm" (pronounced "Preem"), a fork of the "projectM" library, a Milkdrop-esque visualisation. This fork mainly optimizes the core parts of the projectM for the use with Silverjuke (includes, defines, directory structure, avoid using glu.h etc.). Any changes are maked by "EDIT BY SJ". For easy usage of projectM with Silverjuke and with different compilers, we decided to put all configuration to the C-side into `amalgation.h`; the only files to include are `amalgation1.cpp` and `amalgation2.cpp`. We had to create two files to allow the usage of different structures with the same name, see comments in `amalgation1.cpp`. The main interfaces are _not_ changed, so we may decide to switch back to projectM any time. The licence of this fork is the same as the original projectM license, see file "COPYING". �������������������������������������������������������������silverjuke-16.2.3/src/prjm/amalgation.h�������������������������������������������������������������0000664�0000000�0000000�00000005163�12660066715�0020030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #ifndef __PRJM_AMAGATION_H__ #define __PRJM_AMAGATION_H__ #include <sjbase/base.h> #if SJ_USE_PROJECTM /******************************************************************************* * OS define needed for projectM ******************************************************************************/ #if defined(__WXMAC__) #ifndef __APPLE__ #define __APPLE__ #endif #ifndef MACOS #define MACOS #endif #elif defined(__WXMSW__) #ifndef WIN32 #define WIN32 #endif #ifndef _WIN32 #define _WIN32 #endif #else #ifndef LINUX #define LINUX #endif #endif // some checks for OS consistences #if (defined(LINUX) && defined(WIN32)) || (defined(LINUX) && defined(MACOS)) || (defined(WIN32) && defined(MACOS)) #error define only one of LINUX, WIN32 or MACOS #endif #if (defined(__APPLE__) && !defined(MACOS)) || (!defined(__APPLE__) && defined(MACOS)) #error define both, __APPLE__ and MACOS - both are used in the code :-( #endif /******************************************************************************* * projectM special includes, types and settings ******************************************************************************/ #define CMAKE_INSTALL_PREFIX "" #define projectM_FONT_TITLE "" #define projectM_FONT_MENU "" // the following options are enabled by default - and should be enabled by us (non-defaults are more buggy ...) //#define USE_FBO //#define USE_NATIVE_GLEW // we prefer our own glew.h, needed for USE_FBO #define DISABLE_NATIVE_PRESETS // presets in C++-libraries not needed #define STBI_NO_FAILURE_STRINGS // used in stb_image_aug.c, disabling the failure strings avoid lots of string errors on Mac //#define USE_OPENMP //#define USE_FTGL #undef USE_THREADS // all options - description - default: //OPTION (USE_DEVIL "Use devIL for image loading rather than the builtin SOIL library" OFF) //OPTION (USE_FBO "Use Framebuffer Objects for increased rendering quality. Disable this for OpenGL ES 1.x or if you are experiencing problems on older or poorly supported hardware." ON) //OPTION(USE_FTGL "Use FTGL for on-screen fonts (found on your system)" ON) //OPTION (USE_GLES1 "Use OpenGL ES 1.x" OFF) //OPTION (USE_THREADS "Use threads for parallelization" ON) //OPTION (USE_OPENMP "Use OpenMP and OMPTL for multi-core parallelization" ON) //OPTION (USE_NATIVE_GLEW "Use projectM's native implemention of GLEW." OFF) //OPTION (USE_CG "Use Cg for Pixel Shader support" OFF) //OPTION (DISABLE_NATIVE_PRESETS "Turn off support for native (C++ style) presets" OFF) //OPTION (DISABLE_MILKDROP_PRESETS "Turn off support for Milkdrop (.milk / .prjm) presets" OFF) #endif // SJ_USE_PROJECTM #endif // __PRJM_AMAGATION_H__ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/amalgation1.cpp����������������������������������������������������������0000664�0000000�0000000�00000004360�12660066715�0020442�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #include "amalgation.h" #if SJ_USE_PROJECTM #include "src/ConfigFile.cpp" #include "src/fftsg.cpp" #include "src/KeyHandler.cpp" #include "src/MilkdropPresetFactory/BuiltinFuncs.cpp" #include "src/MilkdropPresetFactory/BuiltinParams.cpp" #include "src/MilkdropPresetFactory/CustomShape.cpp" #include "src/MilkdropPresetFactory/CustomWave.cpp" #include "src/MilkdropPresetFactory/Eval.cpp" #include "src/MilkdropPresetFactory/Expr.cpp" #include "src/MilkdropPresetFactory/Func.cpp" #include "src/MilkdropPresetFactory/IdlePreset.cpp" #include "src/MilkdropPresetFactory/InitCond.cpp" #include "src/MilkdropPresetFactory/MilkdropPreset.cpp" #include "src/MilkdropPresetFactory/MilkdropPresetFactory.cpp" #include "src/MilkdropPresetFactory/Param.cpp" #include "src/MilkdropPresetFactory/PerFrameEqn.cpp" #include "src/MilkdropPresetFactory/PerPixelEqn.cpp" #include "src/MilkdropPresetFactory/PerPointEqn.cpp" #include "src/MilkdropPresetFactory/PresetFrameIO.cpp" #include "src/PCM.cpp" #include "src/PipelineMerger.cpp" #include "src/Preset.cpp" #include "src/PresetFactory.cpp" #include "src/PresetFactoryManager.cpp" #include "src/PresetLoader.cpp" #include "src/projectM.cpp" #include "src/Renderer/BeatDetect.cpp" #include "src/Renderer/FBO.cpp" #include "src/Renderer/Filters.cpp" #include "src/Renderer/MilkdropWaveform.cpp" #include "src/Renderer/PerlinNoise.cpp" #include "src/Renderer/PerPixelMesh.cpp" #include "src/Renderer/Pipeline.cpp" #include "src/Renderer/PipelineContext.cpp" #include "src/Renderer/Renderable.cpp" #include "src/Renderer/Renderer.cpp" #include "src/Renderer/RenderItemDistanceMetric.cpp" #include "src/Renderer/RenderItemMatcher.cpp" #include "src/Renderer/Shader.cpp" #include "src/Renderer/ShaderEngine.cpp" #include "src/Renderer/TextureManager.cpp" #include "src/Renderer/UserTexture.cpp" #include "src/Renderer/VideoEcho.cpp" #include "src/Renderer/Waveform.cpp" #include "src/TimeKeeper.cpp" #include "src/timer.cpp" #include "src/wipemalloc.cpp" extern "C" { #include "src/Renderer/SOIL/image_DXT.c" // image_DXT.c and stb_image_aug.c use different structures with the same name; this is the reason for the two amalgation files #include "src/Renderer/SOIL/image_helper.c" #include "src/Renderer/SOIL/SOIL.c" }; #endif // SJ_USE_PROJECTM ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/amalgation2.cpp����������������������������������������������������������0000664�0000000�0000000�00000000566�12660066715�0020447�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #include "amalgation.h" #if SJ_USE_PROJECTM #include "src/MilkdropPresetFactory/Parser.cpp" extern "C" { #ifdef USE_NATIVE_GLEW #include "glew/glew.c" #endif #include "src/Renderer/SOIL/stb_image_aug.c" // image_DXT.c and stb_image_aug.c use different structures with the same name; this is the reason for the two amalgation files }; #endif // SJ_USE_PROJECTM ������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/glew/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0016474�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/glew/glew.c��������������������������������������������������������������0000664�0000000�0000000�00003530553�12660066715�0017614�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net> ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org> ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org> ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ #include "glew.h" #if defined(_WIN32) # include "wglew.h" #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) # include "glxew.h" #endif #include <stddef.h> /* For size_t */ /* * Define glewGetContext and related helper macros. */ #ifdef GLEW_MX # define glewGetContext() ctx # ifdef _WIN32 # define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx # define GLEW_CONTEXT_ARG_VAR_INIT ctx # define wglewGetContext() ctx # define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx # define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx # else /* _WIN32 */ # define GLEW_CONTEXT_ARG_DEF_INIT void # define GLEW_CONTEXT_ARG_VAR_INIT # define glxewGetContext() ctx # define GLXEW_CONTEXT_ARG_DEF_INIT void # define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx # endif /* _WIN32 */ # define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx #else /* GLEW_MX */ # define GLEW_CONTEXT_ARG_DEF_INIT void # define GLEW_CONTEXT_ARG_VAR_INIT # define GLEW_CONTEXT_ARG_DEF_LIST void # define WGLEW_CONTEXT_ARG_DEF_INIT void # define WGLEW_CONTEXT_ARG_DEF_LIST void # define GLXEW_CONTEXT_ARG_DEF_INIT void # define GLXEW_CONTEXT_ARG_DEF_LIST void #endif /* GLEW_MX */ #if defined(GLEW_REGAL) /* In GLEW_REGAL mode we call direcly into the linked libRegal.so glGetProcAddressREGAL for looking up the GL function pointers. */ # undef glGetProcAddressREGAL # ifdef WIN32 extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; # else extern void * glGetProcAddressREGAL(const GLchar *name); static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; # endif # define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) #elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #include <dlfcn.h> #include <stdio.h> #include <stdlib.h> void* dlGetProcAddress (const GLubyte* name) { static void* h = NULL; static void* gpa; if (h == NULL) { if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; gpa = dlsym(h, "glXGetProcAddress"); } if (gpa != NULL) return ((void*(*)(const GLubyte*))gpa)(name); else return dlsym(h, (const char*)name); } #endif /* __sgi || __sun || GLEW_APPLE_GLX */ #if defined(__APPLE__) #include <stdlib.h> #include <string.h> #include <AvailabilityMacros.h> #ifdef MAC_OS_X_VERSION_10_3 #include <dlfcn.h> void* NSGLGetProcAddress (const GLubyte *name) { static void* image = NULL; void* addr; if (NULL == image) { image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); } if( !image ) return NULL; addr = dlsym(image, (const char*)name); if( addr ) return addr; #ifdef GLEW_APPLE_GLX return dlGetProcAddress( name ); // try next for glx symbols #else return NULL; #endif } #else #include <mach-o/dyld.h> void* NSGLGetProcAddress (const GLubyte *name) { static const struct mach_header* image = NULL; NSSymbol symbol; char* symbolName; if (NULL == image) { image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); } /* prepend a '_' for the Unix C symbol mangling convention */ symbolName = malloc(strlen((const char*)name) + 2); strcpy(symbolName+1, (const char*)name); symbolName[0] = '_'; symbol = NULL; /* if (NSIsSymbolNameDefined(symbolName)) symbol = NSLookupAndBindSymbol(symbolName); */ symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; free(symbolName); if( symbol ) return NSAddressOfSymbol(symbol); #ifdef GLEW_APPLE_GLX return dlGetProcAddress( name ); // try next for glx symbols #else return NULL; #endif } #endif /* MAC_OS_X_VERSION_10_3 */ #endif /* __APPLE__ */ /* * Define glewGetProcAddress. */ #if defined(GLEW_REGAL) # define glewGetProcAddress(name) regalGetProcAddress((const GLchar *) name) #elif defined(_WIN32) # define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) # define glewGetProcAddress(name) NSGLGetProcAddress(name) #elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) # define glewGetProcAddress(name) dlGetProcAddress(name) #elif defined(__ANDROID__) # define glewGetProcAddress(name) NULL /* TODO */ #elif defined(__native_client__) # define glewGetProcAddress(name) NULL /* TODO */ #else /* __linux */ # define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) #endif /* * Redefine GLEW_GET_VAR etc without const cast */ #undef GLEW_GET_VAR #ifdef GLEW_MX # define GLEW_GET_VAR(x) (glewGetContext()->x) #else /* GLEW_MX */ # define GLEW_GET_VAR(x) (x) #endif /* GLEW_MX */ #ifdef WGLEW_GET_VAR # undef WGLEW_GET_VAR # ifdef GLEW_MX # define WGLEW_GET_VAR(x) (wglewGetContext()->x) # else /* GLEW_MX */ # define WGLEW_GET_VAR(x) (x) # endif /* GLEW_MX */ #endif /* WGLEW_GET_VAR */ #ifdef GLXEW_GET_VAR # undef GLXEW_GET_VAR # ifdef GLEW_MX # define GLXEW_GET_VAR(x) (glxewGetContext()->x) # else /* GLEW_MX */ # define GLXEW_GET_VAR(x) (x) # endif /* GLEW_MX */ #endif /* GLXEW_GET_VAR */ /* * GLEW, just like OpenGL or GLU, does not rely on the standard C library. * These functions implement the functionality required in this file. */ static GLuint _glewStrLen (const GLubyte* s) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0') i++; return i; } static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) { GLuint i=0; if (s == NULL) return 0; while (s[i] != '\0' && s[i] != c) i++; return (s[i] == '\0' || s[i] == c) ? i : 0; } static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) { GLuint i=0; if(a == NULL || b == NULL) return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; return i == n ? GL_TRUE : GL_FALSE; } static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) { (*a)++; (*na)--; } if(*na >= nb) { GLuint i=0; while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; if(i == nb) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { if(*na >= nb) { GLuint i=0; while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; if(i == nb) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) { if(*na >= nb) { GLuint i=0; while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) { *a = *a + nb; *na = *na - nb; return GL_TRUE; } } return GL_FALSE; } /* * Search for name in the extensions string. Use of strstr() * is not sufficient because extension names can be prefixes of * other extension names. Could use strtok() but the constant * string returned by glGetString might be in read-only memory. */ static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) { const GLubyte* p; GLuint len = _glewStrLen((const GLubyte*)name); p = start; while (p < end) { GLuint n = _glewStrCLen(p, ' '); if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; p += n+1; } return GL_FALSE; } #if !defined(_WIN32) || !defined(GLEW_MX) PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; PFNGLBLENDCOLORPROC __glewBlendColor = NULL; PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; PFNGLBUFFERDATAPROC __glewBufferData = NULL; PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; PFNGLENDQUERYPROC __glewEndQuery = NULL; PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; PFNGLGENQUERIESPROC __glewGenQueries = NULL; PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; PFNGLISBUFFERPROC __glewIsBuffer = NULL; PFNGLISQUERYPROC __glewIsQuery = NULL; PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; PFNGLATTACHSHADERPROC __glewAttachShader = NULL; PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; PFNGLCREATESHADERPROC __glewCreateShader = NULL; PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; PFNGLDELETESHADERPROC __glewDeleteShader = NULL; PFNGLDETACHSHADERPROC __glewDetachShader = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; PFNGLISPROGRAMPROC __glewIsProgram = NULL; PFNGLISSHADERPROC __glewIsShader = NULL; PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; PFNGLUNIFORM1FPROC __glewUniform1f = NULL; PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; PFNGLUNIFORM1IPROC __glewUniform1i = NULL; PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; PFNGLUNIFORM2FPROC __glewUniform2f = NULL; PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; PFNGLUNIFORM2IPROC __glewUniform2i = NULL; PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; PFNGLUNIFORM3FPROC __glewUniform3f = NULL; PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; PFNGLUNIFORM3IPROC __glewUniform3i = NULL; PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; PFNGLUNIFORM4FPROC __glewUniform4f = NULL; PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; PFNGLUNIFORM4IPROC __glewUniform4i = NULL; PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; PFNGLCLAMPCOLORPROC __glewClampColor = NULL; PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; PFNGLCOLORMASKIPROC __glewColorMaski = NULL; PFNGLDISABLEIPROC __glewDisablei = NULL; PFNGLENABLEIPROC __glewEnablei = NULL; PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; PFNGLGETSTRINGIPROC __glewGetStringi = NULL; PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; PFNGLCLIPCONTROLPROC __glewClipControl = NULL; PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; PFNGLUNIFORM1DPROC __glewUniform1d = NULL; PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; PFNGLUNIFORM2DPROC __glewUniform2d = NULL; PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; PFNGLUNIFORM3DPROC __glewUniform3d = NULL; PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; PFNGLUNIFORM4DPROC __glewUniform4d = NULL; PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; PFNGLCOLORTABLEPROC __glewColorTable = NULL; PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; PFNGLGETMINMAXPROC __glewGetMinmax = NULL; PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; PFNGLHISTOGRAMPROC __glewHistogram = NULL; PFNGLMINMAXPROC __glewMinmax = NULL; PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; PFNGLISSAMPLERPROC __glewIsSampler = NULL; PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; PFNGLDELETESYNCPROC __glewDeleteSync = NULL; PFNGLFENCESYNCPROC __glewFenceSync = NULL; PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; PFNGLISSYNCPROC __glewIsSync = NULL; PFNGLWAITSYNCPROC __glewWaitSync = NULL; PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; PFNGLISFENCENVPROC __glewIsFenceNV = NULL; PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; PFNGLISPATHNVPROC __glewIsPathNV = NULL; PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL; PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL; PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL; PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; PFNGLORTHOFOESPROC __glewOrthofOES = NULL; PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; PFNGLCOLOR4XPROC __glewColor4x = NULL; PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; PFNGLFOGXPROC __glewFogx = NULL; PFNGLFOGXVPROC __glewFogxv = NULL; PFNGLFRUSTUMFPROC __glewFrustumf = NULL; PFNGLFRUSTUMXPROC __glewFrustumx = NULL; PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; PFNGLLIGHTXPROC __glewLightx = NULL; PFNGLLIGHTXVPROC __glewLightxv = NULL; PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; PFNGLMATERIALXPROC __glewMaterialx = NULL; PFNGLMATERIALXVPROC __glewMaterialxv = NULL; PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; PFNGLNORMAL3XPROC __glewNormal3x = NULL; PFNGLORTHOFPROC __glewOrthof = NULL; PFNGLORTHOXPROC __glewOrthox = NULL; PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; PFNGLROTATEXPROC __glewRotatex = NULL; PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; PFNGLSCALEXPROC __glewScalex = NULL; PFNGLTEXENVXPROC __glewTexEnvx = NULL; PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; PFNGLTRANSLATEXPROC __glewTranslatex = NULL; PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; #endif /* !WIN32 || !GLEW_MX */ #if !defined(GLEW_MX) GLboolean __GLEW_VERSION_1_1 = GL_FALSE; GLboolean __GLEW_VERSION_1_2 = GL_FALSE; GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; GLboolean __GLEW_VERSION_1_3 = GL_FALSE; GLboolean __GLEW_VERSION_1_4 = GL_FALSE; GLboolean __GLEW_VERSION_1_5 = GL_FALSE; GLboolean __GLEW_VERSION_2_0 = GL_FALSE; GLboolean __GLEW_VERSION_2_1 = GL_FALSE; GLboolean __GLEW_VERSION_3_0 = GL_FALSE; GLboolean __GLEW_VERSION_3_1 = GL_FALSE; GLboolean __GLEW_VERSION_3_2 = GL_FALSE; GLboolean __GLEW_VERSION_3_3 = GL_FALSE; GLboolean __GLEW_VERSION_4_0 = GL_FALSE; GLboolean __GLEW_VERSION_4_1 = GL_FALSE; GLboolean __GLEW_VERSION_4_2 = GL_FALSE; GLboolean __GLEW_VERSION_4_3 = GL_FALSE; GLboolean __GLEW_VERSION_4_4 = GL_FALSE; GLboolean __GLEW_VERSION_4_5 = GL_FALSE; GLboolean __GLEW_3DFX_multisample = GL_FALSE; GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; GLboolean __GLEW_AMD_debug_output = GL_FALSE; GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; GLboolean __GLEW_AMD_sample_positions = GL_FALSE; GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; GLboolean __GLEW_APPLE_client_storage = GL_FALSE; GLboolean __GLEW_APPLE_element_array = GL_FALSE; GLboolean __GLEW_APPLE_fence = GL_FALSE; GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; GLboolean __GLEW_APPLE_texture_range = GL_FALSE; GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; GLboolean __GLEW_ARB_base_instance = GL_FALSE; GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; GLboolean __GLEW_ARB_cl_event = GL_FALSE; GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_clear_texture = GL_FALSE; GLboolean __GLEW_ARB_clip_control = GL_FALSE; GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_compatibility = GL_FALSE; GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; GLboolean __GLEW_ARB_compute_shader = GL_FALSE; GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; GLboolean __GLEW_ARB_copy_image = GL_FALSE; GLboolean __GLEW_ARB_cull_distance = GL_FALSE; GLboolean __GLEW_ARB_debug_output = GL_FALSE; GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; GLboolean __GLEW_ARB_depth_texture = GL_FALSE; GLboolean __GLEW_ARB_derivative_control = GL_FALSE; GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; GLboolean __GLEW_ARB_fragment_program = GL_FALSE; GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; GLboolean __GLEW_ARB_imaging = GL_FALSE; GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; GLboolean __GLEW_ARB_multi_bind = GL_FALSE; GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_multisample = GL_FALSE; GLboolean __GLEW_ARB_multitexture = GL_FALSE; GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_point_parameters = GL_FALSE; GLboolean __GLEW_ARB_point_sprite = GL_FALSE; GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_ARB_robustness = GL_FALSE; GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLEW_ARB_sample_locations = GL_FALSE; GLboolean __GLEW_ARB_sample_shading = GL_FALSE; GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; GLboolean __GLEW_ARB_shader_clock = GL_FALSE; GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; GLboolean __GLEW_ARB_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_precision = GL_FALSE; GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; GLboolean __GLEW_ARB_shadow = GL_FALSE; GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; GLboolean __GLEW_ARB_sync = GL_FALSE; GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_texture_compression = GL_FALSE; GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; GLboolean __GLEW_ARB_texture_float = GL_FALSE; GLboolean __GLEW_ARB_texture_gather = GL_FALSE; GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; GLboolean __GLEW_ARB_texture_rg = GL_FALSE; GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; GLboolean __GLEW_ARB_texture_storage = GL_FALSE; GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; GLboolean __GLEW_ARB_texture_view = GL_FALSE; GLboolean __GLEW_ARB_timer_query = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_program = GL_FALSE; GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; GLboolean __GLEW_ARB_viewport_array = GL_FALSE; GLboolean __GLEW_ARB_window_pos = GL_FALSE; GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; GLboolean __GLEW_ATI_element_array = GL_FALSE; GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; GLboolean __GLEW_ATI_meminfo = GL_FALSE; GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; GLboolean __GLEW_ATI_texture_float = GL_FALSE; GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; GLboolean __GLEW_EXT_422_pixels = GL_FALSE; GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; GLboolean __GLEW_EXT_abgr = GL_FALSE; GLboolean __GLEW_EXT_bgra = GL_FALSE; GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; GLboolean __GLEW_EXT_blend_color = GL_FALSE; GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; GLboolean __GLEW_EXT_cmyka = GL_FALSE; GLboolean __GLEW_EXT_color_subtable = GL_FALSE; GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; GLboolean __GLEW_EXT_convolution = GL_FALSE; GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; GLboolean __GLEW_EXT_copy_texture = GL_FALSE; GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; GLboolean __GLEW_EXT_debug_label = GL_FALSE; GLboolean __GLEW_EXT_debug_marker = GL_FALSE; GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; GLboolean __GLEW_EXT_fog_coord = GL_FALSE; GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; GLboolean __GLEW_EXT_histogram = GL_FALSE; GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; GLboolean __GLEW_EXT_index_func = GL_FALSE; GLboolean __GLEW_EXT_index_material = GL_FALSE; GLboolean __GLEW_EXT_index_texture = GL_FALSE; GLboolean __GLEW_EXT_light_texture = GL_FALSE; GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; GLboolean __GLEW_EXT_multisample = GL_FALSE; GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; GLboolean __GLEW_EXT_packed_float = GL_FALSE; GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; GLboolean __GLEW_EXT_point_parameters = GL_FALSE; GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; GLboolean __GLEW_EXT_scene_marker = GL_FALSE; GLboolean __GLEW_EXT_secondary_color = GL_FALSE; GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; GLboolean __GLEW_EXT_subtexture = GL_FALSE; GLboolean __GLEW_EXT_texture = GL_FALSE; GLboolean __GLEW_EXT_texture3D = GL_FALSE; GLboolean __GLEW_EXT_texture_array = GL_FALSE; GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; GLboolean __GLEW_EXT_texture_env = GL_FALSE; GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; GLboolean __GLEW_EXT_texture_integer = GL_FALSE; GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; GLboolean __GLEW_EXT_texture_object = GL_FALSE; GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; GLboolean __GLEW_EXT_timer_query = GL_FALSE; GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; GLboolean __GLEW_EXT_vertex_array = GL_FALSE; GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; GLboolean __GLEW_HP_image_transform = GL_FALSE; GLboolean __GLEW_HP_occlusion_test = GL_FALSE; GLboolean __GLEW_HP_texture_lighting = GL_FALSE; GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; GLboolean __GLEW_IBM_static_data = GL_FALSE; GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; GLboolean __GLEW_INGR_color_clamp = GL_FALSE; GLboolean __GLEW_INGR_interlace_read = GL_FALSE; GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; GLboolean __GLEW_INTEL_map_texture = GL_FALSE; GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; GLboolean __GLEW_INTEL_performance_query = GL_FALSE; GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; GLboolean __GLEW_KHR_debug = GL_FALSE; GLboolean __GLEW_KHR_no_error = GL_FALSE; GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_KHR_robustness = GL_FALSE; GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; GLboolean __GLEW_KTX_buffer_region = GL_FALSE; GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; GLboolean __GLEW_MESA_pack_invert = GL_FALSE; GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; GLboolean __GLEW_MESA_window_pos = GL_FALSE; GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; GLboolean __GLEW_NVX_conditional_render = GL_FALSE; GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; GLboolean __GLEW_NV_bindless_texture = GL_FALSE; GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; GLboolean __GLEW_NV_blend_square = GL_FALSE; GLboolean __GLEW_NV_compute_program5 = GL_FALSE; GLboolean __GLEW_NV_conditional_render = GL_FALSE; GLboolean __GLEW_NV_conservative_raster = GL_FALSE; GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; GLboolean __GLEW_NV_copy_image = GL_FALSE; GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; GLboolean __GLEW_NV_depth_clamp = GL_FALSE; GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; GLboolean __GLEW_NV_draw_texture = GL_FALSE; GLboolean __GLEW_NV_evaluators = GL_FALSE; GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; GLboolean __GLEW_NV_fence = GL_FALSE; GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; GLboolean __GLEW_NV_float_buffer = GL_FALSE; GLboolean __GLEW_NV_fog_distance = GL_FALSE; GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; GLboolean __GLEW_NV_fragment_program = GL_FALSE; GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; GLboolean __GLEW_NV_half_float = GL_FALSE; GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; GLboolean __GLEW_NV_occlusion_query = GL_FALSE; GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; GLboolean __GLEW_NV_path_rendering = GL_FALSE; GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; GLboolean __GLEW_NV_point_sprite = GL_FALSE; GLboolean __GLEW_NV_present_video = GL_FALSE; GLboolean __GLEW_NV_primitive_restart = GL_FALSE; GLboolean __GLEW_NV_register_combiners = GL_FALSE; GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; GLboolean __GLEW_NV_sample_locations = GL_FALSE; GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; GLboolean __GLEW_NV_texture_barrier = GL_FALSE; GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; GLboolean __GLEW_NV_texture_multisample = GL_FALSE; GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; GLboolean __GLEW_NV_texture_shader = GL_FALSE; GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; GLboolean __GLEW_NV_transform_feedback = GL_FALSE; GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; GLboolean __GLEW_NV_vertex_program = GL_FALSE; GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; GLboolean __GLEW_NV_video_capture = GL_FALSE; GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE; GLboolean __GLEW_OES_read_format = GL_FALSE; GLboolean __GLEW_OES_single_precision = GL_FALSE; GLboolean __GLEW_OML_interlace = GL_FALSE; GLboolean __GLEW_OML_resample = GL_FALSE; GLboolean __GLEW_OML_subsample = GL_FALSE; GLboolean __GLEW_OVR_multiview = GL_FALSE; GLboolean __GLEW_OVR_multiview2 = GL_FALSE; GLboolean __GLEW_PGI_misc_hints = GL_FALSE; GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; GLboolean __GLEW_REGAL_enable = GL_FALSE; GLboolean __GLEW_REGAL_error_string = GL_FALSE; GLboolean __GLEW_REGAL_extension_query = GL_FALSE; GLboolean __GLEW_REGAL_log = GL_FALSE; GLboolean __GLEW_REGAL_proc_address = GL_FALSE; GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; GLboolean __GLEW_S3_s3tc = GL_FALSE; GLboolean __GLEW_SGIS_color_range = GL_FALSE; GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; GLboolean __GLEW_SGIS_fog_function = GL_FALSE; GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; GLboolean __GLEW_SGIS_multisample = GL_FALSE; GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; GLboolean __GLEW_SGIS_texture4D = GL_FALSE; GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; GLboolean __GLEW_SGIS_texture_select = GL_FALSE; GLboolean __GLEW_SGIX_async = GL_FALSE; GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; GLboolean __GLEW_SGIX_clipmap = GL_FALSE; GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; GLboolean __GLEW_SGIX_framezoom = GL_FALSE; GLboolean __GLEW_SGIX_interlace = GL_FALSE; GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; GLboolean __GLEW_SGIX_list_priority = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; GLboolean __GLEW_SGIX_resample = GL_FALSE; GLboolean __GLEW_SGIX_shadow = GL_FALSE; GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; GLboolean __GLEW_SGIX_sprite = GL_FALSE; GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; GLboolean __GLEW_SGIX_texture_range = GL_FALSE; GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; GLboolean __GLEW_SGI_color_matrix = GL_FALSE; GLboolean __GLEW_SGI_color_table = GL_FALSE; GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; GLboolean __GLEW_SUNX_constant_data = GL_FALSE; GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; GLboolean __GLEW_SUN_global_alpha = GL_FALSE; GLboolean __GLEW_SUN_mesh_array = GL_FALSE; GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; GLboolean __GLEW_SUN_slice_accum = GL_FALSE; GLboolean __GLEW_SUN_triangle_list = GL_FALSE; GLboolean __GLEW_SUN_vertex = GL_FALSE; GLboolean __GLEW_WIN_phong_shading = GL_FALSE; GLboolean __GLEW_WIN_specular_fog = GL_FALSE; GLboolean __GLEW_WIN_swap_hint = GL_FALSE; #endif /* !GLEW_MX */ #ifdef GL_VERSION_1_2 static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; return r; } #endif /* GL_VERSION_1_2 */ #ifdef GL_VERSION_1_3 static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; return r; } #endif /* GL_VERSION_1_3 */ #ifdef GL_VERSION_1_4 static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; return r; } #endif /* GL_VERSION_1_4 */ #ifdef GL_VERSION_1_5 static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; return r; } #endif /* GL_VERSION_1_5 */ #ifdef GL_VERSION_2_0 static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; return r; } #endif /* GL_VERSION_2_0 */ #ifdef GL_VERSION_2_1 static GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; return r; } #endif /* GL_VERSION_2_1 */ #ifdef GL_VERSION_3_0 static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; return r; } #endif /* GL_VERSION_3_0 */ #ifdef GL_VERSION_3_1 static GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; return r; } #endif /* GL_VERSION_3_1 */ #ifdef GL_VERSION_3_2 static GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; return r; } #endif /* GL_VERSION_3_2 */ #ifdef GL_VERSION_3_3 static GLboolean _glewInit_GL_VERSION_3_3 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; return r; } #endif /* GL_VERSION_3_3 */ #ifdef GL_VERSION_4_0 static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; return r; } #endif /* GL_VERSION_4_0 */ #ifdef GL_VERSION_4_5 static GLboolean _glewInit_GL_VERSION_4_5 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; return r; } #endif /* GL_VERSION_4_5 */ #ifdef GL_3DFX_tbuffer static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; return r; } #endif /* GL_3DFX_tbuffer */ #ifdef GL_AMD_debug_output static GLboolean _glewInit_GL_AMD_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; return r; } #endif /* GL_AMD_debug_output */ #ifdef GL_AMD_draw_buffers_blend static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; return r; } #endif /* GL_AMD_draw_buffers_blend */ #ifdef GL_AMD_interleaved_elements static GLboolean _glewInit_GL_AMD_interleaved_elements (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; return r; } #endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; return r; } #endif /* GL_AMD_multi_draw_indirect */ #ifdef GL_AMD_name_gen_delete static GLboolean _glewInit_GL_AMD_name_gen_delete (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; return r; } #endif /* GL_AMD_name_gen_delete */ #ifdef GL_AMD_occlusion_query_event static GLboolean _glewInit_GL_AMD_occlusion_query_event (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; return r; } #endif /* GL_AMD_occlusion_query_event */ #ifdef GL_AMD_performance_monitor static GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; return r; } #endif /* GL_AMD_performance_monitor */ #ifdef GL_AMD_sample_positions static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; return r; } #endif /* GL_AMD_sample_positions */ #ifdef GL_AMD_sparse_texture static GLboolean _glewInit_GL_AMD_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; return r; } #endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; return r; } #endif /* GL_AMD_stencil_operation_extended */ #ifdef GL_AMD_vertex_shader_tessellator static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; return r; } #endif /* GL_AMD_vertex_shader_tessellator */ #ifdef GL_ANGLE_framebuffer_blit static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_framebuffer_blit */ #ifdef GL_ANGLE_framebuffer_multisample static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_framebuffer_multisample */ #ifdef GL_ANGLE_instanced_arrays static GLboolean _glewInit_GL_ANGLE_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_instanced_arrays */ #ifdef GL_ANGLE_timer_query static GLboolean _glewInit_GL_ANGLE_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_timer_query */ #ifdef GL_ANGLE_translated_shader_source static GLboolean _glewInit_GL_ANGLE_translated_shader_source (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; return r; } #endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_element_array static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_element_array */ #ifdef GL_APPLE_fence static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_fence */ #ifdef GL_APPLE_flush_buffer_range static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_flush_buffer_range */ #ifdef GL_APPLE_object_purgeable static GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_object_purgeable */ #ifdef GL_APPLE_texture_range static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_texture_range */ #ifdef GL_APPLE_vertex_array_object static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_array_object */ #ifdef GL_APPLE_vertex_array_range static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_array_range */ #ifdef GL_APPLE_vertex_program_evaluators static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; return r; } #endif /* GL_APPLE_vertex_program_evaluators */ #ifdef GL_ARB_ES2_compatibility static GLboolean _glewInit_GL_ARB_ES2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; return r; } #endif /* GL_ARB_ES2_compatibility */ #ifdef GL_ARB_ES3_1_compatibility static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; return r; } #endif /* GL_ARB_ES3_1_compatibility */ #ifdef GL_ARB_ES3_2_compatibility static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; return r; } #endif /* GL_ARB_ES3_2_compatibility */ #ifdef GL_ARB_base_instance static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; return r; } #endif /* GL_ARB_base_instance */ #ifdef GL_ARB_bindless_texture static GLboolean _glewInit_GL_ARB_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; return r; } #endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; return r; } #endif /* GL_ARB_blend_func_extended */ #ifdef GL_ARB_buffer_storage static GLboolean _glewInit_GL_ARB_buffer_storage (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; return r; } #endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; return r; } #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; return r; } #endif /* GL_ARB_clear_buffer_object */ #ifdef GL_ARB_clear_texture static GLboolean _glewInit_GL_ARB_clear_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_clip_control static GLboolean _glewInit_GL_ARB_clip_control (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; return r; } #endif /* GL_ARB_clip_control */ #ifdef GL_ARB_color_buffer_float static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; return r; } #endif /* GL_ARB_color_buffer_float */ #ifdef GL_ARB_compute_shader static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_compute_shader */ #ifdef GL_ARB_compute_variable_group_size static GLboolean _glewInit_GL_ARB_compute_variable_group_size (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; return r; } #endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_copy_buffer static GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; return r; } #endif /* GL_ARB_copy_buffer */ #ifdef GL_ARB_copy_image static GLboolean _glewInit_GL_ARB_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; return r; } #endif /* GL_ARB_copy_image */ #ifdef GL_ARB_debug_output static GLboolean _glewInit_GL_ARB_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; return r; } #endif /* GL_ARB_debug_output */ #ifdef GL_ARB_direct_state_access static GLboolean _glewInit_GL_ARB_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; return r; } #endif /* GL_ARB_direct_state_access */ #ifdef GL_ARB_draw_buffers static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; return r; } #endif /* GL_ARB_draw_buffers */ #ifdef GL_ARB_draw_buffers_blend static GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; return r; } #endif /* GL_ARB_draw_buffers_blend */ #ifdef GL_ARB_draw_elements_base_vertex static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; return r; } #endif /* GL_ARB_draw_elements_base_vertex */ #ifdef GL_ARB_draw_indirect static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_draw_indirect */ #ifdef GL_ARB_framebuffer_no_attachments static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; return r; } #endif /* GL_ARB_framebuffer_no_attachments */ #ifdef GL_ARB_framebuffer_object static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; return r; } #endif /* GL_ARB_framebuffer_object */ #ifdef GL_ARB_geometry_shader4 static GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; return r; } #endif /* GL_ARB_geometry_shader4 */ #ifdef GL_ARB_get_program_binary static GLboolean _glewInit_GL_ARB_get_program_binary (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; return r; } #endif /* GL_ARB_get_program_binary */ #ifdef GL_ARB_get_texture_sub_image static GLboolean _glewInit_GL_ARB_get_texture_sub_image (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_get_texture_sub_image */ #ifdef GL_ARB_gpu_shader_fp64 static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; return r; } #endif /* GL_ARB_gpu_shader_fp64 */ #ifdef GL_ARB_gpu_shader_int64 static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; return r; } #endif /* GL_ARB_gpu_shader_int64 */ #ifdef GL_ARB_imaging static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; return r; } #endif /* GL_ARB_imaging */ #ifdef GL_ARB_indirect_parameters static GLboolean _glewInit_GL_ARB_indirect_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; return r; } #endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; return r; } #endif /* GL_ARB_instanced_arrays */ #ifdef GL_ARB_internalformat_query static GLboolean _glewInit_GL_ARB_internalformat_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; return r; } #endif /* GL_ARB_internalformat_query */ #ifdef GL_ARB_internalformat_query2 static GLboolean _glewInit_GL_ARB_internalformat_query2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; return r; } #endif /* GL_ARB_internalformat_query2 */ #ifdef GL_ARB_invalidate_subdata static GLboolean _glewInit_GL_ARB_invalidate_subdata (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; return r; } #endif /* GL_ARB_invalidate_subdata */ #ifdef GL_ARB_map_buffer_range static GLboolean _glewInit_GL_ARB_map_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; return r; } #endif /* GL_ARB_map_buffer_range */ #ifdef GL_ARB_matrix_palette static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; return r; } #endif /* GL_ARB_matrix_palette */ #ifdef GL_ARB_multi_bind static GLboolean _glewInit_GL_ARB_multi_bind (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; return r; } #endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; return r; } #endif /* GL_ARB_multi_draw_indirect */ #ifdef GL_ARB_multisample static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; return r; } #endif /* GL_ARB_multisample */ #ifdef GL_ARB_multitexture static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; return r; } #endif /* GL_ARB_multitexture */ #ifdef GL_ARB_occlusion_query static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; return r; } #endif /* GL_ARB_occlusion_query */ #ifdef GL_ARB_parallel_shader_compile static GLboolean _glewInit_GL_ARB_parallel_shader_compile (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; return r; } #endif /* GL_ARB_parallel_shader_compile */ #ifdef GL_ARB_point_parameters static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; return r; } #endif /* GL_ARB_point_parameters */ #ifdef GL_ARB_program_interface_query static GLboolean _glewInit_GL_ARB_program_interface_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; return r; } #endif /* GL_ARB_program_interface_query */ #ifdef GL_ARB_provoking_vertex static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; return r; } #endif /* GL_ARB_provoking_vertex */ #ifdef GL_ARB_robustness static GLboolean _glewInit_GL_ARB_robustness (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; return r; } #endif /* GL_ARB_robustness */ #ifdef GL_ARB_sample_locations static GLboolean _glewInit_GL_ARB_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; return r; } #endif /* GL_ARB_sample_locations */ #ifdef GL_ARB_sample_shading static GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; return r; } #endif /* GL_ARB_sample_shading */ #ifdef GL_ARB_sampler_objects static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; return r; } #endif /* GL_ARB_sampler_objects */ #ifdef GL_ARB_separate_shader_objects static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; return r; } #endif /* GL_ARB_separate_shader_objects */ #ifdef GL_ARB_shader_atomic_counters static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; return r; } #endif /* GL_ARB_shader_atomic_counters */ #ifdef GL_ARB_shader_image_load_store static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; return r; } #endif /* GL_ARB_shader_image_load_store */ #ifdef GL_ARB_shader_objects static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; return r; } #endif /* GL_ARB_shader_objects */ #ifdef GL_ARB_shader_storage_buffer_object static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; return r; } #endif /* GL_ARB_shader_storage_buffer_object */ #ifdef GL_ARB_shader_subroutine static GLboolean _glewInit_GL_ARB_shader_subroutine (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; return r; } #endif /* GL_ARB_shader_subroutine */ #ifdef GL_ARB_shading_language_include static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; return r; } #endif /* GL_ARB_shading_language_include */ #ifdef GL_ARB_sparse_buffer static GLboolean _glewInit_GL_ARB_sparse_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; return r; } #endif /* GL_ARB_sparse_buffer */ #ifdef GL_ARB_sparse_texture static GLboolean _glewInit_GL_ARB_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; return r; } #endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_sync static GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; return r; } #endif /* GL_ARB_sync */ #ifdef GL_ARB_tessellation_shader static GLboolean _glewInit_GL_ARB_tessellation_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; return r; } #endif /* GL_ARB_tessellation_shader */ #ifdef GL_ARB_texture_barrier static GLboolean _glewInit_GL_ARB_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; return r; } #endif /* GL_ARB_texture_barrier */ #ifdef GL_ARB_texture_buffer_object static GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; return r; } #endif /* GL_ARB_texture_buffer_object */ #ifdef GL_ARB_texture_buffer_range static GLboolean _glewInit_GL_ARB_texture_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_buffer_range */ #ifdef GL_ARB_texture_compression static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; return r; } #endif /* GL_ARB_texture_compression */ #ifdef GL_ARB_texture_multisample static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; return r; } #endif /* GL_ARB_texture_multisample */ #ifdef GL_ARB_texture_storage static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_storage */ #ifdef GL_ARB_texture_storage_multisample static GLboolean _glewInit_GL_ARB_texture_storage_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_ARB_texture_storage_multisample */ #ifdef GL_ARB_texture_view static GLboolean _glewInit_GL_ARB_texture_view (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; return r; } #endif /* GL_ARB_texture_view */ #ifdef GL_ARB_timer_query static GLboolean _glewInit_GL_ARB_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; return r; } #endif /* GL_ARB_timer_query */ #ifdef GL_ARB_transform_feedback2 static GLboolean _glewInit_GL_ARB_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback2 */ #ifdef GL_ARB_transform_feedback3 static GLboolean _glewInit_GL_ARB_transform_feedback3 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback3 */ #ifdef GL_ARB_transform_feedback_instanced static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; return r; } #endif /* GL_ARB_transform_feedback_instanced */ #ifdef GL_ARB_transpose_matrix static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; return r; } #endif /* GL_ARB_transpose_matrix */ #ifdef GL_ARB_uniform_buffer_object static GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; return r; } #endif /* GL_ARB_uniform_buffer_object */ #ifdef GL_ARB_vertex_array_object static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_array_object */ #ifdef GL_ARB_vertex_attrib_64bit static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_attrib_64bit */ #ifdef GL_ARB_vertex_attrib_binding static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_attrib_binding */ #ifdef GL_ARB_vertex_blend static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_blend */ #ifdef GL_ARB_vertex_buffer_object static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_buffer_object */ #ifdef GL_ARB_vertex_program static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_program */ #ifdef GL_ARB_vertex_shader static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_shader */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; return r; } #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifdef GL_ARB_viewport_array static GLboolean _glewInit_GL_ARB_viewport_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; return r; } #endif /* GL_ARB_viewport_array */ #ifdef GL_ARB_window_pos static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; return r; } #endif /* GL_ARB_window_pos */ #ifdef GL_ATI_draw_buffers static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; return r; } #endif /* GL_ATI_draw_buffers */ #ifdef GL_ATI_element_array static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; return r; } #endif /* GL_ATI_element_array */ #ifdef GL_ATI_envmap_bumpmap static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; return r; } #endif /* GL_ATI_envmap_bumpmap */ #ifdef GL_ATI_fragment_shader static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; return r; } #endif /* GL_ATI_fragment_shader */ #ifdef GL_ATI_map_object_buffer static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; return r; } #endif /* GL_ATI_map_object_buffer */ #ifdef GL_ATI_pn_triangles static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; return r; } #endif /* GL_ATI_pn_triangles */ #ifdef GL_ATI_separate_stencil static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; return r; } #endif /* GL_ATI_separate_stencil */ #ifdef GL_ATI_vertex_array_object static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_array_object */ #ifdef GL_ATI_vertex_attrib_array_object static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_attrib_array_object */ #ifdef GL_ATI_vertex_streams static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; return r; } #endif /* GL_ATI_vertex_streams */ #ifdef GL_EXT_bindable_uniform static GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_bindable_uniform */ #ifdef GL_EXT_blend_color static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_color */ #ifdef GL_EXT_blend_equation_separate static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_equation_separate */ #ifdef GL_EXT_blend_func_separate static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_func_separate */ #ifdef GL_EXT_blend_minmax static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; return r; } #endif /* GL_EXT_blend_minmax */ #ifdef GL_EXT_color_subtable static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; return r; } #endif /* GL_EXT_color_subtable */ #ifdef GL_EXT_compiled_vertex_array static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; return r; } #endif /* GL_EXT_compiled_vertex_array */ #ifdef GL_EXT_convolution static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_convolution */ #ifdef GL_EXT_coordinate_frame static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_coordinate_frame */ #ifdef GL_EXT_copy_texture static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_copy_texture */ #ifdef GL_EXT_cull_vertex static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_cull_vertex */ #ifdef GL_EXT_debug_label static GLboolean _glewInit_GL_EXT_debug_label (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; return r; } #endif /* GL_EXT_debug_label */ #ifdef GL_EXT_debug_marker static GLboolean _glewInit_GL_EXT_debug_marker (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_debug_marker */ #ifdef GL_EXT_depth_bounds_test static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_depth_bounds_test */ #ifdef GL_EXT_direct_state_access static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; return r; } #endif /* GL_EXT_direct_state_access */ #ifdef GL_EXT_draw_buffers2 static GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_buffers2 */ #ifdef GL_EXT_draw_instanced static GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_instanced */ #ifdef GL_EXT_draw_range_elements static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_draw_range_elements */ #ifdef GL_EXT_fog_coord static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_fog_coord */ #ifdef GL_EXT_fragment_lighting static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; return r; } #endif /* GL_EXT_fragment_lighting */ #ifdef GL_EXT_framebuffer_blit static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_blit */ #ifdef GL_EXT_framebuffer_multisample static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_multisample */ #ifdef GL_EXT_framebuffer_object static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; return r; } #endif /* GL_EXT_framebuffer_object */ #ifdef GL_EXT_geometry_shader4 static GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; return r; } #endif /* GL_EXT_geometry_shader4 */ #ifdef GL_EXT_gpu_program_parameters static GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_gpu_program_parameters */ #ifdef GL_EXT_gpu_shader4 static GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_gpu_shader4 */ #ifdef GL_EXT_histogram static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; return r; } #endif /* GL_EXT_histogram */ #ifdef GL_EXT_index_func static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; return r; } #endif /* GL_EXT_index_func */ #ifdef GL_EXT_index_material static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; return r; } #endif /* GL_EXT_index_material */ #ifdef GL_EXT_light_texture static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; return r; } #endif /* GL_EXT_light_texture */ #ifdef GL_EXT_multi_draw_arrays static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multi_draw_arrays */ #ifdef GL_EXT_multisample static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; return r; } #endif /* GL_EXT_multisample */ #ifdef GL_EXT_paletted_texture static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_paletted_texture */ #ifdef GL_EXT_pixel_transform static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_pixel_transform */ #ifdef GL_EXT_point_parameters static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_point_parameters */ #ifdef GL_EXT_polygon_offset static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; return r; } #endif /* GL_EXT_polygon_offset */ #ifdef GL_EXT_polygon_offset_clamp static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; return r; } #endif /* GL_EXT_polygon_offset_clamp */ #ifdef GL_EXT_provoking_vertex static GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; return r; } #endif /* GL_EXT_provoking_vertex */ #ifdef GL_EXT_raster_multisample static GLboolean _glewInit_GL_EXT_raster_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; return r; } #endif /* GL_EXT_raster_multisample */ #ifdef GL_EXT_scene_marker static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; return r; } #endif /* GL_EXT_scene_marker */ #ifdef GL_EXT_secondary_color static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_secondary_color */ #ifdef GL_EXT_separate_shader_objects static GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; return r; } #endif /* GL_EXT_separate_shader_objects */ #ifdef GL_EXT_shader_image_load_store static GLboolean _glewInit_GL_EXT_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; return r; } #endif /* GL_EXT_shader_image_load_store */ #ifdef GL_EXT_stencil_two_side static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; return r; } #endif /* GL_EXT_stencil_two_side */ #ifdef GL_EXT_subtexture static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_subtexture */ #ifdef GL_EXT_texture3D static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture3D */ #ifdef GL_EXT_texture_array static GLboolean _glewInit_GL_EXT_texture_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_array */ #ifdef GL_EXT_texture_buffer_object static GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_buffer_object */ #ifdef GL_EXT_texture_integer static GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_integer */ #ifdef GL_EXT_texture_object static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_object */ #ifdef GL_EXT_texture_perturb_normal static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; return r; } #endif /* GL_EXT_texture_perturb_normal */ #ifdef GL_EXT_timer_query static GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; return r; } #endif /* GL_EXT_timer_query */ #ifdef GL_EXT_transform_feedback static GLboolean _glewInit_GL_EXT_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; return r; } #endif /* GL_EXT_transform_feedback */ #ifdef GL_EXT_vertex_array static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_array */ #ifdef GL_EXT_vertex_attrib_64bit static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_attrib_64bit */ #ifdef GL_EXT_vertex_shader static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_shader */ #ifdef GL_EXT_vertex_weighting static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; return r; } #endif /* GL_EXT_vertex_weighting */ #ifdef GL_EXT_x11_sync_object static GLboolean _glewInit_GL_EXT_x11_sync_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; return r; } #endif /* GL_EXT_x11_sync_object */ #ifdef GL_GREMEDY_frame_terminator static GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; return r; } #endif /* GL_GREMEDY_frame_terminator */ #ifdef GL_GREMEDY_string_marker static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; return r; } #endif /* GL_GREMEDY_string_marker */ #ifdef GL_HP_image_transform static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; return r; } #endif /* GL_HP_image_transform */ #ifdef GL_IBM_multimode_draw_arrays static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; return r; } #endif /* GL_IBM_multimode_draw_arrays */ #ifdef GL_IBM_vertex_array_lists static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; return r; } #endif /* GL_IBM_vertex_array_lists */ #ifdef GL_INTEL_map_texture static GLboolean _glewInit_GL_INTEL_map_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_parallel_arrays */ #ifdef GL_INTEL_performance_query static GLboolean _glewInit_GL_INTEL_performance_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_performance_query */ #ifdef GL_INTEL_texture_scissor static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; return r; } #endif /* GL_INTEL_texture_scissor */ #ifdef GL_KHR_blend_equation_advanced static GLboolean _glewInit_GL_KHR_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; return r; } #endif /* GL_KHR_blend_equation_advanced */ #ifdef GL_KHR_debug static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; return r; } #endif /* GL_KHR_debug */ #ifdef GL_KHR_robustness static GLboolean _glewInit_GL_KHR_robustness (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; return r; } #endif /* GL_KHR_robustness */ #ifdef GL_KTX_buffer_region static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; return r; } #endif /* GL_KTX_buffer_region */ #ifdef GL_MESA_resize_buffers static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; return r; } #endif /* GL_MESA_resize_buffers */ #ifdef GL_MESA_window_pos static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; return r; } #endif /* GL_MESA_window_pos */ #ifdef GL_NVX_conditional_render static GLboolean _glewInit_GL_NVX_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; return r; } #endif /* GL_NVX_conditional_render */ #ifdef GL_NV_bindless_multi_draw_indirect static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_multi_draw_indirect_count static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_multi_draw_indirect_count */ #ifdef GL_NV_bindless_texture static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_bindless_texture */ #ifdef GL_NV_blend_equation_advanced static GLboolean _glewInit_GL_NV_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; return r; } #endif /* GL_NV_blend_equation_advanced */ #ifdef GL_NV_conditional_render static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; return r; } #endif /* GL_NV_conditional_render */ #ifdef GL_NV_conservative_raster static GLboolean _glewInit_GL_NV_conservative_raster (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; return r; } #endif /* GL_NV_conservative_raster */ #ifdef GL_NV_conservative_raster_dilate static GLboolean _glewInit_GL_NV_conservative_raster_dilate (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; return r; } #endif /* GL_NV_conservative_raster_dilate */ #ifdef GL_NV_copy_image static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* GL_NV_copy_image */ #ifdef GL_NV_depth_buffer_float static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; return r; } #endif /* GL_NV_depth_buffer_float */ #ifdef GL_NV_draw_texture static GLboolean _glewInit_GL_NV_draw_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; return r; } #endif /* GL_NV_draw_texture */ #ifdef GL_NV_evaluators static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_evaluators */ #ifdef GL_NV_explicit_multisample static GLboolean _glewInit_GL_NV_explicit_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; return r; } #endif /* GL_NV_explicit_multisample */ #ifdef GL_NV_fence static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; return r; } #endif /* GL_NV_fence */ #ifdef GL_NV_fragment_coverage_to_color static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; return r; } #endif /* GL_NV_fragment_coverage_to_color */ #ifdef GL_NV_fragment_program static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; return r; } #endif /* GL_NV_fragment_program */ #ifdef GL_NV_framebuffer_multisample_coverage static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; return r; } #endif /* GL_NV_framebuffer_multisample_coverage */ #ifdef GL_NV_geometry_program4 static GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; return r; } #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_gpu_program4 static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_program4 */ #ifdef GL_NV_gpu_shader5 static GLboolean _glewInit_GL_NV_gpu_shader5 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_gpu_shader5 */ #ifdef GL_NV_half_float static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; return r; } #endif /* GL_NV_half_float */ #ifdef GL_NV_internalformat_sample_query static GLboolean _glewInit_GL_NV_internalformat_sample_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; return r; } #endif /* GL_NV_internalformat_sample_query */ #ifdef GL_NV_occlusion_query static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; return r; } #endif /* GL_NV_occlusion_query */ #ifdef GL_NV_parameter_buffer_object static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; return r; } #endif /* GL_NV_parameter_buffer_object */ #ifdef GL_NV_path_rendering static GLboolean _glewInit_GL_NV_path_rendering (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; return r; } #endif /* GL_NV_path_rendering */ #ifdef GL_NV_pixel_data_range static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; return r; } #endif /* GL_NV_pixel_data_range */ #ifdef GL_NV_point_sprite static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_point_sprite */ #ifdef GL_NV_present_video static GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; return r; } #endif /* GL_NV_present_video */ #ifdef GL_NV_primitive_restart static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; return r; } #endif /* GL_NV_primitive_restart */ #ifdef GL_NV_register_combiners static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_register_combiners */ #ifdef GL_NV_register_combiners2 static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; return r; } #endif /* GL_NV_register_combiners2 */ #ifdef GL_NV_sample_locations static GLboolean _glewInit_GL_NV_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; return r; } #endif /* GL_NV_sample_locations */ #ifdef GL_NV_shader_buffer_load static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; return r; } #endif /* GL_NV_shader_buffer_load */ #ifdef GL_NV_texture_barrier static GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_barrier */ #ifdef GL_NV_texture_multisample static GLboolean _glewInit_GL_NV_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; return r; } #endif /* GL_NV_texture_multisample */ #ifdef GL_NV_transform_feedback static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; return r; } #endif /* GL_NV_transform_feedback */ #ifdef GL_NV_transform_feedback2 static GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; return r; } #endif /* GL_NV_transform_feedback2 */ #ifdef GL_NV_vdpau_interop static GLboolean _glewInit_GL_NV_vdpau_interop (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; return r; } #endif /* GL_NV_vdpau_interop */ #ifdef GL_NV_vertex_array_range static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_array_range */ #ifdef GL_NV_vertex_attrib_integer_64bit static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifdef GL_NV_vertex_buffer_unified_memory static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_buffer_unified_memory */ #ifdef GL_NV_vertex_program static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; return r; } #endif /* GL_NV_vertex_program */ #ifdef GL_NV_video_capture static GLboolean _glewInit_GL_NV_video_capture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; return r; } #endif /* GL_NV_video_capture */ #ifdef GL_OES_single_precision static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r; r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r; r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r; r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r; r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r; r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r; return r; } #endif /* GL_OES_single_precision */ #ifdef GL_OVR_multiview static GLboolean _glewInit_GL_OVR_multiview (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; return r; } #endif /* GL_OVR_multiview */ #ifdef GL_REGAL_ES1_0_compatibility static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; return r; } #endif /* GL_REGAL_ES1_0_compatibility */ #ifdef GL_REGAL_ES1_1_compatibility static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; return r; } #endif /* GL_REGAL_ES1_1_compatibility */ #ifdef GL_REGAL_error_string static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_error_string */ #ifdef GL_REGAL_extension_query static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log static GLboolean _glewInit_GL_REGAL_log (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_log */ #ifdef GL_REGAL_proc_address static GLboolean _glewInit_GL_REGAL_proc_address (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; return r; } #endif /* GL_REGAL_proc_address */ #ifdef GL_SGIS_detail_texture static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_detail_texture */ #ifdef GL_SGIS_fog_function static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_fog_function */ #ifdef GL_SGIS_multisample static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_multisample */ #ifdef GL_SGIS_sharpen_texture static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_sharpen_texture */ #ifdef GL_SGIS_texture4D static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_texture4D */ #ifdef GL_SGIS_texture_filter4 static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; return r; } #endif /* GL_SGIS_texture_filter4 */ #ifdef GL_SGIX_async static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_async */ #ifdef GL_SGIX_flush_raster static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_flush_raster */ #ifdef GL_SGIX_fog_texture static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fog_texture */ #ifdef GL_SGIX_fragment_specular_lighting static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_fragment_specular_lighting */ #ifdef GL_SGIX_framezoom static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_framezoom */ #ifdef GL_SGIX_pixel_texture static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_pixel_texture */ #ifdef GL_SGIX_reference_plane static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_reference_plane */ #ifdef GL_SGIX_sprite static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_sprite */ #ifdef GL_SGIX_tag_sample_buffer static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; return r; } #endif /* GL_SGIX_tag_sample_buffer */ #ifdef GL_SGI_color_table static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; return r; } #endif /* GL_SGI_color_table */ #ifdef GL_SUNX_constant_data static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; return r; } #endif /* GL_SUNX_constant_data */ #ifdef GL_SUN_global_alpha static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; return r; } #endif /* GL_SUN_global_alpha */ #ifdef GL_SUN_read_video_pixels static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; return r; } #endif /* GL_SUN_read_video_pixels */ #ifdef GL_SUN_triangle_list static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; return r; } #endif /* GL_SUN_triangle_list */ #ifdef GL_SUN_vertex static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; return r; } #endif /* GL_SUN_vertex */ #ifdef GL_WIN_swap_hint static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; return r; } #endif /* GL_WIN_swap_hint */ /* ------------------------------------------------------------------------- */ GLboolean GLEWAPIENTRY glewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; start = (const GLubyte*)glGetString(GL_EXTENSIONS); if (start == 0) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } /* ------------------------------------------------------------------------- */ #ifndef GLEW_MX static #endif GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) { const GLubyte* s; GLuint dot; GLint major, minor; const GLubyte* extStart; const GLubyte* extEnd; /* query opengl version */ s = glGetString(GL_VERSION); dot = _glewStrCLen(s, '.'); if (dot == 0) return GLEW_ERROR_NO_GL_VERSION; major = s[dot-1]-'0'; minor = s[dot+1]-'0'; if (minor < 0 || minor > 9) minor = 0; if (major<0 || major>9) return GLEW_ERROR_NO_GL_VERSION; if (major == 1 && minor == 0) { return GLEW_ERROR_GL_VERSION_10_ONLY; } else { GLEW_VERSION_4_5 = ( major > 4 ) || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; } /* query opengl extensions string */ extStart = glGetString(GL_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte*)""; extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ #ifdef GL_VERSION_1_2 if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_2 */ #ifdef GL_VERSION_1_2_1 #endif /* GL_VERSION_1_2_1 */ #ifdef GL_VERSION_1_3 if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_3 */ #ifdef GL_VERSION_1_4 if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_4 */ #ifdef GL_VERSION_1_5 if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_1_5 */ #ifdef GL_VERSION_2_0 if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_2_0 */ #ifdef GL_VERSION_2_1 if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_2_1 */ #ifdef GL_VERSION_3_0 if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_0 */ #ifdef GL_VERSION_3_1 if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_1 */ #ifdef GL_VERSION_3_2 if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_2 */ #ifdef GL_VERSION_3_3 if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_3_3 */ #ifdef GL_VERSION_4_0 if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_4_0 */ #ifdef GL_VERSION_4_1 #endif /* GL_VERSION_4_1 */ #ifdef GL_VERSION_4_2 #endif /* GL_VERSION_4_2 */ #ifdef GL_VERSION_4_3 #endif /* GL_VERSION_4_3 */ #ifdef GL_VERSION_4_4 #endif /* GL_VERSION_4_4 */ #ifdef GL_VERSION_4_5 if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_VERSION_4_5 */ #ifdef GL_3DFX_multisample GLEW_3DFX_multisample = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd); #endif /* GL_3DFX_multisample */ #ifdef GL_3DFX_tbuffer GLEW_3DFX_tbuffer = _glewSearchExtension("GL_3DFX_tbuffer", extStart, extEnd); if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_3DFX_tbuffer */ #ifdef GL_3DFX_texture_compression_FXT1 GLEW_3DFX_texture_compression_FXT1 = _glewSearchExtension("GL_3DFX_texture_compression_FXT1", extStart, extEnd); #endif /* GL_3DFX_texture_compression_FXT1 */ #ifdef GL_AMD_blend_minmax_factor GLEW_AMD_blend_minmax_factor = _glewSearchExtension("GL_AMD_blend_minmax_factor", extStart, extEnd); #endif /* GL_AMD_blend_minmax_factor */ #ifdef GL_AMD_conservative_depth GLEW_AMD_conservative_depth = _glewSearchExtension("GL_AMD_conservative_depth", extStart, extEnd); #endif /* GL_AMD_conservative_depth */ #ifdef GL_AMD_debug_output GLEW_AMD_debug_output = _glewSearchExtension("GL_AMD_debug_output", extStart, extEnd); if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_debug_output */ #ifdef GL_AMD_depth_clamp_separate GLEW_AMD_depth_clamp_separate = _glewSearchExtension("GL_AMD_depth_clamp_separate", extStart, extEnd); #endif /* GL_AMD_depth_clamp_separate */ #ifdef GL_AMD_draw_buffers_blend GLEW_AMD_draw_buffers_blend = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd); if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_draw_buffers_blend */ #ifdef GL_AMD_gcn_shader GLEW_AMD_gcn_shader = _glewSearchExtension("GL_AMD_gcn_shader", extStart, extEnd); #endif /* GL_AMD_gcn_shader */ #ifdef GL_AMD_gpu_shader_int64 GLEW_AMD_gpu_shader_int64 = _glewSearchExtension("GL_AMD_gpu_shader_int64", extStart, extEnd); #endif /* GL_AMD_gpu_shader_int64 */ #ifdef GL_AMD_interleaved_elements GLEW_AMD_interleaved_elements = _glewSearchExtension("GL_AMD_interleaved_elements", extStart, extEnd); if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect GLEW_AMD_multi_draw_indirect = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_multi_draw_indirect */ #ifdef GL_AMD_name_gen_delete GLEW_AMD_name_gen_delete = _glewSearchExtension("GL_AMD_name_gen_delete", extStart, extEnd); if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_name_gen_delete */ #ifdef GL_AMD_occlusion_query_event GLEW_AMD_occlusion_query_event = _glewSearchExtension("GL_AMD_occlusion_query_event", extStart, extEnd); if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_occlusion_query_event */ #ifdef GL_AMD_performance_monitor GLEW_AMD_performance_monitor = _glewSearchExtension("GL_AMD_performance_monitor", extStart, extEnd); if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_performance_monitor */ #ifdef GL_AMD_pinned_memory GLEW_AMD_pinned_memory = _glewSearchExtension("GL_AMD_pinned_memory", extStart, extEnd); #endif /* GL_AMD_pinned_memory */ #ifdef GL_AMD_query_buffer_object GLEW_AMD_query_buffer_object = _glewSearchExtension("GL_AMD_query_buffer_object", extStart, extEnd); #endif /* GL_AMD_query_buffer_object */ #ifdef GL_AMD_sample_positions GLEW_AMD_sample_positions = _glewSearchExtension("GL_AMD_sample_positions", extStart, extEnd); if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_sample_positions */ #ifdef GL_AMD_seamless_cubemap_per_texture GLEW_AMD_seamless_cubemap_per_texture = _glewSearchExtension("GL_AMD_seamless_cubemap_per_texture", extStart, extEnd); #endif /* GL_AMD_seamless_cubemap_per_texture */ #ifdef GL_AMD_shader_atomic_counter_ops GLEW_AMD_shader_atomic_counter_ops = _glewSearchExtension("GL_AMD_shader_atomic_counter_ops", extStart, extEnd); #endif /* GL_AMD_shader_atomic_counter_ops */ #ifdef GL_AMD_shader_stencil_export GLEW_AMD_shader_stencil_export = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd); #endif /* GL_AMD_shader_stencil_export */ #ifdef GL_AMD_shader_stencil_value_export GLEW_AMD_shader_stencil_value_export = _glewSearchExtension("GL_AMD_shader_stencil_value_export", extStart, extEnd); #endif /* GL_AMD_shader_stencil_value_export */ #ifdef GL_AMD_shader_trinary_minmax GLEW_AMD_shader_trinary_minmax = _glewSearchExtension("GL_AMD_shader_trinary_minmax", extStart, extEnd); #endif /* GL_AMD_shader_trinary_minmax */ #ifdef GL_AMD_sparse_texture GLEW_AMD_sparse_texture = _glewSearchExtension("GL_AMD_sparse_texture", extStart, extEnd); if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended GLEW_AMD_stencil_operation_extended = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd); if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_stencil_operation_extended */ #ifdef GL_AMD_texture_texture4 GLEW_AMD_texture_texture4 = _glewSearchExtension("GL_AMD_texture_texture4", extStart, extEnd); #endif /* GL_AMD_texture_texture4 */ #ifdef GL_AMD_transform_feedback3_lines_triangles GLEW_AMD_transform_feedback3_lines_triangles = _glewSearchExtension("GL_AMD_transform_feedback3_lines_triangles", extStart, extEnd); #endif /* GL_AMD_transform_feedback3_lines_triangles */ #ifdef GL_AMD_transform_feedback4 GLEW_AMD_transform_feedback4 = _glewSearchExtension("GL_AMD_transform_feedback4", extStart, extEnd); #endif /* GL_AMD_transform_feedback4 */ #ifdef GL_AMD_vertex_shader_layer GLEW_AMD_vertex_shader_layer = _glewSearchExtension("GL_AMD_vertex_shader_layer", extStart, extEnd); #endif /* GL_AMD_vertex_shader_layer */ #ifdef GL_AMD_vertex_shader_tessellator GLEW_AMD_vertex_shader_tessellator = _glewSearchExtension("GL_AMD_vertex_shader_tessellator", extStart, extEnd); if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_vertex_shader_tessellator */ #ifdef GL_AMD_vertex_shader_viewport_index GLEW_AMD_vertex_shader_viewport_index = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd); #endif /* GL_AMD_vertex_shader_viewport_index */ #ifdef GL_ANGLE_depth_texture GLEW_ANGLE_depth_texture = _glewSearchExtension("GL_ANGLE_depth_texture", extStart, extEnd); #endif /* GL_ANGLE_depth_texture */ #ifdef GL_ANGLE_framebuffer_blit GLEW_ANGLE_framebuffer_blit = _glewSearchExtension("GL_ANGLE_framebuffer_blit", extStart, extEnd); if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ANGLE_framebuffer_blit */ #ifdef GL_ANGLE_framebuffer_multisample GLEW_ANGLE_framebuffer_multisample = _glewSearchExtension("GL_ANGLE_framebuffer_multisample", extStart, extEnd); if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ANGLE_framebuffer_multisample */ #ifdef GL_ANGLE_instanced_arrays GLEW_ANGLE_instanced_arrays = _glewSearchExtension("GL_ANGLE_instanced_arrays", extStart, extEnd); if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ANGLE_instanced_arrays */ #ifdef GL_ANGLE_pack_reverse_row_order GLEW_ANGLE_pack_reverse_row_order = _glewSearchExtension("GL_ANGLE_pack_reverse_row_order", extStart, extEnd); #endif /* GL_ANGLE_pack_reverse_row_order */ #ifdef GL_ANGLE_program_binary GLEW_ANGLE_program_binary = _glewSearchExtension("GL_ANGLE_program_binary", extStart, extEnd); #endif /* GL_ANGLE_program_binary */ #ifdef GL_ANGLE_texture_compression_dxt1 GLEW_ANGLE_texture_compression_dxt1 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt1", extStart, extEnd); #endif /* GL_ANGLE_texture_compression_dxt1 */ #ifdef GL_ANGLE_texture_compression_dxt3 GLEW_ANGLE_texture_compression_dxt3 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt3", extStart, extEnd); #endif /* GL_ANGLE_texture_compression_dxt3 */ #ifdef GL_ANGLE_texture_compression_dxt5 GLEW_ANGLE_texture_compression_dxt5 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt5", extStart, extEnd); #endif /* GL_ANGLE_texture_compression_dxt5 */ #ifdef GL_ANGLE_texture_usage GLEW_ANGLE_texture_usage = _glewSearchExtension("GL_ANGLE_texture_usage", extStart, extEnd); #endif /* GL_ANGLE_texture_usage */ #ifdef GL_ANGLE_timer_query GLEW_ANGLE_timer_query = _glewSearchExtension("GL_ANGLE_timer_query", extStart, extEnd); if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ANGLE_timer_query */ #ifdef GL_ANGLE_translated_shader_source GLEW_ANGLE_translated_shader_source = _glewSearchExtension("GL_ANGLE_translated_shader_source", extStart, extEnd); if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_aux_depth_stencil GLEW_APPLE_aux_depth_stencil = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd); #endif /* GL_APPLE_aux_depth_stencil */ #ifdef GL_APPLE_client_storage GLEW_APPLE_client_storage = _glewSearchExtension("GL_APPLE_client_storage", extStart, extEnd); #endif /* GL_APPLE_client_storage */ #ifdef GL_APPLE_element_array GLEW_APPLE_element_array = _glewSearchExtension("GL_APPLE_element_array", extStart, extEnd); if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_element_array */ #ifdef GL_APPLE_fence GLEW_APPLE_fence = _glewSearchExtension("GL_APPLE_fence", extStart, extEnd); if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_fence */ #ifdef GL_APPLE_float_pixels GLEW_APPLE_float_pixels = _glewSearchExtension("GL_APPLE_float_pixels", extStart, extEnd); #endif /* GL_APPLE_float_pixels */ #ifdef GL_APPLE_flush_buffer_range GLEW_APPLE_flush_buffer_range = _glewSearchExtension("GL_APPLE_flush_buffer_range", extStart, extEnd); if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_flush_buffer_range */ #ifdef GL_APPLE_object_purgeable GLEW_APPLE_object_purgeable = _glewSearchExtension("GL_APPLE_object_purgeable", extStart, extEnd); if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_object_purgeable */ #ifdef GL_APPLE_pixel_buffer GLEW_APPLE_pixel_buffer = _glewSearchExtension("GL_APPLE_pixel_buffer", extStart, extEnd); #endif /* GL_APPLE_pixel_buffer */ #ifdef GL_APPLE_rgb_422 GLEW_APPLE_rgb_422 = _glewSearchExtension("GL_APPLE_rgb_422", extStart, extEnd); #endif /* GL_APPLE_rgb_422 */ #ifdef GL_APPLE_row_bytes GLEW_APPLE_row_bytes = _glewSearchExtension("GL_APPLE_row_bytes", extStart, extEnd); #endif /* GL_APPLE_row_bytes */ #ifdef GL_APPLE_specular_vector GLEW_APPLE_specular_vector = _glewSearchExtension("GL_APPLE_specular_vector", extStart, extEnd); #endif /* GL_APPLE_specular_vector */ #ifdef GL_APPLE_texture_range GLEW_APPLE_texture_range = _glewSearchExtension("GL_APPLE_texture_range", extStart, extEnd); if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_texture_range */ #ifdef GL_APPLE_transform_hint GLEW_APPLE_transform_hint = _glewSearchExtension("GL_APPLE_transform_hint", extStart, extEnd); #endif /* GL_APPLE_transform_hint */ #ifdef GL_APPLE_vertex_array_object GLEW_APPLE_vertex_array_object = _glewSearchExtension("GL_APPLE_vertex_array_object", extStart, extEnd); if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_vertex_array_object */ #ifdef GL_APPLE_vertex_array_range GLEW_APPLE_vertex_array_range = _glewSearchExtension("GL_APPLE_vertex_array_range", extStart, extEnd); if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_vertex_array_range */ #ifdef GL_APPLE_vertex_program_evaluators GLEW_APPLE_vertex_program_evaluators = _glewSearchExtension("GL_APPLE_vertex_program_evaluators", extStart, extEnd); if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_APPLE_vertex_program_evaluators */ #ifdef GL_APPLE_ycbcr_422 GLEW_APPLE_ycbcr_422 = _glewSearchExtension("GL_APPLE_ycbcr_422", extStart, extEnd); #endif /* GL_APPLE_ycbcr_422 */ #ifdef GL_ARB_ES2_compatibility GLEW_ARB_ES2_compatibility = _glewSearchExtension("GL_ARB_ES2_compatibility", extStart, extEnd); if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_ES2_compatibility */ #ifdef GL_ARB_ES3_1_compatibility GLEW_ARB_ES3_1_compatibility = _glewSearchExtension("GL_ARB_ES3_1_compatibility", extStart, extEnd); if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_ES3_1_compatibility */ #ifdef GL_ARB_ES3_2_compatibility GLEW_ARB_ES3_2_compatibility = _glewSearchExtension("GL_ARB_ES3_2_compatibility", extStart, extEnd); if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_ES3_2_compatibility */ #ifdef GL_ARB_ES3_compatibility GLEW_ARB_ES3_compatibility = _glewSearchExtension("GL_ARB_ES3_compatibility", extStart, extEnd); #endif /* GL_ARB_ES3_compatibility */ #ifdef GL_ARB_arrays_of_arrays GLEW_ARB_arrays_of_arrays = _glewSearchExtension("GL_ARB_arrays_of_arrays", extStart, extEnd); #endif /* GL_ARB_arrays_of_arrays */ #ifdef GL_ARB_base_instance GLEW_ARB_base_instance = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd); if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_base_instance */ #ifdef GL_ARB_bindless_texture GLEW_ARB_bindless_texture = _glewSearchExtension("GL_ARB_bindless_texture", extStart, extEnd); if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended GLEW_ARB_blend_func_extended = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd); if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_blend_func_extended */ #ifdef GL_ARB_buffer_storage GLEW_ARB_buffer_storage = _glewSearchExtension("GL_ARB_buffer_storage", extStart, extEnd); if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event GLEW_ARB_cl_event = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd); if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object GLEW_ARB_clear_buffer_object = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_clear_buffer_object */ #ifdef GL_ARB_clear_texture GLEW_ARB_clear_texture = _glewSearchExtension("GL_ARB_clear_texture", extStart, extEnd); if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_clip_control GLEW_ARB_clip_control = _glewSearchExtension("GL_ARB_clip_control", extStart, extEnd); if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_clip_control */ #ifdef GL_ARB_color_buffer_float GLEW_ARB_color_buffer_float = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_color_buffer_float */ #ifdef GL_ARB_compatibility GLEW_ARB_compatibility = _glewSearchExtension("GL_ARB_compatibility", extStart, extEnd); #endif /* GL_ARB_compatibility */ #ifdef GL_ARB_compressed_texture_pixel_storage GLEW_ARB_compressed_texture_pixel_storage = _glewSearchExtension("GL_ARB_compressed_texture_pixel_storage", extStart, extEnd); #endif /* GL_ARB_compressed_texture_pixel_storage */ #ifdef GL_ARB_compute_shader GLEW_ARB_compute_shader = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_compute_shader */ #ifdef GL_ARB_compute_variable_group_size GLEW_ARB_compute_variable_group_size = _glewSearchExtension("GL_ARB_compute_variable_group_size", extStart, extEnd); if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_conditional_render_inverted GLEW_ARB_conditional_render_inverted = _glewSearchExtension("GL_ARB_conditional_render_inverted", extStart, extEnd); #endif /* GL_ARB_conditional_render_inverted */ #ifdef GL_ARB_conservative_depth GLEW_ARB_conservative_depth = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd); #endif /* GL_ARB_conservative_depth */ #ifdef GL_ARB_copy_buffer GLEW_ARB_copy_buffer = _glewSearchExtension("GL_ARB_copy_buffer", extStart, extEnd); if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_copy_buffer */ #ifdef GL_ARB_copy_image GLEW_ARB_copy_image = _glewSearchExtension("GL_ARB_copy_image", extStart, extEnd); if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_copy_image */ #ifdef GL_ARB_cull_distance GLEW_ARB_cull_distance = _glewSearchExtension("GL_ARB_cull_distance", extStart, extEnd); #endif /* GL_ARB_cull_distance */ #ifdef GL_ARB_debug_output GLEW_ARB_debug_output = _glewSearchExtension("GL_ARB_debug_output", extStart, extEnd); if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_debug_output */ #ifdef GL_ARB_depth_buffer_float GLEW_ARB_depth_buffer_float = _glewSearchExtension("GL_ARB_depth_buffer_float", extStart, extEnd); #endif /* GL_ARB_depth_buffer_float */ #ifdef GL_ARB_depth_clamp GLEW_ARB_depth_clamp = _glewSearchExtension("GL_ARB_depth_clamp", extStart, extEnd); #endif /* GL_ARB_depth_clamp */ #ifdef GL_ARB_depth_texture GLEW_ARB_depth_texture = _glewSearchExtension("GL_ARB_depth_texture", extStart, extEnd); #endif /* GL_ARB_depth_texture */ #ifdef GL_ARB_derivative_control GLEW_ARB_derivative_control = _glewSearchExtension("GL_ARB_derivative_control", extStart, extEnd); #endif /* GL_ARB_derivative_control */ #ifdef GL_ARB_direct_state_access GLEW_ARB_direct_state_access = _glewSearchExtension("GL_ARB_direct_state_access", extStart, extEnd); if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_direct_state_access */ #ifdef GL_ARB_draw_buffers GLEW_ARB_draw_buffers = _glewSearchExtension("GL_ARB_draw_buffers", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_buffers */ #ifdef GL_ARB_draw_buffers_blend GLEW_ARB_draw_buffers_blend = _glewSearchExtension("GL_ARB_draw_buffers_blend", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_buffers_blend */ #ifdef GL_ARB_draw_elements_base_vertex GLEW_ARB_draw_elements_base_vertex = _glewSearchExtension("GL_ARB_draw_elements_base_vertex", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_elements_base_vertex */ #ifdef GL_ARB_draw_indirect GLEW_ARB_draw_indirect = _glewSearchExtension("GL_ARB_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_draw_indirect */ #ifdef GL_ARB_draw_instanced GLEW_ARB_draw_instanced = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd); #endif /* GL_ARB_draw_instanced */ #ifdef GL_ARB_enhanced_layouts GLEW_ARB_enhanced_layouts = _glewSearchExtension("GL_ARB_enhanced_layouts", extStart, extEnd); #endif /* GL_ARB_enhanced_layouts */ #ifdef GL_ARB_explicit_attrib_location GLEW_ARB_explicit_attrib_location = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd); #endif /* GL_ARB_explicit_attrib_location */ #ifdef GL_ARB_explicit_uniform_location GLEW_ARB_explicit_uniform_location = _glewSearchExtension("GL_ARB_explicit_uniform_location", extStart, extEnd); #endif /* GL_ARB_explicit_uniform_location */ #ifdef GL_ARB_fragment_coord_conventions GLEW_ARB_fragment_coord_conventions = _glewSearchExtension("GL_ARB_fragment_coord_conventions", extStart, extEnd); #endif /* GL_ARB_fragment_coord_conventions */ #ifdef GL_ARB_fragment_layer_viewport GLEW_ARB_fragment_layer_viewport = _glewSearchExtension("GL_ARB_fragment_layer_viewport", extStart, extEnd); #endif /* GL_ARB_fragment_layer_viewport */ #ifdef GL_ARB_fragment_program GLEW_ARB_fragment_program = _glewSearchExtension("GL_ARB_fragment_program", extStart, extEnd); #endif /* GL_ARB_fragment_program */ #ifdef GL_ARB_fragment_program_shadow GLEW_ARB_fragment_program_shadow = _glewSearchExtension("GL_ARB_fragment_program_shadow", extStart, extEnd); #endif /* GL_ARB_fragment_program_shadow */ #ifdef GL_ARB_fragment_shader GLEW_ARB_fragment_shader = _glewSearchExtension("GL_ARB_fragment_shader", extStart, extEnd); #endif /* GL_ARB_fragment_shader */ #ifdef GL_ARB_fragment_shader_interlock GLEW_ARB_fragment_shader_interlock = _glewSearchExtension("GL_ARB_fragment_shader_interlock", extStart, extEnd); #endif /* GL_ARB_fragment_shader_interlock */ #ifdef GL_ARB_framebuffer_no_attachments GLEW_ARB_framebuffer_no_attachments = _glewSearchExtension("GL_ARB_framebuffer_no_attachments", extStart, extEnd); if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_framebuffer_no_attachments */ #ifdef GL_ARB_framebuffer_object GLEW_ARB_framebuffer_object = _glewSearchExtension("GL_ARB_framebuffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_framebuffer_object */ #ifdef GL_ARB_framebuffer_sRGB GLEW_ARB_framebuffer_sRGB = _glewSearchExtension("GL_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* GL_ARB_framebuffer_sRGB */ #ifdef GL_ARB_geometry_shader4 GLEW_ARB_geometry_shader4 = _glewSearchExtension("GL_ARB_geometry_shader4", extStart, extEnd); if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_geometry_shader4 */ #ifdef GL_ARB_get_program_binary GLEW_ARB_get_program_binary = _glewSearchExtension("GL_ARB_get_program_binary", extStart, extEnd); if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_get_program_binary */ #ifdef GL_ARB_get_texture_sub_image GLEW_ARB_get_texture_sub_image = _glewSearchExtension("GL_ARB_get_texture_sub_image", extStart, extEnd); if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_get_texture_sub_image */ #ifdef GL_ARB_gpu_shader5 GLEW_ARB_gpu_shader5 = _glewSearchExtension("GL_ARB_gpu_shader5", extStart, extEnd); #endif /* GL_ARB_gpu_shader5 */ #ifdef GL_ARB_gpu_shader_fp64 GLEW_ARB_gpu_shader_fp64 = _glewSearchExtension("GL_ARB_gpu_shader_fp64", extStart, extEnd); if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_gpu_shader_fp64 */ #ifdef GL_ARB_gpu_shader_int64 GLEW_ARB_gpu_shader_int64 = _glewSearchExtension("GL_ARB_gpu_shader_int64", extStart, extEnd); if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_gpu_shader_int64 */ #ifdef GL_ARB_half_float_pixel GLEW_ARB_half_float_pixel = _glewSearchExtension("GL_ARB_half_float_pixel", extStart, extEnd); #endif /* GL_ARB_half_float_pixel */ #ifdef GL_ARB_half_float_vertex GLEW_ARB_half_float_vertex = _glewSearchExtension("GL_ARB_half_float_vertex", extStart, extEnd); #endif /* GL_ARB_half_float_vertex */ #ifdef GL_ARB_imaging GLEW_ARB_imaging = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd); if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_imaging */ #ifdef GL_ARB_indirect_parameters GLEW_ARB_indirect_parameters = _glewSearchExtension("GL_ARB_indirect_parameters", extStart, extEnd); if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays GLEW_ARB_instanced_arrays = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd); if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_instanced_arrays */ #ifdef GL_ARB_internalformat_query GLEW_ARB_internalformat_query = _glewSearchExtension("GL_ARB_internalformat_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_internalformat_query */ #ifdef GL_ARB_internalformat_query2 GLEW_ARB_internalformat_query2 = _glewSearchExtension("GL_ARB_internalformat_query2", extStart, extEnd); if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_internalformat_query2 */ #ifdef GL_ARB_invalidate_subdata GLEW_ARB_invalidate_subdata = _glewSearchExtension("GL_ARB_invalidate_subdata", extStart, extEnd); if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_invalidate_subdata */ #ifdef GL_ARB_map_buffer_alignment GLEW_ARB_map_buffer_alignment = _glewSearchExtension("GL_ARB_map_buffer_alignment", extStart, extEnd); #endif /* GL_ARB_map_buffer_alignment */ #ifdef GL_ARB_map_buffer_range GLEW_ARB_map_buffer_range = _glewSearchExtension("GL_ARB_map_buffer_range", extStart, extEnd); if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_map_buffer_range */ #ifdef GL_ARB_matrix_palette GLEW_ARB_matrix_palette = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd); if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_matrix_palette */ #ifdef GL_ARB_multi_bind GLEW_ARB_multi_bind = _glewSearchExtension("GL_ARB_multi_bind", extStart, extEnd); if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect GLEW_ARB_multi_draw_indirect = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multi_draw_indirect */ #ifdef GL_ARB_multisample GLEW_ARB_multisample = _glewSearchExtension("GL_ARB_multisample", extStart, extEnd); if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multisample */ #ifdef GL_ARB_multitexture GLEW_ARB_multitexture = _glewSearchExtension("GL_ARB_multitexture", extStart, extEnd); if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_multitexture */ #ifdef GL_ARB_occlusion_query GLEW_ARB_occlusion_query = _glewSearchExtension("GL_ARB_occlusion_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_occlusion_query */ #ifdef GL_ARB_occlusion_query2 GLEW_ARB_occlusion_query2 = _glewSearchExtension("GL_ARB_occlusion_query2", extStart, extEnd); #endif /* GL_ARB_occlusion_query2 */ #ifdef GL_ARB_parallel_shader_compile GLEW_ARB_parallel_shader_compile = _glewSearchExtension("GL_ARB_parallel_shader_compile", extStart, extEnd); if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_parallel_shader_compile */ #ifdef GL_ARB_pipeline_statistics_query GLEW_ARB_pipeline_statistics_query = _glewSearchExtension("GL_ARB_pipeline_statistics_query", extStart, extEnd); #endif /* GL_ARB_pipeline_statistics_query */ #ifdef GL_ARB_pixel_buffer_object GLEW_ARB_pixel_buffer_object = _glewSearchExtension("GL_ARB_pixel_buffer_object", extStart, extEnd); #endif /* GL_ARB_pixel_buffer_object */ #ifdef GL_ARB_point_parameters GLEW_ARB_point_parameters = _glewSearchExtension("GL_ARB_point_parameters", extStart, extEnd); if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_point_parameters */ #ifdef GL_ARB_point_sprite GLEW_ARB_point_sprite = _glewSearchExtension("GL_ARB_point_sprite", extStart, extEnd); #endif /* GL_ARB_point_sprite */ #ifdef GL_ARB_post_depth_coverage GLEW_ARB_post_depth_coverage = _glewSearchExtension("GL_ARB_post_depth_coverage", extStart, extEnd); #endif /* GL_ARB_post_depth_coverage */ #ifdef GL_ARB_program_interface_query GLEW_ARB_program_interface_query = _glewSearchExtension("GL_ARB_program_interface_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_program_interface_query */ #ifdef GL_ARB_provoking_vertex GLEW_ARB_provoking_vertex = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd); if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_provoking_vertex */ #ifdef GL_ARB_query_buffer_object GLEW_ARB_query_buffer_object = _glewSearchExtension("GL_ARB_query_buffer_object", extStart, extEnd); #endif /* GL_ARB_query_buffer_object */ #ifdef GL_ARB_robust_buffer_access_behavior GLEW_ARB_robust_buffer_access_behavior = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd); #endif /* GL_ARB_robust_buffer_access_behavior */ #ifdef GL_ARB_robustness GLEW_ARB_robustness = _glewSearchExtension("GL_ARB_robustness", extStart, extEnd); if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_robustness */ #ifdef GL_ARB_robustness_application_isolation GLEW_ARB_robustness_application_isolation = _glewSearchExtension("GL_ARB_robustness_application_isolation", extStart, extEnd); #endif /* GL_ARB_robustness_application_isolation */ #ifdef GL_ARB_robustness_share_group_isolation GLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GL_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* GL_ARB_robustness_share_group_isolation */ #ifdef GL_ARB_sample_locations GLEW_ARB_sample_locations = _glewSearchExtension("GL_ARB_sample_locations", extStart, extEnd); if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sample_locations */ #ifdef GL_ARB_sample_shading GLEW_ARB_sample_shading = _glewSearchExtension("GL_ARB_sample_shading", extStart, extEnd); if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sample_shading */ #ifdef GL_ARB_sampler_objects GLEW_ARB_sampler_objects = _glewSearchExtension("GL_ARB_sampler_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sampler_objects */ #ifdef GL_ARB_seamless_cube_map GLEW_ARB_seamless_cube_map = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd); #endif /* GL_ARB_seamless_cube_map */ #ifdef GL_ARB_seamless_cubemap_per_texture GLEW_ARB_seamless_cubemap_per_texture = _glewSearchExtension("GL_ARB_seamless_cubemap_per_texture", extStart, extEnd); #endif /* GL_ARB_seamless_cubemap_per_texture */ #ifdef GL_ARB_separate_shader_objects GLEW_ARB_separate_shader_objects = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_separate_shader_objects */ #ifdef GL_ARB_shader_atomic_counter_ops GLEW_ARB_shader_atomic_counter_ops = _glewSearchExtension("GL_ARB_shader_atomic_counter_ops", extStart, extEnd); #endif /* GL_ARB_shader_atomic_counter_ops */ #ifdef GL_ARB_shader_atomic_counters GLEW_ARB_shader_atomic_counters = _glewSearchExtension("GL_ARB_shader_atomic_counters", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_atomic_counters */ #ifdef GL_ARB_shader_ballot GLEW_ARB_shader_ballot = _glewSearchExtension("GL_ARB_shader_ballot", extStart, extEnd); #endif /* GL_ARB_shader_ballot */ #ifdef GL_ARB_shader_bit_encoding GLEW_ARB_shader_bit_encoding = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd); #endif /* GL_ARB_shader_bit_encoding */ #ifdef GL_ARB_shader_clock GLEW_ARB_shader_clock = _glewSearchExtension("GL_ARB_shader_clock", extStart, extEnd); #endif /* GL_ARB_shader_clock */ #ifdef GL_ARB_shader_draw_parameters GLEW_ARB_shader_draw_parameters = _glewSearchExtension("GL_ARB_shader_draw_parameters", extStart, extEnd); #endif /* GL_ARB_shader_draw_parameters */ #ifdef GL_ARB_shader_group_vote GLEW_ARB_shader_group_vote = _glewSearchExtension("GL_ARB_shader_group_vote", extStart, extEnd); #endif /* GL_ARB_shader_group_vote */ #ifdef GL_ARB_shader_image_load_store GLEW_ARB_shader_image_load_store = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_image_load_store */ #ifdef GL_ARB_shader_image_size GLEW_ARB_shader_image_size = _glewSearchExtension("GL_ARB_shader_image_size", extStart, extEnd); #endif /* GL_ARB_shader_image_size */ #ifdef GL_ARB_shader_objects GLEW_ARB_shader_objects = _glewSearchExtension("GL_ARB_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_objects */ #ifdef GL_ARB_shader_precision GLEW_ARB_shader_precision = _glewSearchExtension("GL_ARB_shader_precision", extStart, extEnd); #endif /* GL_ARB_shader_precision */ #ifdef GL_ARB_shader_stencil_export GLEW_ARB_shader_stencil_export = _glewSearchExtension("GL_ARB_shader_stencil_export", extStart, extEnd); #endif /* GL_ARB_shader_stencil_export */ #ifdef GL_ARB_shader_storage_buffer_object GLEW_ARB_shader_storage_buffer_object = _glewSearchExtension("GL_ARB_shader_storage_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_storage_buffer_object */ #ifdef GL_ARB_shader_subroutine GLEW_ARB_shader_subroutine = _glewSearchExtension("GL_ARB_shader_subroutine", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shader_subroutine */ #ifdef GL_ARB_shader_texture_image_samples GLEW_ARB_shader_texture_image_samples = _glewSearchExtension("GL_ARB_shader_texture_image_samples", extStart, extEnd); #endif /* GL_ARB_shader_texture_image_samples */ #ifdef GL_ARB_shader_texture_lod GLEW_ARB_shader_texture_lod = _glewSearchExtension("GL_ARB_shader_texture_lod", extStart, extEnd); #endif /* GL_ARB_shader_texture_lod */ #ifdef GL_ARB_shader_viewport_layer_array GLEW_ARB_shader_viewport_layer_array = _glewSearchExtension("GL_ARB_shader_viewport_layer_array", extStart, extEnd); #endif /* GL_ARB_shader_viewport_layer_array */ #ifdef GL_ARB_shading_language_100 GLEW_ARB_shading_language_100 = _glewSearchExtension("GL_ARB_shading_language_100", extStart, extEnd); #endif /* GL_ARB_shading_language_100 */ #ifdef GL_ARB_shading_language_420pack GLEW_ARB_shading_language_420pack = _glewSearchExtension("GL_ARB_shading_language_420pack", extStart, extEnd); #endif /* GL_ARB_shading_language_420pack */ #ifdef GL_ARB_shading_language_include GLEW_ARB_shading_language_include = _glewSearchExtension("GL_ARB_shading_language_include", extStart, extEnd); if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_shading_language_include */ #ifdef GL_ARB_shading_language_packing GLEW_ARB_shading_language_packing = _glewSearchExtension("GL_ARB_shading_language_packing", extStart, extEnd); #endif /* GL_ARB_shading_language_packing */ #ifdef GL_ARB_shadow GLEW_ARB_shadow = _glewSearchExtension("GL_ARB_shadow", extStart, extEnd); #endif /* GL_ARB_shadow */ #ifdef GL_ARB_shadow_ambient GLEW_ARB_shadow_ambient = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd); #endif /* GL_ARB_shadow_ambient */ #ifdef GL_ARB_sparse_buffer GLEW_ARB_sparse_buffer = _glewSearchExtension("GL_ARB_sparse_buffer", extStart, extEnd); if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sparse_buffer */ #ifdef GL_ARB_sparse_texture GLEW_ARB_sparse_texture = _glewSearchExtension("GL_ARB_sparse_texture", extStart, extEnd); if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_sparse_texture2 GLEW_ARB_sparse_texture2 = _glewSearchExtension("GL_ARB_sparse_texture2", extStart, extEnd); #endif /* GL_ARB_sparse_texture2 */ #ifdef GL_ARB_sparse_texture_clamp GLEW_ARB_sparse_texture_clamp = _glewSearchExtension("GL_ARB_sparse_texture_clamp", extStart, extEnd); #endif /* GL_ARB_sparse_texture_clamp */ #ifdef GL_ARB_stencil_texturing GLEW_ARB_stencil_texturing = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd); #endif /* GL_ARB_stencil_texturing */ #ifdef GL_ARB_sync GLEW_ARB_sync = _glewSearchExtension("GL_ARB_sync", extStart, extEnd); if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_sync */ #ifdef GL_ARB_tessellation_shader GLEW_ARB_tessellation_shader = _glewSearchExtension("GL_ARB_tessellation_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_tessellation_shader */ #ifdef GL_ARB_texture_barrier GLEW_ARB_texture_barrier = _glewSearchExtension("GL_ARB_texture_barrier", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_barrier */ #ifdef GL_ARB_texture_border_clamp GLEW_ARB_texture_border_clamp = _glewSearchExtension("GL_ARB_texture_border_clamp", extStart, extEnd); #endif /* GL_ARB_texture_border_clamp */ #ifdef GL_ARB_texture_buffer_object GLEW_ARB_texture_buffer_object = _glewSearchExtension("GL_ARB_texture_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_buffer_object */ #ifdef GL_ARB_texture_buffer_object_rgb32 GLEW_ARB_texture_buffer_object_rgb32 = _glewSearchExtension("GL_ARB_texture_buffer_object_rgb32", extStart, extEnd); #endif /* GL_ARB_texture_buffer_object_rgb32 */ #ifdef GL_ARB_texture_buffer_range GLEW_ARB_texture_buffer_range = _glewSearchExtension("GL_ARB_texture_buffer_range", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_buffer_range */ #ifdef GL_ARB_texture_compression GLEW_ARB_texture_compression = _glewSearchExtension("GL_ARB_texture_compression", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_compression */ #ifdef GL_ARB_texture_compression_bptc GLEW_ARB_texture_compression_bptc = _glewSearchExtension("GL_ARB_texture_compression_bptc", extStart, extEnd); #endif /* GL_ARB_texture_compression_bptc */ #ifdef GL_ARB_texture_compression_rgtc GLEW_ARB_texture_compression_rgtc = _glewSearchExtension("GL_ARB_texture_compression_rgtc", extStart, extEnd); #endif /* GL_ARB_texture_compression_rgtc */ #ifdef GL_ARB_texture_cube_map GLEW_ARB_texture_cube_map = _glewSearchExtension("GL_ARB_texture_cube_map", extStart, extEnd); #endif /* GL_ARB_texture_cube_map */ #ifdef GL_ARB_texture_cube_map_array GLEW_ARB_texture_cube_map_array = _glewSearchExtension("GL_ARB_texture_cube_map_array", extStart, extEnd); #endif /* GL_ARB_texture_cube_map_array */ #ifdef GL_ARB_texture_env_add GLEW_ARB_texture_env_add = _glewSearchExtension("GL_ARB_texture_env_add", extStart, extEnd); #endif /* GL_ARB_texture_env_add */ #ifdef GL_ARB_texture_env_combine GLEW_ARB_texture_env_combine = _glewSearchExtension("GL_ARB_texture_env_combine", extStart, extEnd); #endif /* GL_ARB_texture_env_combine */ #ifdef GL_ARB_texture_env_crossbar GLEW_ARB_texture_env_crossbar = _glewSearchExtension("GL_ARB_texture_env_crossbar", extStart, extEnd); #endif /* GL_ARB_texture_env_crossbar */ #ifdef GL_ARB_texture_env_dot3 GLEW_ARB_texture_env_dot3 = _glewSearchExtension("GL_ARB_texture_env_dot3", extStart, extEnd); #endif /* GL_ARB_texture_env_dot3 */ #ifdef GL_ARB_texture_filter_minmax GLEW_ARB_texture_filter_minmax = _glewSearchExtension("GL_ARB_texture_filter_minmax", extStart, extEnd); #endif /* GL_ARB_texture_filter_minmax */ #ifdef GL_ARB_texture_float GLEW_ARB_texture_float = _glewSearchExtension("GL_ARB_texture_float", extStart, extEnd); #endif /* GL_ARB_texture_float */ #ifdef GL_ARB_texture_gather GLEW_ARB_texture_gather = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd); #endif /* GL_ARB_texture_gather */ #ifdef GL_ARB_texture_mirror_clamp_to_edge GLEW_ARB_texture_mirror_clamp_to_edge = _glewSearchExtension("GL_ARB_texture_mirror_clamp_to_edge", extStart, extEnd); #endif /* GL_ARB_texture_mirror_clamp_to_edge */ #ifdef GL_ARB_texture_mirrored_repeat GLEW_ARB_texture_mirrored_repeat = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd); #endif /* GL_ARB_texture_mirrored_repeat */ #ifdef GL_ARB_texture_multisample GLEW_ARB_texture_multisample = _glewSearchExtension("GL_ARB_texture_multisample", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_multisample */ #ifdef GL_ARB_texture_non_power_of_two GLEW_ARB_texture_non_power_of_two = _glewSearchExtension("GL_ARB_texture_non_power_of_two", extStart, extEnd); #endif /* GL_ARB_texture_non_power_of_two */ #ifdef GL_ARB_texture_query_levels GLEW_ARB_texture_query_levels = _glewSearchExtension("GL_ARB_texture_query_levels", extStart, extEnd); #endif /* GL_ARB_texture_query_levels */ #ifdef GL_ARB_texture_query_lod GLEW_ARB_texture_query_lod = _glewSearchExtension("GL_ARB_texture_query_lod", extStart, extEnd); #endif /* GL_ARB_texture_query_lod */ #ifdef GL_ARB_texture_rectangle GLEW_ARB_texture_rectangle = _glewSearchExtension("GL_ARB_texture_rectangle", extStart, extEnd); #endif /* GL_ARB_texture_rectangle */ #ifdef GL_ARB_texture_rg GLEW_ARB_texture_rg = _glewSearchExtension("GL_ARB_texture_rg", extStart, extEnd); #endif /* GL_ARB_texture_rg */ #ifdef GL_ARB_texture_rgb10_a2ui GLEW_ARB_texture_rgb10_a2ui = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd); #endif /* GL_ARB_texture_rgb10_a2ui */ #ifdef GL_ARB_texture_stencil8 GLEW_ARB_texture_stencil8 = _glewSearchExtension("GL_ARB_texture_stencil8", extStart, extEnd); #endif /* GL_ARB_texture_stencil8 */ #ifdef GL_ARB_texture_storage GLEW_ARB_texture_storage = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_storage */ #ifdef GL_ARB_texture_storage_multisample GLEW_ARB_texture_storage_multisample = _glewSearchExtension("GL_ARB_texture_storage_multisample", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_storage_multisample */ #ifdef GL_ARB_texture_swizzle GLEW_ARB_texture_swizzle = _glewSearchExtension("GL_ARB_texture_swizzle", extStart, extEnd); #endif /* GL_ARB_texture_swizzle */ #ifdef GL_ARB_texture_view GLEW_ARB_texture_view = _glewSearchExtension("GL_ARB_texture_view", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_texture_view */ #ifdef GL_ARB_timer_query GLEW_ARB_timer_query = _glewSearchExtension("GL_ARB_timer_query", extStart, extEnd); if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_timer_query */ #ifdef GL_ARB_transform_feedback2 GLEW_ARB_transform_feedback2 = _glewSearchExtension("GL_ARB_transform_feedback2", extStart, extEnd); if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transform_feedback2 */ #ifdef GL_ARB_transform_feedback3 GLEW_ARB_transform_feedback3 = _glewSearchExtension("GL_ARB_transform_feedback3", extStart, extEnd); if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transform_feedback3 */ #ifdef GL_ARB_transform_feedback_instanced GLEW_ARB_transform_feedback_instanced = _glewSearchExtension("GL_ARB_transform_feedback_instanced", extStart, extEnd); if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transform_feedback_instanced */ #ifdef GL_ARB_transform_feedback_overflow_query GLEW_ARB_transform_feedback_overflow_query = _glewSearchExtension("GL_ARB_transform_feedback_overflow_query", extStart, extEnd); #endif /* GL_ARB_transform_feedback_overflow_query */ #ifdef GL_ARB_transpose_matrix GLEW_ARB_transpose_matrix = _glewSearchExtension("GL_ARB_transpose_matrix", extStart, extEnd); if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_transpose_matrix */ #ifdef GL_ARB_uniform_buffer_object GLEW_ARB_uniform_buffer_object = _glewSearchExtension("GL_ARB_uniform_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_uniform_buffer_object */ #ifdef GL_ARB_vertex_array_bgra GLEW_ARB_vertex_array_bgra = _glewSearchExtension("GL_ARB_vertex_array_bgra", extStart, extEnd); #endif /* GL_ARB_vertex_array_bgra */ #ifdef GL_ARB_vertex_array_object GLEW_ARB_vertex_array_object = _glewSearchExtension("GL_ARB_vertex_array_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_array_object */ #ifdef GL_ARB_vertex_attrib_64bit GLEW_ARB_vertex_attrib_64bit = _glewSearchExtension("GL_ARB_vertex_attrib_64bit", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_attrib_64bit */ #ifdef GL_ARB_vertex_attrib_binding GLEW_ARB_vertex_attrib_binding = _glewSearchExtension("GL_ARB_vertex_attrib_binding", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_attrib_binding */ #ifdef GL_ARB_vertex_blend GLEW_ARB_vertex_blend = _glewSearchExtension("GL_ARB_vertex_blend", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_blend */ #ifdef GL_ARB_vertex_buffer_object GLEW_ARB_vertex_buffer_object = _glewSearchExtension("GL_ARB_vertex_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_buffer_object */ #ifdef GL_ARB_vertex_program GLEW_ARB_vertex_program = _glewSearchExtension("GL_ARB_vertex_program", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_program */ #ifdef GL_ARB_vertex_shader GLEW_ARB_vertex_shader = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); _glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); } #endif /* GL_ARB_vertex_shader */ #ifdef GL_ARB_vertex_type_10f_11f_11f_rev GLEW_ARB_vertex_type_10f_11f_11f_rev = _glewSearchExtension("GL_ARB_vertex_type_10f_11f_11f_rev", extStart, extEnd); #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev GLEW_ARB_vertex_type_2_10_10_10_rev = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifdef GL_ARB_viewport_array GLEW_ARB_viewport_array = _glewSearchExtension("GL_ARB_viewport_array", extStart, extEnd); if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_viewport_array */ #ifdef GL_ARB_window_pos GLEW_ARB_window_pos = _glewSearchExtension("GL_ARB_window_pos", extStart, extEnd); if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_window_pos */ #ifdef GL_ATIX_point_sprites GLEW_ATIX_point_sprites = _glewSearchExtension("GL_ATIX_point_sprites", extStart, extEnd); #endif /* GL_ATIX_point_sprites */ #ifdef GL_ATIX_texture_env_combine3 GLEW_ATIX_texture_env_combine3 = _glewSearchExtension("GL_ATIX_texture_env_combine3", extStart, extEnd); #endif /* GL_ATIX_texture_env_combine3 */ #ifdef GL_ATIX_texture_env_route GLEW_ATIX_texture_env_route = _glewSearchExtension("GL_ATIX_texture_env_route", extStart, extEnd); #endif /* GL_ATIX_texture_env_route */ #ifdef GL_ATIX_vertex_shader_output_point_size GLEW_ATIX_vertex_shader_output_point_size = _glewSearchExtension("GL_ATIX_vertex_shader_output_point_size", extStart, extEnd); #endif /* GL_ATIX_vertex_shader_output_point_size */ #ifdef GL_ATI_draw_buffers GLEW_ATI_draw_buffers = _glewSearchExtension("GL_ATI_draw_buffers", extStart, extEnd); if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_draw_buffers */ #ifdef GL_ATI_element_array GLEW_ATI_element_array = _glewSearchExtension("GL_ATI_element_array", extStart, extEnd); if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_element_array */ #ifdef GL_ATI_envmap_bumpmap GLEW_ATI_envmap_bumpmap = _glewSearchExtension("GL_ATI_envmap_bumpmap", extStart, extEnd); if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_envmap_bumpmap */ #ifdef GL_ATI_fragment_shader GLEW_ATI_fragment_shader = _glewSearchExtension("GL_ATI_fragment_shader", extStart, extEnd); if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_fragment_shader */ #ifdef GL_ATI_map_object_buffer GLEW_ATI_map_object_buffer = _glewSearchExtension("GL_ATI_map_object_buffer", extStart, extEnd); if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_map_object_buffer */ #ifdef GL_ATI_meminfo GLEW_ATI_meminfo = _glewSearchExtension("GL_ATI_meminfo", extStart, extEnd); #endif /* GL_ATI_meminfo */ #ifdef GL_ATI_pn_triangles GLEW_ATI_pn_triangles = _glewSearchExtension("GL_ATI_pn_triangles", extStart, extEnd); if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_pn_triangles */ #ifdef GL_ATI_separate_stencil GLEW_ATI_separate_stencil = _glewSearchExtension("GL_ATI_separate_stencil", extStart, extEnd); if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_separate_stencil */ #ifdef GL_ATI_shader_texture_lod GLEW_ATI_shader_texture_lod = _glewSearchExtension("GL_ATI_shader_texture_lod", extStart, extEnd); #endif /* GL_ATI_shader_texture_lod */ #ifdef GL_ATI_text_fragment_shader GLEW_ATI_text_fragment_shader = _glewSearchExtension("GL_ATI_text_fragment_shader", extStart, extEnd); #endif /* GL_ATI_text_fragment_shader */ #ifdef GL_ATI_texture_compression_3dc GLEW_ATI_texture_compression_3dc = _glewSearchExtension("GL_ATI_texture_compression_3dc", extStart, extEnd); #endif /* GL_ATI_texture_compression_3dc */ #ifdef GL_ATI_texture_env_combine3 GLEW_ATI_texture_env_combine3 = _glewSearchExtension("GL_ATI_texture_env_combine3", extStart, extEnd); #endif /* GL_ATI_texture_env_combine3 */ #ifdef GL_ATI_texture_float GLEW_ATI_texture_float = _glewSearchExtension("GL_ATI_texture_float", extStart, extEnd); #endif /* GL_ATI_texture_float */ #ifdef GL_ATI_texture_mirror_once GLEW_ATI_texture_mirror_once = _glewSearchExtension("GL_ATI_texture_mirror_once", extStart, extEnd); #endif /* GL_ATI_texture_mirror_once */ #ifdef GL_ATI_vertex_array_object GLEW_ATI_vertex_array_object = _glewSearchExtension("GL_ATI_vertex_array_object", extStart, extEnd); if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_vertex_array_object */ #ifdef GL_ATI_vertex_attrib_array_object GLEW_ATI_vertex_attrib_array_object = _glewSearchExtension("GL_ATI_vertex_attrib_array_object", extStart, extEnd); if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_vertex_attrib_array_object */ #ifdef GL_ATI_vertex_streams GLEW_ATI_vertex_streams = _glewSearchExtension("GL_ATI_vertex_streams", extStart, extEnd); if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ATI_vertex_streams */ #ifdef GL_EXT_422_pixels GLEW_EXT_422_pixels = _glewSearchExtension("GL_EXT_422_pixels", extStart, extEnd); #endif /* GL_EXT_422_pixels */ #ifdef GL_EXT_Cg_shader GLEW_EXT_Cg_shader = _glewSearchExtension("GL_EXT_Cg_shader", extStart, extEnd); #endif /* GL_EXT_Cg_shader */ #ifdef GL_EXT_abgr GLEW_EXT_abgr = _glewSearchExtension("GL_EXT_abgr", extStart, extEnd); #endif /* GL_EXT_abgr */ #ifdef GL_EXT_bgra GLEW_EXT_bgra = _glewSearchExtension("GL_EXT_bgra", extStart, extEnd); #endif /* GL_EXT_bgra */ #ifdef GL_EXT_bindable_uniform GLEW_EXT_bindable_uniform = _glewSearchExtension("GL_EXT_bindable_uniform", extStart, extEnd); if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_bindable_uniform */ #ifdef GL_EXT_blend_color GLEW_EXT_blend_color = _glewSearchExtension("GL_EXT_blend_color", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_color */ #ifdef GL_EXT_blend_equation_separate GLEW_EXT_blend_equation_separate = _glewSearchExtension("GL_EXT_blend_equation_separate", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_equation_separate */ #ifdef GL_EXT_blend_func_separate GLEW_EXT_blend_func_separate = _glewSearchExtension("GL_EXT_blend_func_separate", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_func_separate */ #ifdef GL_EXT_blend_logic_op GLEW_EXT_blend_logic_op = _glewSearchExtension("GL_EXT_blend_logic_op", extStart, extEnd); #endif /* GL_EXT_blend_logic_op */ #ifdef GL_EXT_blend_minmax GLEW_EXT_blend_minmax = _glewSearchExtension("GL_EXT_blend_minmax", extStart, extEnd); if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_blend_minmax */ #ifdef GL_EXT_blend_subtract GLEW_EXT_blend_subtract = _glewSearchExtension("GL_EXT_blend_subtract", extStart, extEnd); #endif /* GL_EXT_blend_subtract */ #ifdef GL_EXT_clip_volume_hint GLEW_EXT_clip_volume_hint = _glewSearchExtension("GL_EXT_clip_volume_hint", extStart, extEnd); #endif /* GL_EXT_clip_volume_hint */ #ifdef GL_EXT_cmyka GLEW_EXT_cmyka = _glewSearchExtension("GL_EXT_cmyka", extStart, extEnd); #endif /* GL_EXT_cmyka */ #ifdef GL_EXT_color_subtable GLEW_EXT_color_subtable = _glewSearchExtension("GL_EXT_color_subtable", extStart, extEnd); if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_color_subtable */ #ifdef GL_EXT_compiled_vertex_array GLEW_EXT_compiled_vertex_array = _glewSearchExtension("GL_EXT_compiled_vertex_array", extStart, extEnd); if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_compiled_vertex_array */ #ifdef GL_EXT_convolution GLEW_EXT_convolution = _glewSearchExtension("GL_EXT_convolution", extStart, extEnd); if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_convolution */ #ifdef GL_EXT_coordinate_frame GLEW_EXT_coordinate_frame = _glewSearchExtension("GL_EXT_coordinate_frame", extStart, extEnd); if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_coordinate_frame */ #ifdef GL_EXT_copy_texture GLEW_EXT_copy_texture = _glewSearchExtension("GL_EXT_copy_texture", extStart, extEnd); if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_copy_texture */ #ifdef GL_EXT_cull_vertex GLEW_EXT_cull_vertex = _glewSearchExtension("GL_EXT_cull_vertex", extStart, extEnd); if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_cull_vertex */ #ifdef GL_EXT_debug_label GLEW_EXT_debug_label = _glewSearchExtension("GL_EXT_debug_label", extStart, extEnd); if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_debug_label */ #ifdef GL_EXT_debug_marker GLEW_EXT_debug_marker = _glewSearchExtension("GL_EXT_debug_marker", extStart, extEnd); if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_debug_marker */ #ifdef GL_EXT_depth_bounds_test GLEW_EXT_depth_bounds_test = _glewSearchExtension("GL_EXT_depth_bounds_test", extStart, extEnd); if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_depth_bounds_test */ #ifdef GL_EXT_direct_state_access GLEW_EXT_direct_state_access = _glewSearchExtension("GL_EXT_direct_state_access", extStart, extEnd); if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_direct_state_access */ #ifdef GL_EXT_draw_buffers2 GLEW_EXT_draw_buffers2 = _glewSearchExtension("GL_EXT_draw_buffers2", extStart, extEnd); if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_draw_buffers2 */ #ifdef GL_EXT_draw_instanced GLEW_EXT_draw_instanced = _glewSearchExtension("GL_EXT_draw_instanced", extStart, extEnd); if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_draw_instanced */ #ifdef GL_EXT_draw_range_elements GLEW_EXT_draw_range_elements = _glewSearchExtension("GL_EXT_draw_range_elements", extStart, extEnd); if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_draw_range_elements */ #ifdef GL_EXT_fog_coord GLEW_EXT_fog_coord = _glewSearchExtension("GL_EXT_fog_coord", extStart, extEnd); if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_fog_coord */ #ifdef GL_EXT_fragment_lighting GLEW_EXT_fragment_lighting = _glewSearchExtension("GL_EXT_fragment_lighting", extStart, extEnd); if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_fragment_lighting */ #ifdef GL_EXT_framebuffer_blit GLEW_EXT_framebuffer_blit = _glewSearchExtension("GL_EXT_framebuffer_blit", extStart, extEnd); if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_framebuffer_blit */ #ifdef GL_EXT_framebuffer_multisample GLEW_EXT_framebuffer_multisample = _glewSearchExtension("GL_EXT_framebuffer_multisample", extStart, extEnd); if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_framebuffer_multisample */ #ifdef GL_EXT_framebuffer_multisample_blit_scaled GLEW_EXT_framebuffer_multisample_blit_scaled = _glewSearchExtension("GL_EXT_framebuffer_multisample_blit_scaled", extStart, extEnd); #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ #ifdef GL_EXT_framebuffer_object GLEW_EXT_framebuffer_object = _glewSearchExtension("GL_EXT_framebuffer_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_framebuffer_object */ #ifdef GL_EXT_framebuffer_sRGB GLEW_EXT_framebuffer_sRGB = _glewSearchExtension("GL_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* GL_EXT_framebuffer_sRGB */ #ifdef GL_EXT_geometry_shader4 GLEW_EXT_geometry_shader4 = _glewSearchExtension("GL_EXT_geometry_shader4", extStart, extEnd); if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_geometry_shader4 */ #ifdef GL_EXT_gpu_program_parameters GLEW_EXT_gpu_program_parameters = _glewSearchExtension("GL_EXT_gpu_program_parameters", extStart, extEnd); if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_gpu_program_parameters */ #ifdef GL_EXT_gpu_shader4 GLEW_EXT_gpu_shader4 = _glewSearchExtension("GL_EXT_gpu_shader4", extStart, extEnd); if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_gpu_shader4 */ #ifdef GL_EXT_histogram GLEW_EXT_histogram = _glewSearchExtension("GL_EXT_histogram", extStart, extEnd); if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_histogram */ #ifdef GL_EXT_index_array_formats GLEW_EXT_index_array_formats = _glewSearchExtension("GL_EXT_index_array_formats", extStart, extEnd); #endif /* GL_EXT_index_array_formats */ #ifdef GL_EXT_index_func GLEW_EXT_index_func = _glewSearchExtension("GL_EXT_index_func", extStart, extEnd); if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_index_func */ #ifdef GL_EXT_index_material GLEW_EXT_index_material = _glewSearchExtension("GL_EXT_index_material", extStart, extEnd); if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_index_material */ #ifdef GL_EXT_index_texture GLEW_EXT_index_texture = _glewSearchExtension("GL_EXT_index_texture", extStart, extEnd); #endif /* GL_EXT_index_texture */ #ifdef GL_EXT_light_texture GLEW_EXT_light_texture = _glewSearchExtension("GL_EXT_light_texture", extStart, extEnd); if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_light_texture */ #ifdef GL_EXT_misc_attribute GLEW_EXT_misc_attribute = _glewSearchExtension("GL_EXT_misc_attribute", extStart, extEnd); #endif /* GL_EXT_misc_attribute */ #ifdef GL_EXT_multi_draw_arrays GLEW_EXT_multi_draw_arrays = _glewSearchExtension("GL_EXT_multi_draw_arrays", extStart, extEnd); if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_multi_draw_arrays */ #ifdef GL_EXT_multisample GLEW_EXT_multisample = _glewSearchExtension("GL_EXT_multisample", extStart, extEnd); if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_multisample */ #ifdef GL_EXT_packed_depth_stencil GLEW_EXT_packed_depth_stencil = _glewSearchExtension("GL_EXT_packed_depth_stencil", extStart, extEnd); #endif /* GL_EXT_packed_depth_stencil */ #ifdef GL_EXT_packed_float GLEW_EXT_packed_float = _glewSearchExtension("GL_EXT_packed_float", extStart, extEnd); #endif /* GL_EXT_packed_float */ #ifdef GL_EXT_packed_pixels GLEW_EXT_packed_pixels = _glewSearchExtension("GL_EXT_packed_pixels", extStart, extEnd); #endif /* GL_EXT_packed_pixels */ #ifdef GL_EXT_paletted_texture GLEW_EXT_paletted_texture = _glewSearchExtension("GL_EXT_paletted_texture", extStart, extEnd); if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_paletted_texture */ #ifdef GL_EXT_pixel_buffer_object GLEW_EXT_pixel_buffer_object = _glewSearchExtension("GL_EXT_pixel_buffer_object", extStart, extEnd); #endif /* GL_EXT_pixel_buffer_object */ #ifdef GL_EXT_pixel_transform GLEW_EXT_pixel_transform = _glewSearchExtension("GL_EXT_pixel_transform", extStart, extEnd); if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_pixel_transform */ #ifdef GL_EXT_pixel_transform_color_table GLEW_EXT_pixel_transform_color_table = _glewSearchExtension("GL_EXT_pixel_transform_color_table", extStart, extEnd); #endif /* GL_EXT_pixel_transform_color_table */ #ifdef GL_EXT_point_parameters GLEW_EXT_point_parameters = _glewSearchExtension("GL_EXT_point_parameters", extStart, extEnd); if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_point_parameters */ #ifdef GL_EXT_polygon_offset GLEW_EXT_polygon_offset = _glewSearchExtension("GL_EXT_polygon_offset", extStart, extEnd); if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_polygon_offset */ #ifdef GL_EXT_polygon_offset_clamp GLEW_EXT_polygon_offset_clamp = _glewSearchExtension("GL_EXT_polygon_offset_clamp", extStart, extEnd); if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_polygon_offset_clamp */ #ifdef GL_EXT_post_depth_coverage GLEW_EXT_post_depth_coverage = _glewSearchExtension("GL_EXT_post_depth_coverage", extStart, extEnd); #endif /* GL_EXT_post_depth_coverage */ #ifdef GL_EXT_provoking_vertex GLEW_EXT_provoking_vertex = _glewSearchExtension("GL_EXT_provoking_vertex", extStart, extEnd); if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_provoking_vertex */ #ifdef GL_EXT_raster_multisample GLEW_EXT_raster_multisample = _glewSearchExtension("GL_EXT_raster_multisample", extStart, extEnd); if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_raster_multisample */ #ifdef GL_EXT_rescale_normal GLEW_EXT_rescale_normal = _glewSearchExtension("GL_EXT_rescale_normal", extStart, extEnd); #endif /* GL_EXT_rescale_normal */ #ifdef GL_EXT_scene_marker GLEW_EXT_scene_marker = _glewSearchExtension("GL_EXT_scene_marker", extStart, extEnd); if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_scene_marker */ #ifdef GL_EXT_secondary_color GLEW_EXT_secondary_color = _glewSearchExtension("GL_EXT_secondary_color", extStart, extEnd); if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_secondary_color */ #ifdef GL_EXT_separate_shader_objects GLEW_EXT_separate_shader_objects = _glewSearchExtension("GL_EXT_separate_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_separate_shader_objects */ #ifdef GL_EXT_separate_specular_color GLEW_EXT_separate_specular_color = _glewSearchExtension("GL_EXT_separate_specular_color", extStart, extEnd); #endif /* GL_EXT_separate_specular_color */ #ifdef GL_EXT_shader_image_load_formatted GLEW_EXT_shader_image_load_formatted = _glewSearchExtension("GL_EXT_shader_image_load_formatted", extStart, extEnd); #endif /* GL_EXT_shader_image_load_formatted */ #ifdef GL_EXT_shader_image_load_store GLEW_EXT_shader_image_load_store = _glewSearchExtension("GL_EXT_shader_image_load_store", extStart, extEnd); if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_shader_image_load_store */ #ifdef GL_EXT_shader_integer_mix GLEW_EXT_shader_integer_mix = _glewSearchExtension("GL_EXT_shader_integer_mix", extStart, extEnd); #endif /* GL_EXT_shader_integer_mix */ #ifdef GL_EXT_shadow_funcs GLEW_EXT_shadow_funcs = _glewSearchExtension("GL_EXT_shadow_funcs", extStart, extEnd); #endif /* GL_EXT_shadow_funcs */ #ifdef GL_EXT_shared_texture_palette GLEW_EXT_shared_texture_palette = _glewSearchExtension("GL_EXT_shared_texture_palette", extStart, extEnd); #endif /* GL_EXT_shared_texture_palette */ #ifdef GL_EXT_sparse_texture2 GLEW_EXT_sparse_texture2 = _glewSearchExtension("GL_EXT_sparse_texture2", extStart, extEnd); #endif /* GL_EXT_sparse_texture2 */ #ifdef GL_EXT_stencil_clear_tag GLEW_EXT_stencil_clear_tag = _glewSearchExtension("GL_EXT_stencil_clear_tag", extStart, extEnd); #endif /* GL_EXT_stencil_clear_tag */ #ifdef GL_EXT_stencil_two_side GLEW_EXT_stencil_two_side = _glewSearchExtension("GL_EXT_stencil_two_side", extStart, extEnd); if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_stencil_two_side */ #ifdef GL_EXT_stencil_wrap GLEW_EXT_stencil_wrap = _glewSearchExtension("GL_EXT_stencil_wrap", extStart, extEnd); #endif /* GL_EXT_stencil_wrap */ #ifdef GL_EXT_subtexture GLEW_EXT_subtexture = _glewSearchExtension("GL_EXT_subtexture", extStart, extEnd); if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_subtexture */ #ifdef GL_EXT_texture GLEW_EXT_texture = _glewSearchExtension("GL_EXT_texture", extStart, extEnd); #endif /* GL_EXT_texture */ #ifdef GL_EXT_texture3D GLEW_EXT_texture3D = _glewSearchExtension("GL_EXT_texture3D", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture3D */ #ifdef GL_EXT_texture_array GLEW_EXT_texture_array = _glewSearchExtension("GL_EXT_texture_array", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_array */ #ifdef GL_EXT_texture_buffer_object GLEW_EXT_texture_buffer_object = _glewSearchExtension("GL_EXT_texture_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_buffer_object */ #ifdef GL_EXT_texture_compression_dxt1 GLEW_EXT_texture_compression_dxt1 = _glewSearchExtension("GL_EXT_texture_compression_dxt1", extStart, extEnd); #endif /* GL_EXT_texture_compression_dxt1 */ #ifdef GL_EXT_texture_compression_latc GLEW_EXT_texture_compression_latc = _glewSearchExtension("GL_EXT_texture_compression_latc", extStart, extEnd); #endif /* GL_EXT_texture_compression_latc */ #ifdef GL_EXT_texture_compression_rgtc GLEW_EXT_texture_compression_rgtc = _glewSearchExtension("GL_EXT_texture_compression_rgtc", extStart, extEnd); #endif /* GL_EXT_texture_compression_rgtc */ #ifdef GL_EXT_texture_compression_s3tc GLEW_EXT_texture_compression_s3tc = _glewSearchExtension("GL_EXT_texture_compression_s3tc", extStart, extEnd); #endif /* GL_EXT_texture_compression_s3tc */ #ifdef GL_EXT_texture_cube_map GLEW_EXT_texture_cube_map = _glewSearchExtension("GL_EXT_texture_cube_map", extStart, extEnd); #endif /* GL_EXT_texture_cube_map */ #ifdef GL_EXT_texture_edge_clamp GLEW_EXT_texture_edge_clamp = _glewSearchExtension("GL_EXT_texture_edge_clamp", extStart, extEnd); #endif /* GL_EXT_texture_edge_clamp */ #ifdef GL_EXT_texture_env GLEW_EXT_texture_env = _glewSearchExtension("GL_EXT_texture_env", extStart, extEnd); #endif /* GL_EXT_texture_env */ #ifdef GL_EXT_texture_env_add GLEW_EXT_texture_env_add = _glewSearchExtension("GL_EXT_texture_env_add", extStart, extEnd); #endif /* GL_EXT_texture_env_add */ #ifdef GL_EXT_texture_env_combine GLEW_EXT_texture_env_combine = _glewSearchExtension("GL_EXT_texture_env_combine", extStart, extEnd); #endif /* GL_EXT_texture_env_combine */ #ifdef GL_EXT_texture_env_dot3 GLEW_EXT_texture_env_dot3 = _glewSearchExtension("GL_EXT_texture_env_dot3", extStart, extEnd); #endif /* GL_EXT_texture_env_dot3 */ #ifdef GL_EXT_texture_filter_anisotropic GLEW_EXT_texture_filter_anisotropic = _glewSearchExtension("GL_EXT_texture_filter_anisotropic", extStart, extEnd); #endif /* GL_EXT_texture_filter_anisotropic */ #ifdef GL_EXT_texture_filter_minmax GLEW_EXT_texture_filter_minmax = _glewSearchExtension("GL_EXT_texture_filter_minmax", extStart, extEnd); #endif /* GL_EXT_texture_filter_minmax */ #ifdef GL_EXT_texture_integer GLEW_EXT_texture_integer = _glewSearchExtension("GL_EXT_texture_integer", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_integer */ #ifdef GL_EXT_texture_lod_bias GLEW_EXT_texture_lod_bias = _glewSearchExtension("GL_EXT_texture_lod_bias", extStart, extEnd); #endif /* GL_EXT_texture_lod_bias */ #ifdef GL_EXT_texture_mirror_clamp GLEW_EXT_texture_mirror_clamp = _glewSearchExtension("GL_EXT_texture_mirror_clamp", extStart, extEnd); #endif /* GL_EXT_texture_mirror_clamp */ #ifdef GL_EXT_texture_object GLEW_EXT_texture_object = _glewSearchExtension("GL_EXT_texture_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_object */ #ifdef GL_EXT_texture_perturb_normal GLEW_EXT_texture_perturb_normal = _glewSearchExtension("GL_EXT_texture_perturb_normal", extStart, extEnd); if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_texture_perturb_normal */ #ifdef GL_EXT_texture_rectangle GLEW_EXT_texture_rectangle = _glewSearchExtension("GL_EXT_texture_rectangle", extStart, extEnd); #endif /* GL_EXT_texture_rectangle */ #ifdef GL_EXT_texture_sRGB GLEW_EXT_texture_sRGB = _glewSearchExtension("GL_EXT_texture_sRGB", extStart, extEnd); #endif /* GL_EXT_texture_sRGB */ #ifdef GL_EXT_texture_sRGB_decode GLEW_EXT_texture_sRGB_decode = _glewSearchExtension("GL_EXT_texture_sRGB_decode", extStart, extEnd); #endif /* GL_EXT_texture_sRGB_decode */ #ifdef GL_EXT_texture_shared_exponent GLEW_EXT_texture_shared_exponent = _glewSearchExtension("GL_EXT_texture_shared_exponent", extStart, extEnd); #endif /* GL_EXT_texture_shared_exponent */ #ifdef GL_EXT_texture_snorm GLEW_EXT_texture_snorm = _glewSearchExtension("GL_EXT_texture_snorm", extStart, extEnd); #endif /* GL_EXT_texture_snorm */ #ifdef GL_EXT_texture_swizzle GLEW_EXT_texture_swizzle = _glewSearchExtension("GL_EXT_texture_swizzle", extStart, extEnd); #endif /* GL_EXT_texture_swizzle */ #ifdef GL_EXT_timer_query GLEW_EXT_timer_query = _glewSearchExtension("GL_EXT_timer_query", extStart, extEnd); if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_timer_query */ #ifdef GL_EXT_transform_feedback GLEW_EXT_transform_feedback = _glewSearchExtension("GL_EXT_transform_feedback", extStart, extEnd); if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_transform_feedback */ #ifdef GL_EXT_vertex_array GLEW_EXT_vertex_array = _glewSearchExtension("GL_EXT_vertex_array", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_array */ #ifdef GL_EXT_vertex_array_bgra GLEW_EXT_vertex_array_bgra = _glewSearchExtension("GL_EXT_vertex_array_bgra", extStart, extEnd); #endif /* GL_EXT_vertex_array_bgra */ #ifdef GL_EXT_vertex_attrib_64bit GLEW_EXT_vertex_attrib_64bit = _glewSearchExtension("GL_EXT_vertex_attrib_64bit", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_attrib_64bit */ #ifdef GL_EXT_vertex_shader GLEW_EXT_vertex_shader = _glewSearchExtension("GL_EXT_vertex_shader", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_shader */ #ifdef GL_EXT_vertex_weighting GLEW_EXT_vertex_weighting = _glewSearchExtension("GL_EXT_vertex_weighting", extStart, extEnd); if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_vertex_weighting */ #ifdef GL_EXT_x11_sync_object GLEW_EXT_x11_sync_object = _glewSearchExtension("GL_EXT_x11_sync_object", extStart, extEnd); if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_EXT_x11_sync_object */ #ifdef GL_GREMEDY_frame_terminator GLEW_GREMEDY_frame_terminator = _glewSearchExtension("GL_GREMEDY_frame_terminator", extStart, extEnd); if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_GREMEDY_frame_terminator */ #ifdef GL_GREMEDY_string_marker GLEW_GREMEDY_string_marker = _glewSearchExtension("GL_GREMEDY_string_marker", extStart, extEnd); if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_GREMEDY_string_marker */ #ifdef GL_HP_convolution_border_modes GLEW_HP_convolution_border_modes = _glewSearchExtension("GL_HP_convolution_border_modes", extStart, extEnd); #endif /* GL_HP_convolution_border_modes */ #ifdef GL_HP_image_transform GLEW_HP_image_transform = _glewSearchExtension("GL_HP_image_transform", extStart, extEnd); if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_HP_image_transform */ #ifdef GL_HP_occlusion_test GLEW_HP_occlusion_test = _glewSearchExtension("GL_HP_occlusion_test", extStart, extEnd); #endif /* GL_HP_occlusion_test */ #ifdef GL_HP_texture_lighting GLEW_HP_texture_lighting = _glewSearchExtension("GL_HP_texture_lighting", extStart, extEnd); #endif /* GL_HP_texture_lighting */ #ifdef GL_IBM_cull_vertex GLEW_IBM_cull_vertex = _glewSearchExtension("GL_IBM_cull_vertex", extStart, extEnd); #endif /* GL_IBM_cull_vertex */ #ifdef GL_IBM_multimode_draw_arrays GLEW_IBM_multimode_draw_arrays = _glewSearchExtension("GL_IBM_multimode_draw_arrays", extStart, extEnd); if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_IBM_multimode_draw_arrays */ #ifdef GL_IBM_rasterpos_clip GLEW_IBM_rasterpos_clip = _glewSearchExtension("GL_IBM_rasterpos_clip", extStart, extEnd); #endif /* GL_IBM_rasterpos_clip */ #ifdef GL_IBM_static_data GLEW_IBM_static_data = _glewSearchExtension("GL_IBM_static_data", extStart, extEnd); #endif /* GL_IBM_static_data */ #ifdef GL_IBM_texture_mirrored_repeat GLEW_IBM_texture_mirrored_repeat = _glewSearchExtension("GL_IBM_texture_mirrored_repeat", extStart, extEnd); #endif /* GL_IBM_texture_mirrored_repeat */ #ifdef GL_IBM_vertex_array_lists GLEW_IBM_vertex_array_lists = _glewSearchExtension("GL_IBM_vertex_array_lists", extStart, extEnd); if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_IBM_vertex_array_lists */ #ifdef GL_INGR_color_clamp GLEW_INGR_color_clamp = _glewSearchExtension("GL_INGR_color_clamp", extStart, extEnd); #endif /* GL_INGR_color_clamp */ #ifdef GL_INGR_interlace_read GLEW_INGR_interlace_read = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd); #endif /* GL_INGR_interlace_read */ #ifdef GL_INTEL_fragment_shader_ordering GLEW_INTEL_fragment_shader_ordering = _glewSearchExtension("GL_INTEL_fragment_shader_ordering", extStart, extEnd); #endif /* GL_INTEL_fragment_shader_ordering */ #ifdef GL_INTEL_framebuffer_CMAA GLEW_INTEL_framebuffer_CMAA = _glewSearchExtension("GL_INTEL_framebuffer_CMAA", extStart, extEnd); #endif /* GL_INTEL_framebuffer_CMAA */ #ifdef GL_INTEL_map_texture GLEW_INTEL_map_texture = _glewSearchExtension("GL_INTEL_map_texture", extStart, extEnd); if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays GLEW_INTEL_parallel_arrays = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd); if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_INTEL_parallel_arrays */ #ifdef GL_INTEL_performance_query GLEW_INTEL_performance_query = _glewSearchExtension("GL_INTEL_performance_query", extStart, extEnd); if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_INTEL_performance_query */ #ifdef GL_INTEL_texture_scissor GLEW_INTEL_texture_scissor = _glewSearchExtension("GL_INTEL_texture_scissor", extStart, extEnd); if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_INTEL_texture_scissor */ #ifdef GL_KHR_blend_equation_advanced GLEW_KHR_blend_equation_advanced = _glewSearchExtension("GL_KHR_blend_equation_advanced", extStart, extEnd); if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_KHR_blend_equation_advanced */ #ifdef GL_KHR_blend_equation_advanced_coherent GLEW_KHR_blend_equation_advanced_coherent = _glewSearchExtension("GL_KHR_blend_equation_advanced_coherent", extStart, extEnd); #endif /* GL_KHR_blend_equation_advanced_coherent */ #ifdef GL_KHR_context_flush_control GLEW_KHR_context_flush_control = _glewSearchExtension("GL_KHR_context_flush_control", extStart, extEnd); #endif /* GL_KHR_context_flush_control */ #ifdef GL_KHR_debug GLEW_KHR_debug = _glewSearchExtension("GL_KHR_debug", extStart, extEnd); if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_KHR_debug */ #ifdef GL_KHR_no_error GLEW_KHR_no_error = _glewSearchExtension("GL_KHR_no_error", extStart, extEnd); #endif /* GL_KHR_no_error */ #ifdef GL_KHR_robust_buffer_access_behavior GLEW_KHR_robust_buffer_access_behavior = _glewSearchExtension("GL_KHR_robust_buffer_access_behavior", extStart, extEnd); #endif /* GL_KHR_robust_buffer_access_behavior */ #ifdef GL_KHR_robustness GLEW_KHR_robustness = _glewSearchExtension("GL_KHR_robustness", extStart, extEnd); if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_KHR_robustness */ #ifdef GL_KHR_texture_compression_astc_hdr GLEW_KHR_texture_compression_astc_hdr = _glewSearchExtension("GL_KHR_texture_compression_astc_hdr", extStart, extEnd); #endif /* GL_KHR_texture_compression_astc_hdr */ #ifdef GL_KHR_texture_compression_astc_ldr GLEW_KHR_texture_compression_astc_ldr = _glewSearchExtension("GL_KHR_texture_compression_astc_ldr", extStart, extEnd); #endif /* GL_KHR_texture_compression_astc_ldr */ #ifdef GL_KTX_buffer_region GLEW_KTX_buffer_region = _glewSearchExtension("GL_KTX_buffer_region", extStart, extEnd); if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_KTX_buffer_region */ #ifdef GL_MESAX_texture_stack GLEW_MESAX_texture_stack = _glewSearchExtension("GL_MESAX_texture_stack", extStart, extEnd); #endif /* GL_MESAX_texture_stack */ #ifdef GL_MESA_pack_invert GLEW_MESA_pack_invert = _glewSearchExtension("GL_MESA_pack_invert", extStart, extEnd); #endif /* GL_MESA_pack_invert */ #ifdef GL_MESA_resize_buffers GLEW_MESA_resize_buffers = _glewSearchExtension("GL_MESA_resize_buffers", extStart, extEnd); if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_MESA_resize_buffers */ #ifdef GL_MESA_window_pos GLEW_MESA_window_pos = _glewSearchExtension("GL_MESA_window_pos", extStart, extEnd); if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_MESA_window_pos */ #ifdef GL_MESA_ycbcr_texture GLEW_MESA_ycbcr_texture = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd); #endif /* GL_MESA_ycbcr_texture */ #ifdef GL_NVX_conditional_render GLEW_NVX_conditional_render = _glewSearchExtension("GL_NVX_conditional_render", extStart, extEnd); if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NVX_conditional_render */ #ifdef GL_NVX_gpu_memory_info GLEW_NVX_gpu_memory_info = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd); #endif /* GL_NVX_gpu_memory_info */ #ifdef GL_NV_bindless_multi_draw_indirect GLEW_NV_bindless_multi_draw_indirect = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_multi_draw_indirect_count GLEW_NV_bindless_multi_draw_indirect_count = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect_count", extStart, extEnd); if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_bindless_multi_draw_indirect_count */ #ifdef GL_NV_bindless_texture GLEW_NV_bindless_texture = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd); if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_bindless_texture */ #ifdef GL_NV_blend_equation_advanced GLEW_NV_blend_equation_advanced = _glewSearchExtension("GL_NV_blend_equation_advanced", extStart, extEnd); if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_blend_equation_advanced */ #ifdef GL_NV_blend_equation_advanced_coherent GLEW_NV_blend_equation_advanced_coherent = _glewSearchExtension("GL_NV_blend_equation_advanced_coherent", extStart, extEnd); #endif /* GL_NV_blend_equation_advanced_coherent */ #ifdef GL_NV_blend_square GLEW_NV_blend_square = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd); #endif /* GL_NV_blend_square */ #ifdef GL_NV_compute_program5 GLEW_NV_compute_program5 = _glewSearchExtension("GL_NV_compute_program5", extStart, extEnd); #endif /* GL_NV_compute_program5 */ #ifdef GL_NV_conditional_render GLEW_NV_conditional_render = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd); if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_conditional_render */ #ifdef GL_NV_conservative_raster GLEW_NV_conservative_raster = _glewSearchExtension("GL_NV_conservative_raster", extStart, extEnd); if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_conservative_raster */ #ifdef GL_NV_conservative_raster_dilate GLEW_NV_conservative_raster_dilate = _glewSearchExtension("GL_NV_conservative_raster_dilate", extStart, extEnd); if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_conservative_raster_dilate */ #ifdef GL_NV_copy_depth_to_color GLEW_NV_copy_depth_to_color = _glewSearchExtension("GL_NV_copy_depth_to_color", extStart, extEnd); #endif /* GL_NV_copy_depth_to_color */ #ifdef GL_NV_copy_image GLEW_NV_copy_image = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd); if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_copy_image */ #ifdef GL_NV_deep_texture3D GLEW_NV_deep_texture3D = _glewSearchExtension("GL_NV_deep_texture3D", extStart, extEnd); #endif /* GL_NV_deep_texture3D */ #ifdef GL_NV_depth_buffer_float GLEW_NV_depth_buffer_float = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_depth_buffer_float */ #ifdef GL_NV_depth_clamp GLEW_NV_depth_clamp = _glewSearchExtension("GL_NV_depth_clamp", extStart, extEnd); #endif /* GL_NV_depth_clamp */ #ifdef GL_NV_depth_range_unclamped GLEW_NV_depth_range_unclamped = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd); #endif /* GL_NV_depth_range_unclamped */ #ifdef GL_NV_draw_texture GLEW_NV_draw_texture = _glewSearchExtension("GL_NV_draw_texture", extStart, extEnd); if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_draw_texture */ #ifdef GL_NV_evaluators GLEW_NV_evaluators = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd); if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_evaluators */ #ifdef GL_NV_explicit_multisample GLEW_NV_explicit_multisample = _glewSearchExtension("GL_NV_explicit_multisample", extStart, extEnd); if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_explicit_multisample */ #ifdef GL_NV_fence GLEW_NV_fence = _glewSearchExtension("GL_NV_fence", extStart, extEnd); if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_fence */ #ifdef GL_NV_fill_rectangle GLEW_NV_fill_rectangle = _glewSearchExtension("GL_NV_fill_rectangle", extStart, extEnd); #endif /* GL_NV_fill_rectangle */ #ifdef GL_NV_float_buffer GLEW_NV_float_buffer = _glewSearchExtension("GL_NV_float_buffer", extStart, extEnd); #endif /* GL_NV_float_buffer */ #ifdef GL_NV_fog_distance GLEW_NV_fog_distance = _glewSearchExtension("GL_NV_fog_distance", extStart, extEnd); #endif /* GL_NV_fog_distance */ #ifdef GL_NV_fragment_coverage_to_color GLEW_NV_fragment_coverage_to_color = _glewSearchExtension("GL_NV_fragment_coverage_to_color", extStart, extEnd); if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_fragment_coverage_to_color */ #ifdef GL_NV_fragment_program GLEW_NV_fragment_program = _glewSearchExtension("GL_NV_fragment_program", extStart, extEnd); if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_fragment_program */ #ifdef GL_NV_fragment_program2 GLEW_NV_fragment_program2 = _glewSearchExtension("GL_NV_fragment_program2", extStart, extEnd); #endif /* GL_NV_fragment_program2 */ #ifdef GL_NV_fragment_program4 GLEW_NV_fragment_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); #endif /* GL_NV_fragment_program4 */ #ifdef GL_NV_fragment_program_option GLEW_NV_fragment_program_option = _glewSearchExtension("GL_NV_fragment_program_option", extStart, extEnd); #endif /* GL_NV_fragment_program_option */ #ifdef GL_NV_fragment_shader_interlock GLEW_NV_fragment_shader_interlock = _glewSearchExtension("GL_NV_fragment_shader_interlock", extStart, extEnd); #endif /* GL_NV_fragment_shader_interlock */ #ifdef GL_NV_framebuffer_mixed_samples GLEW_NV_framebuffer_mixed_samples = _glewSearchExtension("GL_NV_framebuffer_mixed_samples", extStart, extEnd); #endif /* GL_NV_framebuffer_mixed_samples */ #ifdef GL_NV_framebuffer_multisample_coverage GLEW_NV_framebuffer_multisample_coverage = _glewSearchExtension("GL_NV_framebuffer_multisample_coverage", extStart, extEnd); if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_framebuffer_multisample_coverage */ #ifdef GL_NV_geometry_program4 GLEW_NV_geometry_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_geometry_program4 */ #ifdef GL_NV_geometry_shader4 GLEW_NV_geometry_shader4 = _glewSearchExtension("GL_NV_geometry_shader4", extStart, extEnd); #endif /* GL_NV_geometry_shader4 */ #ifdef GL_NV_geometry_shader_passthrough GLEW_NV_geometry_shader_passthrough = _glewSearchExtension("GL_NV_geometry_shader_passthrough", extStart, extEnd); #endif /* GL_NV_geometry_shader_passthrough */ #ifdef GL_NV_gpu_program4 GLEW_NV_gpu_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_gpu_program4 */ #ifdef GL_NV_gpu_program5 GLEW_NV_gpu_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_gpu_program5 */ #ifdef GL_NV_gpu_program5_mem_extended GLEW_NV_gpu_program5_mem_extended = _glewSearchExtension("GL_NV_gpu_program5_mem_extended", extStart, extEnd); #endif /* GL_NV_gpu_program5_mem_extended */ #ifdef GL_NV_gpu_program_fp64 GLEW_NV_gpu_program_fp64 = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd); #endif /* GL_NV_gpu_program_fp64 */ #ifdef GL_NV_gpu_shader5 GLEW_NV_gpu_shader5 = _glewSearchExtension("GL_NV_gpu_shader5", extStart, extEnd); if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_gpu_shader5 */ #ifdef GL_NV_half_float GLEW_NV_half_float = _glewSearchExtension("GL_NV_half_float", extStart, extEnd); if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_half_float */ #ifdef GL_NV_internalformat_sample_query GLEW_NV_internalformat_sample_query = _glewSearchExtension("GL_NV_internalformat_sample_query", extStart, extEnd); if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_internalformat_sample_query */ #ifdef GL_NV_light_max_exponent GLEW_NV_light_max_exponent = _glewSearchExtension("GL_NV_light_max_exponent", extStart, extEnd); #endif /* GL_NV_light_max_exponent */ #ifdef GL_NV_multisample_coverage GLEW_NV_multisample_coverage = _glewSearchExtension("GL_NV_multisample_coverage", extStart, extEnd); #endif /* GL_NV_multisample_coverage */ #ifdef GL_NV_multisample_filter_hint GLEW_NV_multisample_filter_hint = _glewSearchExtension("GL_NV_multisample_filter_hint", extStart, extEnd); #endif /* GL_NV_multisample_filter_hint */ #ifdef GL_NV_occlusion_query GLEW_NV_occlusion_query = _glewSearchExtension("GL_NV_occlusion_query", extStart, extEnd); if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_occlusion_query */ #ifdef GL_NV_packed_depth_stencil GLEW_NV_packed_depth_stencil = _glewSearchExtension("GL_NV_packed_depth_stencil", extStart, extEnd); #endif /* GL_NV_packed_depth_stencil */ #ifdef GL_NV_parameter_buffer_object GLEW_NV_parameter_buffer_object = _glewSearchExtension("GL_NV_parameter_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_parameter_buffer_object */ #ifdef GL_NV_parameter_buffer_object2 GLEW_NV_parameter_buffer_object2 = _glewSearchExtension("GL_NV_parameter_buffer_object2", extStart, extEnd); #endif /* GL_NV_parameter_buffer_object2 */ #ifdef GL_NV_path_rendering GLEW_NV_path_rendering = _glewSearchExtension("GL_NV_path_rendering", extStart, extEnd); if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_path_rendering */ #ifdef GL_NV_path_rendering_shared_edge GLEW_NV_path_rendering_shared_edge = _glewSearchExtension("GL_NV_path_rendering_shared_edge", extStart, extEnd); #endif /* GL_NV_path_rendering_shared_edge */ #ifdef GL_NV_pixel_data_range GLEW_NV_pixel_data_range = _glewSearchExtension("GL_NV_pixel_data_range", extStart, extEnd); if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_pixel_data_range */ #ifdef GL_NV_point_sprite GLEW_NV_point_sprite = _glewSearchExtension("GL_NV_point_sprite", extStart, extEnd); if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_point_sprite */ #ifdef GL_NV_present_video GLEW_NV_present_video = _glewSearchExtension("GL_NV_present_video", extStart, extEnd); if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_present_video */ #ifdef GL_NV_primitive_restart GLEW_NV_primitive_restart = _glewSearchExtension("GL_NV_primitive_restart", extStart, extEnd); if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_primitive_restart */ #ifdef GL_NV_register_combiners GLEW_NV_register_combiners = _glewSearchExtension("GL_NV_register_combiners", extStart, extEnd); if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_register_combiners */ #ifdef GL_NV_register_combiners2 GLEW_NV_register_combiners2 = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd); if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_register_combiners2 */ #ifdef GL_NV_sample_locations GLEW_NV_sample_locations = _glewSearchExtension("GL_NV_sample_locations", extStart, extEnd); if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_sample_locations */ #ifdef GL_NV_sample_mask_override_coverage GLEW_NV_sample_mask_override_coverage = _glewSearchExtension("GL_NV_sample_mask_override_coverage", extStart, extEnd); #endif /* GL_NV_sample_mask_override_coverage */ #ifdef GL_NV_shader_atomic_counters GLEW_NV_shader_atomic_counters = _glewSearchExtension("GL_NV_shader_atomic_counters", extStart, extEnd); #endif /* GL_NV_shader_atomic_counters */ #ifdef GL_NV_shader_atomic_float GLEW_NV_shader_atomic_float = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd); #endif /* GL_NV_shader_atomic_float */ #ifdef GL_NV_shader_atomic_fp16_vector GLEW_NV_shader_atomic_fp16_vector = _glewSearchExtension("GL_NV_shader_atomic_fp16_vector", extStart, extEnd); #endif /* GL_NV_shader_atomic_fp16_vector */ #ifdef GL_NV_shader_atomic_int64 GLEW_NV_shader_atomic_int64 = _glewSearchExtension("GL_NV_shader_atomic_int64", extStart, extEnd); #endif /* GL_NV_shader_atomic_int64 */ #ifdef GL_NV_shader_buffer_load GLEW_NV_shader_buffer_load = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd); if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_shader_buffer_load */ #ifdef GL_NV_shader_storage_buffer_object GLEW_NV_shader_storage_buffer_object = _glewSearchExtension("GL_NV_shader_storage_buffer_object", extStart, extEnd); #endif /* GL_NV_shader_storage_buffer_object */ #ifdef GL_NV_shader_thread_group GLEW_NV_shader_thread_group = _glewSearchExtension("GL_NV_shader_thread_group", extStart, extEnd); #endif /* GL_NV_shader_thread_group */ #ifdef GL_NV_shader_thread_shuffle GLEW_NV_shader_thread_shuffle = _glewSearchExtension("GL_NV_shader_thread_shuffle", extStart, extEnd); #endif /* GL_NV_shader_thread_shuffle */ #ifdef GL_NV_tessellation_program5 GLEW_NV_tessellation_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_tessellation_program5 */ #ifdef GL_NV_texgen_emboss GLEW_NV_texgen_emboss = _glewSearchExtension("GL_NV_texgen_emboss", extStart, extEnd); #endif /* GL_NV_texgen_emboss */ #ifdef GL_NV_texgen_reflection GLEW_NV_texgen_reflection = _glewSearchExtension("GL_NV_texgen_reflection", extStart, extEnd); #endif /* GL_NV_texgen_reflection */ #ifdef GL_NV_texture_barrier GLEW_NV_texture_barrier = _glewSearchExtension("GL_NV_texture_barrier", extStart, extEnd); if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_texture_barrier */ #ifdef GL_NV_texture_compression_vtc GLEW_NV_texture_compression_vtc = _glewSearchExtension("GL_NV_texture_compression_vtc", extStart, extEnd); #endif /* GL_NV_texture_compression_vtc */ #ifdef GL_NV_texture_env_combine4 GLEW_NV_texture_env_combine4 = _glewSearchExtension("GL_NV_texture_env_combine4", extStart, extEnd); #endif /* GL_NV_texture_env_combine4 */ #ifdef GL_NV_texture_expand_normal GLEW_NV_texture_expand_normal = _glewSearchExtension("GL_NV_texture_expand_normal", extStart, extEnd); #endif /* GL_NV_texture_expand_normal */ #ifdef GL_NV_texture_multisample GLEW_NV_texture_multisample = _glewSearchExtension("GL_NV_texture_multisample", extStart, extEnd); if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_texture_multisample */ #ifdef GL_NV_texture_rectangle GLEW_NV_texture_rectangle = _glewSearchExtension("GL_NV_texture_rectangle", extStart, extEnd); #endif /* GL_NV_texture_rectangle */ #ifdef GL_NV_texture_shader GLEW_NV_texture_shader = _glewSearchExtension("GL_NV_texture_shader", extStart, extEnd); #endif /* GL_NV_texture_shader */ #ifdef GL_NV_texture_shader2 GLEW_NV_texture_shader2 = _glewSearchExtension("GL_NV_texture_shader2", extStart, extEnd); #endif /* GL_NV_texture_shader2 */ #ifdef GL_NV_texture_shader3 GLEW_NV_texture_shader3 = _glewSearchExtension("GL_NV_texture_shader3", extStart, extEnd); #endif /* GL_NV_texture_shader3 */ #ifdef GL_NV_transform_feedback GLEW_NV_transform_feedback = _glewSearchExtension("GL_NV_transform_feedback", extStart, extEnd); if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_transform_feedback */ #ifdef GL_NV_transform_feedback2 GLEW_NV_transform_feedback2 = _glewSearchExtension("GL_NV_transform_feedback2", extStart, extEnd); if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_transform_feedback2 */ #ifdef GL_NV_uniform_buffer_unified_memory GLEW_NV_uniform_buffer_unified_memory = _glewSearchExtension("GL_NV_uniform_buffer_unified_memory", extStart, extEnd); #endif /* GL_NV_uniform_buffer_unified_memory */ #ifdef GL_NV_vdpau_interop GLEW_NV_vdpau_interop = _glewSearchExtension("GL_NV_vdpau_interop", extStart, extEnd); if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vdpau_interop */ #ifdef GL_NV_vertex_array_range GLEW_NV_vertex_array_range = _glewSearchExtension("GL_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_array_range */ #ifdef GL_NV_vertex_array_range2 GLEW_NV_vertex_array_range2 = _glewSearchExtension("GL_NV_vertex_array_range2", extStart, extEnd); #endif /* GL_NV_vertex_array_range2 */ #ifdef GL_NV_vertex_attrib_integer_64bit GLEW_NV_vertex_attrib_integer_64bit = _glewSearchExtension("GL_NV_vertex_attrib_integer_64bit", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifdef GL_NV_vertex_buffer_unified_memory GLEW_NV_vertex_buffer_unified_memory = _glewSearchExtension("GL_NV_vertex_buffer_unified_memory", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_buffer_unified_memory */ #ifdef GL_NV_vertex_program GLEW_NV_vertex_program = _glewSearchExtension("GL_NV_vertex_program", extStart, extEnd); if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_vertex_program */ #ifdef GL_NV_vertex_program1_1 GLEW_NV_vertex_program1_1 = _glewSearchExtension("GL_NV_vertex_program1_1", extStart, extEnd); #endif /* GL_NV_vertex_program1_1 */ #ifdef GL_NV_vertex_program2 GLEW_NV_vertex_program2 = _glewSearchExtension("GL_NV_vertex_program2", extStart, extEnd); #endif /* GL_NV_vertex_program2 */ #ifdef GL_NV_vertex_program2_option GLEW_NV_vertex_program2_option = _glewSearchExtension("GL_NV_vertex_program2_option", extStart, extEnd); #endif /* GL_NV_vertex_program2_option */ #ifdef GL_NV_vertex_program3 GLEW_NV_vertex_program3 = _glewSearchExtension("GL_NV_vertex_program3", extStart, extEnd); #endif /* GL_NV_vertex_program3 */ #ifdef GL_NV_vertex_program4 GLEW_NV_vertex_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); #endif /* GL_NV_vertex_program4 */ #ifdef GL_NV_video_capture GLEW_NV_video_capture = _glewSearchExtension("GL_NV_video_capture", extStart, extEnd); if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_video_capture */ #ifdef GL_NV_viewport_array2 GLEW_NV_viewport_array2 = _glewSearchExtension("GL_NV_viewport_array2", extStart, extEnd); #endif /* GL_NV_viewport_array2 */ #ifdef GL_OES_byte_coordinates GLEW_OES_byte_coordinates = _glewSearchExtension("GL_OES_byte_coordinates", extStart, extEnd); #endif /* GL_OES_byte_coordinates */ #ifdef GL_OES_compressed_paletted_texture GLEW_OES_compressed_paletted_texture = _glewSearchExtension("GL_OES_compressed_paletted_texture", extStart, extEnd); #endif /* GL_OES_compressed_paletted_texture */ #ifdef GL_OES_read_format GLEW_OES_read_format = _glewSearchExtension("GL_OES_read_format", extStart, extEnd); #endif /* GL_OES_read_format */ #ifdef GL_OES_single_precision GLEW_OES_single_precision = _glewSearchExtension("GL_OES_single_precision", extStart, extEnd); if (glewExperimental || GLEW_OES_single_precision) GLEW_OES_single_precision = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_OES_single_precision */ #ifdef GL_OML_interlace GLEW_OML_interlace = _glewSearchExtension("GL_OML_interlace", extStart, extEnd); #endif /* GL_OML_interlace */ #ifdef GL_OML_resample GLEW_OML_resample = _glewSearchExtension("GL_OML_resample", extStart, extEnd); #endif /* GL_OML_resample */ #ifdef GL_OML_subsample GLEW_OML_subsample = _glewSearchExtension("GL_OML_subsample", extStart, extEnd); #endif /* GL_OML_subsample */ #ifdef GL_OVR_multiview GLEW_OVR_multiview = _glewSearchExtension("GL_OVR_multiview", extStart, extEnd); if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_OVR_multiview */ #ifdef GL_OVR_multiview2 GLEW_OVR_multiview2 = _glewSearchExtension("GL_OVR_multiview2", extStart, extEnd); #endif /* GL_OVR_multiview2 */ #ifdef GL_PGI_misc_hints GLEW_PGI_misc_hints = _glewSearchExtension("GL_PGI_misc_hints", extStart, extEnd); #endif /* GL_PGI_misc_hints */ #ifdef GL_PGI_vertex_hints GLEW_PGI_vertex_hints = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd); #endif /* GL_PGI_vertex_hints */ #ifdef GL_REGAL_ES1_0_compatibility GLEW_REGAL_ES1_0_compatibility = _glewSearchExtension("GL_REGAL_ES1_0_compatibility", extStart, extEnd); if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_ES1_0_compatibility */ #ifdef GL_REGAL_ES1_1_compatibility GLEW_REGAL_ES1_1_compatibility = _glewSearchExtension("GL_REGAL_ES1_1_compatibility", extStart, extEnd); if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_ES1_1_compatibility */ #ifdef GL_REGAL_enable GLEW_REGAL_enable = _glewSearchExtension("GL_REGAL_enable", extStart, extEnd); #endif /* GL_REGAL_enable */ #ifdef GL_REGAL_error_string GLEW_REGAL_error_string = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd); if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_error_string */ #ifdef GL_REGAL_extension_query GLEW_REGAL_extension_query = _glewSearchExtension("GL_REGAL_extension_query", extStart, extEnd); if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log GLEW_REGAL_log = _glewSearchExtension("GL_REGAL_log", extStart, extEnd); if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_log */ #ifdef GL_REGAL_proc_address GLEW_REGAL_proc_address = _glewSearchExtension("GL_REGAL_proc_address", extStart, extEnd); if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_proc_address */ #ifdef GL_REND_screen_coordinates GLEW_REND_screen_coordinates = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd); #endif /* GL_REND_screen_coordinates */ #ifdef GL_S3_s3tc GLEW_S3_s3tc = _glewSearchExtension("GL_S3_s3tc", extStart, extEnd); #endif /* GL_S3_s3tc */ #ifdef GL_SGIS_color_range GLEW_SGIS_color_range = _glewSearchExtension("GL_SGIS_color_range", extStart, extEnd); #endif /* GL_SGIS_color_range */ #ifdef GL_SGIS_detail_texture GLEW_SGIS_detail_texture = _glewSearchExtension("GL_SGIS_detail_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_detail_texture */ #ifdef GL_SGIS_fog_function GLEW_SGIS_fog_function = _glewSearchExtension("GL_SGIS_fog_function", extStart, extEnd); if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_fog_function */ #ifdef GL_SGIS_generate_mipmap GLEW_SGIS_generate_mipmap = _glewSearchExtension("GL_SGIS_generate_mipmap", extStart, extEnd); #endif /* GL_SGIS_generate_mipmap */ #ifdef GL_SGIS_multisample GLEW_SGIS_multisample = _glewSearchExtension("GL_SGIS_multisample", extStart, extEnd); if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_multisample */ #ifdef GL_SGIS_pixel_texture GLEW_SGIS_pixel_texture = _glewSearchExtension("GL_SGIS_pixel_texture", extStart, extEnd); #endif /* GL_SGIS_pixel_texture */ #ifdef GL_SGIS_point_line_texgen GLEW_SGIS_point_line_texgen = _glewSearchExtension("GL_SGIS_point_line_texgen", extStart, extEnd); #endif /* GL_SGIS_point_line_texgen */ #ifdef GL_SGIS_sharpen_texture GLEW_SGIS_sharpen_texture = _glewSearchExtension("GL_SGIS_sharpen_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_sharpen_texture */ #ifdef GL_SGIS_texture4D GLEW_SGIS_texture4D = _glewSearchExtension("GL_SGIS_texture4D", extStart, extEnd); if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_texture4D */ #ifdef GL_SGIS_texture_border_clamp GLEW_SGIS_texture_border_clamp = _glewSearchExtension("GL_SGIS_texture_border_clamp", extStart, extEnd); #endif /* GL_SGIS_texture_border_clamp */ #ifdef GL_SGIS_texture_edge_clamp GLEW_SGIS_texture_edge_clamp = _glewSearchExtension("GL_SGIS_texture_edge_clamp", extStart, extEnd); #endif /* GL_SGIS_texture_edge_clamp */ #ifdef GL_SGIS_texture_filter4 GLEW_SGIS_texture_filter4 = _glewSearchExtension("GL_SGIS_texture_filter4", extStart, extEnd); if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIS_texture_filter4 */ #ifdef GL_SGIS_texture_lod GLEW_SGIS_texture_lod = _glewSearchExtension("GL_SGIS_texture_lod", extStart, extEnd); #endif /* GL_SGIS_texture_lod */ #ifdef GL_SGIS_texture_select GLEW_SGIS_texture_select = _glewSearchExtension("GL_SGIS_texture_select", extStart, extEnd); #endif /* GL_SGIS_texture_select */ #ifdef GL_SGIX_async GLEW_SGIX_async = _glewSearchExtension("GL_SGIX_async", extStart, extEnd); if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_async */ #ifdef GL_SGIX_async_histogram GLEW_SGIX_async_histogram = _glewSearchExtension("GL_SGIX_async_histogram", extStart, extEnd); #endif /* GL_SGIX_async_histogram */ #ifdef GL_SGIX_async_pixel GLEW_SGIX_async_pixel = _glewSearchExtension("GL_SGIX_async_pixel", extStart, extEnd); #endif /* GL_SGIX_async_pixel */ #ifdef GL_SGIX_blend_alpha_minmax GLEW_SGIX_blend_alpha_minmax = _glewSearchExtension("GL_SGIX_blend_alpha_minmax", extStart, extEnd); #endif /* GL_SGIX_blend_alpha_minmax */ #ifdef GL_SGIX_clipmap GLEW_SGIX_clipmap = _glewSearchExtension("GL_SGIX_clipmap", extStart, extEnd); #endif /* GL_SGIX_clipmap */ #ifdef GL_SGIX_convolution_accuracy GLEW_SGIX_convolution_accuracy = _glewSearchExtension("GL_SGIX_convolution_accuracy", extStart, extEnd); #endif /* GL_SGIX_convolution_accuracy */ #ifdef GL_SGIX_depth_texture GLEW_SGIX_depth_texture = _glewSearchExtension("GL_SGIX_depth_texture", extStart, extEnd); #endif /* GL_SGIX_depth_texture */ #ifdef GL_SGIX_flush_raster GLEW_SGIX_flush_raster = _glewSearchExtension("GL_SGIX_flush_raster", extStart, extEnd); if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_flush_raster */ #ifdef GL_SGIX_fog_offset GLEW_SGIX_fog_offset = _glewSearchExtension("GL_SGIX_fog_offset", extStart, extEnd); #endif /* GL_SGIX_fog_offset */ #ifdef GL_SGIX_fog_texture GLEW_SGIX_fog_texture = _glewSearchExtension("GL_SGIX_fog_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_fog_texture */ #ifdef GL_SGIX_fragment_specular_lighting GLEW_SGIX_fragment_specular_lighting = _glewSearchExtension("GL_SGIX_fragment_specular_lighting", extStart, extEnd); if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_fragment_specular_lighting */ #ifdef GL_SGIX_framezoom GLEW_SGIX_framezoom = _glewSearchExtension("GL_SGIX_framezoom", extStart, extEnd); if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_framezoom */ #ifdef GL_SGIX_interlace GLEW_SGIX_interlace = _glewSearchExtension("GL_SGIX_interlace", extStart, extEnd); #endif /* GL_SGIX_interlace */ #ifdef GL_SGIX_ir_instrument1 GLEW_SGIX_ir_instrument1 = _glewSearchExtension("GL_SGIX_ir_instrument1", extStart, extEnd); #endif /* GL_SGIX_ir_instrument1 */ #ifdef GL_SGIX_list_priority GLEW_SGIX_list_priority = _glewSearchExtension("GL_SGIX_list_priority", extStart, extEnd); #endif /* GL_SGIX_list_priority */ #ifdef GL_SGIX_pixel_texture GLEW_SGIX_pixel_texture = _glewSearchExtension("GL_SGIX_pixel_texture", extStart, extEnd); if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_pixel_texture */ #ifdef GL_SGIX_pixel_texture_bits GLEW_SGIX_pixel_texture_bits = _glewSearchExtension("GL_SGIX_pixel_texture_bits", extStart, extEnd); #endif /* GL_SGIX_pixel_texture_bits */ #ifdef GL_SGIX_reference_plane GLEW_SGIX_reference_plane = _glewSearchExtension("GL_SGIX_reference_plane", extStart, extEnd); if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_reference_plane */ #ifdef GL_SGIX_resample GLEW_SGIX_resample = _glewSearchExtension("GL_SGIX_resample", extStart, extEnd); #endif /* GL_SGIX_resample */ #ifdef GL_SGIX_shadow GLEW_SGIX_shadow = _glewSearchExtension("GL_SGIX_shadow", extStart, extEnd); #endif /* GL_SGIX_shadow */ #ifdef GL_SGIX_shadow_ambient GLEW_SGIX_shadow_ambient = _glewSearchExtension("GL_SGIX_shadow_ambient", extStart, extEnd); #endif /* GL_SGIX_shadow_ambient */ #ifdef GL_SGIX_sprite GLEW_SGIX_sprite = _glewSearchExtension("GL_SGIX_sprite", extStart, extEnd); if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_sprite */ #ifdef GL_SGIX_tag_sample_buffer GLEW_SGIX_tag_sample_buffer = _glewSearchExtension("GL_SGIX_tag_sample_buffer", extStart, extEnd); if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGIX_tag_sample_buffer */ #ifdef GL_SGIX_texture_add_env GLEW_SGIX_texture_add_env = _glewSearchExtension("GL_SGIX_texture_add_env", extStart, extEnd); #endif /* GL_SGIX_texture_add_env */ #ifdef GL_SGIX_texture_coordinate_clamp GLEW_SGIX_texture_coordinate_clamp = _glewSearchExtension("GL_SGIX_texture_coordinate_clamp", extStart, extEnd); #endif /* GL_SGIX_texture_coordinate_clamp */ #ifdef GL_SGIX_texture_lod_bias GLEW_SGIX_texture_lod_bias = _glewSearchExtension("GL_SGIX_texture_lod_bias", extStart, extEnd); #endif /* GL_SGIX_texture_lod_bias */ #ifdef GL_SGIX_texture_multi_buffer GLEW_SGIX_texture_multi_buffer = _glewSearchExtension("GL_SGIX_texture_multi_buffer", extStart, extEnd); #endif /* GL_SGIX_texture_multi_buffer */ #ifdef GL_SGIX_texture_range GLEW_SGIX_texture_range = _glewSearchExtension("GL_SGIX_texture_range", extStart, extEnd); #endif /* GL_SGIX_texture_range */ #ifdef GL_SGIX_texture_scale_bias GLEW_SGIX_texture_scale_bias = _glewSearchExtension("GL_SGIX_texture_scale_bias", extStart, extEnd); #endif /* GL_SGIX_texture_scale_bias */ #ifdef GL_SGIX_vertex_preclip GLEW_SGIX_vertex_preclip = _glewSearchExtension("GL_SGIX_vertex_preclip", extStart, extEnd); #endif /* GL_SGIX_vertex_preclip */ #ifdef GL_SGIX_vertex_preclip_hint GLEW_SGIX_vertex_preclip_hint = _glewSearchExtension("GL_SGIX_vertex_preclip_hint", extStart, extEnd); #endif /* GL_SGIX_vertex_preclip_hint */ #ifdef GL_SGIX_ycrcb GLEW_SGIX_ycrcb = _glewSearchExtension("GL_SGIX_ycrcb", extStart, extEnd); #endif /* GL_SGIX_ycrcb */ #ifdef GL_SGI_color_matrix GLEW_SGI_color_matrix = _glewSearchExtension("GL_SGI_color_matrix", extStart, extEnd); #endif /* GL_SGI_color_matrix */ #ifdef GL_SGI_color_table GLEW_SGI_color_table = _glewSearchExtension("GL_SGI_color_table", extStart, extEnd); if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SGI_color_table */ #ifdef GL_SGI_texture_color_table GLEW_SGI_texture_color_table = _glewSearchExtension("GL_SGI_texture_color_table", extStart, extEnd); #endif /* GL_SGI_texture_color_table */ #ifdef GL_SUNX_constant_data GLEW_SUNX_constant_data = _glewSearchExtension("GL_SUNX_constant_data", extStart, extEnd); if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUNX_constant_data */ #ifdef GL_SUN_convolution_border_modes GLEW_SUN_convolution_border_modes = _glewSearchExtension("GL_SUN_convolution_border_modes", extStart, extEnd); #endif /* GL_SUN_convolution_border_modes */ #ifdef GL_SUN_global_alpha GLEW_SUN_global_alpha = _glewSearchExtension("GL_SUN_global_alpha", extStart, extEnd); if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_global_alpha */ #ifdef GL_SUN_mesh_array GLEW_SUN_mesh_array = _glewSearchExtension("GL_SUN_mesh_array", extStart, extEnd); #endif /* GL_SUN_mesh_array */ #ifdef GL_SUN_read_video_pixels GLEW_SUN_read_video_pixels = _glewSearchExtension("GL_SUN_read_video_pixels", extStart, extEnd); if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_read_video_pixels */ #ifdef GL_SUN_slice_accum GLEW_SUN_slice_accum = _glewSearchExtension("GL_SUN_slice_accum", extStart, extEnd); #endif /* GL_SUN_slice_accum */ #ifdef GL_SUN_triangle_list GLEW_SUN_triangle_list = _glewSearchExtension("GL_SUN_triangle_list", extStart, extEnd); if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_triangle_list */ #ifdef GL_SUN_vertex GLEW_SUN_vertex = _glewSearchExtension("GL_SUN_vertex", extStart, extEnd); if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_SUN_vertex */ #ifdef GL_WIN_phong_shading GLEW_WIN_phong_shading = _glewSearchExtension("GL_WIN_phong_shading", extStart, extEnd); #endif /* GL_WIN_phong_shading */ #ifdef GL_WIN_specular_fog GLEW_WIN_specular_fog = _glewSearchExtension("GL_WIN_specular_fog", extStart, extEnd); #endif /* GL_WIN_specular_fog */ #ifdef GL_WIN_swap_hint GLEW_WIN_swap_hint = _glewSearchExtension("GL_WIN_swap_hint", extStart, extEnd); if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_WIN_swap_hint */ return GLEW_OK; } #if defined(_WIN32) #if !defined(GLEW_MX) PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; GLboolean __WGLEW_3DFX_multisample = GL_FALSE; GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; GLboolean __WGLEW_ARB_create_context = GL_FALSE; GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; GLboolean __WGLEW_ARB_multisample = GL_FALSE; GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ARB_render_texture = GL_FALSE; GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __WGLEW_EXT_depth_float = GL_FALSE; GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; GLboolean __WGLEW_EXT_multisample = GL_FALSE; GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; GLboolean __WGLEW_EXT_swap_control = GL_FALSE; GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; GLboolean __WGLEW_I3D_gamma = GL_FALSE; GLboolean __WGLEW_I3D_genlock = GL_FALSE; GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; GLboolean __WGLEW_NV_DX_interop = GL_FALSE; GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; GLboolean __WGLEW_NV_copy_image = GL_FALSE; GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; GLboolean __WGLEW_NV_float_buffer = GL_FALSE; GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; GLboolean __WGLEW_NV_present_video = GL_FALSE; GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_NV_swap_group = GL_FALSE; GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; GLboolean __WGLEW_NV_video_capture = GL_FALSE; GLboolean __WGLEW_NV_video_output = GL_FALSE; GLboolean __WGLEW_OML_sync_control = GL_FALSE; #endif /* !GLEW_MX */ #ifdef WGL_3DL_stereo_control static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; return r; } #endif /* WGL_3DL_stereo_control */ #ifdef WGL_AMD_gpu_association static GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; return r; } #endif /* WGL_AMD_gpu_association */ #ifdef WGL_ARB_buffer_region static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; return r; } #endif /* WGL_ARB_buffer_region */ #ifdef WGL_ARB_create_context static GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; return r; } #endif /* WGL_ARB_create_context */ #ifdef WGL_ARB_extensions_string static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; return r; } #endif /* WGL_ARB_extensions_string */ #ifdef WGL_ARB_make_current_read static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; return r; } #endif /* WGL_ARB_make_current_read */ #ifdef WGL_ARB_pbuffer static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; return r; } #endif /* WGL_ARB_pbuffer */ #ifdef WGL_ARB_pixel_format static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; return r; } #endif /* WGL_ARB_pixel_format */ #ifdef WGL_ARB_render_texture static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; return r; } #endif /* WGL_ARB_render_texture */ #ifdef WGL_EXT_display_color_table static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_display_color_table */ #ifdef WGL_EXT_extensions_string static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_extensions_string */ #ifdef WGL_EXT_make_current_read static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_make_current_read */ #ifdef WGL_EXT_pbuffer static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_pbuffer */ #ifdef WGL_EXT_pixel_format static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_pixel_format */ #ifdef WGL_EXT_swap_control static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; return r; } #endif /* WGL_EXT_swap_control */ #ifdef WGL_I3D_digital_video_control static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_digital_video_control */ #ifdef WGL_I3D_gamma static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_gamma */ #ifdef WGL_I3D_genlock static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_genlock */ #ifdef WGL_I3D_image_buffer static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_image_buffer */ #ifdef WGL_I3D_swap_frame_lock static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_swap_frame_lock */ #ifdef WGL_I3D_swap_frame_usage static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; return r; } #endif /* WGL_I3D_swap_frame_usage */ #ifdef WGL_NV_DX_interop static GLboolean _glewInit_WGL_NV_DX_interop (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; return r; } #endif /* WGL_NV_DX_interop */ #ifdef WGL_NV_copy_image static GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* WGL_NV_copy_image */ #ifdef WGL_NV_delay_before_swap static GLboolean _glewInit_WGL_NV_delay_before_swap (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; return r; } #endif /* WGL_NV_delay_before_swap */ #ifdef WGL_NV_gpu_affinity static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; return r; } #endif /* WGL_NV_gpu_affinity */ #ifdef WGL_NV_present_video static GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; return r; } #endif /* WGL_NV_present_video */ #ifdef WGL_NV_swap_group static GLboolean _glewInit_WGL_NV_swap_group (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; return r; } #endif /* WGL_NV_swap_group */ #ifdef WGL_NV_vertex_array_range static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; return r; } #endif /* WGL_NV_vertex_array_range */ #ifdef WGL_NV_video_capture static GLboolean _glewInit_WGL_NV_video_capture (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; return r; } #endif /* WGL_NV_video_capture */ #ifdef WGL_NV_video_output static GLboolean _glewInit_WGL_NV_video_output (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; return r; } #endif /* WGL_NV_video_output */ #ifdef WGL_OML_sync_control static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; return r; } #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringEXT == NULL) return GL_FALSE; else start = (const GLubyte*)_wglewGetExtensionsStringEXT(); else start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); if (start == 0) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } #ifdef GLEW_MX GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) #else GLenum GLEWAPIENTRY wglewInit (WGLEW_CONTEXT_ARG_DEF_LIST) #endif { GLboolean crippled; const GLubyte* extStart; const GLubyte* extEnd; /* find wgl extension string query functions */ _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); /* query wgl extension string */ if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringEXT == NULL) extStart = (const GLubyte*)""; else extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); else extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; #ifdef WGL_3DFX_multisample WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); #endif /* WGL_3DFX_multisample */ #ifdef WGL_3DL_stereo_control WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_3DL_stereo_control */ #ifdef WGL_AMD_gpu_association WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_AMD_gpu_association */ #ifdef WGL_ARB_buffer_region WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_buffer_region */ #ifdef WGL_ARB_context_flush_control WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); #endif /* WGL_ARB_context_flush_control */ #ifdef WGL_ARB_create_context WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_create_context */ #ifdef WGL_ARB_create_context_profile WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); #endif /* WGL_ARB_create_context_profile */ #ifdef WGL_ARB_create_context_robustness WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); #endif /* WGL_ARB_create_context_robustness */ #ifdef WGL_ARB_extensions_string WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_extensions_string */ #ifdef WGL_ARB_framebuffer_sRGB WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* WGL_ARB_framebuffer_sRGB */ #ifdef WGL_ARB_make_current_read WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_make_current_read */ #ifdef WGL_ARB_multisample WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); #endif /* WGL_ARB_multisample */ #ifdef WGL_ARB_pbuffer WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_pbuffer */ #ifdef WGL_ARB_pixel_format WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_pixel_format */ #ifdef WGL_ARB_pixel_format_float WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); #endif /* WGL_ARB_pixel_format_float */ #ifdef WGL_ARB_render_texture WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_render_texture */ #ifdef WGL_ARB_robustness_application_isolation WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); #endif /* WGL_ARB_robustness_application_isolation */ #ifdef WGL_ARB_robustness_share_group_isolation WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* WGL_ARB_robustness_share_group_isolation */ #ifdef WGL_ATI_pixel_format_float WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); #endif /* WGL_ATI_pixel_format_float */ #ifdef WGL_ATI_render_texture_rectangle WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); #endif /* WGL_ATI_render_texture_rectangle */ #ifdef WGL_EXT_create_context_es2_profile WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); #endif /* WGL_EXT_create_context_es2_profile */ #ifdef WGL_EXT_create_context_es_profile WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); #endif /* WGL_EXT_create_context_es_profile */ #ifdef WGL_EXT_depth_float WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); #endif /* WGL_EXT_depth_float */ #ifdef WGL_EXT_display_color_table WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_display_color_table */ #ifdef WGL_EXT_extensions_string WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_extensions_string */ #ifdef WGL_EXT_framebuffer_sRGB WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* WGL_EXT_framebuffer_sRGB */ #ifdef WGL_EXT_make_current_read WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_make_current_read */ #ifdef WGL_EXT_multisample WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); #endif /* WGL_EXT_multisample */ #ifdef WGL_EXT_pbuffer WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_pbuffer */ #ifdef WGL_EXT_pixel_format WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_pixel_format */ #ifdef WGL_EXT_pixel_format_packed_float WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); #endif /* WGL_EXT_pixel_format_packed_float */ #ifdef WGL_EXT_swap_control WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_EXT_swap_control */ #ifdef WGL_EXT_swap_control_tear WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); #endif /* WGL_EXT_swap_control_tear */ #ifdef WGL_I3D_digital_video_control WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_digital_video_control */ #ifdef WGL_I3D_gamma WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_gamma */ #ifdef WGL_I3D_genlock WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_genlock */ #ifdef WGL_I3D_image_buffer WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_image_buffer */ #ifdef WGL_I3D_swap_frame_lock WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_swap_frame_lock */ #ifdef WGL_I3D_swap_frame_usage WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_I3D_swap_frame_usage */ #ifdef WGL_NV_DX_interop WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_DX_interop */ #ifdef WGL_NV_DX_interop2 WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); #endif /* WGL_NV_DX_interop2 */ #ifdef WGL_NV_copy_image WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_copy_image */ #ifdef WGL_NV_delay_before_swap WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_delay_before_swap */ #ifdef WGL_NV_float_buffer WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); #endif /* WGL_NV_float_buffer */ #ifdef WGL_NV_gpu_affinity WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_gpu_affinity */ #ifdef WGL_NV_multisample_coverage WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); #endif /* WGL_NV_multisample_coverage */ #ifdef WGL_NV_present_video WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_present_video */ #ifdef WGL_NV_render_depth_texture WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); #endif /* WGL_NV_render_depth_texture */ #ifdef WGL_NV_render_texture_rectangle WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); #endif /* WGL_NV_render_texture_rectangle */ #ifdef WGL_NV_swap_group WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_swap_group */ #ifdef WGL_NV_vertex_array_range WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_vertex_array_range */ #ifdef WGL_NV_video_capture WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_video_capture */ #ifdef WGL_NV_video_output WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_NV_video_output */ #ifdef WGL_OML_sync_control WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_OML_sync_control */ return GLEW_OK; } #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; #if !defined(GLEW_MX) GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; GLboolean __GLXEW_3DFX_multisample = GL_FALSE; GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; GLboolean __GLXEW_ARB_create_context = GL_FALSE; GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; GLboolean __GLXEW_ARB_multisample = GL_FALSE; GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; GLboolean __GLXEW_ATI_render_texture = GL_FALSE; GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; GLboolean __GLXEW_EXT_import_context = GL_FALSE; GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; GLboolean __GLXEW_EXT_swap_control = GL_FALSE; GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; GLboolean __GLXEW_EXT_visual_info = GL_FALSE; GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; GLboolean __GLXEW_MESA_swap_control = GL_FALSE; GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; GLboolean __GLXEW_NV_copy_image = GL_FALSE; GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; GLboolean __GLXEW_NV_float_buffer = GL_FALSE; GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; GLboolean __GLXEW_NV_present_video = GL_FALSE; GLboolean __GLXEW_NV_swap_group = GL_FALSE; GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLXEW_NV_video_capture = GL_FALSE; GLboolean __GLXEW_NV_video_out = GL_FALSE; GLboolean __GLXEW_OML_swap_method = GL_FALSE; GLboolean __GLXEW_OML_sync_control = GL_FALSE; GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; GLboolean __GLXEW_SGIS_color_range = GL_FALSE; GLboolean __GLXEW_SGIS_multisample = GL_FALSE; GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; GLboolean __GLXEW_SGI_cushion = GL_FALSE; GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; GLboolean __GLXEW_SGI_swap_control = GL_FALSE; GLboolean __GLXEW_SGI_video_sync = GL_FALSE; GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; GLboolean __GLXEW_SUN_video_resize = GL_FALSE; #endif /* !GLEW_MX */ #ifdef GLX_VERSION_1_2 static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; return r; } #endif /* GLX_VERSION_1_2 */ #ifdef GLX_VERSION_1_3 static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; return r; } #endif /* GLX_VERSION_1_3 */ #ifdef GLX_AMD_gpu_association static GLboolean _glewInit_GLX_AMD_gpu_association (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; return r; } #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; return r; } #endif /* GLX_ARB_create_context */ #ifdef GLX_ATI_render_texture static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; return r; } #endif /* GLX_ATI_render_texture */ #ifdef GLX_EXT_import_context static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_import_context */ #ifdef GLX_EXT_swap_control static GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_swap_control */ #ifdef GLX_EXT_texture_from_pixmap static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; return r; } #endif /* GLX_EXT_texture_from_pixmap */ #ifdef GLX_MESA_agp_offset static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_agp_offset */ #ifdef GLX_MESA_copy_sub_buffer static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_copy_sub_buffer */ #ifdef GLX_MESA_pixmap_colormap static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_pixmap_colormap */ #ifdef GLX_MESA_query_renderer static GLboolean _glewInit_GLX_MESA_query_renderer (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_query_renderer */ #ifdef GLX_MESA_release_buffers static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_release_buffers */ #ifdef GLX_MESA_set_3dfx_mode static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_set_3dfx_mode */ #ifdef GLX_MESA_swap_control static GLboolean _glewInit_GLX_MESA_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; return r; } #endif /* GLX_MESA_swap_control */ #ifdef GLX_NV_copy_buffer static GLboolean _glewInit_GLX_NV_copy_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; return r; } #endif /* GLX_NV_copy_buffer */ #ifdef GLX_NV_copy_image static GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; return r; } #endif /* GLX_NV_copy_image */ #ifdef GLX_NV_delay_before_swap static GLboolean _glewInit_GLX_NV_delay_before_swap (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; return r; } #endif /* GLX_NV_delay_before_swap */ #ifdef GLX_NV_present_video static GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; return r; } #endif /* GLX_NV_present_video */ #ifdef GLX_NV_swap_group static GLboolean _glewInit_GLX_NV_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; return r; } #endif /* GLX_NV_swap_group */ #ifdef GLX_NV_vertex_array_range static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; return r; } #endif /* GLX_NV_vertex_array_range */ #ifdef GLX_NV_video_capture static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; return r; } #endif /* GLX_NV_video_capture */ #ifdef GLX_NV_video_out static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; return r; } #endif /* GLX_NV_video_out */ #ifdef GLX_OML_sync_control static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; return r; } #endif /* GLX_OML_sync_control */ #ifdef GLX_SGIX_fbconfig static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_fbconfig */ #ifdef GLX_SGIX_hyperpipe static GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_hyperpipe */ #ifdef GLX_SGIX_pbuffer static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_pbuffer */ #ifdef GLX_SGIX_swap_barrier static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_swap_barrier */ #ifdef GLX_SGIX_swap_group static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_swap_group */ #ifdef GLX_SGIX_video_resize static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; return r; } #endif /* GLX_SGIX_video_resize */ #ifdef GLX_SGI_cushion static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_cushion */ #ifdef GLX_SGI_make_current_read static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_make_current_read */ #ifdef GLX_SGI_swap_control static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_swap_control */ #ifdef GLX_SGI_video_sync static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; return r; } #endif /* GLX_SGI_video_sync */ #ifdef GLX_SUN_get_transparent_index static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; return r; } #endif /* GLX_SUN_get_transparent_index */ #ifdef GLX_SUN_video_resize static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; return r; } #endif /* GLX_SUN_video_resize */ /* ------------------------------------------------------------------------ */ GLboolean glxewGetExtension (const char* name) { const GLubyte* start; const GLubyte* end; if (glXGetCurrentDisplay == NULL) return GL_FALSE; start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); if (0 == start) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); } #ifdef GLEW_MX GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) #else GLenum glxewInit (GLXEW_CONTEXT_ARG_DEF_LIST) #endif { int major, minor; const GLubyte* extStart; const GLubyte* extEnd; /* initialize core GLX 1.2 */ if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; /* initialize flags */ GLXEW_VERSION_1_0 = GL_TRUE; GLXEW_VERSION_1_1 = GL_TRUE; GLXEW_VERSION_1_2 = GL_TRUE; GLXEW_VERSION_1_3 = GL_TRUE; GLXEW_VERSION_1_4 = GL_TRUE; /* query GLX version */ glXQueryVersion(glXGetCurrentDisplay(), &major, &minor); if (major == 1 && minor <= 3) { switch (minor) { case 3: GLXEW_VERSION_1_4 = GL_FALSE; break; case 2: GLXEW_VERSION_1_4 = GL_FALSE; GLXEW_VERSION_1_3 = GL_FALSE; break; default: return GLEW_ERROR_GLX_VERSION_11_ONLY; break; } } /* query GLX extension string */ extStart = 0; if (glXGetCurrentDisplay != NULL) extStart = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte *)""; extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ #ifdef GLX_VERSION_1_3 if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_VERSION_1_3 */ #ifdef GLX_3DFX_multisample GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); #endif /* GLX_3DFX_multisample */ #ifdef GLX_AMD_gpu_association GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_context_flush_control GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); #endif /* GLX_ARB_context_flush_control */ #ifdef GLX_ARB_create_context GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_ARB_create_context */ #ifdef GLX_ARB_create_context_profile GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); #endif /* GLX_ARB_create_context_profile */ #ifdef GLX_ARB_create_context_robustness GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); #endif /* GLX_ARB_create_context_robustness */ #ifdef GLX_ARB_fbconfig_float GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); #endif /* GLX_ARB_fbconfig_float */ #ifdef GLX_ARB_framebuffer_sRGB GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); #endif /* GLX_ARB_framebuffer_sRGB */ #ifdef GLX_ARB_get_proc_address GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); #endif /* GLX_ARB_get_proc_address */ #ifdef GLX_ARB_multisample GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); #endif /* GLX_ARB_multisample */ #ifdef GLX_ARB_robustness_application_isolation GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); #endif /* GLX_ARB_robustness_application_isolation */ #ifdef GLX_ARB_robustness_share_group_isolation GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); #endif /* GLX_ARB_robustness_share_group_isolation */ #ifdef GLX_ARB_vertex_buffer_object GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); #endif /* GLX_ARB_vertex_buffer_object */ #ifdef GLX_ATI_pixel_format_float GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); #endif /* GLX_ATI_pixel_format_float */ #ifdef GLX_ATI_render_texture GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_ATI_render_texture */ #ifdef GLX_EXT_buffer_age GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); #endif /* GLX_EXT_buffer_age */ #ifdef GLX_EXT_create_context_es2_profile GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es2_profile */ #ifdef GLX_EXT_create_context_es_profile GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es_profile */ #ifdef GLX_EXT_fbconfig_packed_float GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); #endif /* GLX_EXT_fbconfig_packed_float */ #ifdef GLX_EXT_framebuffer_sRGB GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); #endif /* GLX_EXT_framebuffer_sRGB */ #ifdef GLX_EXT_import_context GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_EXT_import_context */ #ifdef GLX_EXT_scene_marker GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); #endif /* GLX_EXT_scene_marker */ #ifdef GLX_EXT_stereo_tree GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); #endif /* GLX_EXT_stereo_tree */ #ifdef GLX_EXT_swap_control GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_EXT_swap_control */ #ifdef GLX_EXT_swap_control_tear GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); #endif /* GLX_EXT_swap_control_tear */ #ifdef GLX_EXT_texture_from_pixmap GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_EXT_texture_from_pixmap */ #ifdef GLX_EXT_visual_info GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); #endif /* GLX_EXT_visual_info */ #ifdef GLX_EXT_visual_rating GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); #endif /* GLX_EXT_visual_rating */ #ifdef GLX_INTEL_swap_event GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); #endif /* GLX_INTEL_swap_event */ #ifdef GLX_MESA_agp_offset GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_agp_offset */ #ifdef GLX_MESA_copy_sub_buffer GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_copy_sub_buffer */ #ifdef GLX_MESA_pixmap_colormap GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_pixmap_colormap */ #ifdef GLX_MESA_query_renderer GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_query_renderer */ #ifdef GLX_MESA_release_buffers GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_release_buffers */ #ifdef GLX_MESA_set_3dfx_mode GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_set_3dfx_mode */ #ifdef GLX_MESA_swap_control GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_MESA_swap_control */ #ifdef GLX_NV_copy_buffer GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_copy_buffer */ #ifdef GLX_NV_copy_image GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_copy_image */ #ifdef GLX_NV_delay_before_swap GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_delay_before_swap */ #ifdef GLX_NV_float_buffer GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); #endif /* GLX_NV_float_buffer */ #ifdef GLX_NV_multisample_coverage GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); #endif /* GLX_NV_multisample_coverage */ #ifdef GLX_NV_present_video GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_present_video */ #ifdef GLX_NV_swap_group GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_swap_group */ #ifdef GLX_NV_vertex_array_range GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_vertex_array_range */ #ifdef GLX_NV_video_capture GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_video_capture */ #ifdef GLX_NV_video_out GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_video_out */ #ifdef GLX_OML_swap_method GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); #endif /* GLX_OML_swap_method */ #ifdef GLX_OML_sync_control GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_OML_sync_control */ #ifdef GLX_SGIS_blended_overlay GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); #endif /* GLX_SGIS_blended_overlay */ #ifdef GLX_SGIS_color_range GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); #endif /* GLX_SGIS_color_range */ #ifdef GLX_SGIS_multisample GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); #endif /* GLX_SGIS_multisample */ #ifdef GLX_SGIS_shared_multisample GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); #endif /* GLX_SGIS_shared_multisample */ #ifdef GLX_SGIX_fbconfig GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_fbconfig */ #ifdef GLX_SGIX_hyperpipe GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_hyperpipe */ #ifdef GLX_SGIX_pbuffer GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_pbuffer */ #ifdef GLX_SGIX_swap_barrier GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_swap_barrier */ #ifdef GLX_SGIX_swap_group GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_swap_group */ #ifdef GLX_SGIX_video_resize GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGIX_video_resize */ #ifdef GLX_SGIX_visual_select_group GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); #endif /* GLX_SGIX_visual_select_group */ #ifdef GLX_SGI_cushion GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_cushion */ #ifdef GLX_SGI_make_current_read GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_make_current_read */ #ifdef GLX_SGI_swap_control GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_swap_control */ #ifdef GLX_SGI_video_sync GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SGI_video_sync */ #ifdef GLX_SUN_get_transparent_index GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SUN_get_transparent_index */ #ifdef GLX_SUN_video_resize GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_SUN_video_resize */ return GLEW_OK; } #endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ /* ------------------------------------------------------------------------ */ const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) { static const GLubyte* _glewErrorString[] = { (const GLubyte*)"No error", (const GLubyte*)"Missing GL version", (const GLubyte*)"GL 1.1 and up are not supported", (const GLubyte*)"GLX 1.2 and up are not supported", (const GLubyte*)"Unknown error" }; const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; } const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) { static const GLubyte* _glewString[] = { (const GLubyte*)NULL, (const GLubyte*)"1.13.0", (const GLubyte*)"1", (const GLubyte*)"13", (const GLubyte*)"0" }; const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; } /* ------------------------------------------------------------------------ */ GLboolean glewExperimental = GL_FALSE; #if !defined(GLEW_MX) GLenum GLEWAPIENTRY glewInit (void) { GLenum r; r = glewContextInit(); if ( r != 0 ) return r; #if defined(_WIN32) return wglewInit(); #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ return glxewInit(); #else return r; #endif /* _WIN32 */ } #endif /* !GLEW_MX */ #ifdef GLEW_MX GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext* ctx, const char* name) #else GLboolean GLEWAPIENTRY glewIsSupported (const char* name) #endif { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef GL_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = GLEW_VERSION_1_2; continue; } #endif #ifdef GL_VERSION_1_2_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) { ret = GLEW_VERSION_1_2_1; continue; } #endif #ifdef GL_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = GLEW_VERSION_1_3; continue; } #endif #ifdef GL_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = GLEW_VERSION_1_4; continue; } #endif #ifdef GL_VERSION_1_5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) { ret = GLEW_VERSION_1_5; continue; } #endif #ifdef GL_VERSION_2_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) { ret = GLEW_VERSION_2_0; continue; } #endif #ifdef GL_VERSION_2_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) { ret = GLEW_VERSION_2_1; continue; } #endif #ifdef GL_VERSION_3_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) { ret = GLEW_VERSION_3_0; continue; } #endif #ifdef GL_VERSION_3_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) { ret = GLEW_VERSION_3_1; continue; } #endif #ifdef GL_VERSION_3_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) { ret = GLEW_VERSION_3_2; continue; } #endif #ifdef GL_VERSION_3_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) { ret = GLEW_VERSION_3_3; continue; } #endif #ifdef GL_VERSION_4_0 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) { ret = GLEW_VERSION_4_0; continue; } #endif #ifdef GL_VERSION_4_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) { ret = GLEW_VERSION_4_1; continue; } #endif #ifdef GL_VERSION_4_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) { ret = GLEW_VERSION_4_2; continue; } #endif #ifdef GL_VERSION_4_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) { ret = GLEW_VERSION_4_3; continue; } #endif #ifdef GL_VERSION_4_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) { ret = GLEW_VERSION_4_4; continue; } #endif #ifdef GL_VERSION_4_5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) { ret = GLEW_VERSION_4_5; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef GL_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_3DFX_multisample; continue; } #endif #ifdef GL_3DFX_tbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) { ret = GLEW_3DFX_tbuffer; continue; } #endif #ifdef GL_3DFX_texture_compression_FXT1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) { ret = GLEW_3DFX_texture_compression_FXT1; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef GL_AMD_blend_minmax_factor if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) { ret = GLEW_AMD_blend_minmax_factor; continue; } #endif #ifdef GL_AMD_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_AMD_conservative_depth; continue; } #endif #ifdef GL_AMD_debug_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) { ret = GLEW_AMD_debug_output; continue; } #endif #ifdef GL_AMD_depth_clamp_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) { ret = GLEW_AMD_depth_clamp_separate; continue; } #endif #ifdef GL_AMD_draw_buffers_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) { ret = GLEW_AMD_draw_buffers_blend; continue; } #endif #ifdef GL_AMD_gcn_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) { ret = GLEW_AMD_gcn_shader; continue; } #endif #ifdef GL_AMD_gpu_shader_int64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) { ret = GLEW_AMD_gpu_shader_int64; continue; } #endif #ifdef GL_AMD_interleaved_elements if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) { ret = GLEW_AMD_interleaved_elements; continue; } #endif #ifdef GL_AMD_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_AMD_multi_draw_indirect; continue; } #endif #ifdef GL_AMD_name_gen_delete if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) { ret = GLEW_AMD_name_gen_delete; continue; } #endif #ifdef GL_AMD_occlusion_query_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) { ret = GLEW_AMD_occlusion_query_event; continue; } #endif #ifdef GL_AMD_performance_monitor if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) { ret = GLEW_AMD_performance_monitor; continue; } #endif #ifdef GL_AMD_pinned_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) { ret = GLEW_AMD_pinned_memory; continue; } #endif #ifdef GL_AMD_query_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) { ret = GLEW_AMD_query_buffer_object; continue; } #endif #ifdef GL_AMD_sample_positions if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) { ret = GLEW_AMD_sample_positions; continue; } #endif #ifdef GL_AMD_seamless_cubemap_per_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) { ret = GLEW_AMD_seamless_cubemap_per_texture; continue; } #endif #ifdef GL_AMD_shader_atomic_counter_ops if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) { ret = GLEW_AMD_shader_atomic_counter_ops; continue; } #endif #ifdef GL_AMD_shader_stencil_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) { ret = GLEW_AMD_shader_stencil_export; continue; } #endif #ifdef GL_AMD_shader_stencil_value_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) { ret = GLEW_AMD_shader_stencil_value_export; continue; } #endif #ifdef GL_AMD_shader_trinary_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) { ret = GLEW_AMD_shader_trinary_minmax; continue; } #endif #ifdef GL_AMD_sparse_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) { ret = GLEW_AMD_sparse_texture; continue; } #endif #ifdef GL_AMD_stencil_operation_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) { ret = GLEW_AMD_stencil_operation_extended; continue; } #endif #ifdef GL_AMD_texture_texture4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) { ret = GLEW_AMD_texture_texture4; continue; } #endif #ifdef GL_AMD_transform_feedback3_lines_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) { ret = GLEW_AMD_transform_feedback3_lines_triangles; continue; } #endif #ifdef GL_AMD_transform_feedback4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) { ret = GLEW_AMD_transform_feedback4; continue; } #endif #ifdef GL_AMD_vertex_shader_layer if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) { ret = GLEW_AMD_vertex_shader_layer; continue; } #endif #ifdef GL_AMD_vertex_shader_tessellator if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) { ret = GLEW_AMD_vertex_shader_tessellator; continue; } #endif #ifdef GL_AMD_vertex_shader_viewport_index if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) { ret = GLEW_AMD_vertex_shader_viewport_index; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) { #ifdef GL_ANGLE_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_ANGLE_depth_texture; continue; } #endif #ifdef GL_ANGLE_framebuffer_blit if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) { ret = GLEW_ANGLE_framebuffer_blit; continue; } #endif #ifdef GL_ANGLE_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_ANGLE_framebuffer_multisample; continue; } #endif #ifdef GL_ANGLE_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_ANGLE_instanced_arrays; continue; } #endif #ifdef GL_ANGLE_pack_reverse_row_order if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) { ret = GLEW_ANGLE_pack_reverse_row_order; continue; } #endif #ifdef GL_ANGLE_program_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) { ret = GLEW_ANGLE_program_binary; continue; } #endif #ifdef GL_ANGLE_texture_compression_dxt1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) { ret = GLEW_ANGLE_texture_compression_dxt1; continue; } #endif #ifdef GL_ANGLE_texture_compression_dxt3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) { ret = GLEW_ANGLE_texture_compression_dxt3; continue; } #endif #ifdef GL_ANGLE_texture_compression_dxt5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) { ret = GLEW_ANGLE_texture_compression_dxt5; continue; } #endif #ifdef GL_ANGLE_texture_usage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) { ret = GLEW_ANGLE_texture_usage; continue; } #endif #ifdef GL_ANGLE_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_ANGLE_timer_query; continue; } #endif #ifdef GL_ANGLE_translated_shader_source if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) { ret = GLEW_ANGLE_translated_shader_source; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) { #ifdef GL_APPLE_aux_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) { ret = GLEW_APPLE_aux_depth_stencil; continue; } #endif #ifdef GL_APPLE_client_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) { ret = GLEW_APPLE_client_storage; continue; } #endif #ifdef GL_APPLE_element_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) { ret = GLEW_APPLE_element_array; continue; } #endif #ifdef GL_APPLE_fence if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) { ret = GLEW_APPLE_fence; continue; } #endif #ifdef GL_APPLE_float_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) { ret = GLEW_APPLE_float_pixels; continue; } #endif #ifdef GL_APPLE_flush_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) { ret = GLEW_APPLE_flush_buffer_range; continue; } #endif #ifdef GL_APPLE_object_purgeable if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) { ret = GLEW_APPLE_object_purgeable; continue; } #endif #ifdef GL_APPLE_pixel_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) { ret = GLEW_APPLE_pixel_buffer; continue; } #endif #ifdef GL_APPLE_rgb_422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) { ret = GLEW_APPLE_rgb_422; continue; } #endif #ifdef GL_APPLE_row_bytes if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) { ret = GLEW_APPLE_row_bytes; continue; } #endif #ifdef GL_APPLE_specular_vector if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) { ret = GLEW_APPLE_specular_vector; continue; } #endif #ifdef GL_APPLE_texture_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) { ret = GLEW_APPLE_texture_range; continue; } #endif #ifdef GL_APPLE_transform_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) { ret = GLEW_APPLE_transform_hint; continue; } #endif #ifdef GL_APPLE_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_APPLE_vertex_array_object; continue; } #endif #ifdef GL_APPLE_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLEW_APPLE_vertex_array_range; continue; } #endif #ifdef GL_APPLE_vertex_program_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) { ret = GLEW_APPLE_vertex_program_evaluators; continue; } #endif #ifdef GL_APPLE_ycbcr_422 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) { ret = GLEW_APPLE_ycbcr_422; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef GL_ARB_ES2_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) { ret = GLEW_ARB_ES2_compatibility; continue; } #endif #ifdef GL_ARB_ES3_1_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) { ret = GLEW_ARB_ES3_1_compatibility; continue; } #endif #ifdef GL_ARB_ES3_2_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) { ret = GLEW_ARB_ES3_2_compatibility; continue; } #endif #ifdef GL_ARB_ES3_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) { ret = GLEW_ARB_ES3_compatibility; continue; } #endif #ifdef GL_ARB_arrays_of_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) { ret = GLEW_ARB_arrays_of_arrays; continue; } #endif #ifdef GL_ARB_base_instance if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) { ret = GLEW_ARB_base_instance; continue; } #endif #ifdef GL_ARB_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { ret = GLEW_ARB_bindless_texture; continue; } #endif #ifdef GL_ARB_blend_func_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) { ret = GLEW_ARB_blend_func_extended; continue; } #endif #ifdef GL_ARB_buffer_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) { ret = GLEW_ARB_buffer_storage; continue; } #endif #ifdef GL_ARB_cl_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) { ret = GLEW_ARB_cl_event; continue; } #endif #ifdef GL_ARB_clear_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) { ret = GLEW_ARB_clear_buffer_object; continue; } #endif #ifdef GL_ARB_clear_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) { ret = GLEW_ARB_clear_texture; continue; } #endif #ifdef GL_ARB_clip_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) { ret = GLEW_ARB_clip_control; continue; } #endif #ifdef GL_ARB_color_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) { ret = GLEW_ARB_color_buffer_float; continue; } #endif #ifdef GL_ARB_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) { ret = GLEW_ARB_compatibility; continue; } #endif #ifdef GL_ARB_compressed_texture_pixel_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) { ret = GLEW_ARB_compressed_texture_pixel_storage; continue; } #endif #ifdef GL_ARB_compute_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) { ret = GLEW_ARB_compute_shader; continue; } #endif #ifdef GL_ARB_compute_variable_group_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) { ret = GLEW_ARB_compute_variable_group_size; continue; } #endif #ifdef GL_ARB_conditional_render_inverted if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) { ret = GLEW_ARB_conditional_render_inverted; continue; } #endif #ifdef GL_ARB_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { ret = GLEW_ARB_conservative_depth; continue; } #endif #ifdef GL_ARB_copy_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) { ret = GLEW_ARB_copy_buffer; continue; } #endif #ifdef GL_ARB_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_ARB_copy_image; continue; } #endif #ifdef GL_ARB_cull_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) { ret = GLEW_ARB_cull_distance; continue; } #endif #ifdef GL_ARB_debug_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) { ret = GLEW_ARB_debug_output; continue; } #endif #ifdef GL_ARB_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { ret = GLEW_ARB_depth_buffer_float; continue; } #endif #ifdef GL_ARB_depth_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) { ret = GLEW_ARB_depth_clamp; continue; } #endif #ifdef GL_ARB_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_ARB_depth_texture; continue; } #endif #ifdef GL_ARB_derivative_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) { ret = GLEW_ARB_derivative_control; continue; } #endif #ifdef GL_ARB_direct_state_access if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) { ret = GLEW_ARB_direct_state_access; continue; } #endif #ifdef GL_ARB_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_ARB_draw_buffers; continue; } #endif #ifdef GL_ARB_draw_buffers_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) { ret = GLEW_ARB_draw_buffers_blend; continue; } #endif #ifdef GL_ARB_draw_elements_base_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) { ret = GLEW_ARB_draw_elements_base_vertex; continue; } #endif #ifdef GL_ARB_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) { ret = GLEW_ARB_draw_indirect; continue; } #endif #ifdef GL_ARB_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_ARB_draw_instanced; continue; } #endif #ifdef GL_ARB_enhanced_layouts if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) { ret = GLEW_ARB_enhanced_layouts; continue; } #endif #ifdef GL_ARB_explicit_attrib_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) { ret = GLEW_ARB_explicit_attrib_location; continue; } #endif #ifdef GL_ARB_explicit_uniform_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) { ret = GLEW_ARB_explicit_uniform_location; continue; } #endif #ifdef GL_ARB_fragment_coord_conventions if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) { ret = GLEW_ARB_fragment_coord_conventions; continue; } #endif #ifdef GL_ARB_fragment_layer_viewport if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) { ret = GLEW_ARB_fragment_layer_viewport; continue; } #endif #ifdef GL_ARB_fragment_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) { ret = GLEW_ARB_fragment_program; continue; } #endif #ifdef GL_ARB_fragment_program_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) { ret = GLEW_ARB_fragment_program_shadow; continue; } #endif #ifdef GL_ARB_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) { ret = GLEW_ARB_fragment_shader; continue; } #endif #ifdef GL_ARB_fragment_shader_interlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) { ret = GLEW_ARB_fragment_shader_interlock; continue; } #endif #ifdef GL_ARB_framebuffer_no_attachments if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) { ret = GLEW_ARB_framebuffer_no_attachments; continue; } #endif #ifdef GL_ARB_framebuffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) { ret = GLEW_ARB_framebuffer_object; continue; } #endif #ifdef GL_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef GL_ARB_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_ARB_geometry_shader4; continue; } #endif #ifdef GL_ARB_get_program_binary if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) { ret = GLEW_ARB_get_program_binary; continue; } #endif #ifdef GL_ARB_get_texture_sub_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) { ret = GLEW_ARB_get_texture_sub_image; continue; } #endif #ifdef GL_ARB_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_ARB_gpu_shader5; continue; } #endif #ifdef GL_ARB_gpu_shader_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) { ret = GLEW_ARB_gpu_shader_fp64; continue; } #endif #ifdef GL_ARB_gpu_shader_int64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) { ret = GLEW_ARB_gpu_shader_int64; continue; } #endif #ifdef GL_ARB_half_float_pixel if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) { ret = GLEW_ARB_half_float_pixel; continue; } #endif #ifdef GL_ARB_half_float_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) { ret = GLEW_ARB_half_float_vertex; continue; } #endif #ifdef GL_ARB_imaging if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) { ret = GLEW_ARB_imaging; continue; } #endif #ifdef GL_ARB_indirect_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) { ret = GLEW_ARB_indirect_parameters; continue; } #endif #ifdef GL_ARB_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { ret = GLEW_ARB_instanced_arrays; continue; } #endif #ifdef GL_ARB_internalformat_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) { ret = GLEW_ARB_internalformat_query; continue; } #endif #ifdef GL_ARB_internalformat_query2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) { ret = GLEW_ARB_internalformat_query2; continue; } #endif #ifdef GL_ARB_invalidate_subdata if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) { ret = GLEW_ARB_invalidate_subdata; continue; } #endif #ifdef GL_ARB_map_buffer_alignment if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) { ret = GLEW_ARB_map_buffer_alignment; continue; } #endif #ifdef GL_ARB_map_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) { ret = GLEW_ARB_map_buffer_range; continue; } #endif #ifdef GL_ARB_matrix_palette if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) { ret = GLEW_ARB_matrix_palette; continue; } #endif #ifdef GL_ARB_multi_bind if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) { ret = GLEW_ARB_multi_bind; continue; } #endif #ifdef GL_ARB_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { ret = GLEW_ARB_multi_draw_indirect; continue; } #endif #ifdef GL_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_ARB_multisample; continue; } #endif #ifdef GL_ARB_multitexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) { ret = GLEW_ARB_multitexture; continue; } #endif #ifdef GL_ARB_occlusion_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) { ret = GLEW_ARB_occlusion_query; continue; } #endif #ifdef GL_ARB_occlusion_query2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) { ret = GLEW_ARB_occlusion_query2; continue; } #endif #ifdef GL_ARB_parallel_shader_compile if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) { ret = GLEW_ARB_parallel_shader_compile; continue; } #endif #ifdef GL_ARB_pipeline_statistics_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) { ret = GLEW_ARB_pipeline_statistics_query; continue; } #endif #ifdef GL_ARB_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_ARB_pixel_buffer_object; continue; } #endif #ifdef GL_ARB_point_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) { ret = GLEW_ARB_point_parameters; continue; } #endif #ifdef GL_ARB_point_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) { ret = GLEW_ARB_point_sprite; continue; } #endif #ifdef GL_ARB_post_depth_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) { ret = GLEW_ARB_post_depth_coverage; continue; } #endif #ifdef GL_ARB_program_interface_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) { ret = GLEW_ARB_program_interface_query; continue; } #endif #ifdef GL_ARB_provoking_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) { ret = GLEW_ARB_provoking_vertex; continue; } #endif #ifdef GL_ARB_query_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) { ret = GLEW_ARB_query_buffer_object; continue; } #endif #ifdef GL_ARB_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { ret = GLEW_ARB_robust_buffer_access_behavior; continue; } #endif #ifdef GL_ARB_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) { ret = GLEW_ARB_robustness; continue; } #endif #ifdef GL_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = GLEW_ARB_robustness_application_isolation; continue; } #endif #ifdef GL_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = GLEW_ARB_robustness_share_group_isolation; continue; } #endif #ifdef GL_ARB_sample_locations if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) { ret = GLEW_ARB_sample_locations; continue; } #endif #ifdef GL_ARB_sample_shading if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) { ret = GLEW_ARB_sample_shading; continue; } #endif #ifdef GL_ARB_sampler_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) { ret = GLEW_ARB_sampler_objects; continue; } #endif #ifdef GL_ARB_seamless_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) { ret = GLEW_ARB_seamless_cube_map; continue; } #endif #ifdef GL_ARB_seamless_cubemap_per_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) { ret = GLEW_ARB_seamless_cubemap_per_texture; continue; } #endif #ifdef GL_ARB_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { ret = GLEW_ARB_separate_shader_objects; continue; } #endif #ifdef GL_ARB_shader_atomic_counter_ops if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) { ret = GLEW_ARB_shader_atomic_counter_ops; continue; } #endif #ifdef GL_ARB_shader_atomic_counters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) { ret = GLEW_ARB_shader_atomic_counters; continue; } #endif #ifdef GL_ARB_shader_ballot if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) { ret = GLEW_ARB_shader_ballot; continue; } #endif #ifdef GL_ARB_shader_bit_encoding if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) { ret = GLEW_ARB_shader_bit_encoding; continue; } #endif #ifdef GL_ARB_shader_clock if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) { ret = GLEW_ARB_shader_clock; continue; } #endif #ifdef GL_ARB_shader_draw_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) { ret = GLEW_ARB_shader_draw_parameters; continue; } #endif #ifdef GL_ARB_shader_group_vote if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) { ret = GLEW_ARB_shader_group_vote; continue; } #endif #ifdef GL_ARB_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { ret = GLEW_ARB_shader_image_load_store; continue; } #endif #ifdef GL_ARB_shader_image_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) { ret = GLEW_ARB_shader_image_size; continue; } #endif #ifdef GL_ARB_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) { ret = GLEW_ARB_shader_objects; continue; } #endif #ifdef GL_ARB_shader_precision if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) { ret = GLEW_ARB_shader_precision; continue; } #endif #ifdef GL_ARB_shader_stencil_export if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) { ret = GLEW_ARB_shader_stencil_export; continue; } #endif #ifdef GL_ARB_shader_storage_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) { ret = GLEW_ARB_shader_storage_buffer_object; continue; } #endif #ifdef GL_ARB_shader_subroutine if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) { ret = GLEW_ARB_shader_subroutine; continue; } #endif #ifdef GL_ARB_shader_texture_image_samples if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) { ret = GLEW_ARB_shader_texture_image_samples; continue; } #endif #ifdef GL_ARB_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_ARB_shader_texture_lod; continue; } #endif #ifdef GL_ARB_shader_viewport_layer_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) { ret = GLEW_ARB_shader_viewport_layer_array; continue; } #endif #ifdef GL_ARB_shading_language_100 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) { ret = GLEW_ARB_shading_language_100; continue; } #endif #ifdef GL_ARB_shading_language_420pack if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) { ret = GLEW_ARB_shading_language_420pack; continue; } #endif #ifdef GL_ARB_shading_language_include if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) { ret = GLEW_ARB_shading_language_include; continue; } #endif #ifdef GL_ARB_shading_language_packing if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) { ret = GLEW_ARB_shading_language_packing; continue; } #endif #ifdef GL_ARB_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) { ret = GLEW_ARB_shadow; continue; } #endif #ifdef GL_ARB_shadow_ambient if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) { ret = GLEW_ARB_shadow_ambient; continue; } #endif #ifdef GL_ARB_sparse_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) { ret = GLEW_ARB_sparse_buffer; continue; } #endif #ifdef GL_ARB_sparse_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) { ret = GLEW_ARB_sparse_texture; continue; } #endif #ifdef GL_ARB_sparse_texture2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) { ret = GLEW_ARB_sparse_texture2; continue; } #endif #ifdef GL_ARB_sparse_texture_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) { ret = GLEW_ARB_sparse_texture_clamp; continue; } #endif #ifdef GL_ARB_stencil_texturing if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) { ret = GLEW_ARB_stencil_texturing; continue; } #endif #ifdef GL_ARB_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) { ret = GLEW_ARB_sync; continue; } #endif #ifdef GL_ARB_tessellation_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) { ret = GLEW_ARB_tessellation_shader; continue; } #endif #ifdef GL_ARB_texture_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) { ret = GLEW_ARB_texture_barrier; continue; } #endif #ifdef GL_ARB_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_ARB_texture_border_clamp; continue; } #endif #ifdef GL_ARB_texture_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) { ret = GLEW_ARB_texture_buffer_object; continue; } #endif #ifdef GL_ARB_texture_buffer_object_rgb32 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) { ret = GLEW_ARB_texture_buffer_object_rgb32; continue; } #endif #ifdef GL_ARB_texture_buffer_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) { ret = GLEW_ARB_texture_buffer_range; continue; } #endif #ifdef GL_ARB_texture_compression if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) { ret = GLEW_ARB_texture_compression; continue; } #endif #ifdef GL_ARB_texture_compression_bptc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) { ret = GLEW_ARB_texture_compression_bptc; continue; } #endif #ifdef GL_ARB_texture_compression_rgtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) { ret = GLEW_ARB_texture_compression_rgtc; continue; } #endif #ifdef GL_ARB_texture_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) { ret = GLEW_ARB_texture_cube_map; continue; } #endif #ifdef GL_ARB_texture_cube_map_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) { ret = GLEW_ARB_texture_cube_map_array; continue; } #endif #ifdef GL_ARB_texture_env_add if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) { ret = GLEW_ARB_texture_env_add; continue; } #endif #ifdef GL_ARB_texture_env_combine if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) { ret = GLEW_ARB_texture_env_combine; continue; } #endif #ifdef GL_ARB_texture_env_crossbar if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) { ret = GLEW_ARB_texture_env_crossbar; continue; } #endif #ifdef GL_ARB_texture_env_dot3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) { ret = GLEW_ARB_texture_env_dot3; continue; } #endif #ifdef GL_ARB_texture_filter_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) { ret = GLEW_ARB_texture_filter_minmax; continue; } #endif #ifdef GL_ARB_texture_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) { ret = GLEW_ARB_texture_float; continue; } #endif #ifdef GL_ARB_texture_gather if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) { ret = GLEW_ARB_texture_gather; continue; } #endif #ifdef GL_ARB_texture_mirror_clamp_to_edge if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) { ret = GLEW_ARB_texture_mirror_clamp_to_edge; continue; } #endif #ifdef GL_ARB_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { ret = GLEW_ARB_texture_mirrored_repeat; continue; } #endif #ifdef GL_ARB_texture_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) { ret = GLEW_ARB_texture_multisample; continue; } #endif #ifdef GL_ARB_texture_non_power_of_two if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) { ret = GLEW_ARB_texture_non_power_of_two; continue; } #endif #ifdef GL_ARB_texture_query_levels if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) { ret = GLEW_ARB_texture_query_levels; continue; } #endif #ifdef GL_ARB_texture_query_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) { ret = GLEW_ARB_texture_query_lod; continue; } #endif #ifdef GL_ARB_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_ARB_texture_rectangle; continue; } #endif #ifdef GL_ARB_texture_rg if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) { ret = GLEW_ARB_texture_rg; continue; } #endif #ifdef GL_ARB_texture_rgb10_a2ui if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) { ret = GLEW_ARB_texture_rgb10_a2ui; continue; } #endif #ifdef GL_ARB_texture_stencil8 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) { ret = GLEW_ARB_texture_stencil8; continue; } #endif #ifdef GL_ARB_texture_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) { ret = GLEW_ARB_texture_storage; continue; } #endif #ifdef GL_ARB_texture_storage_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) { ret = GLEW_ARB_texture_storage_multisample; continue; } #endif #ifdef GL_ARB_texture_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) { ret = GLEW_ARB_texture_swizzle; continue; } #endif #ifdef GL_ARB_texture_view if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) { ret = GLEW_ARB_texture_view; continue; } #endif #ifdef GL_ARB_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_ARB_timer_query; continue; } #endif #ifdef GL_ARB_transform_feedback2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) { ret = GLEW_ARB_transform_feedback2; continue; } #endif #ifdef GL_ARB_transform_feedback3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) { ret = GLEW_ARB_transform_feedback3; continue; } #endif #ifdef GL_ARB_transform_feedback_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) { ret = GLEW_ARB_transform_feedback_instanced; continue; } #endif #ifdef GL_ARB_transform_feedback_overflow_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) { ret = GLEW_ARB_transform_feedback_overflow_query; continue; } #endif #ifdef GL_ARB_transpose_matrix if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) { ret = GLEW_ARB_transpose_matrix; continue; } #endif #ifdef GL_ARB_uniform_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) { ret = GLEW_ARB_uniform_buffer_object; continue; } #endif #ifdef GL_ARB_vertex_array_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) { ret = GLEW_ARB_vertex_array_bgra; continue; } #endif #ifdef GL_ARB_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_ARB_vertex_array_object; continue; } #endif #ifdef GL_ARB_vertex_attrib_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) { ret = GLEW_ARB_vertex_attrib_64bit; continue; } #endif #ifdef GL_ARB_vertex_attrib_binding if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) { ret = GLEW_ARB_vertex_attrib_binding; continue; } #endif #ifdef GL_ARB_vertex_blend if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) { ret = GLEW_ARB_vertex_blend; continue; } #endif #ifdef GL_ARB_vertex_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) { ret = GLEW_ARB_vertex_buffer_object; continue; } #endif #ifdef GL_ARB_vertex_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) { ret = GLEW_ARB_vertex_program; continue; } #endif #ifdef GL_ARB_vertex_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) { ret = GLEW_ARB_vertex_shader; continue; } #endif #ifdef GL_ARB_vertex_type_10f_11f_11f_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) { ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; continue; } #endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) { ret = GLEW_ARB_vertex_type_2_10_10_10_rev; continue; } #endif #ifdef GL_ARB_viewport_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) { ret = GLEW_ARB_viewport_array; continue; } #endif #ifdef GL_ARB_window_pos if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) { ret = GLEW_ARB_window_pos; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) { #ifdef GL_ATIX_point_sprites if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) { ret = GLEW_ATIX_point_sprites; continue; } #endif #ifdef GL_ATIX_texture_env_combine3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) { ret = GLEW_ATIX_texture_env_combine3; continue; } #endif #ifdef GL_ATIX_texture_env_route if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) { ret = GLEW_ATIX_texture_env_route; continue; } #endif #ifdef GL_ATIX_vertex_shader_output_point_size if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) { ret = GLEW_ATIX_vertex_shader_output_point_size; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef GL_ATI_draw_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) { ret = GLEW_ATI_draw_buffers; continue; } #endif #ifdef GL_ATI_element_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) { ret = GLEW_ATI_element_array; continue; } #endif #ifdef GL_ATI_envmap_bumpmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) { ret = GLEW_ATI_envmap_bumpmap; continue; } #endif #ifdef GL_ATI_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) { ret = GLEW_ATI_fragment_shader; continue; } #endif #ifdef GL_ATI_map_object_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) { ret = GLEW_ATI_map_object_buffer; continue; } #endif #ifdef GL_ATI_meminfo if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) { ret = GLEW_ATI_meminfo; continue; } #endif #ifdef GL_ATI_pn_triangles if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) { ret = GLEW_ATI_pn_triangles; continue; } #endif #ifdef GL_ATI_separate_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) { ret = GLEW_ATI_separate_stencil; continue; } #endif #ifdef GL_ATI_shader_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) { ret = GLEW_ATI_shader_texture_lod; continue; } #endif #ifdef GL_ATI_text_fragment_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) { ret = GLEW_ATI_text_fragment_shader; continue; } #endif #ifdef GL_ATI_texture_compression_3dc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) { ret = GLEW_ATI_texture_compression_3dc; continue; } #endif #ifdef GL_ATI_texture_env_combine3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) { ret = GLEW_ATI_texture_env_combine3; continue; } #endif #ifdef GL_ATI_texture_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) { ret = GLEW_ATI_texture_float; continue; } #endif #ifdef GL_ATI_texture_mirror_once if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) { ret = GLEW_ATI_texture_mirror_once; continue; } #endif #ifdef GL_ATI_vertex_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) { ret = GLEW_ATI_vertex_array_object; continue; } #endif #ifdef GL_ATI_vertex_attrib_array_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) { ret = GLEW_ATI_vertex_attrib_array_object; continue; } #endif #ifdef GL_ATI_vertex_streams if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) { ret = GLEW_ATI_vertex_streams; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef GL_EXT_422_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) { ret = GLEW_EXT_422_pixels; continue; } #endif #ifdef GL_EXT_Cg_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) { ret = GLEW_EXT_Cg_shader; continue; } #endif #ifdef GL_EXT_abgr if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) { ret = GLEW_EXT_abgr; continue; } #endif #ifdef GL_EXT_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) { ret = GLEW_EXT_bgra; continue; } #endif #ifdef GL_EXT_bindable_uniform if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) { ret = GLEW_EXT_bindable_uniform; continue; } #endif #ifdef GL_EXT_blend_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) { ret = GLEW_EXT_blend_color; continue; } #endif #ifdef GL_EXT_blend_equation_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) { ret = GLEW_EXT_blend_equation_separate; continue; } #endif #ifdef GL_EXT_blend_func_separate if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) { ret = GLEW_EXT_blend_func_separate; continue; } #endif #ifdef GL_EXT_blend_logic_op if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) { ret = GLEW_EXT_blend_logic_op; continue; } #endif #ifdef GL_EXT_blend_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) { ret = GLEW_EXT_blend_minmax; continue; } #endif #ifdef GL_EXT_blend_subtract if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) { ret = GLEW_EXT_blend_subtract; continue; } #endif #ifdef GL_EXT_clip_volume_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) { ret = GLEW_EXT_clip_volume_hint; continue; } #endif #ifdef GL_EXT_cmyka if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) { ret = GLEW_EXT_cmyka; continue; } #endif #ifdef GL_EXT_color_subtable if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) { ret = GLEW_EXT_color_subtable; continue; } #endif #ifdef GL_EXT_compiled_vertex_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) { ret = GLEW_EXT_compiled_vertex_array; continue; } #endif #ifdef GL_EXT_convolution if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) { ret = GLEW_EXT_convolution; continue; } #endif #ifdef GL_EXT_coordinate_frame if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) { ret = GLEW_EXT_coordinate_frame; continue; } #endif #ifdef GL_EXT_copy_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) { ret = GLEW_EXT_copy_texture; continue; } #endif #ifdef GL_EXT_cull_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) { ret = GLEW_EXT_cull_vertex; continue; } #endif #ifdef GL_EXT_debug_label if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) { ret = GLEW_EXT_debug_label; continue; } #endif #ifdef GL_EXT_debug_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) { ret = GLEW_EXT_debug_marker; continue; } #endif #ifdef GL_EXT_depth_bounds_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) { ret = GLEW_EXT_depth_bounds_test; continue; } #endif #ifdef GL_EXT_direct_state_access if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) { ret = GLEW_EXT_direct_state_access; continue; } #endif #ifdef GL_EXT_draw_buffers2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) { ret = GLEW_EXT_draw_buffers2; continue; } #endif #ifdef GL_EXT_draw_instanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) { ret = GLEW_EXT_draw_instanced; continue; } #endif #ifdef GL_EXT_draw_range_elements if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) { ret = GLEW_EXT_draw_range_elements; continue; } #endif #ifdef GL_EXT_fog_coord if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) { ret = GLEW_EXT_fog_coord; continue; } #endif #ifdef GL_EXT_fragment_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) { ret = GLEW_EXT_fragment_lighting; continue; } #endif #ifdef GL_EXT_framebuffer_blit if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) { ret = GLEW_EXT_framebuffer_blit; continue; } #endif #ifdef GL_EXT_framebuffer_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) { ret = GLEW_EXT_framebuffer_multisample; continue; } #endif #ifdef GL_EXT_framebuffer_multisample_blit_scaled if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) { ret = GLEW_EXT_framebuffer_multisample_blit_scaled; continue; } #endif #ifdef GL_EXT_framebuffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) { ret = GLEW_EXT_framebuffer_object; continue; } #endif #ifdef GL_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef GL_EXT_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_EXT_geometry_shader4; continue; } #endif #ifdef GL_EXT_gpu_program_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) { ret = GLEW_EXT_gpu_program_parameters; continue; } #endif #ifdef GL_EXT_gpu_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) { ret = GLEW_EXT_gpu_shader4; continue; } #endif #ifdef GL_EXT_histogram if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) { ret = GLEW_EXT_histogram; continue; } #endif #ifdef GL_EXT_index_array_formats if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) { ret = GLEW_EXT_index_array_formats; continue; } #endif #ifdef GL_EXT_index_func if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) { ret = GLEW_EXT_index_func; continue; } #endif #ifdef GL_EXT_index_material if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) { ret = GLEW_EXT_index_material; continue; } #endif #ifdef GL_EXT_index_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) { ret = GLEW_EXT_index_texture; continue; } #endif #ifdef GL_EXT_light_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) { ret = GLEW_EXT_light_texture; continue; } #endif #ifdef GL_EXT_misc_attribute if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) { ret = GLEW_EXT_misc_attribute; continue; } #endif #ifdef GL_EXT_multi_draw_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) { ret = GLEW_EXT_multi_draw_arrays; continue; } #endif #ifdef GL_EXT_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_EXT_multisample; continue; } #endif #ifdef GL_EXT_packed_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) { ret = GLEW_EXT_packed_depth_stencil; continue; } #endif #ifdef GL_EXT_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) { ret = GLEW_EXT_packed_float; continue; } #endif #ifdef GL_EXT_packed_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) { ret = GLEW_EXT_packed_pixels; continue; } #endif #ifdef GL_EXT_paletted_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) { ret = GLEW_EXT_paletted_texture; continue; } #endif #ifdef GL_EXT_pixel_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) { ret = GLEW_EXT_pixel_buffer_object; continue; } #endif #ifdef GL_EXT_pixel_transform if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) { ret = GLEW_EXT_pixel_transform; continue; } #endif #ifdef GL_EXT_pixel_transform_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) { ret = GLEW_EXT_pixel_transform_color_table; continue; } #endif #ifdef GL_EXT_point_parameters if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) { ret = GLEW_EXT_point_parameters; continue; } #endif #ifdef GL_EXT_polygon_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) { ret = GLEW_EXT_polygon_offset; continue; } #endif #ifdef GL_EXT_polygon_offset_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) { ret = GLEW_EXT_polygon_offset_clamp; continue; } #endif #ifdef GL_EXT_post_depth_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) { ret = GLEW_EXT_post_depth_coverage; continue; } #endif #ifdef GL_EXT_provoking_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) { ret = GLEW_EXT_provoking_vertex; continue; } #endif #ifdef GL_EXT_raster_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) { ret = GLEW_EXT_raster_multisample; continue; } #endif #ifdef GL_EXT_rescale_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) { ret = GLEW_EXT_rescale_normal; continue; } #endif #ifdef GL_EXT_scene_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) { ret = GLEW_EXT_scene_marker; continue; } #endif #ifdef GL_EXT_secondary_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) { ret = GLEW_EXT_secondary_color; continue; } #endif #ifdef GL_EXT_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { ret = GLEW_EXT_separate_shader_objects; continue; } #endif #ifdef GL_EXT_separate_specular_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) { ret = GLEW_EXT_separate_specular_color; continue; } #endif #ifdef GL_EXT_shader_image_load_formatted if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) { ret = GLEW_EXT_shader_image_load_formatted; continue; } #endif #ifdef GL_EXT_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { ret = GLEW_EXT_shader_image_load_store; continue; } #endif #ifdef GL_EXT_shader_integer_mix if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) { ret = GLEW_EXT_shader_integer_mix; continue; } #endif #ifdef GL_EXT_shadow_funcs if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) { ret = GLEW_EXT_shadow_funcs; continue; } #endif #ifdef GL_EXT_shared_texture_palette if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) { ret = GLEW_EXT_shared_texture_palette; continue; } #endif #ifdef GL_EXT_sparse_texture2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) { ret = GLEW_EXT_sparse_texture2; continue; } #endif #ifdef GL_EXT_stencil_clear_tag if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) { ret = GLEW_EXT_stencil_clear_tag; continue; } #endif #ifdef GL_EXT_stencil_two_side if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) { ret = GLEW_EXT_stencil_two_side; continue; } #endif #ifdef GL_EXT_stencil_wrap if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) { ret = GLEW_EXT_stencil_wrap; continue; } #endif #ifdef GL_EXT_subtexture if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) { ret = GLEW_EXT_subtexture; continue; } #endif #ifdef GL_EXT_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) { ret = GLEW_EXT_texture; continue; } #endif #ifdef GL_EXT_texture3D if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) { ret = GLEW_EXT_texture3D; continue; } #endif #ifdef GL_EXT_texture_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) { ret = GLEW_EXT_texture_array; continue; } #endif #ifdef GL_EXT_texture_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) { ret = GLEW_EXT_texture_buffer_object; continue; } #endif #ifdef GL_EXT_texture_compression_dxt1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) { ret = GLEW_EXT_texture_compression_dxt1; continue; } #endif #ifdef GL_EXT_texture_compression_latc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) { ret = GLEW_EXT_texture_compression_latc; continue; } #endif #ifdef GL_EXT_texture_compression_rgtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) { ret = GLEW_EXT_texture_compression_rgtc; continue; } #endif #ifdef GL_EXT_texture_compression_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) { ret = GLEW_EXT_texture_compression_s3tc; continue; } #endif #ifdef GL_EXT_texture_cube_map if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) { ret = GLEW_EXT_texture_cube_map; continue; } #endif #ifdef GL_EXT_texture_edge_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) { ret = GLEW_EXT_texture_edge_clamp; continue; } #endif #ifdef GL_EXT_texture_env if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) { ret = GLEW_EXT_texture_env; continue; } #endif #ifdef GL_EXT_texture_env_add if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) { ret = GLEW_EXT_texture_env_add; continue; } #endif #ifdef GL_EXT_texture_env_combine if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) { ret = GLEW_EXT_texture_env_combine; continue; } #endif #ifdef GL_EXT_texture_env_dot3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) { ret = GLEW_EXT_texture_env_dot3; continue; } #endif #ifdef GL_EXT_texture_filter_anisotropic if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) { ret = GLEW_EXT_texture_filter_anisotropic; continue; } #endif #ifdef GL_EXT_texture_filter_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) { ret = GLEW_EXT_texture_filter_minmax; continue; } #endif #ifdef GL_EXT_texture_integer if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) { ret = GLEW_EXT_texture_integer; continue; } #endif #ifdef GL_EXT_texture_lod_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) { ret = GLEW_EXT_texture_lod_bias; continue; } #endif #ifdef GL_EXT_texture_mirror_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) { ret = GLEW_EXT_texture_mirror_clamp; continue; } #endif #ifdef GL_EXT_texture_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) { ret = GLEW_EXT_texture_object; continue; } #endif #ifdef GL_EXT_texture_perturb_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) { ret = GLEW_EXT_texture_perturb_normal; continue; } #endif #ifdef GL_EXT_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_EXT_texture_rectangle; continue; } #endif #ifdef GL_EXT_texture_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) { ret = GLEW_EXT_texture_sRGB; continue; } #endif #ifdef GL_EXT_texture_sRGB_decode if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) { ret = GLEW_EXT_texture_sRGB_decode; continue; } #endif #ifdef GL_EXT_texture_shared_exponent if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) { ret = GLEW_EXT_texture_shared_exponent; continue; } #endif #ifdef GL_EXT_texture_snorm if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) { ret = GLEW_EXT_texture_snorm; continue; } #endif #ifdef GL_EXT_texture_swizzle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) { ret = GLEW_EXT_texture_swizzle; continue; } #endif #ifdef GL_EXT_timer_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) { ret = GLEW_EXT_timer_query; continue; } #endif #ifdef GL_EXT_transform_feedback if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) { ret = GLEW_EXT_transform_feedback; continue; } #endif #ifdef GL_EXT_vertex_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) { ret = GLEW_EXT_vertex_array; continue; } #endif #ifdef GL_EXT_vertex_array_bgra if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) { ret = GLEW_EXT_vertex_array_bgra; continue; } #endif #ifdef GL_EXT_vertex_attrib_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) { ret = GLEW_EXT_vertex_attrib_64bit; continue; } #endif #ifdef GL_EXT_vertex_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) { ret = GLEW_EXT_vertex_shader; continue; } #endif #ifdef GL_EXT_vertex_weighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) { ret = GLEW_EXT_vertex_weighting; continue; } #endif #ifdef GL_EXT_x11_sync_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) { ret = GLEW_EXT_x11_sync_object; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) { #ifdef GL_GREMEDY_frame_terminator if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) { ret = GLEW_GREMEDY_frame_terminator; continue; } #endif #ifdef GL_GREMEDY_string_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) { ret = GLEW_GREMEDY_string_marker; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) { #ifdef GL_HP_convolution_border_modes if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) { ret = GLEW_HP_convolution_border_modes; continue; } #endif #ifdef GL_HP_image_transform if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) { ret = GLEW_HP_image_transform; continue; } #endif #ifdef GL_HP_occlusion_test if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) { ret = GLEW_HP_occlusion_test; continue; } #endif #ifdef GL_HP_texture_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) { ret = GLEW_HP_texture_lighting; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) { #ifdef GL_IBM_cull_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) { ret = GLEW_IBM_cull_vertex; continue; } #endif #ifdef GL_IBM_multimode_draw_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) { ret = GLEW_IBM_multimode_draw_arrays; continue; } #endif #ifdef GL_IBM_rasterpos_clip if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) { ret = GLEW_IBM_rasterpos_clip; continue; } #endif #ifdef GL_IBM_static_data if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) { ret = GLEW_IBM_static_data; continue; } #endif #ifdef GL_IBM_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { ret = GLEW_IBM_texture_mirrored_repeat; continue; } #endif #ifdef GL_IBM_vertex_array_lists if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) { ret = GLEW_IBM_vertex_array_lists; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) { #ifdef GL_INGR_color_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) { ret = GLEW_INGR_color_clamp; continue; } #endif #ifdef GL_INGR_interlace_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) { ret = GLEW_INGR_interlace_read; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { #ifdef GL_INTEL_fragment_shader_ordering if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) { ret = GLEW_INTEL_fragment_shader_ordering; continue; } #endif #ifdef GL_INTEL_framebuffer_CMAA if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) { ret = GLEW_INTEL_framebuffer_CMAA; continue; } #endif #ifdef GL_INTEL_map_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) { ret = GLEW_INTEL_map_texture; continue; } #endif #ifdef GL_INTEL_parallel_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) { ret = GLEW_INTEL_parallel_arrays; continue; } #endif #ifdef GL_INTEL_performance_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) { ret = GLEW_INTEL_performance_query; continue; } #endif #ifdef GL_INTEL_texture_scissor if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) { ret = GLEW_INTEL_texture_scissor; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) { #ifdef GL_KHR_blend_equation_advanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) { ret = GLEW_KHR_blend_equation_advanced; continue; } #endif #ifdef GL_KHR_blend_equation_advanced_coherent if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) { ret = GLEW_KHR_blend_equation_advanced_coherent; continue; } #endif #ifdef GL_KHR_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = GLEW_KHR_context_flush_control; continue; } #endif #ifdef GL_KHR_debug if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) { ret = GLEW_KHR_debug; continue; } #endif #ifdef GL_KHR_no_error if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) { ret = GLEW_KHR_no_error; continue; } #endif #ifdef GL_KHR_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { ret = GLEW_KHR_robust_buffer_access_behavior; continue; } #endif #ifdef GL_KHR_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) { ret = GLEW_KHR_robustness; continue; } #endif #ifdef GL_KHR_texture_compression_astc_hdr if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) { ret = GLEW_KHR_texture_compression_astc_hdr; continue; } #endif #ifdef GL_KHR_texture_compression_astc_ldr if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) { ret = GLEW_KHR_texture_compression_astc_ldr; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) { #ifdef GL_KTX_buffer_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) { ret = GLEW_KTX_buffer_region; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) { #ifdef GL_MESAX_texture_stack if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) { ret = GLEW_MESAX_texture_stack; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef GL_MESA_pack_invert if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) { ret = GLEW_MESA_pack_invert; continue; } #endif #ifdef GL_MESA_resize_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) { ret = GLEW_MESA_resize_buffers; continue; } #endif #ifdef GL_MESA_window_pos if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) { ret = GLEW_MESA_window_pos; continue; } #endif #ifdef GL_MESA_ycbcr_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) { ret = GLEW_MESA_ycbcr_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) { #ifdef GL_NVX_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { ret = GLEW_NVX_conditional_render; continue; } #endif #ifdef GL_NVX_gpu_memory_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) { ret = GLEW_NVX_gpu_memory_info; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef GL_NV_bindless_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) { ret = GLEW_NV_bindless_multi_draw_indirect; continue; } #endif #ifdef GL_NV_bindless_multi_draw_indirect_count if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) { ret = GLEW_NV_bindless_multi_draw_indirect_count; continue; } #endif #ifdef GL_NV_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { ret = GLEW_NV_bindless_texture; continue; } #endif #ifdef GL_NV_blend_equation_advanced if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) { ret = GLEW_NV_blend_equation_advanced; continue; } #endif #ifdef GL_NV_blend_equation_advanced_coherent if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) { ret = GLEW_NV_blend_equation_advanced_coherent; continue; } #endif #ifdef GL_NV_blend_square if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) { ret = GLEW_NV_blend_square; continue; } #endif #ifdef GL_NV_compute_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) { ret = GLEW_NV_compute_program5; continue; } #endif #ifdef GL_NV_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { ret = GLEW_NV_conditional_render; continue; } #endif #ifdef GL_NV_conservative_raster if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) { ret = GLEW_NV_conservative_raster; continue; } #endif #ifdef GL_NV_conservative_raster_dilate if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) { ret = GLEW_NV_conservative_raster_dilate; continue; } #endif #ifdef GL_NV_copy_depth_to_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) { ret = GLEW_NV_copy_depth_to_color; continue; } #endif #ifdef GL_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLEW_NV_copy_image; continue; } #endif #ifdef GL_NV_deep_texture3D if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) { ret = GLEW_NV_deep_texture3D; continue; } #endif #ifdef GL_NV_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { ret = GLEW_NV_depth_buffer_float; continue; } #endif #ifdef GL_NV_depth_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) { ret = GLEW_NV_depth_clamp; continue; } #endif #ifdef GL_NV_depth_range_unclamped if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) { ret = GLEW_NV_depth_range_unclamped; continue; } #endif #ifdef GL_NV_draw_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) { ret = GLEW_NV_draw_texture; continue; } #endif #ifdef GL_NV_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) { ret = GLEW_NV_evaluators; continue; } #endif #ifdef GL_NV_explicit_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) { ret = GLEW_NV_explicit_multisample; continue; } #endif #ifdef GL_NV_fence if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) { ret = GLEW_NV_fence; continue; } #endif #ifdef GL_NV_fill_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) { ret = GLEW_NV_fill_rectangle; continue; } #endif #ifdef GL_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = GLEW_NV_float_buffer; continue; } #endif #ifdef GL_NV_fog_distance if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) { ret = GLEW_NV_fog_distance; continue; } #endif #ifdef GL_NV_fragment_coverage_to_color if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) { ret = GLEW_NV_fragment_coverage_to_color; continue; } #endif #ifdef GL_NV_fragment_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) { ret = GLEW_NV_fragment_program; continue; } #endif #ifdef GL_NV_fragment_program2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) { ret = GLEW_NV_fragment_program2; continue; } #endif #ifdef GL_NV_fragment_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) { ret = GLEW_NV_fragment_program4; continue; } #endif #ifdef GL_NV_fragment_program_option if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) { ret = GLEW_NV_fragment_program_option; continue; } #endif #ifdef GL_NV_fragment_shader_interlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) { ret = GLEW_NV_fragment_shader_interlock; continue; } #endif #ifdef GL_NV_framebuffer_mixed_samples if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) { ret = GLEW_NV_framebuffer_mixed_samples; continue; } #endif #ifdef GL_NV_framebuffer_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) { ret = GLEW_NV_framebuffer_multisample_coverage; continue; } #endif #ifdef GL_NV_geometry_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) { ret = GLEW_NV_geometry_program4; continue; } #endif #ifdef GL_NV_geometry_shader4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) { ret = GLEW_NV_geometry_shader4; continue; } #endif #ifdef GL_NV_geometry_shader_passthrough if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) { ret = GLEW_NV_geometry_shader_passthrough; continue; } #endif #ifdef GL_NV_gpu_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) { ret = GLEW_NV_gpu_program4; continue; } #endif #ifdef GL_NV_gpu_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) { ret = GLEW_NV_gpu_program5; continue; } #endif #ifdef GL_NV_gpu_program5_mem_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) { ret = GLEW_NV_gpu_program5_mem_extended; continue; } #endif #ifdef GL_NV_gpu_program_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) { ret = GLEW_NV_gpu_program_fp64; continue; } #endif #ifdef GL_NV_gpu_shader5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) { ret = GLEW_NV_gpu_shader5; continue; } #endif #ifdef GL_NV_half_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) { ret = GLEW_NV_half_float; continue; } #endif #ifdef GL_NV_internalformat_sample_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) { ret = GLEW_NV_internalformat_sample_query; continue; } #endif #ifdef GL_NV_light_max_exponent if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) { ret = GLEW_NV_light_max_exponent; continue; } #endif #ifdef GL_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = GLEW_NV_multisample_coverage; continue; } #endif #ifdef GL_NV_multisample_filter_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) { ret = GLEW_NV_multisample_filter_hint; continue; } #endif #ifdef GL_NV_occlusion_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) { ret = GLEW_NV_occlusion_query; continue; } #endif #ifdef GL_NV_packed_depth_stencil if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) { ret = GLEW_NV_packed_depth_stencil; continue; } #endif #ifdef GL_NV_parameter_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) { ret = GLEW_NV_parameter_buffer_object; continue; } #endif #ifdef GL_NV_parameter_buffer_object2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) { ret = GLEW_NV_parameter_buffer_object2; continue; } #endif #ifdef GL_NV_path_rendering if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) { ret = GLEW_NV_path_rendering; continue; } #endif #ifdef GL_NV_path_rendering_shared_edge if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) { ret = GLEW_NV_path_rendering_shared_edge; continue; } #endif #ifdef GL_NV_pixel_data_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) { ret = GLEW_NV_pixel_data_range; continue; } #endif #ifdef GL_NV_point_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) { ret = GLEW_NV_point_sprite; continue; } #endif #ifdef GL_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = GLEW_NV_present_video; continue; } #endif #ifdef GL_NV_primitive_restart if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) { ret = GLEW_NV_primitive_restart; continue; } #endif #ifdef GL_NV_register_combiners if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) { ret = GLEW_NV_register_combiners; continue; } #endif #ifdef GL_NV_register_combiners2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) { ret = GLEW_NV_register_combiners2; continue; } #endif #ifdef GL_NV_sample_locations if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) { ret = GLEW_NV_sample_locations; continue; } #endif #ifdef GL_NV_sample_mask_override_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) { ret = GLEW_NV_sample_mask_override_coverage; continue; } #endif #ifdef GL_NV_shader_atomic_counters if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) { ret = GLEW_NV_shader_atomic_counters; continue; } #endif #ifdef GL_NV_shader_atomic_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) { ret = GLEW_NV_shader_atomic_float; continue; } #endif #ifdef GL_NV_shader_atomic_fp16_vector if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) { ret = GLEW_NV_shader_atomic_fp16_vector; continue; } #endif #ifdef GL_NV_shader_atomic_int64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) { ret = GLEW_NV_shader_atomic_int64; continue; } #endif #ifdef GL_NV_shader_buffer_load if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) { ret = GLEW_NV_shader_buffer_load; continue; } #endif #ifdef GL_NV_shader_storage_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) { ret = GLEW_NV_shader_storage_buffer_object; continue; } #endif #ifdef GL_NV_shader_thread_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) { ret = GLEW_NV_shader_thread_group; continue; } #endif #ifdef GL_NV_shader_thread_shuffle if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) { ret = GLEW_NV_shader_thread_shuffle; continue; } #endif #ifdef GL_NV_tessellation_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) { ret = GLEW_NV_tessellation_program5; continue; } #endif #ifdef GL_NV_texgen_emboss if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) { ret = GLEW_NV_texgen_emboss; continue; } #endif #ifdef GL_NV_texgen_reflection if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) { ret = GLEW_NV_texgen_reflection; continue; } #endif #ifdef GL_NV_texture_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) { ret = GLEW_NV_texture_barrier; continue; } #endif #ifdef GL_NV_texture_compression_vtc if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) { ret = GLEW_NV_texture_compression_vtc; continue; } #endif #ifdef GL_NV_texture_env_combine4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) { ret = GLEW_NV_texture_env_combine4; continue; } #endif #ifdef GL_NV_texture_expand_normal if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) { ret = GLEW_NV_texture_expand_normal; continue; } #endif #ifdef GL_NV_texture_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) { ret = GLEW_NV_texture_multisample; continue; } #endif #ifdef GL_NV_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) { ret = GLEW_NV_texture_rectangle; continue; } #endif #ifdef GL_NV_texture_shader if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) { ret = GLEW_NV_texture_shader; continue; } #endif #ifdef GL_NV_texture_shader2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) { ret = GLEW_NV_texture_shader2; continue; } #endif #ifdef GL_NV_texture_shader3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) { ret = GLEW_NV_texture_shader3; continue; } #endif #ifdef GL_NV_transform_feedback if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) { ret = GLEW_NV_transform_feedback; continue; } #endif #ifdef GL_NV_transform_feedback2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) { ret = GLEW_NV_transform_feedback2; continue; } #endif #ifdef GL_NV_uniform_buffer_unified_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) { ret = GLEW_NV_uniform_buffer_unified_memory; continue; } #endif #ifdef GL_NV_vdpau_interop if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) { ret = GLEW_NV_vdpau_interop; continue; } #endif #ifdef GL_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLEW_NV_vertex_array_range; continue; } #endif #ifdef GL_NV_vertex_array_range2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) { ret = GLEW_NV_vertex_array_range2; continue; } #endif #ifdef GL_NV_vertex_attrib_integer_64bit if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) { ret = GLEW_NV_vertex_attrib_integer_64bit; continue; } #endif #ifdef GL_NV_vertex_buffer_unified_memory if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) { ret = GLEW_NV_vertex_buffer_unified_memory; continue; } #endif #ifdef GL_NV_vertex_program if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) { ret = GLEW_NV_vertex_program; continue; } #endif #ifdef GL_NV_vertex_program1_1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) { ret = GLEW_NV_vertex_program1_1; continue; } #endif #ifdef GL_NV_vertex_program2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) { ret = GLEW_NV_vertex_program2; continue; } #endif #ifdef GL_NV_vertex_program2_option if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) { ret = GLEW_NV_vertex_program2_option; continue; } #endif #ifdef GL_NV_vertex_program3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) { ret = GLEW_NV_vertex_program3; continue; } #endif #ifdef GL_NV_vertex_program4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) { ret = GLEW_NV_vertex_program4; continue; } #endif #ifdef GL_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = GLEW_NV_video_capture; continue; } #endif #ifdef GL_NV_viewport_array2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) { ret = GLEW_NV_viewport_array2; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) { #ifdef GL_OES_byte_coordinates if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) { ret = GLEW_OES_byte_coordinates; continue; } #endif #ifdef GL_OES_compressed_paletted_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27)) { ret = GLEW_OES_compressed_paletted_texture; continue; } #endif #ifdef GL_OES_read_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) { ret = GLEW_OES_read_format; continue; } #endif #ifdef GL_OES_single_precision if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16)) { ret = GLEW_OES_single_precision; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef GL_OML_interlace if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) { ret = GLEW_OML_interlace; continue; } #endif #ifdef GL_OML_resample if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) { ret = GLEW_OML_resample; continue; } #endif #ifdef GL_OML_subsample if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) { ret = GLEW_OML_subsample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) { #ifdef GL_OVR_multiview if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) { ret = GLEW_OVR_multiview; continue; } #endif #ifdef GL_OVR_multiview2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) { ret = GLEW_OVR_multiview2; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) { #ifdef GL_PGI_misc_hints if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) { ret = GLEW_PGI_misc_hints; continue; } #endif #ifdef GL_PGI_vertex_hints if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) { ret = GLEW_PGI_vertex_hints; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) { #ifdef GL_REGAL_ES1_0_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) { ret = GLEW_REGAL_ES1_0_compatibility; continue; } #endif #ifdef GL_REGAL_ES1_1_compatibility if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) { ret = GLEW_REGAL_ES1_1_compatibility; continue; } #endif #ifdef GL_REGAL_enable if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) { ret = GLEW_REGAL_enable; continue; } #endif #ifdef GL_REGAL_error_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) { ret = GLEW_REGAL_error_string; continue; } #endif #ifdef GL_REGAL_extension_query if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) { ret = GLEW_REGAL_extension_query; continue; } #endif #ifdef GL_REGAL_log if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) { ret = GLEW_REGAL_log; continue; } #endif #ifdef GL_REGAL_proc_address if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) { ret = GLEW_REGAL_proc_address; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) { #ifdef GL_REND_screen_coordinates if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) { ret = GLEW_REND_screen_coordinates; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) { #ifdef GL_S3_s3tc if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) { ret = GLEW_S3_s3tc; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) { #ifdef GL_SGIS_color_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) { ret = GLEW_SGIS_color_range; continue; } #endif #ifdef GL_SGIS_detail_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) { ret = GLEW_SGIS_detail_texture; continue; } #endif #ifdef GL_SGIS_fog_function if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) { ret = GLEW_SGIS_fog_function; continue; } #endif #ifdef GL_SGIS_generate_mipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) { ret = GLEW_SGIS_generate_mipmap; continue; } #endif #ifdef GL_SGIS_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLEW_SGIS_multisample; continue; } #endif #ifdef GL_SGIS_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) { ret = GLEW_SGIS_pixel_texture; continue; } #endif #ifdef GL_SGIS_point_line_texgen if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) { ret = GLEW_SGIS_point_line_texgen; continue; } #endif #ifdef GL_SGIS_sharpen_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) { ret = GLEW_SGIS_sharpen_texture; continue; } #endif #ifdef GL_SGIS_texture4D if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) { ret = GLEW_SGIS_texture4D; continue; } #endif #ifdef GL_SGIS_texture_border_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) { ret = GLEW_SGIS_texture_border_clamp; continue; } #endif #ifdef GL_SGIS_texture_edge_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) { ret = GLEW_SGIS_texture_edge_clamp; continue; } #endif #ifdef GL_SGIS_texture_filter4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) { ret = GLEW_SGIS_texture_filter4; continue; } #endif #ifdef GL_SGIS_texture_lod if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) { ret = GLEW_SGIS_texture_lod; continue; } #endif #ifdef GL_SGIS_texture_select if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) { ret = GLEW_SGIS_texture_select; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) { #ifdef GL_SGIX_async if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) { ret = GLEW_SGIX_async; continue; } #endif #ifdef GL_SGIX_async_histogram if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) { ret = GLEW_SGIX_async_histogram; continue; } #endif #ifdef GL_SGIX_async_pixel if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) { ret = GLEW_SGIX_async_pixel; continue; } #endif #ifdef GL_SGIX_blend_alpha_minmax if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) { ret = GLEW_SGIX_blend_alpha_minmax; continue; } #endif #ifdef GL_SGIX_clipmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) { ret = GLEW_SGIX_clipmap; continue; } #endif #ifdef GL_SGIX_convolution_accuracy if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) { ret = GLEW_SGIX_convolution_accuracy; continue; } #endif #ifdef GL_SGIX_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) { ret = GLEW_SGIX_depth_texture; continue; } #endif #ifdef GL_SGIX_flush_raster if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) { ret = GLEW_SGIX_flush_raster; continue; } #endif #ifdef GL_SGIX_fog_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) { ret = GLEW_SGIX_fog_offset; continue; } #endif #ifdef GL_SGIX_fog_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) { ret = GLEW_SGIX_fog_texture; continue; } #endif #ifdef GL_SGIX_fragment_specular_lighting if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) { ret = GLEW_SGIX_fragment_specular_lighting; continue; } #endif #ifdef GL_SGIX_framezoom if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) { ret = GLEW_SGIX_framezoom; continue; } #endif #ifdef GL_SGIX_interlace if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) { ret = GLEW_SGIX_interlace; continue; } #endif #ifdef GL_SGIX_ir_instrument1 if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) { ret = GLEW_SGIX_ir_instrument1; continue; } #endif #ifdef GL_SGIX_list_priority if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) { ret = GLEW_SGIX_list_priority; continue; } #endif #ifdef GL_SGIX_pixel_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) { ret = GLEW_SGIX_pixel_texture; continue; } #endif #ifdef GL_SGIX_pixel_texture_bits if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) { ret = GLEW_SGIX_pixel_texture_bits; continue; } #endif #ifdef GL_SGIX_reference_plane if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) { ret = GLEW_SGIX_reference_plane; continue; } #endif #ifdef GL_SGIX_resample if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) { ret = GLEW_SGIX_resample; continue; } #endif #ifdef GL_SGIX_shadow if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) { ret = GLEW_SGIX_shadow; continue; } #endif #ifdef GL_SGIX_shadow_ambient if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) { ret = GLEW_SGIX_shadow_ambient; continue; } #endif #ifdef GL_SGIX_sprite if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) { ret = GLEW_SGIX_sprite; continue; } #endif #ifdef GL_SGIX_tag_sample_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) { ret = GLEW_SGIX_tag_sample_buffer; continue; } #endif #ifdef GL_SGIX_texture_add_env if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) { ret = GLEW_SGIX_texture_add_env; continue; } #endif #ifdef GL_SGIX_texture_coordinate_clamp if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) { ret = GLEW_SGIX_texture_coordinate_clamp; continue; } #endif #ifdef GL_SGIX_texture_lod_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) { ret = GLEW_SGIX_texture_lod_bias; continue; } #endif #ifdef GL_SGIX_texture_multi_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) { ret = GLEW_SGIX_texture_multi_buffer; continue; } #endif #ifdef GL_SGIX_texture_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) { ret = GLEW_SGIX_texture_range; continue; } #endif #ifdef GL_SGIX_texture_scale_bias if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) { ret = GLEW_SGIX_texture_scale_bias; continue; } #endif #ifdef GL_SGIX_vertex_preclip if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) { ret = GLEW_SGIX_vertex_preclip; continue; } #endif #ifdef GL_SGIX_vertex_preclip_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) { ret = GLEW_SGIX_vertex_preclip_hint; continue; } #endif #ifdef GL_SGIX_ycrcb if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) { ret = GLEW_SGIX_ycrcb; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) { #ifdef GL_SGI_color_matrix if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) { ret = GLEW_SGI_color_matrix; continue; } #endif #ifdef GL_SGI_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) { ret = GLEW_SGI_color_table; continue; } #endif #ifdef GL_SGI_texture_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) { ret = GLEW_SGI_texture_color_table; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) { #ifdef GL_SUNX_constant_data if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) { ret = GLEW_SUNX_constant_data; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) { #ifdef GL_SUN_convolution_border_modes if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) { ret = GLEW_SUN_convolution_border_modes; continue; } #endif #ifdef GL_SUN_global_alpha if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) { ret = GLEW_SUN_global_alpha; continue; } #endif #ifdef GL_SUN_mesh_array if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) { ret = GLEW_SUN_mesh_array; continue; } #endif #ifdef GL_SUN_read_video_pixels if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) { ret = GLEW_SUN_read_video_pixels; continue; } #endif #ifdef GL_SUN_slice_accum if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) { ret = GLEW_SUN_slice_accum; continue; } #endif #ifdef GL_SUN_triangle_list if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) { ret = GLEW_SUN_triangle_list; continue; } #endif #ifdef GL_SUN_vertex if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) { ret = GLEW_SUN_vertex; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) { #ifdef GL_WIN_phong_shading if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) { ret = GLEW_WIN_phong_shading; continue; } #endif #ifdef GL_WIN_specular_fog if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) { ret = GLEW_WIN_specular_fog; continue; } #endif #ifdef GL_WIN_swap_hint if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) { ret = GLEW_WIN_swap_hint; continue; } #endif } } ret = (len == 0); } return ret; } #if defined(_WIN32) #if defined(GLEW_MX) GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name) #else GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) #endif { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef WGL_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_3DFX_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) { #ifdef WGL_3DL_stereo_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) { ret = WGLEW_3DL_stereo_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef WGL_AMD_gpu_association if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) { ret = WGLEW_AMD_gpu_association; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef WGL_ARB_buffer_region if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) { ret = WGLEW_ARB_buffer_region; continue; } #endif #ifdef WGL_ARB_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = WGLEW_ARB_context_flush_control; continue; } #endif #ifdef WGL_ARB_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = WGLEW_ARB_create_context; continue; } #endif #ifdef WGL_ARB_create_context_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) { ret = WGLEW_ARB_create_context_profile; continue; } #endif #ifdef WGL_ARB_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = WGLEW_ARB_create_context_robustness; continue; } #endif #ifdef WGL_ARB_extensions_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) { ret = WGLEW_ARB_extensions_string; continue; } #endif #ifdef WGL_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = WGLEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef WGL_ARB_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = WGLEW_ARB_make_current_read; continue; } #endif #ifdef WGL_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_ARB_multisample; continue; } #endif #ifdef WGL_ARB_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = WGLEW_ARB_pbuffer; continue; } #endif #ifdef WGL_ARB_pixel_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) { ret = WGLEW_ARB_pixel_format; continue; } #endif #ifdef WGL_ARB_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = WGLEW_ARB_pixel_format_float; continue; } #endif #ifdef WGL_ARB_render_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) { ret = WGLEW_ARB_render_texture; continue; } #endif #ifdef WGL_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = WGLEW_ARB_robustness_application_isolation; continue; } #endif #ifdef WGL_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = WGLEW_ARB_robustness_share_group_isolation; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef WGL_ATI_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = WGLEW_ATI_pixel_format_float; continue; } #endif #ifdef WGL_ATI_render_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) { ret = WGLEW_ATI_render_texture_rectangle; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef WGL_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { ret = WGLEW_EXT_create_context_es2_profile; continue; } #endif #ifdef WGL_EXT_create_context_es_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) { ret = WGLEW_EXT_create_context_es_profile; continue; } #endif #ifdef WGL_EXT_depth_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) { ret = WGLEW_EXT_depth_float; continue; } #endif #ifdef WGL_EXT_display_color_table if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) { ret = WGLEW_EXT_display_color_table; continue; } #endif #ifdef WGL_EXT_extensions_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) { ret = WGLEW_EXT_extensions_string; continue; } #endif #ifdef WGL_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = WGLEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef WGL_EXT_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = WGLEW_EXT_make_current_read; continue; } #endif #ifdef WGL_EXT_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = WGLEW_EXT_multisample; continue; } #endif #ifdef WGL_EXT_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = WGLEW_EXT_pbuffer; continue; } #endif #ifdef WGL_EXT_pixel_format if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) { ret = WGLEW_EXT_pixel_format; continue; } #endif #ifdef WGL_EXT_pixel_format_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) { ret = WGLEW_EXT_pixel_format_packed_float; continue; } #endif #ifdef WGL_EXT_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = WGLEW_EXT_swap_control; continue; } #endif #ifdef WGL_EXT_swap_control_tear if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) { ret = WGLEW_EXT_swap_control_tear; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) { #ifdef WGL_I3D_digital_video_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) { ret = WGLEW_I3D_digital_video_control; continue; } #endif #ifdef WGL_I3D_gamma if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) { ret = WGLEW_I3D_gamma; continue; } #endif #ifdef WGL_I3D_genlock if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) { ret = WGLEW_I3D_genlock; continue; } #endif #ifdef WGL_I3D_image_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) { ret = WGLEW_I3D_image_buffer; continue; } #endif #ifdef WGL_I3D_swap_frame_lock if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) { ret = WGLEW_I3D_swap_frame_lock; continue; } #endif #ifdef WGL_I3D_swap_frame_usage if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) { ret = WGLEW_I3D_swap_frame_usage; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef WGL_NV_DX_interop if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) { ret = WGLEW_NV_DX_interop; continue; } #endif #ifdef WGL_NV_DX_interop2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) { ret = WGLEW_NV_DX_interop2; continue; } #endif #ifdef WGL_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = WGLEW_NV_copy_image; continue; } #endif #ifdef WGL_NV_delay_before_swap if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) { ret = WGLEW_NV_delay_before_swap; continue; } #endif #ifdef WGL_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = WGLEW_NV_float_buffer; continue; } #endif #ifdef WGL_NV_gpu_affinity if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) { ret = WGLEW_NV_gpu_affinity; continue; } #endif #ifdef WGL_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = WGLEW_NV_multisample_coverage; continue; } #endif #ifdef WGL_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = WGLEW_NV_present_video; continue; } #endif #ifdef WGL_NV_render_depth_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) { ret = WGLEW_NV_render_depth_texture; continue; } #endif #ifdef WGL_NV_render_texture_rectangle if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) { ret = WGLEW_NV_render_texture_rectangle; continue; } #endif #ifdef WGL_NV_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = WGLEW_NV_swap_group; continue; } #endif #ifdef WGL_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = WGLEW_NV_vertex_array_range; continue; } #endif #ifdef WGL_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = WGLEW_NV_video_capture; continue; } #endif #ifdef WGL_NV_video_output if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) { ret = WGLEW_NV_video_output; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef WGL_OML_sync_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) { ret = WGLEW_OML_sync_control; continue; } #endif } } ret = (len == 0); } return ret; } #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(GLEW_MX) GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name) #else GLboolean glxewIsSupported (const char* name) #endif { const GLubyte* pos = (const GLubyte*)name; GLuint len = _glewStrLen(pos); GLboolean ret = GL_TRUE; while (ret && len > 0) { if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) { if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) { #ifdef GLX_VERSION_1_2 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) { ret = GLXEW_VERSION_1_2; continue; } #endif #ifdef GLX_VERSION_1_3 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) { ret = GLXEW_VERSION_1_3; continue; } #endif #ifdef GLX_VERSION_1_4 if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) { ret = GLXEW_VERSION_1_4; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) { #ifdef GLX_3DFX_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_3DFX_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) { #ifdef GLX_AMD_gpu_association if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) { ret = GLXEW_AMD_gpu_association; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) { #ifdef GLX_ARB_context_flush_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) { ret = GLXEW_ARB_context_flush_control; continue; } #endif #ifdef GLX_ARB_create_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) { ret = GLXEW_ARB_create_context; continue; } #endif #ifdef GLX_ARB_create_context_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) { ret = GLXEW_ARB_create_context_profile; continue; } #endif #ifdef GLX_ARB_create_context_robustness if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) { ret = GLXEW_ARB_create_context_robustness; continue; } #endif #ifdef GLX_ARB_fbconfig_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) { ret = GLXEW_ARB_fbconfig_float; continue; } #endif #ifdef GLX_ARB_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLXEW_ARB_framebuffer_sRGB; continue; } #endif #ifdef GLX_ARB_get_proc_address if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) { ret = GLXEW_ARB_get_proc_address; continue; } #endif #ifdef GLX_ARB_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_ARB_multisample; continue; } #endif #ifdef GLX_ARB_robustness_application_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) { ret = GLXEW_ARB_robustness_application_isolation; continue; } #endif #ifdef GLX_ARB_robustness_share_group_isolation if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) { ret = GLXEW_ARB_robustness_share_group_isolation; continue; } #endif #ifdef GLX_ARB_vertex_buffer_object if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) { ret = GLXEW_ARB_vertex_buffer_object; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) { #ifdef GLX_ATI_pixel_format_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) { ret = GLXEW_ATI_pixel_format_float; continue; } #endif #ifdef GLX_ATI_render_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) { ret = GLXEW_ATI_render_texture; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { #ifdef GLX_EXT_buffer_age if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) { ret = GLXEW_EXT_buffer_age; continue; } #endif #ifdef GLX_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { ret = GLXEW_EXT_create_context_es2_profile; continue; } #endif #ifdef GLX_EXT_create_context_es_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) { ret = GLXEW_EXT_create_context_es_profile; continue; } #endif #ifdef GLX_EXT_fbconfig_packed_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) { ret = GLXEW_EXT_fbconfig_packed_float; continue; } #endif #ifdef GLX_EXT_framebuffer_sRGB if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) { ret = GLXEW_EXT_framebuffer_sRGB; continue; } #endif #ifdef GLX_EXT_import_context if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) { ret = GLXEW_EXT_import_context; continue; } #endif #ifdef GLX_EXT_scene_marker if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) { ret = GLXEW_EXT_scene_marker; continue; } #endif #ifdef GLX_EXT_stereo_tree if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) { ret = GLXEW_EXT_stereo_tree; continue; } #endif #ifdef GLX_EXT_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_EXT_swap_control; continue; } #endif #ifdef GLX_EXT_swap_control_tear if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) { ret = GLXEW_EXT_swap_control_tear; continue; } #endif #ifdef GLX_EXT_texture_from_pixmap if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) { ret = GLXEW_EXT_texture_from_pixmap; continue; } #endif #ifdef GLX_EXT_visual_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) { ret = GLXEW_EXT_visual_info; continue; } #endif #ifdef GLX_EXT_visual_rating if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) { ret = GLXEW_EXT_visual_rating; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { #ifdef GLX_INTEL_swap_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) { ret = GLXEW_INTEL_swap_event; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) { #ifdef GLX_MESA_agp_offset if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) { ret = GLXEW_MESA_agp_offset; continue; } #endif #ifdef GLX_MESA_copy_sub_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) { ret = GLXEW_MESA_copy_sub_buffer; continue; } #endif #ifdef GLX_MESA_pixmap_colormap if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) { ret = GLXEW_MESA_pixmap_colormap; continue; } #endif #ifdef GLX_MESA_query_renderer if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) { ret = GLXEW_MESA_query_renderer; continue; } #endif #ifdef GLX_MESA_release_buffers if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) { ret = GLXEW_MESA_release_buffers; continue; } #endif #ifdef GLX_MESA_set_3dfx_mode if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) { ret = GLXEW_MESA_set_3dfx_mode; continue; } #endif #ifdef GLX_MESA_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_MESA_swap_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { #ifdef GLX_NV_copy_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) { ret = GLXEW_NV_copy_buffer; continue; } #endif #ifdef GLX_NV_copy_image if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) { ret = GLXEW_NV_copy_image; continue; } #endif #ifdef GLX_NV_delay_before_swap if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) { ret = GLXEW_NV_delay_before_swap; continue; } #endif #ifdef GLX_NV_float_buffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) { ret = GLXEW_NV_float_buffer; continue; } #endif #ifdef GLX_NV_multisample_coverage if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) { ret = GLXEW_NV_multisample_coverage; continue; } #endif #ifdef GLX_NV_present_video if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) { ret = GLXEW_NV_present_video; continue; } #endif #ifdef GLX_NV_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = GLXEW_NV_swap_group; continue; } #endif #ifdef GLX_NV_vertex_array_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) { ret = GLXEW_NV_vertex_array_range; continue; } #endif #ifdef GLX_NV_video_capture if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) { ret = GLXEW_NV_video_capture; continue; } #endif #ifdef GLX_NV_video_out if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) { ret = GLXEW_NV_video_out; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) { #ifdef GLX_OML_swap_method if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) { ret = GLXEW_OML_swap_method; continue; } #endif #ifdef GLX_OML_sync_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) { ret = GLXEW_OML_sync_control; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) { #ifdef GLX_SGIS_blended_overlay if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) { ret = GLXEW_SGIS_blended_overlay; continue; } #endif #ifdef GLX_SGIS_color_range if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) { ret = GLXEW_SGIS_color_range; continue; } #endif #ifdef GLX_SGIS_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) { ret = GLXEW_SGIS_multisample; continue; } #endif #ifdef GLX_SGIS_shared_multisample if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) { ret = GLXEW_SGIS_shared_multisample; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) { #ifdef GLX_SGIX_fbconfig if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) { ret = GLXEW_SGIX_fbconfig; continue; } #endif #ifdef GLX_SGIX_hyperpipe if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) { ret = GLXEW_SGIX_hyperpipe; continue; } #endif #ifdef GLX_SGIX_pbuffer if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) { ret = GLXEW_SGIX_pbuffer; continue; } #endif #ifdef GLX_SGIX_swap_barrier if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) { ret = GLXEW_SGIX_swap_barrier; continue; } #endif #ifdef GLX_SGIX_swap_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) { ret = GLXEW_SGIX_swap_group; continue; } #endif #ifdef GLX_SGIX_video_resize if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) { ret = GLXEW_SGIX_video_resize; continue; } #endif #ifdef GLX_SGIX_visual_select_group if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) { ret = GLXEW_SGIX_visual_select_group; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) { #ifdef GLX_SGI_cushion if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) { ret = GLXEW_SGI_cushion; continue; } #endif #ifdef GLX_SGI_make_current_read if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) { ret = GLXEW_SGI_make_current_read; continue; } #endif #ifdef GLX_SGI_swap_control if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) { ret = GLXEW_SGI_swap_control; continue; } #endif #ifdef GLX_SGI_video_sync if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) { ret = GLXEW_SGI_video_sync; continue; } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) { #ifdef GLX_SUN_get_transparent_index if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) { ret = GLXEW_SUN_get_transparent_index; continue; } #endif #ifdef GLX_SUN_video_resize if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) { ret = GLXEW_SUN_video_resize; continue; } #endif } } ret = (len == 0); } return ret; } #endif /* _WIN32 */ �����������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/glew/glew.h��������������������������������������������������������������0000664�0000000�0000000�00003705654�12660066715�0017627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net> ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org> ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org> ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* * Mesa 3-D graphics library * Version: 7.0 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * 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 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are 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 Materials. ** ** THE MATERIALS ARE 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __glew_h__ #define __glew_h__ #define __GLEW_H__ #if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) #error gl.h included before glew.h #endif #if defined(__gl2_h_) #error gl2.h included before glew.h #endif #if defined(__gltypes_h_) #error gltypes.h included before glew.h #endif #if defined(__REGAL_H__) #error Regal.h included before glew.h #endif #if defined(__glext_h_) || defined(__GLEXT_H_) #error glext.h included before glew.h #endif #if defined(__gl_ATI_h_) #error glATI.h included before glew.h #endif #define __gl_h_ #define __gl2_h_ #define __GL_H__ #define _GL_H #define __gltypes_h_ #define __REGAL_H__ #define __X_GL_H #define __glext_h_ #define __GLEXT_H_ #define __gl_ATI_h_ #if defined(_WIN32) /* * GLEW does not include <windows.h> to avoid name space pollution. * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t * defined properly. */ /* <windef.h> and <gl.h>*/ #ifdef APIENTRY # ifndef GLAPIENTRY # define GLAPIENTRY APIENTRY # endif # ifndef GLEWAPIENTRY # define GLEWAPIENTRY APIENTRY # endif #else #define GLEW_APIENTRY_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) # define APIENTRY __stdcall # ifndef GLAPIENTRY # define GLAPIENTRY __stdcall # endif # ifndef GLEWAPIENTRY # define GLEWAPIENTRY __stdcall # endif # else # define APIENTRY # endif #endif #ifndef GLAPI # if defined(__MINGW32__) || defined(__CYGWIN__) # define GLAPI extern # endif #endif /* <winnt.h> */ #ifndef CALLBACK #define GLEW_CALLBACK_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) # define CALLBACK __attribute__ ((__stdcall__)) # elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) # define CALLBACK __stdcall # else # define CALLBACK # endif #endif /* <wingdi.h> and <winnt.h> */ #ifndef WINGDIAPI #define GLEW_WINGDIAPI_DEFINED #define WINGDIAPI __declspec(dllimport) #endif /* <ctype.h> */ #if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) typedef unsigned short wchar_t; # define _WCHAR_T_DEFINED #endif /* <stddef.h> */ #if !defined(_W64) # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif #if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) # ifdef _WIN64 typedef __int64 ptrdiff_t; # else typedef _W64 int ptrdiff_t; # endif # define _PTRDIFF_T_DEFINED # define _PTRDIFF_T_ #endif #ifndef GLAPI # if defined(__MINGW32__) || defined(__CYGWIN__) # define GLAPI extern # else # define GLAPI WINGDIAPI # endif #endif /* * GLEW_STATIC is defined for static library. * GLEW_BUILD is defined for building the DLL library. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #else /* _UNIX */ /* * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO * C. On my system, this amounts to _3 lines_ of included code, all of * them pretty much harmless. If you know of a way of detecting 32 vs * 64 _targets_ at compile time you are free to replace this with * something that's portable. For now, _this_ is the portable solution. * (mem, 2004-01-04) */ #include <stddef.h> /* SGI MIPSPro doesn't like stdint.h in C++ mode */ /* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ #if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) #include <inttypes.h> #else #include <stdint.h> #endif #define GLEW_APIENTRY_DEFINED #define APIENTRY /* * GLEW_STATIC is defined for static library. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # if defined(__GNUC__) && __GNUC__>=4 # define GLEWAPI extern __attribute__ ((visibility("default"))) # elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) # define GLEWAPI extern __global # else # define GLEWAPI extern # endif #endif /* <glu.h> */ #ifndef GLAPI #define GLAPI extern #endif #endif /* _WIN32 */ #ifndef GLAPIENTRY #define GLAPIENTRY #endif #ifndef GLEWAPIENTRY #define GLEWAPIENTRY #endif #ifdef __cplusplus extern "C" { #endif /* ----------------------------- GL_VERSION_1_1 ---------------------------- */ #ifndef GL_VERSION_1_1 #define GL_VERSION_1_1 1 typedef unsigned int GLenum; typedef unsigned int GLbitfield; typedef unsigned int GLuint; typedef int GLint; typedef int GLsizei; typedef unsigned char GLboolean; typedef signed char GLbyte; typedef short GLshort; typedef unsigned char GLubyte; typedef unsigned short GLushort; typedef unsigned long GLulong; typedef float GLfloat; typedef float GLclampf; typedef double GLdouble; typedef double GLclampd; typedef void GLvoid; #if defined(_MSC_VER) && _MSC_VER < 1400 typedef __int64 GLint64EXT; typedef unsigned __int64 GLuint64EXT; #elif defined(_MSC_VER) || defined(__BORLANDC__) typedef signed long long GLint64EXT; typedef unsigned long long GLuint64EXT; #else # if defined(__MINGW32__) || defined(__CYGWIN__) #include <inttypes.h> # endif typedef int64_t GLint64EXT; typedef uint64_t GLuint64EXT; #endif typedef GLint64EXT GLint64; typedef GLuint64EXT GLuint64; typedef struct __GLsync *GLsync; typedef char GLchar; #define GL_ZERO 0 #define GL_FALSE 0 #define GL_LOGIC_OP 0x0BF1 #define GL_NONE 0 #define GL_TEXTURE_COMPONENTS 0x1003 #define GL_NO_ERROR 0 #define GL_POINTS 0x0000 #define GL_CURRENT_BIT 0x00000001 #define GL_TRUE 1 #define GL_ONE 1 #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 #define GL_LINES 0x0001 #define GL_LINE_LOOP 0x0002 #define GL_POINT_BIT 0x00000002 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 #define GL_LINE_STRIP 0x0003 #define GL_LINE_BIT 0x00000004 #define GL_TRIANGLES 0x0004 #define GL_TRIANGLE_STRIP 0x0005 #define GL_TRIANGLE_FAN 0x0006 #define GL_QUADS 0x0007 #define GL_QUAD_STRIP 0x0008 #define GL_POLYGON_BIT 0x00000008 #define GL_POLYGON 0x0009 #define GL_POLYGON_STIPPLE_BIT 0x00000010 #define GL_PIXEL_MODE_BIT 0x00000020 #define GL_LIGHTING_BIT 0x00000040 #define GL_FOG_BIT 0x00000080 #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GL_ACCUM 0x0100 #define GL_LOAD 0x0101 #define GL_RETURN 0x0102 #define GL_MULT 0x0103 #define GL_ADD 0x0104 #define GL_NEVER 0x0200 #define GL_ACCUM_BUFFER_BIT 0x00000200 #define GL_LESS 0x0201 #define GL_EQUAL 0x0202 #define GL_LEQUAL 0x0203 #define GL_GREATER 0x0204 #define GL_NOTEQUAL 0x0205 #define GL_GEQUAL 0x0206 #define GL_ALWAYS 0x0207 #define GL_SRC_COLOR 0x0300 #define GL_ONE_MINUS_SRC_COLOR 0x0301 #define GL_SRC_ALPHA 0x0302 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_DST_ALPHA 0x0304 #define GL_ONE_MINUS_DST_ALPHA 0x0305 #define GL_DST_COLOR 0x0306 #define GL_ONE_MINUS_DST_COLOR 0x0307 #define GL_SRC_ALPHA_SATURATE 0x0308 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 #define GL_LEFT 0x0406 #define GL_RIGHT 0x0407 #define GL_FRONT_AND_BACK 0x0408 #define GL_AUX0 0x0409 #define GL_AUX1 0x040A #define GL_AUX2 0x040B #define GL_AUX3 0x040C #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_VALUE 0x0501 #define GL_INVALID_OPERATION 0x0502 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_OUT_OF_MEMORY 0x0505 #define GL_2D 0x0600 #define GL_3D 0x0601 #define GL_3D_COLOR 0x0602 #define GL_3D_COLOR_TEXTURE 0x0603 #define GL_4D_COLOR_TEXTURE 0x0604 #define GL_PASS_THROUGH_TOKEN 0x0700 #define GL_POINT_TOKEN 0x0701 #define GL_LINE_TOKEN 0x0702 #define GL_POLYGON_TOKEN 0x0703 #define GL_BITMAP_TOKEN 0x0704 #define GL_DRAW_PIXEL_TOKEN 0x0705 #define GL_COPY_PIXEL_TOKEN 0x0706 #define GL_LINE_RESET_TOKEN 0x0707 #define GL_EXP 0x0800 #define GL_VIEWPORT_BIT 0x00000800 #define GL_EXP2 0x0801 #define GL_CW 0x0900 #define GL_CCW 0x0901 #define GL_COEFF 0x0A00 #define GL_ORDER 0x0A01 #define GL_DOMAIN 0x0A02 #define GL_CURRENT_COLOR 0x0B00 #define GL_CURRENT_INDEX 0x0B01 #define GL_CURRENT_NORMAL 0x0B02 #define GL_CURRENT_TEXTURE_COORDS 0x0B03 #define GL_CURRENT_RASTER_COLOR 0x0B04 #define GL_CURRENT_RASTER_INDEX 0x0B05 #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 #define GL_CURRENT_RASTER_POSITION 0x0B07 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 #define GL_CURRENT_RASTER_DISTANCE 0x0B09 #define GL_POINT_SMOOTH 0x0B10 #define GL_POINT_SIZE 0x0B11 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_POINT_SIZE_GRANULARITY 0x0B13 #define GL_LINE_SMOOTH 0x0B20 #define GL_LINE_WIDTH 0x0B21 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_LINE_STIPPLE 0x0B24 #define GL_LINE_STIPPLE_PATTERN 0x0B25 #define GL_LINE_STIPPLE_REPEAT 0x0B26 #define GL_LIST_MODE 0x0B30 #define GL_MAX_LIST_NESTING 0x0B31 #define GL_LIST_BASE 0x0B32 #define GL_LIST_INDEX 0x0B33 #define GL_POLYGON_MODE 0x0B40 #define GL_POLYGON_SMOOTH 0x0B41 #define GL_POLYGON_STIPPLE 0x0B42 #define GL_EDGE_FLAG 0x0B43 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_FRONT_FACE 0x0B46 #define GL_LIGHTING 0x0B50 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 #define GL_SHADE_MODEL 0x0B54 #define GL_COLOR_MATERIAL_FACE 0x0B55 #define GL_COLOR_MATERIAL_PARAMETER 0x0B56 #define GL_COLOR_MATERIAL 0x0B57 #define GL_FOG 0x0B60 #define GL_FOG_INDEX 0x0B61 #define GL_FOG_DENSITY 0x0B62 #define GL_FOG_START 0x0B63 #define GL_FOG_END 0x0B64 #define GL_FOG_MODE 0x0B65 #define GL_FOG_COLOR 0x0B66 #define GL_DEPTH_RANGE 0x0B70 #define GL_DEPTH_TEST 0x0B71 #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_DEPTH_FUNC 0x0B74 #define GL_ACCUM_CLEAR_VALUE 0x0B80 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_CLEAR_VALUE 0x0B91 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_MATRIX_MODE 0x0BA0 #define GL_NORMALIZE 0x0BA1 #define GL_VIEWPORT 0x0BA2 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3 #define GL_PROJECTION_STACK_DEPTH 0x0BA4 #define GL_TEXTURE_STACK_DEPTH 0x0BA5 #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_PROJECTION_MATRIX 0x0BA7 #define GL_TEXTURE_MATRIX 0x0BA8 #define GL_ATTRIB_STACK_DEPTH 0x0BB0 #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 #define GL_ALPHA_TEST 0x0BC0 #define GL_ALPHA_TEST_FUNC 0x0BC1 #define GL_ALPHA_TEST_REF 0x0BC2 #define GL_DITHER 0x0BD0 #define GL_BLEND_DST 0x0BE0 #define GL_BLEND_SRC 0x0BE1 #define GL_BLEND 0x0BE2 #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_INDEX_LOGIC_OP 0x0BF1 #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_AUX_BUFFERS 0x0C00 #define GL_DRAW_BUFFER 0x0C01 #define GL_READ_BUFFER 0x0C02 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_INDEX_CLEAR_VALUE 0x0C20 #define GL_INDEX_WRITEMASK 0x0C21 #define GL_COLOR_CLEAR_VALUE 0x0C22 #define GL_COLOR_WRITEMASK 0x0C23 #define GL_INDEX_MODE 0x0C30 #define GL_RGBA_MODE 0x0C31 #define GL_DOUBLEBUFFER 0x0C32 #define GL_STEREO 0x0C33 #define GL_RENDER_MODE 0x0C40 #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 #define GL_POINT_SMOOTH_HINT 0x0C51 #define GL_LINE_SMOOTH_HINT 0x0C52 #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_FOG_HINT 0x0C54 #define GL_TEXTURE_GEN_S 0x0C60 #define GL_TEXTURE_GEN_T 0x0C61 #define GL_TEXTURE_GEN_R 0x0C62 #define GL_TEXTURE_GEN_Q 0x0C63 #define GL_PIXEL_MAP_I_TO_I 0x0C70 #define GL_PIXEL_MAP_S_TO_S 0x0C71 #define GL_PIXEL_MAP_I_TO_R 0x0C72 #define GL_PIXEL_MAP_I_TO_G 0x0C73 #define GL_PIXEL_MAP_I_TO_B 0x0C74 #define GL_PIXEL_MAP_I_TO_A 0x0C75 #define GL_PIXEL_MAP_R_TO_R 0x0C76 #define GL_PIXEL_MAP_G_TO_G 0x0C77 #define GL_PIXEL_MAP_B_TO_B 0x0C78 #define GL_PIXEL_MAP_A_TO_A 0x0C79 #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 #define GL_UNPACK_SWAP_BYTES 0x0CF0 #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_PACK_SWAP_BYTES 0x0D00 #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_MAP_COLOR 0x0D10 #define GL_MAP_STENCIL 0x0D11 #define GL_INDEX_SHIFT 0x0D12 #define GL_INDEX_OFFSET 0x0D13 #define GL_RED_SCALE 0x0D14 #define GL_RED_BIAS 0x0D15 #define GL_ZOOM_X 0x0D16 #define GL_ZOOM_Y 0x0D17 #define GL_GREEN_SCALE 0x0D18 #define GL_GREEN_BIAS 0x0D19 #define GL_BLUE_SCALE 0x0D1A #define GL_BLUE_BIAS 0x0D1B #define GL_ALPHA_SCALE 0x0D1C #define GL_ALPHA_BIAS 0x0D1D #define GL_DEPTH_SCALE 0x0D1E #define GL_DEPTH_BIAS 0x0D1F #define GL_MAX_EVAL_ORDER 0x0D30 #define GL_MAX_LIGHTS 0x0D31 #define GL_MAX_CLIP_PLANES 0x0D32 #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_MAX_PIXEL_MAP_TABLE 0x0D34 #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 #define GL_MAX_NAME_STACK_DEPTH 0x0D37 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 #define GL_MAX_VIEWPORT_DIMS 0x0D3A #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B #define GL_SUBPIXEL_BITS 0x0D50 #define GL_INDEX_BITS 0x0D51 #define GL_RED_BITS 0x0D52 #define GL_GREEN_BITS 0x0D53 #define GL_BLUE_BITS 0x0D54 #define GL_ALPHA_BITS 0x0D55 #define GL_DEPTH_BITS 0x0D56 #define GL_STENCIL_BITS 0x0D57 #define GL_ACCUM_RED_BITS 0x0D58 #define GL_ACCUM_GREEN_BITS 0x0D59 #define GL_ACCUM_BLUE_BITS 0x0D5A #define GL_ACCUM_ALPHA_BITS 0x0D5B #define GL_NAME_STACK_DEPTH 0x0D70 #define GL_AUTO_NORMAL 0x0D80 #define GL_MAP1_COLOR_4 0x0D90 #define GL_MAP1_INDEX 0x0D91 #define GL_MAP1_NORMAL 0x0D92 #define GL_MAP1_TEXTURE_COORD_1 0x0D93 #define GL_MAP1_TEXTURE_COORD_2 0x0D94 #define GL_MAP1_TEXTURE_COORD_3 0x0D95 #define GL_MAP1_TEXTURE_COORD_4 0x0D96 #define GL_MAP1_VERTEX_3 0x0D97 #define GL_MAP1_VERTEX_4 0x0D98 #define GL_MAP2_COLOR_4 0x0DB0 #define GL_MAP2_INDEX 0x0DB1 #define GL_MAP2_NORMAL 0x0DB2 #define GL_MAP2_TEXTURE_COORD_1 0x0DB3 #define GL_MAP2_TEXTURE_COORD_2 0x0DB4 #define GL_MAP2_TEXTURE_COORD_3 0x0DB5 #define GL_MAP2_TEXTURE_COORD_4 0x0DB6 #define GL_MAP2_VERTEX_3 0x0DB7 #define GL_MAP2_VERTEX_4 0x0DB8 #define GL_MAP1_GRID_DOMAIN 0x0DD0 #define GL_MAP1_GRID_SEGMENTS 0x0DD1 #define GL_MAP2_GRID_DOMAIN 0x0DD2 #define GL_MAP2_GRID_SEGMENTS 0x0DD3 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 #define GL_SELECTION_BUFFER_POINTER 0x0DF3 #define GL_SELECTION_BUFFER_SIZE 0x0DF4 #define GL_TEXTURE_WIDTH 0x1000 #define GL_TRANSFORM_BIT 0x00001000 #define GL_TEXTURE_HEIGHT 0x1001 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_TEXTURE_BORDER 0x1005 #define GL_DONT_CARE 0x1100 #define GL_FASTEST 0x1101 #define GL_NICEST 0x1102 #define GL_AMBIENT 0x1200 #define GL_DIFFUSE 0x1201 #define GL_SPECULAR 0x1202 #define GL_POSITION 0x1203 #define GL_SPOT_DIRECTION 0x1204 #define GL_SPOT_EXPONENT 0x1205 #define GL_SPOT_CUTOFF 0x1206 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_LINEAR_ATTENUATION 0x1208 #define GL_QUADRATIC_ATTENUATION 0x1209 #define GL_COMPILE 0x1300 #define GL_COMPILE_AND_EXECUTE 0x1301 #define GL_BYTE 0x1400 #define GL_UNSIGNED_BYTE 0x1401 #define GL_SHORT 0x1402 #define GL_UNSIGNED_SHORT 0x1403 #define GL_INT 0x1404 #define GL_UNSIGNED_INT 0x1405 #define GL_FLOAT 0x1406 #define GL_2_BYTES 0x1407 #define GL_3_BYTES 0x1408 #define GL_4_BYTES 0x1409 #define GL_DOUBLE 0x140A #define GL_CLEAR 0x1500 #define GL_AND 0x1501 #define GL_AND_REVERSE 0x1502 #define GL_COPY 0x1503 #define GL_AND_INVERTED 0x1504 #define GL_NOOP 0x1505 #define GL_XOR 0x1506 #define GL_OR 0x1507 #define GL_NOR 0x1508 #define GL_EQUIV 0x1509 #define GL_INVERT 0x150A #define GL_OR_REVERSE 0x150B #define GL_COPY_INVERTED 0x150C #define GL_OR_INVERTED 0x150D #define GL_NAND 0x150E #define GL_SET 0x150F #define GL_EMISSION 0x1600 #define GL_SHININESS 0x1601 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_COLOR_INDEXES 0x1603 #define GL_MODELVIEW 0x1700 #define GL_PROJECTION 0x1701 #define GL_TEXTURE 0x1702 #define GL_COLOR 0x1800 #define GL_DEPTH 0x1801 #define GL_STENCIL 0x1802 #define GL_COLOR_INDEX 0x1900 #define GL_STENCIL_INDEX 0x1901 #define GL_DEPTH_COMPONENT 0x1902 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190A #define GL_BITMAP 0x1A00 #define GL_POINT 0x1B00 #define GL_LINE 0x1B01 #define GL_FILL 0x1B02 #define GL_RENDER 0x1C00 #define GL_FEEDBACK 0x1C01 #define GL_SELECT 0x1C02 #define GL_FLAT 0x1D00 #define GL_SMOOTH 0x1D01 #define GL_KEEP 0x1E00 #define GL_REPLACE 0x1E01 #define GL_INCR 0x1E02 #define GL_DECR 0x1E03 #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 #define GL_EXTENSIONS 0x1F03 #define GL_S 0x2000 #define GL_ENABLE_BIT 0x00002000 #define GL_T 0x2001 #define GL_R 0x2002 #define GL_Q 0x2003 #define GL_MODULATE 0x2100 #define GL_DECAL 0x2101 #define GL_TEXTURE_ENV_MODE 0x2200 #define GL_TEXTURE_ENV_COLOR 0x2201 #define GL_TEXTURE_ENV 0x2300 #define GL_EYE_LINEAR 0x2400 #define GL_OBJECT_LINEAR 0x2401 #define GL_SPHERE_MAP 0x2402 #define GL_TEXTURE_GEN_MODE 0x2500 #define GL_OBJECT_PLANE 0x2501 #define GL_EYE_PLANE 0x2502 #define GL_NEAREST 0x2600 #define GL_LINEAR 0x2601 #define GL_NEAREST_MIPMAP_NEAREST 0x2700 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 #define GL_CLAMP 0x2900 #define GL_REPEAT 0x2901 #define GL_POLYGON_OFFSET_UNITS 0x2A00 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_POLYGON_OFFSET_LINE 0x2A02 #define GL_R3_G3_B2 0x2A10 #define GL_V2F 0x2A20 #define GL_V3F 0x2A21 #define GL_C4UB_V2F 0x2A22 #define GL_C4UB_V3F 0x2A23 #define GL_C3F_V3F 0x2A24 #define GL_N3F_V3F 0x2A25 #define GL_C4F_N3F_V3F 0x2A26 #define GL_T2F_V3F 0x2A27 #define GL_T4F_V4F 0x2A28 #define GL_T2F_C4UB_V3F 0x2A29 #define GL_T2F_C3F_V3F 0x2A2A #define GL_T2F_N3F_V3F 0x2A2B #define GL_T2F_C4F_N3F_V3F 0x2A2C #define GL_T4F_C4F_N3F_V4F 0x2A2D #define GL_CLIP_PLANE0 0x3000 #define GL_CLIP_PLANE1 0x3001 #define GL_CLIP_PLANE2 0x3002 #define GL_CLIP_PLANE3 0x3003 #define GL_CLIP_PLANE4 0x3004 #define GL_CLIP_PLANE5 0x3005 #define GL_LIGHT0 0x4000 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_LIGHT1 0x4001 #define GL_LIGHT2 0x4002 #define GL_LIGHT3 0x4003 #define GL_LIGHT4 0x4004 #define GL_LIGHT5 0x4005 #define GL_LIGHT6 0x4006 #define GL_LIGHT7 0x4007 #define GL_HINT_BIT 0x00008000 #define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_ALPHA4 0x803B #define GL_ALPHA8 0x803C #define GL_ALPHA12 0x803D #define GL_ALPHA16 0x803E #define GL_LUMINANCE4 0x803F #define GL_LUMINANCE8 0x8040 #define GL_LUMINANCE12 0x8041 #define GL_LUMINANCE16 0x8042 #define GL_LUMINANCE4_ALPHA4 0x8043 #define GL_LUMINANCE6_ALPHA2 0x8044 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_LUMINANCE12_ALPHA4 0x8046 #define GL_LUMINANCE12_ALPHA12 0x8047 #define GL_LUMINANCE16_ALPHA16 0x8048 #define GL_INTENSITY 0x8049 #define GL_INTENSITY4 0x804A #define GL_INTENSITY8 0x804B #define GL_INTENSITY12 0x804C #define GL_INTENSITY16 0x804D #define GL_RGB4 0x804F #define GL_RGB5 0x8050 #define GL_RGB8 0x8051 #define GL_RGB10 0x8052 #define GL_RGB12 0x8053 #define GL_RGB16 0x8054 #define GL_RGBA2 0x8055 #define GL_RGBA4 0x8056 #define GL_RGB5_A1 0x8057 #define GL_RGBA8 0x8058 #define GL_RGB10_A2 0x8059 #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B #define GL_TEXTURE_RED_SIZE 0x805C #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_TEXTURE_ALPHA_SIZE 0x805F #define GL_TEXTURE_LUMINANCE_SIZE 0x8060 #define GL_TEXTURE_INTENSITY_SIZE 0x8061 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_TEXTURE_PRIORITY 0x8066 #define GL_TEXTURE_RESIDENT 0x8067 #define GL_TEXTURE_BINDING_1D 0x8068 #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_VERTEX_ARRAY 0x8074 #define GL_NORMAL_ARRAY 0x8075 #define GL_COLOR_ARRAY 0x8076 #define GL_INDEX_ARRAY 0x8077 #define GL_TEXTURE_COORD_ARRAY 0x8078 #define GL_EDGE_FLAG_ARRAY 0x8079 #define GL_VERTEX_ARRAY_SIZE 0x807A #define GL_VERTEX_ARRAY_TYPE 0x807B #define GL_VERTEX_ARRAY_STRIDE 0x807C #define GL_NORMAL_ARRAY_TYPE 0x807E #define GL_NORMAL_ARRAY_STRIDE 0x807F #define GL_COLOR_ARRAY_SIZE 0x8081 #define GL_COLOR_ARRAY_TYPE 0x8082 #define GL_COLOR_ARRAY_STRIDE 0x8083 #define GL_INDEX_ARRAY_TYPE 0x8085 #define GL_INDEX_ARRAY_STRIDE 0x8086 #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C #define GL_VERTEX_ARRAY_POINTER 0x808E #define GL_NORMAL_ARRAY_POINTER 0x808F #define GL_COLOR_ARRAY_POINTER 0x8090 #define GL_INDEX_ARRAY_POINTER 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_EVAL_BIT 0x00010000 #define GL_LIST_BIT 0x00020000 #define GL_TEXTURE_BIT 0x00040000 #define GL_SCISSOR_BIT 0x00080000 #define GL_ALL_ATTRIB_BITS 0x000fffff #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); GLAPI void GLAPIENTRY glArrayElement (GLint i); GLAPI void GLAPIENTRY glBegin (GLenum mode); GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); GLAPI void GLAPIENTRY glCallList (GLuint list); GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); GLAPI void GLAPIENTRY glClear (GLbitfield mask); GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); GLAPI void GLAPIENTRY glClearIndex (GLfloat c); GLAPI void GLAPIENTRY glClearStencil (GLint s); GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); GLAPI void GLAPIENTRY glColor3iv (const GLint *v); GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); GLAPI void GLAPIENTRY glColor4iv (const GLint *v); GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void GLAPIENTRY glCullFace (GLenum mode); GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); GLAPI void GLAPIENTRY glDepthFunc (GLenum func); GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); GLAPI void GLAPIENTRY glDisable (GLenum cap); GLAPI void GLAPIENTRY glDisableClientState (GLenum array); GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); GLAPI void GLAPIENTRY glEnable (GLenum cap); GLAPI void GLAPIENTRY glEnableClientState (GLenum array); GLAPI void GLAPIENTRY glEnd (void); GLAPI void GLAPIENTRY glEndList (void); GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); GLAPI void GLAPIENTRY glFinish (void); GLAPI void GLAPIENTRY glFlush (void); GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glFrontFace (GLenum mode); GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); GLAPI GLenum GLAPIENTRY glGetError (void); GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); GLAPI void GLAPIENTRY glIndexMask (GLuint mask); GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glIndexd (GLdouble c); GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); GLAPI void GLAPIENTRY glIndexf (GLfloat c); GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); GLAPI void GLAPIENTRY glIndexi (GLint c); GLAPI void GLAPIENTRY glIndexiv (const GLint *c); GLAPI void GLAPIENTRY glIndexs (GLshort c); GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); GLAPI void GLAPIENTRY glIndexub (GLubyte c); GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); GLAPI void GLAPIENTRY glInitNames (void); GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); GLAPI void GLAPIENTRY glLineWidth (GLfloat width); GLAPI void GLAPIENTRY glListBase (GLuint base); GLAPI void GLAPIENTRY glLoadIdentity (void); GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); GLAPI void GLAPIENTRY glLoadName (GLuint name); GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI void GLAPIENTRY glPassThrough (GLfloat token); GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); GLAPI void GLAPIENTRY glPointSize (GLfloat size); GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); GLAPI void GLAPIENTRY glPopAttrib (void); GLAPI void GLAPIENTRY glPopClientAttrib (void); GLAPI void GLAPIENTRY glPopMatrix (void); GLAPI void GLAPIENTRY glPopName (void); GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); GLAPI void GLAPIENTRY glPushMatrix (void); GLAPI void GLAPIENTRY glPushName (GLuint name); GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); GLAPI void GLAPIENTRY glShadeModel (GLenum mode); GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); GLAPI void GLAPIENTRY glStencilMask (GLuint mask); GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord1i (GLint s); GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); #define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) #endif /* GL_VERSION_1_1 */ /* ---------------------------------- GLU ---------------------------------- */ #ifndef GLEW_NO_GLU # ifdef __APPLE__ # include <Availability.h> # if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) # define GLEW_NO_GLU # endif # endif #endif #ifndef GLEW_NO_GLU /* this is where we can safely include GLU */ # if defined(__APPLE__) && defined(__MACH__) # include <OpenGL/glu.h> # else //# include <GL/glu.h> # endif #endif /* ----------------------------- GL_VERSION_1_2 ---------------------------- */ #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_RESCALE_NORMAL 0x803A #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_CLAMP_TO_EDGE 0x812F #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) #define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) #define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) #define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) #define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) #endif /* GL_VERSION_1_2 */ /* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ #ifndef GL_VERSION_1_2_1 #define GL_VERSION_1_2_1 1 #define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) #endif /* GL_VERSION_1_2_1 */ /* ----------------------------- GL_VERSION_1_3 ---------------------------- */ #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_CLAMP_TO_BORDER 0x812D #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_SUBTRACT 0x84E7 #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_NORMAL_MAP 0x8511 #define GL_REFLECTION_MAP 0x8512 #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 #define GL_RGB_SCALE 0x8573 #define GL_ADD_SIGNED 0x8574 #define GL_INTERPOLATE 0x8575 #define GL_CONSTANT 0x8576 #define GL_PRIMARY_COLOR 0x8577 #define GL_PREVIOUS 0x8578 #define GL_SOURCE0_RGB 0x8580 #define GL_SOURCE1_RGB 0x8581 #define GL_SOURCE2_RGB 0x8582 #define GL_SOURCE0_ALPHA 0x8588 #define GL_SOURCE1_ALPHA 0x8589 #define GL_SOURCE2_ALPHA 0x858A #define GL_OPERAND0_RGB 0x8590 #define GL_OPERAND1_RGB 0x8591 #define GL_OPERAND2_RGB 0x8592 #define GL_OPERAND0_ALPHA 0x8598 #define GL_OPERAND1_ALPHA 0x8599 #define GL_OPERAND2_ALPHA 0x859A #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF #define GL_MULTISAMPLE_BIT 0x20000000 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); #define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) #define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) #define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) #define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) #define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) #define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) #define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) #define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) #define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) #define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) #define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) #define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) #define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) #define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) #define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) #define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) #define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) #define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) #define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) #define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) #define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) #define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) #define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) #define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) #define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) #define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) #define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) #define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) #define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) #define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) #define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) #define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) #define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) #define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) #define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) #define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) #define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) #define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) #define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) #define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) #define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) #define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) #define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) #define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) #define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) #define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) #define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) #endif /* GL_VERSION_1_3 */ /* ----------------------------- GL_VERSION_1_4 ---------------------------- */ #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_GENERATE_MIPMAP 0x8191 #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_COLOR_SUM 0x8458 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_COMPARE_R_TO_TEXTURE 0x884E typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); #define glBlendColor GLEW_GET_FUN(__glewBlendColor) #define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) #define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) #define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) #define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) #define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) #define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) #define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) #define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) #define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) #define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) #define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) #define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) #define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) #define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) #define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) #define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) #define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) #define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) #define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) #define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) #define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) #define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) #define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) #define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) #define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) #define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) #define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) #define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) #define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) #define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) #define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) #define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) #define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) #define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) #define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) #define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) #define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) #define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) #define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) #define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) #define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) #define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) #define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) #define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) #define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) #define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) #define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) #endif /* GL_VERSION_1_4 */ /* ----------------------------- GL_VERSION_1_5 ---------------------------- */ #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE #define GL_FOG_COORD GL_FOG_COORDINATE #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE #define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA #define GL_SRC0_RGB GL_SOURCE0_RGB #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA #define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA #define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_CURRENT_QUERY 0x8865 #define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 #define GL_READ_WRITE 0x88BA #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_READ 0x88E1 #define GL_STREAM_COPY 0x88E2 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 #define GL_STATIC_COPY 0x88E6 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 typedef ptrdiff_t GLintptr; typedef ptrdiff_t GLsizeiptr; typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); #define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) #define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) #define glBufferData GLEW_GET_FUN(__glewBufferData) #define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) #define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) #define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) #define glEndQuery GLEW_GET_FUN(__glewEndQuery) #define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) #define glGenQueries GLEW_GET_FUN(__glewGenQueries) #define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) #define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) #define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) #define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) #define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) #define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) #define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) #define glIsQuery GLEW_GET_FUN(__glewIsQuery) #define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) #define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) #define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) #endif /* GL_VERSION_1_5 */ /* ----------------------------- GL_VERSION_2_0 ---------------------------- */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 #define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FAIL 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_DRAW_BUFFER0 0x8825 #define GL_DRAW_BUFFER1 0x8826 #define GL_DRAW_BUFFER2 0x8827 #define GL_DRAW_BUFFER3 0x8828 #define GL_DRAW_BUFFER4 0x8829 #define GL_DRAW_BUFFER5 0x882A #define GL_DRAW_BUFFER6 0x882B #define GL_DRAW_BUFFER7 0x882C #define GL_DRAW_BUFFER8 0x882D #define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_BUFFER10 0x882F #define GL_DRAW_BUFFER11 0x8830 #define GL_DRAW_BUFFER12 0x8831 #define GL_DRAW_BUFFER13 0x8832 #define GL_DRAW_BUFFER14 0x8833 #define GL_DRAW_BUFFER15 0x8834 #define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_POINT_SPRITE 0x8861 #define GL_COORD_REPLACE 0x8862 #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_MAX_TEXTURE_COORDS 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_SHADER_TYPE 0x8B4F #define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC4 0x8B52 #define GL_INT_VEC2 0x8B53 #define GL_INT_VEC3 0x8B54 #define GL_INT_VEC4 0x8B55 #define GL_BOOL 0x8B56 #define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC4 0x8B59 #define GL_FLOAT_MAT2 0x8B5A #define GL_FLOAT_MAT3 0x8B5B #define GL_FLOAT_MAT4 0x8B5C #define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_2D 0x8B5E #define GL_SAMPLER_3D 0x8B5F #define GL_SAMPLER_CUBE 0x8B60 #define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_DELETE_STATUS 0x8B80 #define GL_COMPILE_STATUS 0x8B81 #define GL_LINK_STATUS 0x8B82 #define GL_VALIDATE_STATUS 0x8B83 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_ATTACHED_SHADERS 0x8B85 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 #define GL_SHADER_SOURCE_LENGTH 0x8B88 #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_CURRENT_PROGRAM 0x8B8D #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_STENCIL_BACK_REF 0x8CA3 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); #define glAttachShader GLEW_GET_FUN(__glewAttachShader) #define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) #define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) #define glCompileShader GLEW_GET_FUN(__glewCompileShader) #define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) #define glCreateShader GLEW_GET_FUN(__glewCreateShader) #define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) #define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) #define glDetachShader GLEW_GET_FUN(__glewDetachShader) #define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) #define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) #define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) #define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) #define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) #define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) #define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) #define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) #define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) #define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) #define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) #define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) #define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) #define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) #define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) #define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) #define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) #define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) #define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) #define glIsProgram GLEW_GET_FUN(__glewIsProgram) #define glIsShader GLEW_GET_FUN(__glewIsShader) #define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) #define glShaderSource GLEW_GET_FUN(__glewShaderSource) #define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) #define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) #define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) #define glUniform1f GLEW_GET_FUN(__glewUniform1f) #define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) #define glUniform1i GLEW_GET_FUN(__glewUniform1i) #define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) #define glUniform2f GLEW_GET_FUN(__glewUniform2f) #define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) #define glUniform2i GLEW_GET_FUN(__glewUniform2i) #define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) #define glUniform3f GLEW_GET_FUN(__glewUniform3f) #define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) #define glUniform3i GLEW_GET_FUN(__glewUniform3i) #define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) #define glUniform4f GLEW_GET_FUN(__glewUniform4f) #define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) #define glUniform4i GLEW_GET_FUN(__glewUniform4i) #define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) #define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) #define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) #define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) #define glUseProgram GLEW_GET_FUN(__glewUseProgram) #define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) #define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) #define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) #define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) #define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) #define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) #define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) #define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) #define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) #define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) #define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) #define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) #define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) #define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) #define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) #define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) #define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) #define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) #define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) #define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) #define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) #define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) #define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) #define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) #define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) #define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) #define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) #define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) #define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) #define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) #define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) #define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) #define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) #define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) #define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) #define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) #define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) #define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) #define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) #endif /* GL_VERSION_2_0 */ /* ----------------------------- GL_VERSION_2_1 ---------------------------- */ #ifndef GL_VERSION_2_1 #define GL_VERSION_2_1 1 #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_FLOAT_MAT2x3 0x8B65 #define GL_FLOAT_MAT2x4 0x8B66 #define GL_FLOAT_MAT3x2 0x8B67 #define GL_FLOAT_MAT3x4 0x8B68 #define GL_FLOAT_MAT4x2 0x8B69 #define GL_FLOAT_MAT4x3 0x8B6A #define GL_SRGB 0x8C40 #define GL_SRGB8 0x8C41 #define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_SLUMINANCE 0x8C46 #define GL_SLUMINANCE8 0x8C47 #define GL_COMPRESSED_SRGB 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) #define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) #define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) #define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) #define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) #define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) #define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) #endif /* GL_VERSION_2_1 */ /* ----------------------------- GL_VERSION_3_0 ---------------------------- */ #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 #define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 #define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 #define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 #define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB #define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES #define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C #define GL_NUM_EXTENSIONS 0x821D #define GL_CONTEXT_FLAGS 0x821E #define GL_DEPTH_BUFFER 0x8223 #define GL_STENCIL_BUFFER 0x8224 #define GL_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A #define GL_RGB16F 0x881B #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 #define GL_CLAMP_VERTEX_COLOR 0x891A #define GL_CLAMP_FRAGMENT_COLOR 0x891B #define GL_CLAMP_READ_COLOR 0x891C #define GL_FIXED_ONLY 0x891D #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_ALPHA_TYPE 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15 #define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_R11F_G11F_B10F 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GL_RGB9_E5 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 #define GL_RASTERIZER_DISCARD 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_INTERLEAVED_ATTRIBS 0x8C8C #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_RGBA32UI 0x8D70 #define GL_RGB32UI 0x8D71 #define GL_RGBA16UI 0x8D76 #define GL_RGB16UI 0x8D77 #define GL_RGBA8UI 0x8D7C #define GL_RGB8UI 0x8D7D #define GL_RGBA32I 0x8D82 #define GL_RGB32I 0x8D83 #define GL_RGBA16I 0x8D88 #define GL_RGB16I 0x8D89 #define GL_RGBA8I 0x8D8E #define GL_RGB8I 0x8D8F #define GL_RED_INTEGER 0x8D94 #define GL_GREEN_INTEGER 0x8D95 #define GL_BLUE_INTEGER 0x8D96 #define GL_ALPHA_INTEGER 0x8D97 #define GL_RGB_INTEGER 0x8D98 #define GL_RGBA_INTEGER 0x8D99 #define GL_BGR_INTEGER 0x8D9A #define GL_BGRA_INTEGER 0x8D9B #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_SAMPLER_2D_ARRAY 0x8DC1 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_INT_SAMPLER_3D 0x8DCB #define GL_INT_SAMPLER_CUBE 0x8DCC #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 #define GL_QUERY_WAIT 0x8E13 #define GL_QUERY_NO_WAIT 0x8E14 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); #define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) #define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) #define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) #define glClampColor GLEW_GET_FUN(__glewClampColor) #define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) #define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) #define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) #define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) #define glColorMaski GLEW_GET_FUN(__glewColorMaski) #define glDisablei GLEW_GET_FUN(__glewDisablei) #define glEnablei GLEW_GET_FUN(__glewEnablei) #define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) #define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) #define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) #define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) #define glGetStringi GLEW_GET_FUN(__glewGetStringi) #define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) #define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) #define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) #define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) #define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) #define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) #define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) #define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) #define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) #define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) #define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) #define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) #define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) #define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) #define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) #define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) #define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) #define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) #define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) #define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) #define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) #define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) #define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) #define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) #define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) #define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) #define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) #define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) #define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) #define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) #define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) #define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) #define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) #define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) #define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) #define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) #define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) #define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) #define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) #define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) #endif /* GL_VERSION_3_0 */ /* ----------------------------- GL_VERSION_3_1 ---------------------------- */ #ifndef GL_VERSION_3_1 #define GL_VERSION_3_1 1 #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_SAMPLER_2D_RECT 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT 0x8C2E #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_INT_SAMPLER_2D_RECT 0x8DCD #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_PRIMITIVE_RESTART 0x8F9D #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); #define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) #define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) #define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) #define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) #define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) #endif /* GL_VERSION_3_1 */ /* ----------------------------- GL_VERSION_3_2 ---------------------------- */ #ifndef GL_VERSION_3_2 #define GL_VERSION_3_2 1 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_LINES_ADJACENCY 0x000A #define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_TRIANGLES_ADJACENCY 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_PROGRAM_POINT_SIZE 0x8642 #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_GEOMETRY_SHADER 0x8DD9 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 #define GL_CONTEXT_PROFILE_MASK 0x9126 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); #define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) #define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) #define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) #define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) #endif /* GL_VERSION_3_2 */ /* ----------------------------- GL_VERSION_3_3 ---------------------------- */ #ifndef GL_VERSION_3_3 #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_RGB10_A2UI 0x906F typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); #define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) #define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) #endif /* GL_VERSION_3_3 */ /* ----------------------------- GL_VERSION_4_0 ---------------------------- */ #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); #define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) #define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) #define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) #define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) #define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) #define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) #endif /* GL_VERSION_4_0 */ /* ----------------------------- GL_VERSION_4_1 ---------------------------- */ #ifndef GL_VERSION_4_1 #define GL_VERSION_4_1 1 #define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) #endif /* GL_VERSION_4_1 */ /* ----------------------------- GL_VERSION_4_2 ---------------------------- */ #ifndef GL_VERSION_4_2 #define GL_VERSION_4_2 1 #define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_COPY_READ_BUFFER_BINDING 0x8F36 #define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 #define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) #endif /* GL_VERSION_4_2 */ /* ----------------------------- GL_VERSION_4_3 ---------------------------- */ #ifndef GL_VERSION_4_3 #define GL_VERSION_4_3 1 #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) #endif /* GL_VERSION_4_3 */ /* ----------------------------- GL_VERSION_4_4 ---------------------------- */ #ifndef GL_VERSION_4_4 #define GL_VERSION_4_4 1 #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 #define GL_TEXTURE_BUFFER_BINDING 0x8C2A #define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) #endif /* GL_VERSION_4_4 */ /* ----------------------------- GL_VERSION_4_5 ---------------------------- */ #ifndef GL_VERSION_4_5 #define GL_VERSION_4_5 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); #define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) #define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) #define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) #define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) #define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) #endif /* GL_VERSION_4_5 */ /* -------------------------- GL_3DFX_multisample -------------------------- */ #ifndef GL_3DFX_multisample #define GL_3DFX_multisample 1 #define GL_MULTISAMPLE_3DFX 0x86B2 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3 #define GL_SAMPLES_3DFX 0x86B4 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000 #define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) #endif /* GL_3DFX_multisample */ /* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ #ifndef GL_3DFX_tbuffer #define GL_3DFX_tbuffer 1 typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) #define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) #endif /* GL_3DFX_tbuffer */ /* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ #ifndef GL_3DFX_texture_compression_FXT1 #define GL_3DFX_texture_compression_FXT1 1 #define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 #define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 #define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) #endif /* GL_3DFX_texture_compression_FXT1 */ /* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ #ifndef GL_AMD_blend_minmax_factor #define GL_AMD_blend_minmax_factor 1 #define GL_FACTOR_MIN_AMD 0x901C #define GL_FACTOR_MAX_AMD 0x901D #define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) #endif /* GL_AMD_blend_minmax_factor */ /* ----------------------- GL_AMD_conservative_depth ----------------------- */ #ifndef GL_AMD_conservative_depth #define GL_AMD_conservative_depth 1 #define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) #endif /* GL_AMD_conservative_depth */ /* -------------------------- GL_AMD_debug_output -------------------------- */ #ifndef GL_AMD_debug_output #define GL_AMD_debug_output 1 #define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 #define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 #define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A #define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B #define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C #define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D #define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E #define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); #define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) #define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) #define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) #define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) #define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) #endif /* GL_AMD_debug_output */ /* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ #ifndef GL_AMD_depth_clamp_separate #define GL_AMD_depth_clamp_separate 1 #define GL_DEPTH_CLAMP_NEAR_AMD 0x901E #define GL_DEPTH_CLAMP_FAR_AMD 0x901F #define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) #endif /* GL_AMD_depth_clamp_separate */ /* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ #ifndef GL_AMD_draw_buffers_blend #define GL_AMD_draw_buffers_blend 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) #define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) #define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) #define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) #define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) #endif /* GL_AMD_draw_buffers_blend */ /* --------------------------- GL_AMD_gcn_shader --------------------------- */ #ifndef GL_AMD_gcn_shader #define GL_AMD_gcn_shader 1 #define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) #endif /* GL_AMD_gcn_shader */ /* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ #ifndef GL_AMD_gpu_shader_int64 #define GL_AMD_gpu_shader_int64 1 #define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) #endif /* GL_AMD_gpu_shader_int64 */ /* ---------------------- GL_AMD_interleaved_elements ---------------------- */ #ifndef GL_AMD_interleaved_elements #define GL_AMD_interleaved_elements 1 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RG8UI 0x8238 #define GL_RG16UI 0x823A #define GL_RGBA8UI 0x8D7C #define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 #define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); #define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) #define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) #endif /* GL_AMD_interleaved_elements */ /* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ #ifndef GL_AMD_multi_draw_indirect #define GL_AMD_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) #define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) #define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) #endif /* GL_AMD_multi_draw_indirect */ /* ------------------------- GL_AMD_name_gen_delete ------------------------ */ #ifndef GL_AMD_name_gen_delete #define GL_AMD_name_gen_delete 1 #define GL_DATA_BUFFER_AMD 0x9151 #define GL_PERFORMANCE_MONITOR_AMD 0x9152 #define GL_QUERY_OBJECT_AMD 0x9153 #define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 #define GL_SAMPLER_OBJECT_AMD 0x9155 typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); #define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) #define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) #define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) #define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) #endif /* GL_AMD_name_gen_delete */ /* ---------------------- GL_AMD_occlusion_query_event --------------------- */ #ifndef GL_AMD_occlusion_query_event #define GL_AMD_occlusion_query_event 1 #define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 #define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 #define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 #define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 #define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F #define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); #define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) #define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) #endif /* GL_AMD_occlusion_query_event */ /* ----------------------- GL_AMD_performance_monitor ---------------------- */ #ifndef GL_AMD_performance_monitor #define GL_AMD_performance_monitor 1 #define GL_COUNTER_TYPE_AMD 0x8BC0 #define GL_COUNTER_RANGE_AMD 0x8BC1 #define GL_UNSIGNED_INT64_AMD 0x8BC2 #define GL_PERCENTAGE_AMD 0x8BC3 #define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 #define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 #define GL_PERFMON_RESULT_AMD 0x8BC6 typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); #define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) #define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) #define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) #define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) #define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) #define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) #define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) #define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) #define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) #define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) #define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) #define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) #endif /* GL_AMD_performance_monitor */ /* -------------------------- GL_AMD_pinned_memory ------------------------- */ #ifndef GL_AMD_pinned_memory #define GL_AMD_pinned_memory 1 #define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 #define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) #endif /* GL_AMD_pinned_memory */ /* ----------------------- GL_AMD_query_buffer_object ---------------------- */ #ifndef GL_AMD_query_buffer_object #define GL_AMD_query_buffer_object 1 #define GL_QUERY_BUFFER_AMD 0x9192 #define GL_QUERY_BUFFER_BINDING_AMD 0x9193 #define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 #define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) #endif /* GL_AMD_query_buffer_object */ /* ------------------------ GL_AMD_sample_positions ------------------------ */ #ifndef GL_AMD_sample_positions #define GL_AMD_sample_positions 1 #define GL_SUBSAMPLE_DISTANCE_AMD 0x883F typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); #define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) #define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) #endif /* GL_AMD_sample_positions */ /* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ #ifndef GL_AMD_seamless_cubemap_per_texture #define GL_AMD_seamless_cubemap_per_texture 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F #define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) #endif /* GL_AMD_seamless_cubemap_per_texture */ /* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ #ifndef GL_AMD_shader_atomic_counter_ops #define GL_AMD_shader_atomic_counter_ops 1 #define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) #endif /* GL_AMD_shader_atomic_counter_ops */ /* ---------------------- GL_AMD_shader_stencil_export --------------------- */ #ifndef GL_AMD_shader_stencil_export #define GL_AMD_shader_stencil_export 1 #define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) #endif /* GL_AMD_shader_stencil_export */ /* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ #ifndef GL_AMD_shader_stencil_value_export #define GL_AMD_shader_stencil_value_export 1 #define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) #endif /* GL_AMD_shader_stencil_value_export */ /* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ #ifndef GL_AMD_shader_trinary_minmax #define GL_AMD_shader_trinary_minmax 1 #define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) #endif /* GL_AMD_shader_trinary_minmax */ /* ------------------------- GL_AMD_sparse_texture ------------------------- */ #ifndef GL_AMD_sparse_texture #define GL_AMD_sparse_texture 1 #define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 #define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A #define GL_MIN_SPARSE_LEVEL_AMD 0x919B #define GL_MIN_LOD_WARNING_AMD 0x919C typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); #define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) #define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) #define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) #endif /* GL_AMD_sparse_texture */ /* ------------------- GL_AMD_stencil_operation_extended ------------------- */ #ifndef GL_AMD_stencil_operation_extended #define GL_AMD_stencil_operation_extended 1 #define GL_SET_AMD 0x874A #define GL_REPLACE_VALUE_AMD 0x874B #define GL_STENCIL_OP_VALUE_AMD 0x874C #define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); #define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) #define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) #endif /* GL_AMD_stencil_operation_extended */ /* ------------------------ GL_AMD_texture_texture4 ------------------------ */ #ifndef GL_AMD_texture_texture4 #define GL_AMD_texture_texture4 1 #define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) #endif /* GL_AMD_texture_texture4 */ /* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ #ifndef GL_AMD_transform_feedback3_lines_triangles #define GL_AMD_transform_feedback3_lines_triangles 1 #define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) #endif /* GL_AMD_transform_feedback3_lines_triangles */ /* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ #ifndef GL_AMD_transform_feedback4 #define GL_AMD_transform_feedback4 1 #define GL_STREAM_RASTERIZATION_AMD 0x91A0 #define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) #endif /* GL_AMD_transform_feedback4 */ /* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ #ifndef GL_AMD_vertex_shader_layer #define GL_AMD_vertex_shader_layer 1 #define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) #endif /* GL_AMD_vertex_shader_layer */ /* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ #ifndef GL_AMD_vertex_shader_tessellator #define GL_AMD_vertex_shader_tessellator 1 #define GL_SAMPLER_BUFFER_AMD 0x9001 #define GL_INT_SAMPLER_BUFFER_AMD 0x9002 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 #define GL_TESSELLATION_MODE_AMD 0x9004 #define GL_TESSELLATION_FACTOR_AMD 0x9005 #define GL_DISCRETE_AMD 0x9006 #define GL_CONTINUOUS_AMD 0x9007 typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); #define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) #define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) #define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) #endif /* GL_AMD_vertex_shader_tessellator */ /* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ #ifndef GL_AMD_vertex_shader_viewport_index #define GL_AMD_vertex_shader_viewport_index 1 #define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) #endif /* GL_AMD_vertex_shader_viewport_index */ /* ------------------------- GL_ANGLE_depth_texture ------------------------ */ #ifndef GL_ANGLE_depth_texture #define GL_ANGLE_depth_texture 1 #define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) #endif /* GL_ANGLE_depth_texture */ /* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ #ifndef GL_ANGLE_framebuffer_blit #define GL_ANGLE_framebuffer_blit 1 #define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 #define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 #define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) #define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) #endif /* GL_ANGLE_framebuffer_blit */ /* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ #ifndef GL_ANGLE_framebuffer_multisample #define GL_ANGLE_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 #define GL_MAX_SAMPLES_ANGLE 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) #define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) #endif /* GL_ANGLE_framebuffer_multisample */ /* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ #ifndef GL_ANGLE_instanced_arrays #define GL_ANGLE_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); #define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) #define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) #define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) #define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) #endif /* GL_ANGLE_instanced_arrays */ /* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ #ifndef GL_ANGLE_pack_reverse_row_order #define GL_ANGLE_pack_reverse_row_order 1 #define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 #define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) #endif /* GL_ANGLE_pack_reverse_row_order */ /* ------------------------ GL_ANGLE_program_binary ------------------------ */ #ifndef GL_ANGLE_program_binary #define GL_ANGLE_program_binary 1 #define GL_PROGRAM_BINARY_ANGLE 0x93A6 #define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) #endif /* GL_ANGLE_program_binary */ /* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ #ifndef GL_ANGLE_texture_compression_dxt1 #define GL_ANGLE_texture_compression_dxt1 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 #define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) #endif /* GL_ANGLE_texture_compression_dxt1 */ /* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ #ifndef GL_ANGLE_texture_compression_dxt3 #define GL_ANGLE_texture_compression_dxt3 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 #define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) #endif /* GL_ANGLE_texture_compression_dxt3 */ /* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ #ifndef GL_ANGLE_texture_compression_dxt5 #define GL_ANGLE_texture_compression_dxt5 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 #define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) #endif /* GL_ANGLE_texture_compression_dxt5 */ /* ------------------------- GL_ANGLE_texture_usage ------------------------ */ #ifndef GL_ANGLE_texture_usage #define GL_ANGLE_texture_usage 1 #define GL_TEXTURE_USAGE_ANGLE 0x93A2 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 #define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) #endif /* GL_ANGLE_texture_usage */ /* -------------------------- GL_ANGLE_timer_query ------------------------- */ #ifndef GL_ANGLE_timer_query #define GL_ANGLE_timer_query 1 #define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 #define GL_CURRENT_QUERY_ANGLE 0x8865 #define GL_QUERY_RESULT_ANGLE 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 #define GL_TIME_ELAPSED_ANGLE 0x88BF #define GL_TIMESTAMP_ANGLE 0x8E28 typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); #define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) #define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) #define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) #define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) #define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) #define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) #define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) #define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) #define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) #define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) #define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) #define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) #endif /* GL_ANGLE_timer_query */ /* ------------------- GL_ANGLE_translated_shader_source ------------------- */ #ifndef GL_ANGLE_translated_shader_source #define GL_ANGLE_translated_shader_source 1 #define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); #define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) #define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) #endif /* GL_ANGLE_translated_shader_source */ /* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ #ifndef GL_APPLE_aux_depth_stencil #define GL_APPLE_aux_depth_stencil 1 #define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 #define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) #endif /* GL_APPLE_aux_depth_stencil */ /* ------------------------ GL_APPLE_client_storage ------------------------ */ #ifndef GL_APPLE_client_storage #define GL_APPLE_client_storage 1 #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 #define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) #endif /* GL_APPLE_client_storage */ /* ------------------------- GL_APPLE_element_array ------------------------ */ #ifndef GL_APPLE_element_array #define GL_APPLE_element_array 1 #define GL_ELEMENT_ARRAY_APPLE 0x8A0C #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); #define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) #define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) #define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) #define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) #define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) #define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) #endif /* GL_APPLE_element_array */ /* ----------------------------- GL_APPLE_fence ---------------------------- */ #ifndef GL_APPLE_fence #define GL_APPLE_fence 1 #define GL_DRAW_PIXELS_APPLE 0x8A0A #define GL_FENCE_APPLE 0x8A0B typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); #define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) #define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) #define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) #define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) #define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) #define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) #define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) #define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) #define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) #endif /* GL_APPLE_fence */ /* ------------------------- GL_APPLE_float_pixels ------------------------- */ #ifndef GL_APPLE_float_pixels #define GL_APPLE_float_pixels 1 #define GL_HALF_APPLE 0x140B #define GL_RGBA_FLOAT32_APPLE 0x8814 #define GL_RGB_FLOAT32_APPLE 0x8815 #define GL_ALPHA_FLOAT32_APPLE 0x8816 #define GL_INTENSITY_FLOAT32_APPLE 0x8817 #define GL_LUMINANCE_FLOAT32_APPLE 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 #define GL_RGBA_FLOAT16_APPLE 0x881A #define GL_RGB_FLOAT16_APPLE 0x881B #define GL_ALPHA_FLOAT16_APPLE 0x881C #define GL_INTENSITY_FLOAT16_APPLE 0x881D #define GL_LUMINANCE_FLOAT16_APPLE 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F #define GL_COLOR_FLOAT_APPLE 0x8A0F #define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) #endif /* GL_APPLE_float_pixels */ /* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ #ifndef GL_APPLE_flush_buffer_range #define GL_APPLE_flush_buffer_range 1 #define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 #define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); #define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) #define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) #define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) #endif /* GL_APPLE_flush_buffer_range */ /* ----------------------- GL_APPLE_object_purgeable ----------------------- */ #ifndef GL_APPLE_object_purgeable #define GL_APPLE_object_purgeable 1 #define GL_BUFFER_OBJECT_APPLE 0x85B3 #define GL_RELEASED_APPLE 0x8A19 #define GL_VOLATILE_APPLE 0x8A1A #define GL_RETAINED_APPLE 0x8A1B #define GL_UNDEFINED_APPLE 0x8A1C #define GL_PURGEABLE_APPLE 0x8A1D typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); #define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) #define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) #define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) #define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) #endif /* GL_APPLE_object_purgeable */ /* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ #ifndef GL_APPLE_pixel_buffer #define GL_APPLE_pixel_buffer 1 #define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 #define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) #endif /* GL_APPLE_pixel_buffer */ /* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ #ifndef GL_APPLE_rgb_422 #define GL_APPLE_rgb_422 1 #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB #define GL_RGB_422_APPLE 0x8A1F #define GL_RGB_RAW_422_APPLE 0x8A51 #define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) #endif /* GL_APPLE_rgb_422 */ /* --------------------------- GL_APPLE_row_bytes -------------------------- */ #ifndef GL_APPLE_row_bytes #define GL_APPLE_row_bytes 1 #define GL_PACK_ROW_BYTES_APPLE 0x8A15 #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 #define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) #endif /* GL_APPLE_row_bytes */ /* ------------------------ GL_APPLE_specular_vector ----------------------- */ #ifndef GL_APPLE_specular_vector #define GL_APPLE_specular_vector 1 #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 #define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) #endif /* GL_APPLE_specular_vector */ /* ------------------------- GL_APPLE_texture_range ------------------------ */ #ifndef GL_APPLE_texture_range #define GL_APPLE_texture_range 1 #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 #define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC #define GL_STORAGE_PRIVATE_APPLE 0x85BD #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); #define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) #define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) #define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) #endif /* GL_APPLE_texture_range */ /* ------------------------ GL_APPLE_transform_hint ------------------------ */ #ifndef GL_APPLE_transform_hint #define GL_APPLE_transform_hint 1 #define GL_TRANSFORM_HINT_APPLE 0x85B1 #define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) #endif /* GL_APPLE_transform_hint */ /* ---------------------- GL_APPLE_vertex_array_object --------------------- */ #ifndef GL_APPLE_vertex_array_object #define GL_APPLE_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) #define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) #define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) #define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) #define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) #endif /* GL_APPLE_vertex_array_object */ /* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ #ifndef GL_APPLE_vertex_array_range #define GL_APPLE_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 #define GL_STORAGE_CLIENT_APPLE 0x85B4 #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); #define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) #define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) #define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) #define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) #endif /* GL_APPLE_vertex_array_range */ /* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ #ifndef GL_APPLE_vertex_program_evaluators #define GL_APPLE_vertex_program_evaluators 1 #define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 #define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 #define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 #define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 #define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 #define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 #define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 #define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 #define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 #define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); #define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) #define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) #define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) #define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) #define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) #define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) #define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) #define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) #endif /* GL_APPLE_vertex_program_evaluators */ /* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ #ifndef GL_APPLE_ycbcr_422 #define GL_APPLE_ycbcr_422 1 #define GL_YCBCR_422_APPLE 0x85B9 #define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) #endif /* GL_APPLE_ycbcr_422 */ /* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ #ifndef GL_ARB_ES2_compatibility #define GL_ARB_ES2_compatibility 1 #define GL_FIXED 0x140C #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B #define GL_RGB565 0x8D62 #define GL_LOW_FLOAT 0x8DF0 #define GL_MEDIUM_FLOAT 0x8DF1 #define GL_HIGH_FLOAT 0x8DF2 #define GL_LOW_INT 0x8DF3 #define GL_MEDIUM_INT 0x8DF4 #define GL_HIGH_INT 0x8DF5 #define GL_SHADER_BINARY_FORMATS 0x8DF8 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 #define GL_SHADER_COMPILER 0x8DFA #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD typedef int GLfixed; typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); #define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) #define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) #define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) #define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) #define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) #define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) #endif /* GL_ARB_ES2_compatibility */ /* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ #ifndef GL_ARB_ES3_1_compatibility #define GL_ARB_ES3_1_compatibility 1 typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); #define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) #define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) #endif /* GL_ARB_ES3_1_compatibility */ /* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ #ifndef GL_ARB_ES3_2_compatibility #define GL_ARB_ES3_2_compatibility 1 #define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE #define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 #define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); #define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) #define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) #endif /* GL_ARB_ES3_2_compatibility */ /* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) #endif /* GL_ARB_ES3_compatibility */ /* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ #ifndef GL_ARB_arrays_of_arrays #define GL_ARB_arrays_of_arrays 1 #define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) #endif /* GL_ARB_arrays_of_arrays */ /* -------------------------- GL_ARB_base_instance ------------------------- */ #ifndef GL_ARB_base_instance #define GL_ARB_base_instance 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); #define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) #define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) #define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) #define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) #endif /* GL_ARB_base_instance */ /* ------------------------ GL_ARB_bindless_texture ------------------------ */ #ifndef GL_ARB_bindless_texture #define GL_ARB_bindless_texture 1 #define GL_UNSIGNED_INT64_ARB 0x140F typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); #define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) #define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) #define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) #define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) #define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) #define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) #define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) #define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) #define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) #define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) #define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) #define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) #define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) #define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) #define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) #define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) #define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) #endif /* GL_ARB_bindless_texture */ /* ----------------------- GL_ARB_blend_func_extended ---------------------- */ #ifndef GL_ARB_blend_func_extended #define GL_ARB_blend_func_extended 1 #define GL_SRC1_COLOR 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); #define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) #define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) #define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) #endif /* GL_ARB_blend_func_extended */ /* ------------------------- GL_ARB_buffer_storage ------------------------- */ #ifndef GL_ARB_buffer_storage #define GL_ARB_buffer_storage 1 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_PERSISTENT_BIT 0x00000040 #define GL_MAP_COHERENT_BIT 0x00000080 #define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_CLIENT_STORAGE_BIT 0x0200 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 #define GL_BUFFER_IMMUTABLE_STORAGE 0x821F #define GL_BUFFER_STORAGE_FLAGS 0x8220 typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); #define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) #define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) #define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) #endif /* GL_ARB_buffer_storage */ /* ---------------------------- GL_ARB_cl_event ---------------------------- */ #ifndef GL_ARB_cl_event #define GL_ARB_cl_event 1 #define GL_SYNC_CL_EVENT_ARB 0x8240 #define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 typedef struct _cl_context *cl_context; typedef struct _cl_event *cl_event; typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); #define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) #define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) #endif /* GL_ARB_cl_event */ /* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ #ifndef GL_ARB_clear_buffer_object #define GL_ARB_clear_buffer_object 1 typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); #define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) #define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) #define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) #define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) #define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) #endif /* GL_ARB_clear_buffer_object */ /* -------------------------- GL_ARB_clear_texture ------------------------- */ #ifndef GL_ARB_clear_texture #define GL_ARB_clear_texture 1 #define GL_CLEAR_TEXTURE 0x9365 typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); #define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) #define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) #define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) #endif /* GL_ARB_clear_texture */ /* -------------------------- GL_ARB_clip_control -------------------------- */ #ifndef GL_ARB_clip_control #define GL_ARB_clip_control 1 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_CLIP_ORIGIN 0x935C #define GL_CLIP_DEPTH_MODE 0x935D #define GL_NEGATIVE_ONE_TO_ONE 0x935E #define GL_ZERO_TO_ONE 0x935F typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); #define glClipControl GLEW_GET_FUN(__glewClipControl) #define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) #endif /* GL_ARB_clip_control */ /* ----------------------- GL_ARB_color_buffer_float ----------------------- */ #ifndef GL_ARB_color_buffer_float #define GL_ARB_color_buffer_float 1 #define GL_RGBA_FLOAT_MODE_ARB 0x8820 #define GL_CLAMP_VERTEX_COLOR_ARB 0x891A #define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B #define GL_CLAMP_READ_COLOR_ARB 0x891C #define GL_FIXED_ONLY_ARB 0x891D typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) #define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) #endif /* GL_ARB_color_buffer_float */ /* -------------------------- GL_ARB_compatibility ------------------------- */ #ifndef GL_ARB_compatibility #define GL_ARB_compatibility 1 #define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) #endif /* GL_ARB_compatibility */ /* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ #ifndef GL_ARB_compressed_texture_pixel_storage #define GL_ARB_compressed_texture_pixel_storage 1 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E #define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) #endif /* GL_ARB_compressed_texture_pixel_storage */ /* ------------------------- GL_ARB_compute_shader ------------------------- */ #ifndef GL_ARB_compute_shader #define GL_ARB_compute_shader 1 #define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_COMPUTE_SHADER 0x91B9 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); #define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) #define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) #define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) #endif /* GL_ARB_compute_shader */ /* ------------------- GL_ARB_compute_variable_group_size ------------------ */ #ifndef GL_ARB_compute_variable_group_size #define GL_ARB_compute_variable_group_size 1 #define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB #define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF #define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 #define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); #define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) #define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) #endif /* GL_ARB_compute_variable_group_size */ /* ------------------- GL_ARB_conditional_render_inverted ------------------ */ #ifndef GL_ARB_conditional_render_inverted #define GL_ARB_conditional_render_inverted 1 #define GL_QUERY_WAIT_INVERTED 0x8E17 #define GL_QUERY_NO_WAIT_INVERTED 0x8E18 #define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 #define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A #define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) #endif /* GL_ARB_conditional_render_inverted */ /* ----------------------- GL_ARB_conservative_depth ----------------------- */ #ifndef GL_ARB_conservative_depth #define GL_ARB_conservative_depth 1 #define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) #endif /* GL_ARB_conservative_depth */ /* --------------------------- GL_ARB_copy_buffer -------------------------- */ #ifndef GL_ARB_copy_buffer #define GL_ARB_copy_buffer 1 #define GL_COPY_READ_BUFFER 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); #define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) #define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) #endif /* GL_ARB_copy_buffer */ /* --------------------------- GL_ARB_copy_image --------------------------- */ #ifndef GL_ARB_copy_image #define GL_ARB_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); #define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) #define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) #endif /* GL_ARB_copy_image */ /* -------------------------- GL_ARB_cull_distance ------------------------- */ #ifndef GL_ARB_cull_distance #define GL_ARB_cull_distance 1 #define GL_MAX_CULL_DISTANCES 0x82F9 #define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA #define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) #endif /* GL_ARB_cull_distance */ /* -------------------------- GL_ARB_debug_output -------------------------- */ #ifndef GL_ARB_debug_output #define GL_ARB_debug_output 1 #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 #define GL_DEBUG_SOURCE_API_ARB 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B #define GL_DEBUG_TYPE_ERROR_ARB 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 #define GL_DEBUG_TYPE_OTHER_ARB 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); #define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) #define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) #define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) #define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) #define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) #endif /* GL_ARB_debug_output */ /* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ #ifndef GL_ARB_depth_buffer_float #define GL_ARB_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) #endif /* GL_ARB_depth_buffer_float */ /* --------------------------- GL_ARB_depth_clamp -------------------------- */ #ifndef GL_ARB_depth_clamp #define GL_ARB_depth_clamp 1 #define GL_DEPTH_CLAMP 0x864F #define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) #endif /* GL_ARB_depth_clamp */ /* -------------------------- GL_ARB_depth_texture ------------------------- */ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 #define GL_DEPTH_COMPONENT16_ARB 0x81A5 #define GL_DEPTH_COMPONENT24_ARB 0x81A6 #define GL_DEPTH_COMPONENT32_ARB 0x81A7 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B #define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) #endif /* GL_ARB_depth_texture */ /* ----------------------- GL_ARB_derivative_control ----------------------- */ #ifndef GL_ARB_derivative_control #define GL_ARB_derivative_control 1 #define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) #endif /* GL_ARB_derivative_control */ /* ----------------------- GL_ARB_direct_state_access ---------------------- */ #ifndef GL_ARB_direct_state_access #define GL_ARB_direct_state_access 1 #define GL_TEXTURE_TARGET 0x1006 #define GL_QUERY_TARGET 0x82EA typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); #define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) #define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) #define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) #define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) #define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) #define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) #define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) #define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) #define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) #define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) #define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) #define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) #define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) #define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) #define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) #define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) #define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) #define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) #define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) #define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) #define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) #define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) #define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) #define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) #define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) #define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) #define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) #define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) #define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) #define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) #define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) #define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) #define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) #define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) #define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) #define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) #define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) #define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) #define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) #define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) #define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) #define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) #define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) #define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) #define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) #define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) #define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) #define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) #define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) #define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) #define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) #define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) #define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) #define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) #define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) #define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) #define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) #define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) #define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) #define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) #define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) #define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) #define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) #define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) #define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) #define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) #define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) #define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) #define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) #define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) #define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) #define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) #define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) #define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) #define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) #define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) #define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) #define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) #define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) #define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) #define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) #define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) #define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) #define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) #define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) #define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) #define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) #define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) #define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) #define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) #define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) #define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) #define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) #define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) #define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) #define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) #define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) #define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) #endif /* GL_ARB_direct_state_access */ /* -------------------------- GL_ARB_draw_buffers -------------------------- */ #ifndef GL_ARB_draw_buffers #define GL_ARB_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ARB 0x8824 #define GL_DRAW_BUFFER0_ARB 0x8825 #define GL_DRAW_BUFFER1_ARB 0x8826 #define GL_DRAW_BUFFER2_ARB 0x8827 #define GL_DRAW_BUFFER3_ARB 0x8828 #define GL_DRAW_BUFFER4_ARB 0x8829 #define GL_DRAW_BUFFER5_ARB 0x882A #define GL_DRAW_BUFFER6_ARB 0x882B #define GL_DRAW_BUFFER7_ARB 0x882C #define GL_DRAW_BUFFER8_ARB 0x882D #define GL_DRAW_BUFFER9_ARB 0x882E #define GL_DRAW_BUFFER10_ARB 0x882F #define GL_DRAW_BUFFER11_ARB 0x8830 #define GL_DRAW_BUFFER12_ARB 0x8831 #define GL_DRAW_BUFFER13_ARB 0x8832 #define GL_DRAW_BUFFER14_ARB 0x8833 #define GL_DRAW_BUFFER15_ARB 0x8834 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) #define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) #endif /* GL_ARB_draw_buffers */ /* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ #ifndef GL_ARB_draw_buffers_blend #define GL_ARB_draw_buffers_blend 1 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); #define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) #define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) #define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) #define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) #define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) #endif /* GL_ARB_draw_buffers_blend */ /* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); #define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) #define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) #define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) #define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) #define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) #endif /* GL_ARB_draw_elements_base_vertex */ /* -------------------------- GL_ARB_draw_indirect ------------------------- */ #ifndef GL_ARB_draw_indirect #define GL_ARB_draw_indirect 1 #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); #define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) #define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) #define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) #endif /* GL_ARB_draw_indirect */ /* ------------------------- GL_ARB_draw_instanced ------------------------- */ #ifndef GL_ARB_draw_instanced #define GL_ARB_draw_instanced 1 #define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) #endif /* GL_ARB_draw_instanced */ /* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ #ifndef GL_ARB_enhanced_layouts #define GL_ARB_enhanced_layouts 1 #define GL_LOCATION_COMPONENT 0x934A #define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B #define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C #define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) #endif /* GL_ARB_enhanced_layouts */ /* -------------------- GL_ARB_explicit_attrib_location -------------------- */ #ifndef GL_ARB_explicit_attrib_location #define GL_ARB_explicit_attrib_location 1 #define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) #endif /* GL_ARB_explicit_attrib_location */ /* -------------------- GL_ARB_explicit_uniform_location ------------------- */ #ifndef GL_ARB_explicit_uniform_location #define GL_ARB_explicit_uniform_location 1 #define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) #endif /* GL_ARB_explicit_uniform_location */ /* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ #ifndef GL_ARB_fragment_coord_conventions #define GL_ARB_fragment_coord_conventions 1 #define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) #endif /* GL_ARB_fragment_coord_conventions */ /* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ #ifndef GL_ARB_fragment_layer_viewport #define GL_ARB_fragment_layer_viewport 1 #define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) #endif /* GL_ARB_fragment_layer_viewport */ /* ------------------------ GL_ARB_fragment_program ------------------------ */ #ifndef GL_ARB_fragment_program #define GL_ARB_fragment_program 1 #define GL_FRAGMENT_PROGRAM_ARB 0x8804 #define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 #define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 #define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 #define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 #define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 #define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A #define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B #define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C #define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D #define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E #define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F #define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 #define GL_MAX_TEXTURE_COORDS_ARB 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 #define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) #endif /* GL_ARB_fragment_program */ /* --------------------- GL_ARB_fragment_program_shadow -------------------- */ #ifndef GL_ARB_fragment_program_shadow #define GL_ARB_fragment_program_shadow 1 #define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) #endif /* GL_ARB_fragment_program_shadow */ /* ------------------------- GL_ARB_fragment_shader ------------------------ */ #ifndef GL_ARB_fragment_shader #define GL_ARB_fragment_shader 1 #define GL_FRAGMENT_SHADER_ARB 0x8B30 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B #define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) #endif /* GL_ARB_fragment_shader */ /* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ #ifndef GL_ARB_fragment_shader_interlock #define GL_ARB_fragment_shader_interlock 1 #define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) #endif /* GL_ARB_fragment_shader_interlock */ /* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ #ifndef GL_ARB_framebuffer_no_attachments #define GL_ARB_framebuffer_no_attachments 1 #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); #define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) #define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) #define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) #define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) #define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) #endif /* GL_ARB_framebuffer_no_attachments */ /* ----------------------- GL_ARB_framebuffer_object ----------------------- */ #ifndef GL_ARB_framebuffer_object #define GL_ARB_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_INDEX 0x8222 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_SRGB 0x8C40 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_RENDERBUFFER_SAMPLES 0x8CAB #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_COLOR_ATTACHMENT0 0x8CE0 #define GL_COLOR_ATTACHMENT1 0x8CE1 #define GL_COLOR_ATTACHMENT2 0x8CE2 #define GL_COLOR_ATTACHMENT3 0x8CE3 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT5 0x8CE5 #define GL_COLOR_ATTACHMENT6 0x8CE6 #define GL_COLOR_ATTACHMENT7 0x8CE7 #define GL_COLOR_ATTACHMENT8 0x8CE8 #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_COLOR_ATTACHMENT10 0x8CEA #define GL_COLOR_ATTACHMENT11 0x8CEB #define GL_COLOR_ATTACHMENT12 0x8CEC #define GL_COLOR_ATTACHMENT13 0x8CED #define GL_COLOR_ATTACHMENT14 0x8CEE #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_FRAMEBUFFER 0x8D40 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_WIDTH 0x8D42 #define GL_RENDERBUFFER_HEIGHT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 #define GL_STENCIL_INDEX1 0x8D46 #define GL_STENCIL_INDEX4 0x8D47 #define GL_STENCIL_INDEX8 0x8D48 #define GL_STENCIL_INDEX16 0x8D49 #define GL_RENDERBUFFER_RED_SIZE 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_MAX_SAMPLES 0x8D57 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) #define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) #define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) #define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) #define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) #define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) #define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) #define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) #define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) #define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) #define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) #define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) #define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) #define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) #define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) #define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) #define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) #define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) #define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) #define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) #define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) #endif /* GL_ARB_framebuffer_object */ /* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ #ifndef GL_ARB_framebuffer_sRGB #define GL_ARB_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) #endif /* GL_ARB_framebuffer_sRGB */ /* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ #ifndef GL_ARB_geometry_shader4 #define GL_ARB_geometry_shader4 1 #define GL_LINES_ADJACENCY_ARB 0xA #define GL_LINE_STRIP_ADJACENCY_ARB 0xB #define GL_TRIANGLES_ADJACENCY_ARB 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD #define GL_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 #define GL_GEOMETRY_SHADER_ARB 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); #define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) #define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) #define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) #define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) #define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) #endif /* GL_ARB_geometry_shader4 */ /* ----------------------- GL_ARB_get_program_binary ----------------------- */ #ifndef GL_ARB_get_program_binary #define GL_ARB_get_program_binary 1 #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_PROGRAM_BINARY_FORMATS 0x87FF typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); #define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) #define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) #define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) #define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) #endif /* GL_ARB_get_program_binary */ /* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ #ifndef GL_ARB_get_texture_sub_image #define GL_ARB_get_texture_sub_image 1 typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); #define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) #define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) #define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) #endif /* GL_ARB_get_texture_sub_image */ /* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ #ifndef GL_ARB_gpu_shader5 #define GL_ARB_gpu_shader5 1 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MAX_VERTEX_STREAMS 0x8E71 #define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) #endif /* GL_ARB_gpu_shader5 */ /* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ #ifndef GL_ARB_gpu_shader_fp64 #define GL_ARB_gpu_shader_fp64 1 #define GL_DOUBLE_MAT2 0x8F46 #define GL_DOUBLE_MAT3 0x8F47 #define GL_DOUBLE_MAT4 0x8F48 #define GL_DOUBLE_MAT2x3 0x8F49 #define GL_DOUBLE_MAT2x4 0x8F4A #define GL_DOUBLE_MAT3x2 0x8F4B #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_DOUBLE_MAT4x3 0x8F4E #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); #define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) #define glUniform1d GLEW_GET_FUN(__glewUniform1d) #define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) #define glUniform2d GLEW_GET_FUN(__glewUniform2d) #define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) #define glUniform3d GLEW_GET_FUN(__glewUniform3d) #define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) #define glUniform4d GLEW_GET_FUN(__glewUniform4d) #define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) #define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) #define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) #define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) #define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) #define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) #define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) #define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) #define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) #define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) #define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) #endif /* GL_ARB_gpu_shader_fp64 */ /* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ #ifndef GL_ARB_gpu_shader_int64 #define GL_ARB_gpu_shader_int64 1 #define GL_INT64_ARB 0x140E #define GL_UNSIGNED_INT64_ARB 0x140F #define GL_INT64_VEC2_ARB 0x8FE9 #define GL_INT64_VEC3_ARB 0x8FEA #define GL_INT64_VEC4_ARB 0x8FEB #define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 #define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 #define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); #define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) #define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) #define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) #define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) #define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) #define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) #define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) #define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) #define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) #define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) #define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) #define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) #define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) #define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) #define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) #define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) #define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) #define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) #define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) #define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) #define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) #define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) #define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) #define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) #define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) #define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) #define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) #define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) #define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) #define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) #define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) #define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) #define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) #define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) #define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) #define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) #define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) #endif /* GL_ARB_gpu_shader_int64 */ /* ------------------------ GL_ARB_half_float_pixel ------------------------ */ #ifndef GL_ARB_half_float_pixel #define GL_ARB_half_float_pixel 1 #define GL_HALF_FLOAT_ARB 0x140B #define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) #endif /* GL_ARB_half_float_pixel */ /* ------------------------ GL_ARB_half_float_vertex ----------------------- */ #ifndef GL_ARB_half_float_vertex #define GL_ARB_half_float_vertex 1 #define GL_HALF_FLOAT 0x140B #define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) #endif /* GL_ARB_half_float_vertex */ /* ----------------------------- GL_ARB_imaging ---------------------------- */ #ifndef GL_ARB_imaging #define GL_ARB_imaging 1 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_BLEND_COLOR 0x8005 #define GL_FUNC_ADD 0x8006 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF #define GL_IGNORE_BORDER 0x8150 #define GL_CONSTANT_BORDER 0x8151 #define GL_WRAP_BORDER 0x8152 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); #define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) #define glColorTable GLEW_GET_FUN(__glewColorTable) #define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) #define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) #define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) #define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) #define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) #define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) #define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) #define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) #define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) #define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) #define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) #define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) #define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) #define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) #define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) #define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) #define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) #define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) #define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) #define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) #define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) #define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) #define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) #define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) #define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) #define glHistogram GLEW_GET_FUN(__glewHistogram) #define glMinmax GLEW_GET_FUN(__glewMinmax) #define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) #define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) #define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) #define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) #endif /* GL_ARB_imaging */ /* ----------------------- GL_ARB_indirect_parameters ---------------------- */ #ifndef GL_ARB_indirect_parameters #define GL_ARB_indirect_parameters 1 #define GL_PARAMETER_BUFFER_ARB 0x80EE #define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); #define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) #define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) #define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) #endif /* GL_ARB_indirect_parameters */ /* ------------------------ GL_ARB_instanced_arrays ------------------------ */ #ifndef GL_ARB_instanced_arrays #define GL_ARB_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); #define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) #define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) #define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) #define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) #endif /* GL_ARB_instanced_arrays */ /* ---------------------- GL_ARB_internalformat_query ---------------------- */ #ifndef GL_ARB_internalformat_query #define GL_ARB_internalformat_query 1 #define GL_NUM_SAMPLE_COUNTS 0x9380 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); #define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) #define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) #endif /* GL_ARB_internalformat_query */ /* ---------------------- GL_ARB_internalformat_query2 --------------------- */ #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 #define GL_INTERNALFORMAT_RED_TYPE 0x8278 #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D #define GL_MAX_WIDTH 0x827E #define GL_MAX_HEIGHT 0x827F #define GL_MAX_DEPTH 0x8280 #define GL_MAX_LAYERS 0x8281 #define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_COLOR_COMPONENTS 0x8283 #define GL_DEPTH_COMPONENTS 0x8284 #define GL_STENCIL_COMPONENTS 0x8285 #define GL_COLOR_RENDERABLE 0x8286 #define GL_DEPTH_RENDERABLE 0x8287 #define GL_STENCIL_RENDERABLE 0x8288 #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_FRAMEBUFFER_BLEND 0x828B #define GL_READ_PIXELS 0x828C #define GL_READ_PIXELS_FORMAT 0x828D #define GL_READ_PIXELS_TYPE 0x828E #define GL_TEXTURE_IMAGE_FORMAT 0x828F #define GL_TEXTURE_IMAGE_TYPE 0x8290 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_MIPMAP 0x8293 #define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_COLOR_ENCODING 0x8296 #define GL_SRGB_READ 0x8297 #define GL_SRGB_WRITE 0x8298 #define GL_SRGB_DECODE_ARB 0x8299 #define GL_FILTER 0x829A #define GL_VERTEX_TEXTURE 0x829B #define GL_TESS_CONTROL_TEXTURE 0x829C #define GL_TESS_EVALUATION_TEXTURE 0x829D #define GL_GEOMETRY_TEXTURE 0x829E #define GL_FRAGMENT_TEXTURE 0x829F #define GL_COMPUTE_TEXTURE 0x82A0 #define GL_TEXTURE_SHADOW 0x82A1 #define GL_TEXTURE_GATHER 0x82A2 #define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_SHADER_IMAGE_LOAD 0x82A4 #define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_IMAGE_ATOMIC 0x82A6 #define GL_IMAGE_TEXEL_SIZE 0x82A7 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 #define GL_IMAGE_PIXEL_FORMAT 0x82A9 #define GL_IMAGE_PIXEL_TYPE 0x82AA #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 #define GL_CLEAR_BUFFER 0x82B4 #define GL_TEXTURE_VIEW 0x82B5 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_FULL_SUPPORT 0x82B7 #define GL_CAVEAT_SUPPORT 0x82B8 #define GL_IMAGE_CLASS_4_X_32 0x82B9 #define GL_IMAGE_CLASS_2_X_32 0x82BA #define GL_IMAGE_CLASS_1_X_32 0x82BB #define GL_IMAGE_CLASS_4_X_16 0x82BC #define GL_IMAGE_CLASS_2_X_16 0x82BD #define GL_IMAGE_CLASS_1_X_16 0x82BE #define GL_IMAGE_CLASS_4_X_8 0x82BF #define GL_IMAGE_CLASS_2_X_8 0x82C0 #define GL_IMAGE_CLASS_1_X_8 0x82C1 #define GL_IMAGE_CLASS_11_11_10 0x82C2 #define GL_IMAGE_CLASS_10_10_10_2 0x82C3 #define GL_VIEW_CLASS_128_BITS 0x82C4 #define GL_VIEW_CLASS_96_BITS 0x82C5 #define GL_VIEW_CLASS_64_BITS 0x82C6 #define GL_VIEW_CLASS_48_BITS 0x82C7 #define GL_VIEW_CLASS_32_BITS 0x82C8 #define GL_VIEW_CLASS_24_BITS 0x82C9 #define GL_VIEW_CLASS_16_BITS 0x82CA #define GL_VIEW_CLASS_8_BITS 0x82CB #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF #define GL_VIEW_CLASS_RGTC1_RED 0x82D0 #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); #define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) #define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) #endif /* GL_ARB_internalformat_query2 */ /* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ #ifndef GL_ARB_invalidate_subdata #define GL_ARB_invalidate_subdata 1 typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); #define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) #define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) #define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) #define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) #define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) #define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) #define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) #endif /* GL_ARB_invalidate_subdata */ /* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ #ifndef GL_ARB_map_buffer_alignment #define GL_ARB_map_buffer_alignment 1 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) #endif /* GL_ARB_map_buffer_alignment */ /* ------------------------ GL_ARB_map_buffer_range ------------------------ */ #ifndef GL_ARB_map_buffer_range #define GL_ARB_map_buffer_range 1 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); #define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) #define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) #define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) #endif /* GL_ARB_map_buffer_range */ /* ------------------------- GL_ARB_matrix_palette ------------------------- */ #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #define GL_MATRIX_PALETTE_ARB 0x8840 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); #define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) #define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) #define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) #define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) #define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) #define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) #endif /* GL_ARB_matrix_palette */ /* --------------------------- GL_ARB_multi_bind --------------------------- */ #ifndef GL_ARB_multi_bind #define GL_ARB_multi_bind 1 typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); #define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) #define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) #define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) #define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) #define glBindTextures GLEW_GET_FUN(__glewBindTextures) #define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) #define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) #endif /* GL_ARB_multi_bind */ /* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) #define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) #define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) #endif /* GL_ARB_multi_draw_indirect */ /* --------------------------- GL_ARB_multisample -------------------------- */ #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #define GL_MULTISAMPLE_ARB 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F #define GL_SAMPLE_COVERAGE_ARB 0x80A0 #define GL_SAMPLE_BUFFERS_ARB 0x80A8 #define GL_SAMPLES_ARB 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB #define GL_MULTISAMPLE_BIT_ARB 0x20000000 typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); #define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) #define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) #endif /* GL_ARB_multisample */ /* -------------------------- GL_ARB_multitexture -------------------------- */ #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); #define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) #define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) #define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) #define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) #define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) #define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) #define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) #define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) #define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) #define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) #define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) #define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) #define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) #define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) #define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) #define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) #define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) #define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) #define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) #define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) #define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) #define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) #define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) #define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) #define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) #define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) #define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) #define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) #define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) #define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) #define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) #define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) #define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) #define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) #define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) #endif /* GL_ARB_multitexture */ /* ------------------------- GL_ARB_occlusion_query ------------------------ */ #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #define GL_QUERY_COUNTER_BITS_ARB 0x8864 #define GL_CURRENT_QUERY_ARB 0x8865 #define GL_QUERY_RESULT_ARB 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 #define GL_SAMPLES_PASSED_ARB 0x8914 typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); #define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) #define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) #define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) #define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) #define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) #define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) #define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) #define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) #define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) #endif /* GL_ARB_occlusion_query */ /* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ #ifndef GL_ARB_occlusion_query2 #define GL_ARB_occlusion_query2 1 #define GL_ANY_SAMPLES_PASSED 0x8C2F #define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) #endif /* GL_ARB_occlusion_query2 */ /* --------------------- GL_ARB_parallel_shader_compile -------------------- */ #ifndef GL_ARB_parallel_shader_compile #define GL_ARB_parallel_shader_compile 1 #define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 #define GL_COMPLETION_STATUS_ARB 0x91B1 typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); #define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) #define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) #endif /* GL_ARB_parallel_shader_compile */ /* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ #ifndef GL_ARB_pipeline_statistics_query #define GL_ARB_pipeline_statistics_query 1 #define GL_VERTICES_SUBMITTED_ARB 0x82EE #define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF #define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 #define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 #define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 #define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 #define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 #define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 #define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 #define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) #endif /* GL_ARB_pipeline_statistics_query */ /* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ #ifndef GL_ARB_pixel_buffer_object #define GL_ARB_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_ARB 0x88EB #define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF #define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) #endif /* GL_ARB_pixel_buffer_object */ /* ------------------------ GL_ARB_point_parameters ------------------------ */ #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #define GL_POINT_SIZE_MIN_ARB 0x8126 #define GL_POINT_SIZE_MAX_ARB 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); #define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) #define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) #define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) #endif /* GL_ARB_point_parameters */ /* -------------------------- GL_ARB_point_sprite -------------------------- */ #ifndef GL_ARB_point_sprite #define GL_ARB_point_sprite 1 #define GL_POINT_SPRITE_ARB 0x8861 #define GL_COORD_REPLACE_ARB 0x8862 #define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) #endif /* GL_ARB_point_sprite */ /* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ #ifndef GL_ARB_post_depth_coverage #define GL_ARB_post_depth_coverage 1 #define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) #endif /* GL_ARB_post_depth_coverage */ /* --------------------- GL_ARB_program_interface_query -------------------- */ #ifndef GL_ARB_program_interface_query #define GL_ARB_program_interface_query 1 #define GL_UNIFORM 0x92E1 #define GL_UNIFORM_BLOCK 0x92E2 #define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_SHADER_STORAGE_BLOCK 0x92E6 #define GL_IS_PER_PATCH 0x92E7 #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA #define GL_GEOMETRY_SUBROUTINE 0x92EB #define GL_FRAGMENT_SUBROUTINE 0x92EC #define GL_COMPUTE_SUBROUTINE 0x92ED #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_ACTIVE_RESOURCES 0x92F5 #define GL_MAX_NAME_LENGTH 0x92F6 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 #define GL_NAME_LENGTH 0x92F9 #define GL_TYPE 0x92FA #define GL_ARRAY_SIZE 0x92FB #define GL_OFFSET 0x92FC #define GL_BLOCK_INDEX 0x92FD #define GL_ARRAY_STRIDE 0x92FE #define GL_MATRIX_STRIDE 0x92FF #define GL_IS_ROW_MAJOR 0x9300 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 #define GL_BUFFER_BINDING 0x9302 #define GL_BUFFER_DATA_SIZE 0x9303 #define GL_NUM_ACTIVE_VARIABLES 0x9304 #define GL_ACTIVE_VARIABLES 0x9305 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_LOCATION 0x930E #define GL_LOCATION_INDEX 0x930F typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); #define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) #define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) #define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) #define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) #define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) #define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) #define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) #endif /* GL_ARB_program_interface_query */ /* ------------------------ GL_ARB_provoking_vertex ------------------------ */ #ifndef GL_ARB_provoking_vertex #define GL_ARB_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); #define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) #define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) #endif /* GL_ARB_provoking_vertex */ /* ----------------------- GL_ARB_query_buffer_object ---------------------- */ #ifndef GL_ARB_query_buffer_object #define GL_ARB_query_buffer_object 1 #define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 #define GL_QUERY_BUFFER 0x9192 #define GL_QUERY_BUFFER_BINDING 0x9193 #define GL_QUERY_RESULT_NO_WAIT 0x9194 #define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) #endif /* GL_ARB_query_buffer_object */ /* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ #ifndef GL_ARB_robust_buffer_access_behavior #define GL_ARB_robust_buffer_access_behavior 1 #define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) #endif /* GL_ARB_robust_buffer_access_behavior */ /* --------------------------- GL_ARB_robustness --------------------------- */ #ifndef GL_ARB_robustness #define GL_ARB_robustness 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 #define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 #define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261 typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); #define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) #define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) #define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) #define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) #define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) #define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) #define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) #define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) #define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) #define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) #define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) #define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) #define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) #define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) #define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) #define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) #define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) #define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) #define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) #define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) #define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) #endif /* GL_ARB_robustness */ /* ---------------- GL_ARB_robustness_application_isolation ---------------- */ #ifndef GL_ARB_robustness_application_isolation #define GL_ARB_robustness_application_isolation 1 #define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) #endif /* GL_ARB_robustness_application_isolation */ /* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ #ifndef GL_ARB_robustness_share_group_isolation #define GL_ARB_robustness_share_group_isolation 1 #define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) #endif /* GL_ARB_robustness_share_group_isolation */ /* ------------------------ GL_ARB_sample_locations ------------------------ */ #ifndef GL_ARB_sample_locations #define GL_ARB_sample_locations 1 #define GL_SAMPLE_LOCATION_ARB 0x8E50 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); #define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) #define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) #define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) #endif /* GL_ARB_sample_locations */ /* ------------------------- GL_ARB_sample_shading ------------------------- */ #ifndef GL_ARB_sample_shading #define GL_ARB_sample_shading 1 #define GL_SAMPLE_SHADING_ARB 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); #define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) #define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) #endif /* GL_ARB_sample_shading */ /* ------------------------- GL_ARB_sampler_objects ------------------------ */ #ifndef GL_ARB_sampler_objects #define GL_ARB_sampler_objects 1 #define GL_SAMPLER_BINDING 0x8919 typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); #define glBindSampler GLEW_GET_FUN(__glewBindSampler) #define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) #define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) #define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) #define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) #define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) #define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) #define glIsSampler GLEW_GET_FUN(__glewIsSampler) #define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) #define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) #define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) #define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) #define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) #define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) #define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) #endif /* GL_ARB_sampler_objects */ /* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ #ifndef GL_ARB_seamless_cube_map #define GL_ARB_seamless_cube_map 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) #endif /* GL_ARB_seamless_cube_map */ /* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ #ifndef GL_ARB_seamless_cubemap_per_texture #define GL_ARB_seamless_cubemap_per_texture 1 #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) #endif /* GL_ARB_seamless_cubemap_per_texture */ /* --------------------- GL_ARB_separate_shader_objects -------------------- */ #ifndef GL_ARB_separate_shader_objects #define GL_ARB_separate_shader_objects 1 #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_ALL_SHADER_BITS 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); #define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) #define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) #define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) #define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) #define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) #define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) #define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) #define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) #define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) #define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) #define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) #define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) #define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) #define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) #define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) #define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) #define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) #define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) #define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) #define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) #define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) #define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) #define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) #define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) #define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) #define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) #define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) #define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) #define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) #define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) #define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) #define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) #define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) #define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) #define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) #define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) #define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) #define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) #define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) #define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) #define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) #define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) #define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) #define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) #define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) #define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) #define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) #define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) #define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) #define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) #define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) #define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) #define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) #define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) #define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) #define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) #define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) #define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) #define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) #define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) #define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) #endif /* GL_ARB_separate_shader_objects */ /* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ #ifndef GL_ARB_shader_atomic_counter_ops #define GL_ARB_shader_atomic_counter_ops 1 #define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) #endif /* GL_ARB_shader_atomic_counter_ops */ /* --------------------- GL_ARB_shader_atomic_counters --------------------- */ #ifndef GL_ARB_shader_atomic_counters #define GL_ARB_shader_atomic_counters 1 #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); #define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) #define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) #endif /* GL_ARB_shader_atomic_counters */ /* -------------------------- GL_ARB_shader_ballot ------------------------- */ #ifndef GL_ARB_shader_ballot #define GL_ARB_shader_ballot 1 #define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) #endif /* GL_ARB_shader_ballot */ /* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ #ifndef GL_ARB_shader_bit_encoding #define GL_ARB_shader_bit_encoding 1 #define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) #endif /* GL_ARB_shader_bit_encoding */ /* -------------------------- GL_ARB_shader_clock -------------------------- */ #ifndef GL_ARB_shader_clock #define GL_ARB_shader_clock 1 #define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) #endif /* GL_ARB_shader_clock */ /* --------------------- GL_ARB_shader_draw_parameters --------------------- */ #ifndef GL_ARB_shader_draw_parameters #define GL_ARB_shader_draw_parameters 1 #define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) #endif /* GL_ARB_shader_draw_parameters */ /* ------------------------ GL_ARB_shader_group_vote ----------------------- */ #ifndef GL_ARB_shader_group_vote #define GL_ARB_shader_group_vote 1 #define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) #endif /* GL_ARB_shader_group_vote */ /* --------------------- GL_ARB_shader_image_load_store -------------------- */ #ifndef GL_ARB_shader_image_load_store #define GL_ARB_shader_image_load_store 1 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_UNIFORM_BARRIER_BIT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 #define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 #define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 #define GL_IMAGE_BINDING_NAME 0x8F3A #define GL_IMAGE_BINDING_LEVEL 0x8F3B #define GL_IMAGE_BINDING_LAYERED 0x8F3C #define GL_IMAGE_BINDING_LAYER 0x8F3D #define GL_IMAGE_BINDING_ACCESS 0x8F3E #define GL_IMAGE_1D 0x904C #define GL_IMAGE_2D 0x904D #define GL_IMAGE_3D 0x904E #define GL_IMAGE_2D_RECT 0x904F #define GL_IMAGE_CUBE 0x9050 #define GL_IMAGE_BUFFER 0x9051 #define GL_IMAGE_1D_ARRAY 0x9052 #define GL_IMAGE_2D_ARRAY 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #define GL_INT_IMAGE_1D 0x9057 #define GL_INT_IMAGE_2D 0x9058 #define GL_INT_IMAGE_3D 0x9059 #define GL_INT_IMAGE_2D_RECT 0x905A #define GL_INT_IMAGE_CUBE 0x905B #define GL_INT_IMAGE_BUFFER 0x905C #define GL_INT_IMAGE_1D_ARRAY 0x905D #define GL_INT_IMAGE_2D_ARRAY 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C #define GL_MAX_IMAGE_SAMPLES 0x906D #define GL_IMAGE_BINDING_FORMAT 0x906E #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF #define GL_ALL_BARRIER_BITS 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); #define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) #define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) #define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) #endif /* GL_ARB_shader_image_load_store */ /* ------------------------ GL_ARB_shader_image_size ----------------------- */ #ifndef GL_ARB_shader_image_size #define GL_ARB_shader_image_size 1 #define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) #endif /* GL_ARB_shader_image_size */ /* ------------------------- GL_ARB_shader_objects ------------------------- */ #ifndef GL_ARB_shader_objects #define GL_ARB_shader_objects 1 #define GL_PROGRAM_OBJECT_ARB 0x8B40 #define GL_SHADER_OBJECT_ARB 0x8B48 #define GL_OBJECT_TYPE_ARB 0x8B4E #define GL_OBJECT_SUBTYPE_ARB 0x8B4F #define GL_FLOAT_VEC2_ARB 0x8B50 #define GL_FLOAT_VEC3_ARB 0x8B51 #define GL_FLOAT_VEC4_ARB 0x8B52 #define GL_INT_VEC2_ARB 0x8B53 #define GL_INT_VEC3_ARB 0x8B54 #define GL_INT_VEC4_ARB 0x8B55 #define GL_BOOL_ARB 0x8B56 #define GL_BOOL_VEC2_ARB 0x8B57 #define GL_BOOL_VEC3_ARB 0x8B58 #define GL_BOOL_VEC4_ARB 0x8B59 #define GL_FLOAT_MAT2_ARB 0x8B5A #define GL_FLOAT_MAT3_ARB 0x8B5B #define GL_FLOAT_MAT4_ARB 0x8B5C #define GL_SAMPLER_1D_ARB 0x8B5D #define GL_SAMPLER_2D_ARB 0x8B5E #define GL_SAMPLER_3D_ARB 0x8B5F #define GL_SAMPLER_CUBE_ARB 0x8B60 #define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 #define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 #define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 #define GL_OBJECT_LINK_STATUS_ARB 0x8B82 #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 #define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 #define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 #define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 typedef char GLcharARB; typedef unsigned int GLhandleARB; typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); #define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) #define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) #define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) #define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) #define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) #define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) #define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) #define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) #define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) #define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) #define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) #define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) #define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) #define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) #define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) #define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) #define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) #define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) #define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) #define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) #define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) #define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) #define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) #define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) #define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) #define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) #define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) #define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) #define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) #define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) #define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) #define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) #define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) #define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) #define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) #define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) #define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) #define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) #define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) #define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) #endif /* GL_ARB_shader_objects */ /* ------------------------ GL_ARB_shader_precision ------------------------ */ #ifndef GL_ARB_shader_precision #define GL_ARB_shader_precision 1 #define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) #endif /* GL_ARB_shader_precision */ /* ---------------------- GL_ARB_shader_stencil_export --------------------- */ #ifndef GL_ARB_shader_stencil_export #define GL_ARB_shader_stencil_export 1 #define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) #endif /* GL_ARB_shader_stencil_export */ /* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ #ifndef GL_ARB_shader_storage_buffer_object #define GL_ARB_shader_storage_buffer_object 1 #define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); #define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) #define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) #endif /* GL_ARB_shader_storage_buffer_object */ /* ------------------------ GL_ARB_shader_subroutine ----------------------- */ #ifndef GL_ARB_shader_subroutine #define GL_ARB_shader_subroutine 1 #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_MAX_SUBROUTINES 0x8DE7 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPATIBLE_SUBROUTINES 0x8E4B typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); #define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) #define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) #define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) #define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) #define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) #define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) #define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) #define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) #define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) #endif /* GL_ARB_shader_subroutine */ /* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ #ifndef GL_ARB_shader_texture_image_samples #define GL_ARB_shader_texture_image_samples 1 #define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) #endif /* GL_ARB_shader_texture_image_samples */ /* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ #ifndef GL_ARB_shader_texture_lod #define GL_ARB_shader_texture_lod 1 #define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) #endif /* GL_ARB_shader_texture_lod */ /* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ #ifndef GL_ARB_shader_viewport_layer_array #define GL_ARB_shader_viewport_layer_array 1 #define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) #endif /* GL_ARB_shader_viewport_layer_array */ /* ---------------------- GL_ARB_shading_language_100 ---------------------- */ #ifndef GL_ARB_shading_language_100 #define GL_ARB_shading_language_100 1 #define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C #define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) #endif /* GL_ARB_shading_language_100 */ /* -------------------- GL_ARB_shading_language_420pack -------------------- */ #ifndef GL_ARB_shading_language_420pack #define GL_ARB_shading_language_420pack 1 #define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) #endif /* GL_ARB_shading_language_420pack */ /* -------------------- GL_ARB_shading_language_include -------------------- */ #ifndef GL_ARB_shading_language_include #define GL_ARB_shading_language_include 1 #define GL_SHADER_INCLUDE_ARB 0x8DAE #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); #define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) #define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) #define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) #define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) #define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) #define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) #define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) #endif /* GL_ARB_shading_language_include */ /* -------------------- GL_ARB_shading_language_packing -------------------- */ #ifndef GL_ARB_shading_language_packing #define GL_ARB_shading_language_packing 1 #define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) #endif /* GL_ARB_shading_language_packing */ /* ----------------------------- GL_ARB_shadow ----------------------------- */ #ifndef GL_ARB_shadow #define GL_ARB_shadow 1 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) #endif /* GL_ARB_shadow */ /* ------------------------- GL_ARB_shadow_ambient ------------------------- */ #ifndef GL_ARB_shadow_ambient #define GL_ARB_shadow_ambient 1 #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF #define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) #endif /* GL_ARB_shadow_ambient */ /* -------------------------- GL_ARB_sparse_buffer ------------------------- */ #ifndef GL_ARB_sparse_buffer #define GL_ARB_sparse_buffer 1 #define GL_SPARSE_STORAGE_BIT_ARB 0x0400 #define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); #define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) #define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) #endif /* GL_ARB_sparse_buffer */ /* ------------------------- GL_ARB_sparse_texture ------------------------- */ #ifndef GL_ARB_sparse_texture #define GL_ARB_sparse_texture 1 #define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A #define GL_TEXTURE_SPARSE_ARB 0x91A6 #define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 #define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 #define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 #define GL_NUM_SPARSE_LEVELS_ARB 0x91AA typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); #define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) #define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) #define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) #endif /* GL_ARB_sparse_texture */ /* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ #ifndef GL_ARB_sparse_texture2 #define GL_ARB_sparse_texture2 1 #define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) #endif /* GL_ARB_sparse_texture2 */ /* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ #ifndef GL_ARB_sparse_texture_clamp #define GL_ARB_sparse_texture_clamp 1 #define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) #endif /* GL_ARB_sparse_texture_clamp */ /* ------------------------ GL_ARB_stencil_texturing ----------------------- */ #ifndef GL_ARB_stencil_texturing #define GL_ARB_stencil_texturing 1 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) #endif /* GL_ARB_stencil_texturing */ /* ------------------------------ GL_ARB_sync ------------------------------ */ #ifndef GL_ARB_sync #define GL_ARB_sync 1 #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_OBJECT_TYPE 0x9112 #define GL_SYNC_CONDITION 0x9113 #define GL_SYNC_STATUS 0x9114 #define GL_SYNC_FLAGS 0x9115 #define GL_SYNC_FENCE 0x9116 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_UNSIGNALED 0x9118 #define GL_SIGNALED 0x9119 #define GL_ALREADY_SIGNALED 0x911A #define GL_TIMEOUT_EXPIRED 0x911B #define GL_CONDITION_SATISFIED 0x911C #define GL_WAIT_FAILED 0x911D #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); #define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) #define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) #define glFenceSync GLEW_GET_FUN(__glewFenceSync) #define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) #define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) #define glIsSync GLEW_GET_FUN(__glewIsSync) #define glWaitSync GLEW_GET_FUN(__glewWaitSync) #define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) #endif /* GL_ARB_sync */ /* ----------------------- GL_ARB_tessellation_shader ---------------------- */ #ifndef GL_ARB_tessellation_shader #define GL_ARB_tessellation_shader 1 #define GL_PATCHES 0xE #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_PATCH_VERTICES 0x8E72 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 #define GL_TESS_GEN_MODE 0x8E76 #define GL_TESS_GEN_SPACING 0x8E77 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TESS_GEN_POINT_MODE 0x8E79 #define GL_ISOLINES 0x8E7A #define GL_FRACTIONAL_ODD 0x8E7B #define GL_FRACTIONAL_EVEN 0x8E7C #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); #define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) #define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) #define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) #endif /* GL_ARB_tessellation_shader */ /* ------------------------- GL_ARB_texture_barrier ------------------------ */ #ifndef GL_ARB_texture_barrier #define GL_ARB_texture_barrier 1 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); #define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) #define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) #endif /* GL_ARB_texture_barrier */ /* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ #ifndef GL_ARB_texture_border_clamp #define GL_ARB_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_ARB 0x812D #define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) #endif /* GL_ARB_texture_border_clamp */ /* ---------------------- GL_ARB_texture_buffer_object --------------------- */ #ifndef GL_ARB_texture_buffer_object #define GL_ARB_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_ARB 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); #define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) #define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) #endif /* GL_ARB_texture_buffer_object */ /* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ #ifndef GL_ARB_texture_buffer_object_rgb32 #define GL_ARB_texture_buffer_object_rgb32 1 #define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) #endif /* GL_ARB_texture_buffer_object_rgb32 */ /* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ #ifndef GL_ARB_texture_buffer_range #define GL_ARB_texture_buffer_range 1 #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); #define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) #define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) #define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) #endif /* GL_ARB_texture_buffer_range */ /* ----------------------- GL_ARB_texture_compression ---------------------- */ #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGB_ARB 0x84ED #define GL_COMPRESSED_RGBA_ARB 0x84EE #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); #define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) #define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) #define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) #define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) #define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) #define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) #define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) #define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) #endif /* GL_ARB_texture_compression */ /* -------------------- GL_ARB_texture_compression_bptc -------------------- */ #ifndef GL_ARB_texture_compression_bptc #define GL_ARB_texture_compression_bptc 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F #define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) #endif /* GL_ARB_texture_compression_bptc */ /* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ #ifndef GL_ARB_texture_compression_rgtc #define GL_ARB_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) #endif /* GL_ARB_texture_compression_rgtc */ /* ------------------------ GL_ARB_texture_cube_map ------------------------ */ #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C #define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) #endif /* GL_ARB_texture_cube_map */ /* --------------------- GL_ARB_texture_cube_map_array --------------------- */ #ifndef GL_ARB_texture_cube_map_array #define GL_ARB_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F #define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) #endif /* GL_ARB_texture_cube_map_array */ /* ------------------------- GL_ARB_texture_env_add ------------------------ */ #ifndef GL_ARB_texture_env_add #define GL_ARB_texture_env_add 1 #define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) #endif /* GL_ARB_texture_env_add */ /* ----------------------- GL_ARB_texture_env_combine ---------------------- */ #ifndef GL_ARB_texture_env_combine #define GL_ARB_texture_env_combine 1 #define GL_SUBTRACT_ARB 0x84E7 #define GL_COMBINE_ARB 0x8570 #define GL_COMBINE_RGB_ARB 0x8571 #define GL_COMBINE_ALPHA_ARB 0x8572 #define GL_RGB_SCALE_ARB 0x8573 #define GL_ADD_SIGNED_ARB 0x8574 #define GL_INTERPOLATE_ARB 0x8575 #define GL_CONSTANT_ARB 0x8576 #define GL_PRIMARY_COLOR_ARB 0x8577 #define GL_PREVIOUS_ARB 0x8578 #define GL_SOURCE0_RGB_ARB 0x8580 #define GL_SOURCE1_RGB_ARB 0x8581 #define GL_SOURCE2_RGB_ARB 0x8582 #define GL_SOURCE0_ALPHA_ARB 0x8588 #define GL_SOURCE1_ALPHA_ARB 0x8589 #define GL_SOURCE2_ALPHA_ARB 0x858A #define GL_OPERAND0_RGB_ARB 0x8590 #define GL_OPERAND1_RGB_ARB 0x8591 #define GL_OPERAND2_RGB_ARB 0x8592 #define GL_OPERAND0_ALPHA_ARB 0x8598 #define GL_OPERAND1_ALPHA_ARB 0x8599 #define GL_OPERAND2_ALPHA_ARB 0x859A #define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) #endif /* GL_ARB_texture_env_combine */ /* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ #ifndef GL_ARB_texture_env_crossbar #define GL_ARB_texture_env_crossbar 1 #define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) #endif /* GL_ARB_texture_env_crossbar */ /* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ #ifndef GL_ARB_texture_env_dot3 #define GL_ARB_texture_env_dot3 1 #define GL_DOT3_RGB_ARB 0x86AE #define GL_DOT3_RGBA_ARB 0x86AF #define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) #endif /* GL_ARB_texture_env_dot3 */ /* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ #ifndef GL_ARB_texture_filter_minmax #define GL_ARB_texture_filter_minmax 1 #define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 #define GL_WEIGHTED_AVERAGE_ARB 0x9367 #define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) #endif /* GL_ARB_texture_filter_minmax */ /* -------------------------- GL_ARB_texture_float ------------------------- */ #ifndef GL_ARB_texture_float #define GL_ARB_texture_float 1 #define GL_RGBA32F_ARB 0x8814 #define GL_RGB32F_ARB 0x8815 #define GL_ALPHA32F_ARB 0x8816 #define GL_INTENSITY32F_ARB 0x8817 #define GL_LUMINANCE32F_ARB 0x8818 #define GL_LUMINANCE_ALPHA32F_ARB 0x8819 #define GL_RGBA16F_ARB 0x881A #define GL_RGB16F_ARB 0x881B #define GL_ALPHA16F_ARB 0x881C #define GL_INTENSITY16F_ARB 0x881D #define GL_LUMINANCE16F_ARB 0x881E #define GL_LUMINANCE_ALPHA16F_ARB 0x881F #define GL_TEXTURE_RED_TYPE_ARB 0x8C10 #define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 #define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 #define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 #define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 #define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 #define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) #endif /* GL_ARB_texture_float */ /* ------------------------- GL_ARB_texture_gather ------------------------- */ #ifndef GL_ARB_texture_gather #define GL_ARB_texture_gather 1 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F #define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) #endif /* GL_ARB_texture_gather */ /* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ #ifndef GL_ARB_texture_mirror_clamp_to_edge #define GL_ARB_texture_mirror_clamp_to_edge 1 #define GL_MIRROR_CLAMP_TO_EDGE 0x8743 #define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) #endif /* GL_ARB_texture_mirror_clamp_to_edge */ /* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ #ifndef GL_ARB_texture_mirrored_repeat #define GL_ARB_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_ARB 0x8370 #define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) #endif /* GL_ARB_texture_mirrored_repeat */ /* ----------------------- GL_ARB_texture_multisample ---------------------- */ #ifndef GL_ARB_texture_multisample #define GL_ARB_texture_multisample 1 #define GL_SAMPLE_POSITION 0x8E50 #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 #define GL_TEXTURE_SAMPLES 0x9106 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); #define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) #define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) #define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) #define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) #define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) #endif /* GL_ARB_texture_multisample */ /* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ #ifndef GL_ARB_texture_non_power_of_two #define GL_ARB_texture_non_power_of_two 1 #define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) #endif /* GL_ARB_texture_non_power_of_two */ /* ---------------------- GL_ARB_texture_query_levels ---------------------- */ #ifndef GL_ARB_texture_query_levels #define GL_ARB_texture_query_levels 1 #define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) #endif /* GL_ARB_texture_query_levels */ /* ------------------------ GL_ARB_texture_query_lod ----------------------- */ #ifndef GL_ARB_texture_query_lod #define GL_ARB_texture_query_lod 1 #define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) #endif /* GL_ARB_texture_query_lod */ /* ------------------------ GL_ARB_texture_rectangle ----------------------- */ #ifndef GL_ARB_texture_rectangle #define GL_ARB_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_ARB 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) #endif /* GL_ARB_texture_rectangle */ /* --------------------------- GL_ARB_texture_rg --------------------------- */ #ifndef GL_ARB_texture_rg #define GL_ARB_texture_rg 1 #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RG 0x8226 #define GL_RG 0x8227 #define GL_RG_INTEGER 0x8228 #define GL_R8 0x8229 #define GL_R16 0x822A #define GL_RG8 0x822B #define GL_RG16 0x822C #define GL_R16F 0x822D #define GL_R32F 0x822E #define GL_RG16F 0x822F #define GL_RG32F 0x8230 #define GL_R8I 0x8231 #define GL_R8UI 0x8232 #define GL_R16I 0x8233 #define GL_R16UI 0x8234 #define GL_R32I 0x8235 #define GL_R32UI 0x8236 #define GL_RG8I 0x8237 #define GL_RG8UI 0x8238 #define GL_RG16I 0x8239 #define GL_RG16UI 0x823A #define GL_RG32I 0x823B #define GL_RG32UI 0x823C #define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) #endif /* GL_ARB_texture_rg */ /* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ #ifndef GL_ARB_texture_rgb10_a2ui #define GL_ARB_texture_rgb10_a2ui 1 #define GL_RGB10_A2UI 0x906F #define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) #endif /* GL_ARB_texture_rgb10_a2ui */ /* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ #ifndef GL_ARB_texture_stencil8 #define GL_ARB_texture_stencil8 1 #define GL_STENCIL_INDEX 0x1901 #define GL_STENCIL_INDEX8 0x8D48 #define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) #endif /* GL_ARB_texture_stencil8 */ /* ------------------------- GL_ARB_texture_storage ------------------------ */ #ifndef GL_ARB_texture_storage #define GL_ARB_texture_storage 1 #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); #define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) #define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) #define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) #define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) #define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) #define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) #define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) #endif /* GL_ARB_texture_storage */ /* ------------------- GL_ARB_texture_storage_multisample ------------------ */ #ifndef GL_ARB_texture_storage_multisample #define GL_ARB_texture_storage_multisample 1 typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); #define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) #define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) #define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) #define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) #define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) #endif /* GL_ARB_texture_storage_multisample */ /* ------------------------- GL_ARB_texture_swizzle ------------------------ */ #ifndef GL_ARB_texture_swizzle #define GL_ARB_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) #endif /* GL_ARB_texture_swizzle */ /* -------------------------- GL_ARB_texture_view -------------------------- */ #ifndef GL_ARB_texture_view #define GL_ARB_texture_view 1 #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); #define glTextureView GLEW_GET_FUN(__glewTextureView) #define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) #endif /* GL_ARB_texture_view */ /* --------------------------- GL_ARB_timer_query -------------------------- */ #ifndef GL_ARB_timer_query #define GL_ARB_timer_query 1 #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); #define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) #define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) #define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) #define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) #endif /* GL_ARB_timer_query */ /* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ #ifndef GL_ARB_transform_feedback2 #define GL_ARB_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); #define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) #define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) #define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) #define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) #define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) #define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) #define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) #define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) #endif /* GL_ARB_transform_feedback2 */ /* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ #ifndef GL_ARB_transform_feedback3 #define GL_ARB_transform_feedback3 1 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 #define GL_MAX_VERTEX_STREAMS 0x8E71 typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); #define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) #define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) #define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) #define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) #define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) #endif /* GL_ARB_transform_feedback3 */ /* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ #ifndef GL_ARB_transform_feedback_instanced #define GL_ARB_transform_feedback_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); #define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) #define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) #define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) #endif /* GL_ARB_transform_feedback_instanced */ /* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ #ifndef GL_ARB_transform_feedback_overflow_query #define GL_ARB_transform_feedback_overflow_query 1 #define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC #define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED #define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) #endif /* GL_ARB_transform_feedback_overflow_query */ /* ------------------------ GL_ARB_transpose_matrix ------------------------ */ #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); #define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) #define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) #define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) #define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) #define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) #endif /* GL_ARB_transpose_matrix */ /* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ #ifndef GL_ARB_uniform_buffer_object #define GL_ARB_uniform_buffer_object 1 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_UNIFORM_TYPE 0x8A37 #define GL_UNIFORM_SIZE 0x8A38 #define GL_UNIFORM_NAME_LENGTH 0x8A39 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_UNIFORM_OFFSET 0x8A3B #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) #define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) #define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) #define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) #define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) #define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) #define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) #define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) #define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) #define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) #define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) #endif /* GL_ARB_uniform_buffer_object */ /* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ #ifndef GL_ARB_vertex_array_bgra #define GL_ARB_vertex_array_bgra 1 #define GL_BGRA 0x80E1 #define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) #endif /* GL_ARB_vertex_array_bgra */ /* ----------------------- GL_ARB_vertex_array_object ---------------------- */ #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING 0x85B5 typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); #define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) #define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) #define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) #define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) #define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) #endif /* GL_ARB_vertex_array_object */ /* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); #define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) #define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) #define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) #define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) #define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) #define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) #define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) #define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) #define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) #define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) #define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) #endif /* GL_ARB_vertex_attrib_64bit */ /* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ #ifndef GL_ARB_vertex_attrib_binding #define GL_ARB_vertex_attrib_binding 1 #define GL_VERTEX_ATTRIB_BINDING 0x82D4 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 #define GL_VERTEX_BINDING_DIVISOR 0x82D6 #define GL_VERTEX_BINDING_OFFSET 0x82D7 #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA #define GL_VERTEX_BINDING_BUFFER 0x8F4F typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); #define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) #define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) #define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) #define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) #define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) #define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) #define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) #define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) #define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) #define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) #define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) #define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) #define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) #endif /* GL_ARB_vertex_attrib_binding */ /* -------------------------- GL_ARB_vertex_blend -------------------------- */ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #define GL_MODELVIEW0_ARB 0x1700 #define GL_MODELVIEW1_ARB 0x850A #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 #define GL_VERTEX_BLEND_ARB 0x86A7 #define GL_CURRENT_WEIGHT_ARB 0x86A8 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC #define GL_WEIGHT_ARRAY_ARB 0x86AD #define GL_MODELVIEW2_ARB 0x8722 #define GL_MODELVIEW3_ARB 0x8723 #define GL_MODELVIEW4_ARB 0x8724 #define GL_MODELVIEW5_ARB 0x8725 #define GL_MODELVIEW6_ARB 0x8726 #define GL_MODELVIEW7_ARB 0x8727 #define GL_MODELVIEW8_ARB 0x8728 #define GL_MODELVIEW9_ARB 0x8729 #define GL_MODELVIEW10_ARB 0x872A #define GL_MODELVIEW11_ARB 0x872B #define GL_MODELVIEW12_ARB 0x872C #define GL_MODELVIEW13_ARB 0x872D #define GL_MODELVIEW14_ARB 0x872E #define GL_MODELVIEW15_ARB 0x872F #define GL_MODELVIEW16_ARB 0x8730 #define GL_MODELVIEW17_ARB 0x8731 #define GL_MODELVIEW18_ARB 0x8732 #define GL_MODELVIEW19_ARB 0x8733 #define GL_MODELVIEW20_ARB 0x8734 #define GL_MODELVIEW21_ARB 0x8735 #define GL_MODELVIEW22_ARB 0x8736 #define GL_MODELVIEW23_ARB 0x8737 #define GL_MODELVIEW24_ARB 0x8738 #define GL_MODELVIEW25_ARB 0x8739 #define GL_MODELVIEW26_ARB 0x873A #define GL_MODELVIEW27_ARB 0x873B #define GL_MODELVIEW28_ARB 0x873C #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); #define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) #define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) #define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) #define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) #define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) #define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) #define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) #define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) #define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) #define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) #define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) #endif /* GL_ARB_vertex_blend */ /* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ #ifndef GL_ARB_vertex_buffer_object #define GL_ARB_vertex_buffer_object 1 #define GL_BUFFER_SIZE_ARB 0x8764 #define GL_BUFFER_USAGE_ARB 0x8765 #define GL_ARRAY_BUFFER_ARB 0x8892 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F #define GL_READ_ONLY_ARB 0x88B8 #define GL_WRITE_ONLY_ARB 0x88B9 #define GL_READ_WRITE_ARB 0x88BA #define GL_BUFFER_ACCESS_ARB 0x88BB #define GL_BUFFER_MAPPED_ARB 0x88BC #define GL_BUFFER_MAP_POINTER_ARB 0x88BD #define GL_STREAM_DRAW_ARB 0x88E0 #define GL_STREAM_READ_ARB 0x88E1 #define GL_STREAM_COPY_ARB 0x88E2 #define GL_STATIC_DRAW_ARB 0x88E4 #define GL_STATIC_READ_ARB 0x88E5 #define GL_STATIC_COPY_ARB 0x88E6 #define GL_DYNAMIC_DRAW_ARB 0x88E8 #define GL_DYNAMIC_READ_ARB 0x88E9 #define GL_DYNAMIC_COPY_ARB 0x88EA typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); #define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) #define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) #define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) #define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) #define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) #define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) #define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) #define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) #define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) #define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) #define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) #define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) #endif /* GL_ARB_vertex_buffer_object */ /* ------------------------- GL_ARB_vertex_program ------------------------- */ #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 #define GL_COLOR_SUM_ARB 0x8458 #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_STRING_ARB 0x8628 #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B #define GL_PROGRAM_BINDING_ARB 0x8677 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX1_ARB 0x88C1 #define GL_MATRIX2_ARB 0x88C2 #define GL_MATRIX3_ARB 0x88C3 #define GL_MATRIX4_ARB 0x88C4 #define GL_MATRIX5_ARB 0x88C5 #define GL_MATRIX6_ARB 0x88C6 #define GL_MATRIX7_ARB 0x88C7 #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX10_ARB 0x88CA #define GL_MATRIX11_ARB 0x88CB #define GL_MATRIX12_ARB 0x88CC #define GL_MATRIX13_ARB 0x88CD #define GL_MATRIX14_ARB 0x88CE #define GL_MATRIX15_ARB 0x88CF #define GL_MATRIX16_ARB 0x88D0 #define GL_MATRIX17_ARB 0x88D1 #define GL_MATRIX18_ARB 0x88D2 #define GL_MATRIX19_ARB 0x88D3 #define GL_MATRIX20_ARB 0x88D4 #define GL_MATRIX21_ARB 0x88D5 #define GL_MATRIX22_ARB 0x88D6 #define GL_MATRIX23_ARB 0x88D7 #define GL_MATRIX24_ARB 0x88D8 #define GL_MATRIX25_ARB 0x88D9 #define GL_MATRIX26_ARB 0x88DA #define GL_MATRIX27_ARB 0x88DB #define GL_MATRIX28_ARB 0x88DC #define GL_MATRIX29_ARB 0x88DD #define GL_MATRIX30_ARB 0x88DE #define GL_MATRIX31_ARB 0x88DF typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) #define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) #define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) #define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) #define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) #define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) #define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) #define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) #define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) #define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) #define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) #define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) #define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) #define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) #define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) #define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) #define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) #define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) #define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) #define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) #define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) #define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) #define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) #define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) #define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) #define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) #define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) #define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) #define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) #define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) #define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) #define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) #define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) #define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) #define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) #define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) #define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) #define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) #define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) #define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) #define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) #define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) #define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) #define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) #define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) #define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) #define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) #define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) #define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) #define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) #define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) #define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) #define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) #define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) #define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) #define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) #define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) #define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) #define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) #define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) #define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) #define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) #define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) #endif /* GL_ARB_vertex_program */ /* -------------------------- GL_ARB_vertex_shader ------------------------- */ #ifndef GL_ARB_vertex_shader #define GL_ARB_vertex_shader 1 #define GL_VERTEX_SHADER_ARB 0x8B31 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); #define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) #define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) #define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) #define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) #endif /* GL_ARB_vertex_shader */ /* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ #ifndef GL_ARB_vertex_type_10f_11f_11f_rev #define GL_ARB_vertex_type_10f_11f_11f_rev 1 #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ /* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev #define GL_ARB_vertex_type_2_10_10_10_rev 1 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_INT_2_10_10_10_REV 0x8D9F typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); #define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) #define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) #define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) #define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) #define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) #define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) #define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) #define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) #define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) #define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) #define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) #define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) #define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) #define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) #define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) #define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) #define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) #define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) #define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) #define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) #define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) #define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) #define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) #define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) #define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) #define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) #define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) #define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) #define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) #define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) #define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) #define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) #define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) #define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) #define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) #define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) #define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) #define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) #define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ /* ------------------------- GL_ARB_viewport_array ------------------------- */ #ifndef GL_ARB_viewport_array #define GL_ARB_viewport_array 1 #define GL_DEPTH_RANGE 0x0B70 #define GL_VIEWPORT 0x0BA2 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_MAX_VIEWPORTS 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_UNDEFINED_VERTEX 0x8260 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); #define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) #define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) #define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) #define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) #define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) #define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) #define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) #define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) #define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) #define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) #define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) #endif /* GL_ARB_viewport_array */ /* --------------------------- GL_ARB_window_pos --------------------------- */ #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); #define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) #define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) #define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) #define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) #define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) #define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) #define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) #define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) #define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) #define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) #define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) #define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) #define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) #define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) #define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) #define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) #define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) #endif /* GL_ARB_window_pos */ /* ------------------------- GL_ATIX_point_sprites ------------------------- */ #ifndef GL_ATIX_point_sprites #define GL_ATIX_point_sprites 1 #define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 #define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 #define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 #define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 #define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 #define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 #define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) #endif /* GL_ATIX_point_sprites */ /* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ #ifndef GL_ATIX_texture_env_combine3 #define GL_ATIX_texture_env_combine3 1 #define GL_MODULATE_ADD_ATIX 0x8744 #define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 #define GL_MODULATE_SUBTRACT_ATIX 0x8746 #define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) #endif /* GL_ATIX_texture_env_combine3 */ /* ----------------------- GL_ATIX_texture_env_route ----------------------- */ #ifndef GL_ATIX_texture_env_route #define GL_ATIX_texture_env_route 1 #define GL_SECONDARY_COLOR_ATIX 0x8747 #define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 #define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 #define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) #endif /* GL_ATIX_texture_env_route */ /* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ #ifndef GL_ATIX_vertex_shader_output_point_size #define GL_ATIX_vertex_shader_output_point_size 1 #define GL_OUTPUT_POINT_SIZE_ATIX 0x610E #define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) #endif /* GL_ATIX_vertex_shader_output_point_size */ /* -------------------------- GL_ATI_draw_buffers -------------------------- */ #ifndef GL_ATI_draw_buffers #define GL_ATI_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ATI 0x8824 #define GL_DRAW_BUFFER0_ATI 0x8825 #define GL_DRAW_BUFFER1_ATI 0x8826 #define GL_DRAW_BUFFER2_ATI 0x8827 #define GL_DRAW_BUFFER3_ATI 0x8828 #define GL_DRAW_BUFFER4_ATI 0x8829 #define GL_DRAW_BUFFER5_ATI 0x882A #define GL_DRAW_BUFFER6_ATI 0x882B #define GL_DRAW_BUFFER7_ATI 0x882C #define GL_DRAW_BUFFER8_ATI 0x882D #define GL_DRAW_BUFFER9_ATI 0x882E #define GL_DRAW_BUFFER10_ATI 0x882F #define GL_DRAW_BUFFER11_ATI 0x8830 #define GL_DRAW_BUFFER12_ATI 0x8831 #define GL_DRAW_BUFFER13_ATI 0x8832 #define GL_DRAW_BUFFER14_ATI 0x8833 #define GL_DRAW_BUFFER15_ATI 0x8834 typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); #define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) #define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) #endif /* GL_ATI_draw_buffers */ /* -------------------------- GL_ATI_element_array ------------------------- */ #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #define GL_ELEMENT_ARRAY_ATI 0x8768 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); #define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) #define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) #define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) #define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) #endif /* GL_ATI_element_array */ /* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 #define GL_BUMP_TEX_UNITS_ATI 0x8778 #define GL_DUDV_ATI 0x8779 #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); #define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) #define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) #define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) #define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) #define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) #endif /* GL_ATI_envmap_bumpmap */ /* ------------------------- GL_ATI_fragment_shader ------------------------ */ #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #define GL_2X_BIT_ATI 0x00000001 #define GL_RED_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 #define GL_COMP_BIT_ATI 0x00000002 #define GL_GREEN_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 #define GL_BLUE_BIT_ATI 0x00000004 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 #define GL_EIGHTH_BIT_ATI 0x00000020 #define GL_SATURATE_BIT_ATI 0x00000040 #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 #define GL_REG_2_ATI 0x8923 #define GL_REG_3_ATI 0x8924 #define GL_REG_4_ATI 0x8925 #define GL_REG_5_ATI 0x8926 #define GL_CON_0_ATI 0x8941 #define GL_CON_1_ATI 0x8942 #define GL_CON_2_ATI 0x8943 #define GL_CON_3_ATI 0x8944 #define GL_CON_4_ATI 0x8945 #define GL_CON_5_ATI 0x8946 #define GL_CON_6_ATI 0x8947 #define GL_CON_7_ATI 0x8948 #define GL_MOV_ATI 0x8961 #define GL_ADD_ATI 0x8963 #define GL_MUL_ATI 0x8964 #define GL_SUB_ATI 0x8965 #define GL_DOT3_ATI 0x8966 #define GL_DOT4_ATI 0x8967 #define GL_MAD_ATI 0x8968 #define GL_LERP_ATI 0x8969 #define GL_CND_ATI 0x896A #define GL_CND0_ATI 0x896B #define GL_DOT2_ADD_ATI 0x896C #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F #define GL_NUM_PASSES_ATI 0x8970 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 #define GL_SWIZZLE_STR_ATI 0x8976 #define GL_SWIZZLE_STQ_ATI 0x8977 #define GL_SWIZZLE_STR_DR_ATI 0x8978 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979 #define GL_SWIZZLE_STRQ_ATI 0x897A #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); #define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) #define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) #define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) #define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) #define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) #define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) #define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) #define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) #define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) #define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) #define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) #define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) #define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) #define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) #define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) #endif /* GL_ATI_fragment_shader */ /* ------------------------ GL_ATI_map_object_buffer ----------------------- */ #ifndef GL_ATI_map_object_buffer #define GL_ATI_map_object_buffer 1 typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); #define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) #define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) #define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) #endif /* GL_ATI_map_object_buffer */ /* ----------------------------- GL_ATI_meminfo ---------------------------- */ #ifndef GL_ATI_meminfo #define GL_ATI_meminfo 1 #define GL_VBO_FREE_MEMORY_ATI 0x87FB #define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC #define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD #define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) #endif /* GL_ATI_meminfo */ /* -------------------------- GL_ATI_pn_triangles -------------------------- */ #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); #define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) #define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) #define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) #endif /* GL_ATI_pn_triangles */ /* ------------------------ GL_ATI_separate_stencil ------------------------ */ #ifndef GL_ATI_separate_stencil #define GL_ATI_separate_stencil 1 #define GL_STENCIL_BACK_FUNC_ATI 0x8800 #define GL_STENCIL_BACK_FAIL_ATI 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); #define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) #define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) #define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) #endif /* GL_ATI_separate_stencil */ /* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ #ifndef GL_ATI_shader_texture_lod #define GL_ATI_shader_texture_lod 1 #define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) #endif /* GL_ATI_shader_texture_lod */ /* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ #ifndef GL_ATI_text_fragment_shader #define GL_ATI_text_fragment_shader 1 #define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 #define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) #endif /* GL_ATI_text_fragment_shader */ /* --------------------- GL_ATI_texture_compression_3dc -------------------- */ #ifndef GL_ATI_texture_compression_3dc #define GL_ATI_texture_compression_3dc 1 #define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 #define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) #endif /* GL_ATI_texture_compression_3dc */ /* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ #ifndef GL_ATI_texture_env_combine3 #define GL_ATI_texture_env_combine3 1 #define GL_MODULATE_ADD_ATI 0x8744 #define GL_MODULATE_SIGNED_ADD_ATI 0x8745 #define GL_MODULATE_SUBTRACT_ATI 0x8746 #define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) #endif /* GL_ATI_texture_env_combine3 */ /* -------------------------- GL_ATI_texture_float ------------------------- */ #ifndef GL_ATI_texture_float #define GL_ATI_texture_float 1 #define GL_RGBA_FLOAT32_ATI 0x8814 #define GL_RGB_FLOAT32_ATI 0x8815 #define GL_ALPHA_FLOAT32_ATI 0x8816 #define GL_INTENSITY_FLOAT32_ATI 0x8817 #define GL_LUMINANCE_FLOAT32_ATI 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 #define GL_RGBA_FLOAT16_ATI 0x881A #define GL_RGB_FLOAT16_ATI 0x881B #define GL_ALPHA_FLOAT16_ATI 0x881C #define GL_INTENSITY_FLOAT16_ATI 0x881D #define GL_LUMINANCE_FLOAT16_ATI 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F #define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) #endif /* GL_ATI_texture_float */ /* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ #ifndef GL_ATI_texture_mirror_once #define GL_ATI_texture_mirror_once 1 #define GL_MIRROR_CLAMP_ATI 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 #define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) #endif /* GL_ATI_texture_mirror_once */ /* ----------------------- GL_ATI_vertex_array_object ---------------------- */ #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 #define GL_DISCARD_ATI 0x8763 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); #define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) #define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) #define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) #define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) #define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) #define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) #define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) #define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) #define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) #define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) #define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) #define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) #define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) #endif /* GL_ATI_vertex_array_object */ /* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ #ifndef GL_ATI_vertex_attrib_array_object #define GL_ATI_vertex_attrib_array_object 1 typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); #define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) #define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) #define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) #define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) #endif /* GL_ATI_vertex_attrib_array_object */ /* ------------------------- GL_ATI_vertex_streams ------------------------- */ #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #define GL_MAX_VERTEX_STREAMS_ATI 0x876B #define GL_VERTEX_SOURCE_ATI 0x876C #define GL_VERTEX_STREAM0_ATI 0x876D #define GL_VERTEX_STREAM1_ATI 0x876E #define GL_VERTEX_STREAM2_ATI 0x876F #define GL_VERTEX_STREAM3_ATI 0x8770 #define GL_VERTEX_STREAM4_ATI 0x8771 #define GL_VERTEX_STREAM5_ATI 0x8772 #define GL_VERTEX_STREAM6_ATI 0x8773 #define GL_VERTEX_STREAM7_ATI 0x8774 typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); #define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) #define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) #define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) #define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) #define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) #define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) #define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) #define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) #define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) #define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) #define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) #define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) #define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) #define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) #define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) #define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) #define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) #define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) #define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) #define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) #define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) #define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) #define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) #define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) #define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) #define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) #define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) #define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) #define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) #define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) #define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) #define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) #define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) #define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) #define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) #define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) #define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) #define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) #define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) #define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) #define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) #define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) #define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) #define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) #define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) #define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) #endif /* GL_ATI_vertex_streams */ /* --------------------------- GL_EXT_422_pixels --------------------------- */ #ifndef GL_EXT_422_pixels #define GL_EXT_422_pixels 1 #define GL_422_EXT 0x80CC #define GL_422_REV_EXT 0x80CD #define GL_422_AVERAGE_EXT 0x80CE #define GL_422_REV_AVERAGE_EXT 0x80CF #define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) #endif /* GL_EXT_422_pixels */ /* ---------------------------- GL_EXT_Cg_shader --------------------------- */ #ifndef GL_EXT_Cg_shader #define GL_EXT_Cg_shader 1 #define GL_CG_VERTEX_SHADER_EXT 0x890E #define GL_CG_FRAGMENT_SHADER_EXT 0x890F #define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) #endif /* GL_EXT_Cg_shader */ /* ------------------------------ GL_EXT_abgr ------------------------------ */ #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #define GL_ABGR_EXT 0x8000 #define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) #endif /* GL_EXT_abgr */ /* ------------------------------ GL_EXT_bgra ------------------------------ */ #ifndef GL_EXT_bgra #define GL_EXT_bgra 1 #define GL_BGR_EXT 0x80E0 #define GL_BGRA_EXT 0x80E1 #define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) #endif /* GL_EXT_bgra */ /* ------------------------ GL_EXT_bindable_uniform ------------------------ */ #ifndef GL_EXT_bindable_uniform #define GL_EXT_bindable_uniform 1 #define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 #define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 #define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 #define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED #define GL_UNIFORM_BUFFER_EXT 0x8DEE #define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); #define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) #define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) #define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) #define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) #endif /* GL_EXT_bindable_uniform */ /* --------------------------- GL_EXT_blend_color -------------------------- */ #ifndef GL_EXT_blend_color #define GL_EXT_blend_color 1 #define GL_CONSTANT_COLOR_EXT 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 #define GL_CONSTANT_ALPHA_EXT 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 #define GL_BLEND_COLOR_EXT 0x8005 typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); #define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) #define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) #endif /* GL_EXT_blend_color */ /* --------------------- GL_EXT_blend_equation_separate -------------------- */ #ifndef GL_EXT_blend_equation_separate #define GL_EXT_blend_equation_separate 1 #define GL_BLEND_EQUATION_RGB_EXT 0x8009 #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); #define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) #define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) #endif /* GL_EXT_blend_equation_separate */ /* ----------------------- GL_EXT_blend_func_separate ---------------------- */ #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_SRC_RGB_EXT 0x80C9 #define GL_BLEND_DST_ALPHA_EXT 0x80CA #define GL_BLEND_SRC_ALPHA_EXT 0x80CB typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) #define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) #endif /* GL_EXT_blend_func_separate */ /* ------------------------- GL_EXT_blend_logic_op ------------------------- */ #ifndef GL_EXT_blend_logic_op #define GL_EXT_blend_logic_op 1 #define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) #endif /* GL_EXT_blend_logic_op */ /* -------------------------- GL_EXT_blend_minmax -------------------------- */ #ifndef GL_EXT_blend_minmax #define GL_EXT_blend_minmax 1 #define GL_FUNC_ADD_EXT 0x8006 #define GL_MIN_EXT 0x8007 #define GL_MAX_EXT 0x8008 #define GL_BLEND_EQUATION_EXT 0x8009 typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) #define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) #endif /* GL_EXT_blend_minmax */ /* ------------------------- GL_EXT_blend_subtract ------------------------- */ #ifndef GL_EXT_blend_subtract #define GL_EXT_blend_subtract 1 #define GL_FUNC_SUBTRACT_EXT 0x800A #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B #define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) #endif /* GL_EXT_blend_subtract */ /* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ #ifndef GL_EXT_clip_volume_hint #define GL_EXT_clip_volume_hint 1 #define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 #define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) #endif /* GL_EXT_clip_volume_hint */ /* ------------------------------ GL_EXT_cmyka ----------------------------- */ #ifndef GL_EXT_cmyka #define GL_EXT_cmyka 1 #define GL_CMYK_EXT 0x800C #define GL_CMYKA_EXT 0x800D #define GL_PACK_CMYK_HINT_EXT 0x800E #define GL_UNPACK_CMYK_HINT_EXT 0x800F #define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) #endif /* GL_EXT_cmyka */ /* ------------------------- GL_EXT_color_subtable ------------------------- */ #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) #define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) #define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) #endif /* GL_EXT_color_subtable */ /* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) #define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) #define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) #endif /* GL_EXT_compiled_vertex_array */ /* --------------------------- GL_EXT_convolution -------------------------- */ #ifndef GL_EXT_convolution #define GL_EXT_convolution 1 #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 #define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 #define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 #define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 #define GL_REDUCE_EXT 0x8016 #define GL_CONVOLUTION_FORMAT_EXT 0x8017 #define GL_CONVOLUTION_WIDTH_EXT 0x8018 #define GL_CONVOLUTION_HEIGHT_EXT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A #define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F #define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); #define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) #define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) #define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) #define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) #define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) #define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) #define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) #define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) #define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) #define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) #define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) #define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) #define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) #define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) #endif /* GL_EXT_convolution */ /* ------------------------ GL_EXT_coordinate_frame ------------------------ */ #ifndef GL_EXT_coordinate_frame #define GL_EXT_coordinate_frame 1 #define GL_TANGENT_ARRAY_EXT 0x8439 #define GL_BINORMAL_ARRAY_EXT 0x843A #define GL_CURRENT_TANGENT_EXT 0x843B #define GL_CURRENT_BINORMAL_EXT 0x843C #define GL_TANGENT_ARRAY_TYPE_EXT 0x843E #define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F #define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 #define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 #define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 #define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 #define GL_MAP1_TANGENT_EXT 0x8444 #define GL_MAP2_TANGENT_EXT 0x8445 #define GL_MAP1_BINORMAL_EXT 0x8446 #define GL_MAP2_BINORMAL_EXT 0x8447 typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); #define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) #define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) #define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) #endif /* GL_EXT_coordinate_frame */ /* -------------------------- GL_EXT_copy_texture -------------------------- */ #ifndef GL_EXT_copy_texture #define GL_EXT_copy_texture 1 typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) #define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) #define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) #define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) #define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) #define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) #endif /* GL_EXT_copy_texture */ /* --------------------------- GL_EXT_cull_vertex -------------------------- */ #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #define GL_CULL_VERTEX_EXT 0x81AA #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); #define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) #define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) #define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) #endif /* GL_EXT_cull_vertex */ /* --------------------------- GL_EXT_debug_label -------------------------- */ #ifndef GL_EXT_debug_label #define GL_EXT_debug_label 1 #define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F #define GL_PROGRAM_OBJECT_EXT 0x8B40 #define GL_SHADER_OBJECT_EXT 0x8B48 #define GL_BUFFER_OBJECT_EXT 0x9151 #define GL_QUERY_OBJECT_EXT 0x9153 #define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); #define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) #define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) #define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) #endif /* GL_EXT_debug_label */ /* -------------------------- GL_EXT_debug_marker -------------------------- */ #ifndef GL_EXT_debug_marker #define GL_EXT_debug_marker 1 typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); #define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) #define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) #define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) #define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) #endif /* GL_EXT_debug_marker */ /* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ #ifndef GL_EXT_depth_bounds_test #define GL_EXT_depth_bounds_test 1 #define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 #define GL_DEPTH_BOUNDS_EXT 0x8891 typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) #define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) #endif /* GL_EXT_depth_bounds_test */ /* ----------------------- GL_EXT_direct_state_access ---------------------- */ #ifndef GL_EXT_direct_state_access #define GL_EXT_direct_state_access 1 #define GL_PROGRAM_MATRIX_EXT 0x8E2D #define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E #define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); #define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) #define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) #define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) #define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) #define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) #define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) #define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) #define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) #define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) #define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) #define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) #define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) #define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) #define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) #define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) #define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) #define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) #define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) #define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) #define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) #define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) #define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) #define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) #define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) #define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) #define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) #define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) #define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) #define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) #define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) #define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) #define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) #define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) #define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) #define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) #define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) #define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) #define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) #define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) #define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) #define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) #define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) #define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) #define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) #define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) #define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) #define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) #define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) #define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) #define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) #define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) #define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) #define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) #define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) #define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) #define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) #define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) #define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) #define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) #define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) #define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) #define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) #define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) #define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) #define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) #define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) #define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) #define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) #define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) #define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) #define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) #define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) #define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) #define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) #define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) #define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) #define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) #define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) #define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) #define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) #define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) #define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) #define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) #define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) #define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) #define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) #define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) #define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) #define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) #define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) #define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) #define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) #define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) #define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) #define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) #define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) #define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) #define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) #define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) #define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) #define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) #define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) #define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) #define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) #define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) #define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) #define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) #define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) #define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) #define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) #define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) #define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) #define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) #define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) #define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) #define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) #define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) #define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) #define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) #define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) #define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) #define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) #define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) #define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) #define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) #define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) #define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) #define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) #define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) #define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) #define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) #define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) #define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) #define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) #define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) #define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) #define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) #define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) #define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) #define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) #define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) #define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) #define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) #define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) #define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) #define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) #define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) #define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) #define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) #define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) #define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) #define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) #define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) #define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) #define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) #define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) #define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) #define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) #define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) #define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) #define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) #define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) #define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) #define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) #define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) #define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) #define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) #define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) #define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) #define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) #define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) #define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) #define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) #define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) #define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) #define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) #define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) #define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) #define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) #define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) #define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) #define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) #define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) #define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) #define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) #define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) #define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) #define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) #define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) #define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) #define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) #define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) #define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) #define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) #define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) #define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) #define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) #define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) #define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) #define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) #define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) #define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) #define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) #define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) #define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) #define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) #define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) #define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) #define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) #define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) #define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) #define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) #define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) #define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) #define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) #endif /* GL_EXT_direct_state_access */ /* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ #ifndef GL_EXT_draw_buffers2 #define GL_EXT_draw_buffers2 1 typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); #define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) #define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) #define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) #define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) #define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) #define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) #define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) #endif /* GL_EXT_draw_buffers2 */ /* ------------------------- GL_EXT_draw_instanced ------------------------- */ #ifndef GL_EXT_draw_instanced #define GL_EXT_draw_instanced 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) #define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) #define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) #endif /* GL_EXT_draw_instanced */ /* ----------------------- GL_EXT_draw_range_elements ---------------------- */ #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); #define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) #define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) #endif /* GL_EXT_draw_range_elements */ /* ---------------------------- GL_EXT_fog_coord --------------------------- */ #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 #define GL_FOG_COORDINATE_EXT 0x8451 #define GL_FRAGMENT_DEPTH_EXT 0x8452 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); #define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) #define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) #define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) #define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) #define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) #define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) #endif /* GL_EXT_fog_coord */ /* ------------------------ GL_EXT_fragment_lighting ----------------------- */ #ifndef GL_EXT_fragment_lighting #define GL_EXT_fragment_lighting 1 #define GL_FRAGMENT_LIGHTING_EXT 0x8400 #define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 #define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 #define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 #define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 #define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 #define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 #define GL_LIGHT_ENV_MODE_EXT 0x8407 #define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 #define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 #define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A #define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B #define GL_FRAGMENT_LIGHT0_EXT 0x840C #define GL_FRAGMENT_LIGHT7_EXT 0x8413 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); #define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) #define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) #define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) #define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) #define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) #define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) #define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) #define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) #define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) #define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) #define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) #define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) #define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) #define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) #define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) #define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) #define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) #define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) #define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) #endif /* GL_EXT_fragment_lighting */ /* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) #define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) #endif /* GL_EXT_framebuffer_blit */ /* --------------------- GL_EXT_framebuffer_multisample -------------------- */ #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 #define GL_MAX_SAMPLES_EXT 0x8D57 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) #define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) #endif /* GL_EXT_framebuffer_multisample */ /* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ #ifndef GL_EXT_framebuffer_multisample_blit_scaled #define GL_EXT_framebuffer_multisample_blit_scaled 1 #define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA #define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB #define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ /* ----------------------- GL_EXT_framebuffer_object ----------------------- */ #ifndef GL_EXT_framebuffer_object #define GL_EXT_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC #define GL_COLOR_ATTACHMENT13_EXT 0x8CED #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF #define GL_DEPTH_ATTACHMENT_EXT 0x8D00 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20 #define GL_FRAMEBUFFER_EXT 0x8D40 #define GL_RENDERBUFFER_EXT 0x8D41 #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 #define GL_STENCIL_INDEX1_EXT 0x8D46 #define GL_STENCIL_INDEX4_EXT 0x8D47 #define GL_STENCIL_INDEX8_EXT 0x8D48 #define GL_STENCIL_INDEX16_EXT 0x8D49 #define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); #define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) #define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) #define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) #define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) #define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) #define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) #define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) #define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) #define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) #define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) #define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) #define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) #define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) #define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) #define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) #define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) #define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) #define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) #endif /* GL_EXT_framebuffer_object */ /* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ #ifndef GL_EXT_framebuffer_sRGB #define GL_EXT_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) #endif /* GL_EXT_framebuffer_sRGB */ /* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ #ifndef GL_EXT_geometry_shader4 #define GL_EXT_geometry_shader4 1 #define GL_LINES_ADJACENCY_EXT 0xA #define GL_LINE_STRIP_ADJACENCY_EXT 0xB #define GL_TRIANGLES_ADJACENCY_EXT 0xC #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD #define GL_PROGRAM_POINT_SIZE_EXT 0x8642 #define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); #define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) #define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) #define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) #define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) #endif /* GL_EXT_geometry_shader4 */ /* --------------------- GL_EXT_gpu_program_parameters --------------------- */ #ifndef GL_EXT_gpu_program_parameters #define GL_EXT_gpu_program_parameters 1 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); #define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) #define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) #define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) #endif /* GL_EXT_gpu_program_parameters */ /* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ #ifndef GL_EXT_gpu_shader4 #define GL_EXT_gpu_shader4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD #define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 #define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 #define GL_SAMPLER_BUFFER_EXT 0x8DC2 #define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 #define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 #define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 #define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 #define GL_INT_SAMPLER_1D_EXT 0x8DC9 #define GL_INT_SAMPLER_2D_EXT 0x8DCA #define GL_INT_SAMPLER_3D_EXT 0x8DCB #define GL_INT_SAMPLER_CUBE_EXT 0x8DCC #define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD #define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF #define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); #define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) #define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) #define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) #define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) #define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) #define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) #define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) #define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) #define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) #define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) #define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) #define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) #define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) #define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) #define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) #define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) #define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) #define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) #define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) #define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) #define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) #define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) #define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) #define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) #define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) #define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) #define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) #define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) #define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) #define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) #define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) #define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) #define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) #define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) #define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) #endif /* GL_EXT_gpu_shader4 */ /* ---------------------------- GL_EXT_histogram --------------------------- */ #ifndef GL_EXT_histogram #define GL_EXT_histogram 1 #define GL_HISTOGRAM_EXT 0x8024 #define GL_PROXY_HISTOGRAM_EXT 0x8025 #define GL_HISTOGRAM_WIDTH_EXT 0x8026 #define GL_HISTOGRAM_FORMAT_EXT 0x8027 #define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 #define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 #define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A #define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C #define GL_HISTOGRAM_SINK_EXT 0x802D #define GL_MINMAX_EXT 0x802E #define GL_MINMAX_FORMAT_EXT 0x802F #define GL_MINMAX_SINK_EXT 0x8030 typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); #define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) #define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) #define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) #define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) #define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) #define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) #define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) #define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) #define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) #define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) #define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) #endif /* GL_EXT_histogram */ /* ----------------------- GL_EXT_index_array_formats ---------------------- */ #ifndef GL_EXT_index_array_formats #define GL_EXT_index_array_formats 1 #define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) #endif /* GL_EXT_index_array_formats */ /* --------------------------- GL_EXT_index_func --------------------------- */ #ifndef GL_EXT_index_func #define GL_EXT_index_func 1 typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); #define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) #define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) #endif /* GL_EXT_index_func */ /* ------------------------- GL_EXT_index_material ------------------------- */ #ifndef GL_EXT_index_material #define GL_EXT_index_material 1 typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) #define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) #endif /* GL_EXT_index_material */ /* -------------------------- GL_EXT_index_texture ------------------------- */ #ifndef GL_EXT_index_texture #define GL_EXT_index_texture 1 #define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) #endif /* GL_EXT_index_texture */ /* -------------------------- GL_EXT_light_texture ------------------------- */ #ifndef GL_EXT_light_texture #define GL_EXT_light_texture 1 #define GL_FRAGMENT_MATERIAL_EXT 0x8349 #define GL_FRAGMENT_NORMAL_EXT 0x834A #define GL_FRAGMENT_COLOR_EXT 0x834C #define GL_ATTENUATION_EXT 0x834D #define GL_SHADOW_ATTENUATION_EXT 0x834E #define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F #define GL_TEXTURE_LIGHT_EXT 0x8350 #define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 #define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) #define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) #define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) #define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) #endif /* GL_EXT_light_texture */ /* ------------------------- GL_EXT_misc_attribute ------------------------- */ #ifndef GL_EXT_misc_attribute #define GL_EXT_misc_attribute 1 #define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) #endif /* GL_EXT_misc_attribute */ /* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); #define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) #define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) #define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) #endif /* GL_EXT_multi_draw_arrays */ /* --------------------------- GL_EXT_multisample -------------------------- */ #ifndef GL_EXT_multisample #define GL_EXT_multisample 1 #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #define GL_SAMPLE_MASK_EXT 0x80A0 #define GL_1PASS_EXT 0x80A1 #define GL_2PASS_0_EXT 0x80A2 #define GL_2PASS_1_EXT 0x80A3 #define GL_4PASS_0_EXT 0x80A4 #define GL_4PASS_1_EXT 0x80A5 #define GL_4PASS_2_EXT 0x80A6 #define GL_4PASS_3_EXT 0x80A7 #define GL_SAMPLE_BUFFERS_EXT 0x80A8 #define GL_SAMPLES_EXT 0x80A9 #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB #define GL_SAMPLE_PATTERN_EXT 0x80AC #define GL_MULTISAMPLE_BIT_EXT 0x20000000 typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) #define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) #define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) #endif /* GL_EXT_multisample */ /* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ #ifndef GL_EXT_packed_depth_stencil #define GL_EXT_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_EXT 0x84F9 #define GL_UNSIGNED_INT_24_8_EXT 0x84FA #define GL_DEPTH24_STENCIL8_EXT 0x88F0 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 #define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) #endif /* GL_EXT_packed_depth_stencil */ /* -------------------------- GL_EXT_packed_float -------------------------- */ #ifndef GL_EXT_packed_float #define GL_EXT_packed_float 1 #define GL_R11F_G11F_B10F_EXT 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B #define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C #define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) #endif /* GL_EXT_packed_float */ /* -------------------------- GL_EXT_packed_pixels ------------------------- */ #ifndef GL_EXT_packed_pixels #define GL_EXT_packed_pixels 1 #define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 #define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 #define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 #define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) #endif /* GL_EXT_packed_pixels */ /* ------------------------ GL_EXT_paletted_texture ------------------------ */ #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 #define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); #define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) #define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) #define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) #define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) #define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) #endif /* GL_EXT_paletted_texture */ /* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ #ifndef GL_EXT_pixel_buffer_object #define GL_EXT_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_EXT 0x88EB #define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF #define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) #endif /* GL_EXT_pixel_buffer_object */ /* ------------------------- GL_EXT_pixel_transform ------------------------ */ #ifndef GL_EXT_pixel_transform #define GL_EXT_pixel_transform 1 #define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 #define GL_PIXEL_MAG_FILTER_EXT 0x8331 #define GL_PIXEL_MIN_FILTER_EXT 0x8332 #define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 #define GL_CUBIC_EXT 0x8334 #define GL_AVERAGE_EXT 0x8335 #define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 #define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 #define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); #define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) #define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) #define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) #define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) #define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) #define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) #define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) #endif /* GL_EXT_pixel_transform */ /* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ #ifndef GL_EXT_pixel_transform_color_table #define GL_EXT_pixel_transform_color_table 1 #define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) #endif /* GL_EXT_pixel_transform_color_table */ /* ------------------------ GL_EXT_point_parameters ------------------------ */ #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 #define GL_DISTANCE_ATTENUATION_EXT 0x8129 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); #define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) #define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) #define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) #endif /* GL_EXT_point_parameters */ /* ------------------------- GL_EXT_polygon_offset ------------------------- */ #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 #define GL_POLYGON_OFFSET_EXT 0x8037 #define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 #define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) #define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) #endif /* GL_EXT_polygon_offset */ /* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ #ifndef GL_EXT_polygon_offset_clamp #define GL_EXT_polygon_offset_clamp 1 #define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); #define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) #define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) #endif /* GL_EXT_polygon_offset_clamp */ /* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ #ifndef GL_EXT_post_depth_coverage #define GL_EXT_post_depth_coverage 1 #define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) #endif /* GL_EXT_post_depth_coverage */ /* ------------------------ GL_EXT_provoking_vertex ------------------------ */ #ifndef GL_EXT_provoking_vertex #define GL_EXT_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_PROVOKING_VERTEX_EXT 0x8E4F typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); #define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) #define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) #endif /* GL_EXT_provoking_vertex */ /* ----------------------- GL_EXT_raster_multisample ----------------------- */ #ifndef GL_EXT_raster_multisample #define GL_EXT_raster_multisample 1 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GL_RASTER_MULTISAMPLE_EXT 0x9327 #define GL_RASTER_SAMPLES_EXT 0x9328 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C #define GL_DEPTH_SAMPLES_NV 0x932D #define GL_STENCIL_SAMPLES_NV 0x932E #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 #define GL_COVERAGE_MODULATION_NV 0x9332 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); #define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) #define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) #define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) #define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) #define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) #endif /* GL_EXT_raster_multisample */ /* ------------------------- GL_EXT_rescale_normal ------------------------- */ #ifndef GL_EXT_rescale_normal #define GL_EXT_rescale_normal 1 #define GL_RESCALE_NORMAL_EXT 0x803A #define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) #endif /* GL_EXT_rescale_normal */ /* -------------------------- GL_EXT_scene_marker -------------------------- */ #ifndef GL_EXT_scene_marker #define GL_EXT_scene_marker 1 typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); #define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) #define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) #define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) #endif /* GL_EXT_scene_marker */ /* ------------------------- GL_EXT_secondary_color ------------------------ */ #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #define GL_COLOR_SUM_EXT 0x8458 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) #define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) #define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) #define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) #define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) #define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) #define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) #define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) #define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) #define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) #define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) #define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) #define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) #define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) #define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) #define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) #define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) #define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) #endif /* GL_EXT_secondary_color */ /* --------------------- GL_EXT_separate_shader_objects -------------------- */ #ifndef GL_EXT_separate_shader_objects #define GL_EXT_separate_shader_objects 1 #define GL_ACTIVE_PROGRAM_EXT 0x8B8D typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); #define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) #define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) #define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) #define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) #endif /* GL_EXT_separate_shader_objects */ /* --------------------- GL_EXT_separate_specular_color -------------------- */ #ifndef GL_EXT_separate_specular_color #define GL_EXT_separate_specular_color 1 #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 #define GL_SINGLE_COLOR_EXT 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) #endif /* GL_EXT_separate_specular_color */ /* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ #ifndef GL_EXT_shader_image_load_formatted #define GL_EXT_shader_image_load_formatted 1 #define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) #endif /* GL_EXT_shader_image_load_formatted */ /* --------------------- GL_EXT_shader_image_load_store -------------------- */ #ifndef GL_EXT_shader_image_load_store #define GL_EXT_shader_image_load_store 1 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 #define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 #define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 #define GL_MAX_IMAGE_UNITS_EXT 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 #define GL_IMAGE_BINDING_NAME_EXT 0x8F3A #define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B #define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C #define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D #define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E #define GL_IMAGE_1D_EXT 0x904C #define GL_IMAGE_2D_EXT 0x904D #define GL_IMAGE_3D_EXT 0x904E #define GL_IMAGE_2D_RECT_EXT 0x904F #define GL_IMAGE_CUBE_EXT 0x9050 #define GL_IMAGE_BUFFER_EXT 0x9051 #define GL_IMAGE_1D_ARRAY_EXT 0x9052 #define GL_IMAGE_2D_ARRAY_EXT 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 #define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 #define GL_INT_IMAGE_1D_EXT 0x9057 #define GL_INT_IMAGE_2D_EXT 0x9058 #define GL_INT_IMAGE_3D_EXT 0x9059 #define GL_INT_IMAGE_2D_RECT_EXT 0x905A #define GL_INT_IMAGE_CUBE_EXT 0x905B #define GL_INT_IMAGE_BUFFER_EXT 0x905C #define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D #define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C #define GL_MAX_IMAGE_SAMPLES_EXT 0x906D #define GL_IMAGE_BINDING_FORMAT_EXT 0x906E #define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); #define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) #define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) #define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) #endif /* GL_EXT_shader_image_load_store */ /* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ #ifndef GL_EXT_shader_integer_mix #define GL_EXT_shader_integer_mix 1 #define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) #endif /* GL_EXT_shader_integer_mix */ /* -------------------------- GL_EXT_shadow_funcs -------------------------- */ #ifndef GL_EXT_shadow_funcs #define GL_EXT_shadow_funcs 1 #define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) #endif /* GL_EXT_shadow_funcs */ /* --------------------- GL_EXT_shared_texture_palette --------------------- */ #ifndef GL_EXT_shared_texture_palette #define GL_EXT_shared_texture_palette 1 #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB #define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) #endif /* GL_EXT_shared_texture_palette */ /* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ #ifndef GL_EXT_sparse_texture2 #define GL_EXT_sparse_texture2 1 #define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) #endif /* GL_EXT_sparse_texture2 */ /* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ #ifndef GL_EXT_stencil_clear_tag #define GL_EXT_stencil_clear_tag 1 #define GL_STENCIL_TAG_BITS_EXT 0x88F2 #define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 #define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) #endif /* GL_EXT_stencil_clear_tag */ /* ------------------------ GL_EXT_stencil_two_side ------------------------ */ #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) #define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) #endif /* GL_EXT_stencil_two_side */ /* -------------------------- GL_EXT_stencil_wrap -------------------------- */ #ifndef GL_EXT_stencil_wrap #define GL_EXT_stencil_wrap 1 #define GL_INCR_WRAP_EXT 0x8507 #define GL_DECR_WRAP_EXT 0x8508 #define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) #endif /* GL_EXT_stencil_wrap */ /* --------------------------- GL_EXT_subtexture --------------------------- */ #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) #define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) #define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) #define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) #endif /* GL_EXT_subtexture */ /* ----------------------------- GL_EXT_texture ---------------------------- */ #ifndef GL_EXT_texture #define GL_EXT_texture 1 #define GL_ALPHA4_EXT 0x803B #define GL_ALPHA8_EXT 0x803C #define GL_ALPHA12_EXT 0x803D #define GL_ALPHA16_EXT 0x803E #define GL_LUMINANCE4_EXT 0x803F #define GL_LUMINANCE8_EXT 0x8040 #define GL_LUMINANCE12_EXT 0x8041 #define GL_LUMINANCE16_EXT 0x8042 #define GL_LUMINANCE4_ALPHA4_EXT 0x8043 #define GL_LUMINANCE6_ALPHA2_EXT 0x8044 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045 #define GL_LUMINANCE12_ALPHA4_EXT 0x8046 #define GL_LUMINANCE12_ALPHA12_EXT 0x8047 #define GL_LUMINANCE16_ALPHA16_EXT 0x8048 #define GL_INTENSITY_EXT 0x8049 #define GL_INTENSITY4_EXT 0x804A #define GL_INTENSITY8_EXT 0x804B #define GL_INTENSITY12_EXT 0x804C #define GL_INTENSITY16_EXT 0x804D #define GL_RGB2_EXT 0x804E #define GL_RGB4_EXT 0x804F #define GL_RGB5_EXT 0x8050 #define GL_RGB8_EXT 0x8051 #define GL_RGB10_EXT 0x8052 #define GL_RGB12_EXT 0x8053 #define GL_RGB16_EXT 0x8054 #define GL_RGBA2_EXT 0x8055 #define GL_RGBA4_EXT 0x8056 #define GL_RGB5_A1_EXT 0x8057 #define GL_RGBA8_EXT 0x8058 #define GL_RGB10_A2_EXT 0x8059 #define GL_RGBA12_EXT 0x805A #define GL_RGBA16_EXT 0x805B #define GL_TEXTURE_RED_SIZE_EXT 0x805C #define GL_TEXTURE_GREEN_SIZE_EXT 0x805D #define GL_TEXTURE_BLUE_SIZE_EXT 0x805E #define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F #define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 #define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 #define GL_REPLACE_EXT 0x8062 #define GL_PROXY_TEXTURE_1D_EXT 0x8063 #define GL_PROXY_TEXTURE_2D_EXT 0x8064 #define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) #endif /* GL_EXT_texture */ /* ---------------------------- GL_EXT_texture3D --------------------------- */ #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 #define GL_PACK_SKIP_IMAGES_EXT 0x806B #define GL_PACK_IMAGE_HEIGHT_EXT 0x806C #define GL_UNPACK_SKIP_IMAGES_EXT 0x806D #define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E #define GL_TEXTURE_3D_EXT 0x806F #define GL_PROXY_TEXTURE_3D_EXT 0x8070 #define GL_TEXTURE_DEPTH_EXT 0x8071 #define GL_TEXTURE_WRAP_R_EXT 0x8072 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); #define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) #define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) #endif /* GL_EXT_texture3D */ /* -------------------------- GL_EXT_texture_array ------------------------- */ #ifndef GL_EXT_texture_array #define GL_EXT_texture_array 1 #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF #define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 #define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); #define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) #define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) #endif /* GL_EXT_texture_array */ /* ---------------------- GL_EXT_texture_buffer_object --------------------- */ #ifndef GL_EXT_texture_buffer_object #define GL_EXT_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_EXT 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); #define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) #define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) #endif /* GL_EXT_texture_buffer_object */ /* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ #ifndef GL_EXT_texture_compression_dxt1 #define GL_EXT_texture_compression_dxt1 1 #define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) #endif /* GL_EXT_texture_compression_dxt1 */ /* -------------------- GL_EXT_texture_compression_latc -------------------- */ #ifndef GL_EXT_texture_compression_latc #define GL_EXT_texture_compression_latc 1 #define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 #define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 #define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 #define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 #define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) #endif /* GL_EXT_texture_compression_latc */ /* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ #ifndef GL_EXT_texture_compression_rgtc #define GL_EXT_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC #define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE #define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) #endif /* GL_EXT_texture_compression_rgtc */ /* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) #endif /* GL_EXT_texture_compression_s3tc */ /* ------------------------ GL_EXT_texture_cube_map ------------------------ */ #ifndef GL_EXT_texture_cube_map #define GL_EXT_texture_cube_map 1 #define GL_NORMAL_MAP_EXT 0x8511 #define GL_REFLECTION_MAP_EXT 0x8512 #define GL_TEXTURE_CUBE_MAP_EXT 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C #define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) #endif /* GL_EXT_texture_cube_map */ /* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ #ifndef GL_EXT_texture_edge_clamp #define GL_EXT_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_EXT 0x812F #define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) #endif /* GL_EXT_texture_edge_clamp */ /* --------------------------- GL_EXT_texture_env -------------------------- */ #ifndef GL_EXT_texture_env #define GL_EXT_texture_env 1 #define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) #endif /* GL_EXT_texture_env */ /* ------------------------- GL_EXT_texture_env_add ------------------------ */ #ifndef GL_EXT_texture_env_add #define GL_EXT_texture_env_add 1 #define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) #endif /* GL_EXT_texture_env_add */ /* ----------------------- GL_EXT_texture_env_combine ---------------------- */ #ifndef GL_EXT_texture_env_combine #define GL_EXT_texture_env_combine 1 #define GL_COMBINE_EXT 0x8570 #define GL_COMBINE_RGB_EXT 0x8571 #define GL_COMBINE_ALPHA_EXT 0x8572 #define GL_RGB_SCALE_EXT 0x8573 #define GL_ADD_SIGNED_EXT 0x8574 #define GL_INTERPOLATE_EXT 0x8575 #define GL_CONSTANT_EXT 0x8576 #define GL_PRIMARY_COLOR_EXT 0x8577 #define GL_PREVIOUS_EXT 0x8578 #define GL_SOURCE0_RGB_EXT 0x8580 #define GL_SOURCE1_RGB_EXT 0x8581 #define GL_SOURCE2_RGB_EXT 0x8582 #define GL_SOURCE0_ALPHA_EXT 0x8588 #define GL_SOURCE1_ALPHA_EXT 0x8589 #define GL_SOURCE2_ALPHA_EXT 0x858A #define GL_OPERAND0_RGB_EXT 0x8590 #define GL_OPERAND1_RGB_EXT 0x8591 #define GL_OPERAND2_RGB_EXT 0x8592 #define GL_OPERAND0_ALPHA_EXT 0x8598 #define GL_OPERAND1_ALPHA_EXT 0x8599 #define GL_OPERAND2_ALPHA_EXT 0x859A #define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) #endif /* GL_EXT_texture_env_combine */ /* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ #ifndef GL_EXT_texture_env_dot3 #define GL_EXT_texture_env_dot3 1 #define GL_DOT3_RGB_EXT 0x8740 #define GL_DOT3_RGBA_EXT 0x8741 #define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) #endif /* GL_EXT_texture_env_dot3 */ /* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ #ifndef GL_EXT_texture_filter_anisotropic #define GL_EXT_texture_filter_anisotropic 1 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF #define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) #endif /* GL_EXT_texture_filter_anisotropic */ /* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ #ifndef GL_EXT_texture_filter_minmax #define GL_EXT_texture_filter_minmax 1 #define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 #define GL_WEIGHTED_AVERAGE_EXT 0x9367 #define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) #endif /* GL_EXT_texture_filter_minmax */ /* ------------------------- GL_EXT_texture_integer ------------------------ */ #ifndef GL_EXT_texture_integer #define GL_EXT_texture_integer 1 #define GL_RGBA32UI_EXT 0x8D70 #define GL_RGB32UI_EXT 0x8D71 #define GL_ALPHA32UI_EXT 0x8D72 #define GL_INTENSITY32UI_EXT 0x8D73 #define GL_LUMINANCE32UI_EXT 0x8D74 #define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 #define GL_RGBA16UI_EXT 0x8D76 #define GL_RGB16UI_EXT 0x8D77 #define GL_ALPHA16UI_EXT 0x8D78 #define GL_INTENSITY16UI_EXT 0x8D79 #define GL_LUMINANCE16UI_EXT 0x8D7A #define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B #define GL_RGBA8UI_EXT 0x8D7C #define GL_RGB8UI_EXT 0x8D7D #define GL_ALPHA8UI_EXT 0x8D7E #define GL_INTENSITY8UI_EXT 0x8D7F #define GL_LUMINANCE8UI_EXT 0x8D80 #define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 #define GL_RGBA32I_EXT 0x8D82 #define GL_RGB32I_EXT 0x8D83 #define GL_ALPHA32I_EXT 0x8D84 #define GL_INTENSITY32I_EXT 0x8D85 #define GL_LUMINANCE32I_EXT 0x8D86 #define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 #define GL_RGBA16I_EXT 0x8D88 #define GL_RGB16I_EXT 0x8D89 #define GL_ALPHA16I_EXT 0x8D8A #define GL_INTENSITY16I_EXT 0x8D8B #define GL_LUMINANCE16I_EXT 0x8D8C #define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D #define GL_RGBA8I_EXT 0x8D8E #define GL_RGB8I_EXT 0x8D8F #define GL_ALPHA8I_EXT 0x8D90 #define GL_INTENSITY8I_EXT 0x8D91 #define GL_LUMINANCE8I_EXT 0x8D92 #define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 #define GL_RED_INTEGER_EXT 0x8D94 #define GL_GREEN_INTEGER_EXT 0x8D95 #define GL_BLUE_INTEGER_EXT 0x8D96 #define GL_ALPHA_INTEGER_EXT 0x8D97 #define GL_RGB_INTEGER_EXT 0x8D98 #define GL_RGBA_INTEGER_EXT 0x8D99 #define GL_BGR_INTEGER_EXT 0x8D9A #define GL_BGRA_INTEGER_EXT 0x8D9B #define GL_LUMINANCE_INTEGER_EXT 0x8D9C #define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); #define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) #define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) #define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) #define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) #define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) #define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) #define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) #endif /* GL_EXT_texture_integer */ /* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ #ifndef GL_EXT_texture_lod_bias #define GL_EXT_texture_lod_bias 1 #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501 #define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) #endif /* GL_EXT_texture_lod_bias */ /* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ #ifndef GL_EXT_texture_mirror_clamp #define GL_EXT_texture_mirror_clamp 1 #define GL_MIRROR_CLAMP_EXT 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 #define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 #define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) #endif /* GL_EXT_texture_mirror_clamp */ /* ------------------------- GL_EXT_texture_object ------------------------- */ #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 #define GL_TEXTURE_PRIORITY_EXT 0x8066 #define GL_TEXTURE_RESIDENT_EXT 0x8067 #define GL_TEXTURE_1D_BINDING_EXT 0x8068 #define GL_TEXTURE_2D_BINDING_EXT 0x8069 #define GL_TEXTURE_3D_BINDING_EXT 0x806A typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); #define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) #define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) #define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) #define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) #define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) #define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) #define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) #endif /* GL_EXT_texture_object */ /* --------------------- GL_EXT_texture_perturb_normal --------------------- */ #ifndef GL_EXT_texture_perturb_normal #define GL_EXT_texture_perturb_normal 1 #define GL_PERTURB_EXT 0x85AE #define GL_TEXTURE_NORMAL_EXT 0x85AF typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) #define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) #endif /* GL_EXT_texture_perturb_normal */ /* ------------------------ GL_EXT_texture_rectangle ----------------------- */ #ifndef GL_EXT_texture_rectangle #define GL_EXT_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_EXT 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 #define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) #endif /* GL_EXT_texture_rectangle */ /* -------------------------- GL_EXT_texture_sRGB -------------------------- */ #ifndef GL_EXT_texture_sRGB #define GL_EXT_texture_sRGB 1 #define GL_SRGB_EXT 0x8C40 #define GL_SRGB8_EXT 0x8C41 #define GL_SRGB_ALPHA_EXT 0x8C42 #define GL_SRGB8_ALPHA8_EXT 0x8C43 #define GL_SLUMINANCE_ALPHA_EXT 0x8C44 #define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 #define GL_SLUMINANCE_EXT 0x8C46 #define GL_SLUMINANCE8_EXT 0x8C47 #define GL_COMPRESSED_SRGB_EXT 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 #define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B #define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F #define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) #endif /* GL_EXT_texture_sRGB */ /* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ #ifndef GL_EXT_texture_sRGB_decode #define GL_EXT_texture_sRGB_decode 1 #define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 #define GL_DECODE_EXT 0x8A49 #define GL_SKIP_DECODE_EXT 0x8A4A #define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) #endif /* GL_EXT_texture_sRGB_decode */ /* --------------------- GL_EXT_texture_shared_exponent -------------------- */ #ifndef GL_EXT_texture_shared_exponent #define GL_EXT_texture_shared_exponent 1 #define GL_RGB9_E5_EXT 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E #define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F #define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) #endif /* GL_EXT_texture_shared_exponent */ /* -------------------------- GL_EXT_texture_snorm ------------------------- */ #ifndef GL_EXT_texture_snorm #define GL_EXT_texture_snorm 1 #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_ALPHA_SNORM 0x9010 #define GL_LUMINANCE_SNORM 0x9011 #define GL_LUMINANCE_ALPHA_SNORM 0x9012 #define GL_INTENSITY_SNORM 0x9013 #define GL_ALPHA8_SNORM 0x9014 #define GL_LUMINANCE8_SNORM 0x9015 #define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 #define GL_INTENSITY8_SNORM 0x9017 #define GL_ALPHA16_SNORM 0x9018 #define GL_LUMINANCE16_SNORM 0x9019 #define GL_LUMINANCE16_ALPHA16_SNORM 0x901A #define GL_INTENSITY16_SNORM 0x901B #define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) #endif /* GL_EXT_texture_snorm */ /* ------------------------- GL_EXT_texture_swizzle ------------------------ */ #ifndef GL_EXT_texture_swizzle #define GL_EXT_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 #define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 #define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 #define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 #define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) #endif /* GL_EXT_texture_swizzle */ /* --------------------------- GL_EXT_timer_query -------------------------- */ #ifndef GL_EXT_timer_query #define GL_EXT_timer_query 1 #define GL_TIME_ELAPSED_EXT 0x88BF typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); #define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) #define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) #define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) #endif /* GL_EXT_timer_query */ /* ----------------------- GL_EXT_transform_feedback ----------------------- */ #ifndef GL_EXT_transform_feedback #define GL_EXT_transform_feedback 1 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 #define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 #define GL_RASTERIZER_DISCARD_EXT 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B #define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C #define GL_SEPARATE_ATTRIBS_EXT 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); #define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) #define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) #define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) #define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) #define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) #define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) #define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) #define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) #endif /* GL_EXT_transform_feedback */ /* -------------------------- GL_EXT_vertex_array -------------------------- */ #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 #define GL_DOUBLE_EXT 0x140A #define GL_VERTEX_ARRAY_EXT 0x8074 #define GL_NORMAL_ARRAY_EXT 0x8075 #define GL_COLOR_ARRAY_EXT 0x8076 #define GL_INDEX_ARRAY_EXT 0x8077 #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 #define GL_EDGE_FLAG_ARRAY_EXT 0x8079 #define GL_VERTEX_ARRAY_SIZE_EXT 0x807A #define GL_VERTEX_ARRAY_TYPE_EXT 0x807B #define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 #define GL_COLOR_ARRAY_SIZE_EXT 0x8081 #define GL_COLOR_ARRAY_TYPE_EXT 0x8082 #define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084 #define GL_INDEX_ARRAY_TYPE_EXT 0x8085 #define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087 #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D #define GL_VERTEX_ARRAY_POINTER_EXT 0x808E #define GL_NORMAL_ARRAY_POINTER_EXT 0x808F #define GL_COLOR_ARRAY_POINTER_EXT 0x8090 #define GL_INDEX_ARRAY_POINTER_EXT 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); #define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) #define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) #define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) #define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) #define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) #define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) #define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) #define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) #define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) #endif /* GL_EXT_vertex_array */ /* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ #ifndef GL_EXT_vertex_array_bgra #define GL_EXT_vertex_array_bgra 1 #define GL_BGRA 0x80E1 #define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) #endif /* GL_EXT_vertex_array_bgra */ /* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ #ifndef GL_EXT_vertex_attrib_64bit #define GL_EXT_vertex_attrib_64bit 1 #define GL_DOUBLE_MAT2_EXT 0x8F46 #define GL_DOUBLE_MAT3_EXT 0x8F47 #define GL_DOUBLE_MAT4_EXT 0x8F48 #define GL_DOUBLE_MAT2x3_EXT 0x8F49 #define GL_DOUBLE_MAT2x4_EXT 0x8F4A #define GL_DOUBLE_MAT3x2_EXT 0x8F4B #define GL_DOUBLE_MAT3x4_EXT 0x8F4C #define GL_DOUBLE_MAT4x2_EXT 0x8F4D #define GL_DOUBLE_MAT4x3_EXT 0x8F4E #define GL_DOUBLE_VEC2_EXT 0x8FFC #define GL_DOUBLE_VEC3_EXT 0x8FFD #define GL_DOUBLE_VEC4_EXT 0x8FFE typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); #define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) #define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) #define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) #define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) #define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) #define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) #define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) #define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) #define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) #define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) #define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) #define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) #endif /* GL_EXT_vertex_attrib_64bit */ /* -------------------------- GL_EXT_vertex_shader ------------------------- */ #ifndef GL_EXT_vertex_shader #define GL_EXT_vertex_shader 1 #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 #define GL_OP_NEGATE_EXT 0x8783 #define GL_OP_DOT3_EXT 0x8784 #define GL_OP_DOT4_EXT 0x8785 #define GL_OP_MUL_EXT 0x8786 #define GL_OP_ADD_EXT 0x8787 #define GL_OP_MADD_EXT 0x8788 #define GL_OP_FRAC_EXT 0x8789 #define GL_OP_MAX_EXT 0x878A #define GL_OP_MIN_EXT 0x878B #define GL_OP_SET_GE_EXT 0x878C #define GL_OP_SET_LT_EXT 0x878D #define GL_OP_CLAMP_EXT 0x878E #define GL_OP_FLOOR_EXT 0x878F #define GL_OP_ROUND_EXT 0x8790 #define GL_OP_EXP_BASE_2_EXT 0x8791 #define GL_OP_LOG_BASE_2_EXT 0x8792 #define GL_OP_POWER_EXT 0x8793 #define GL_OP_RECIP_EXT 0x8794 #define GL_OP_RECIP_SQRT_EXT 0x8795 #define GL_OP_SUB_EXT 0x8796 #define GL_OP_CROSS_PRODUCT_EXT 0x8797 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 #define GL_OP_MOV_EXT 0x8799 #define GL_OUTPUT_VERTEX_EXT 0x879A #define GL_OUTPUT_COLOR0_EXT 0x879B #define GL_OUTPUT_COLOR1_EXT 0x879C #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC #define GL_OUTPUT_FOG_EXT 0x87BD #define GL_SCALAR_EXT 0x87BE #define GL_VECTOR_EXT 0x87BF #define GL_MATRIX_EXT 0x87C0 #define GL_VARIANT_EXT 0x87C1 #define GL_INVARIANT_EXT 0x87C2 #define GL_LOCAL_CONSTANT_EXT 0x87C3 #define GL_LOCAL_EXT 0x87C4 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 #define GL_X_EXT 0x87D5 #define GL_Y_EXT 0x87D6 #define GL_Z_EXT 0x87D7 #define GL_W_EXT 0x87D8 #define GL_NEGATIVE_X_EXT 0x87D9 #define GL_NEGATIVE_Y_EXT 0x87DA #define GL_NEGATIVE_Z_EXT 0x87DB #define GL_NEGATIVE_W_EXT 0x87DC #define GL_ZERO_EXT 0x87DD #define GL_ONE_EXT 0x87DE #define GL_NEGATIVE_ONE_EXT 0x87DF #define GL_NORMALIZED_RANGE_EXT 0x87E0 #define GL_FULL_RANGE_EXT 0x87E1 #define GL_CURRENT_VERTEX_EXT 0x87E2 #define GL_MVP_MATRIX_EXT 0x87E3 #define GL_VARIANT_VALUE_EXT 0x87E4 #define GL_VARIANT_DATATYPE_EXT 0x87E5 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 #define GL_VARIANT_ARRAY_EXT 0x87E8 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 #define GL_INVARIANT_VALUE_EXT 0x87EA #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); #define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) #define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) #define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) #define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) #define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) #define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) #define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) #define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) #define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) #define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) #define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) #define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) #define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) #define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) #define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) #define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) #define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) #define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) #define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) #define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) #define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) #define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) #define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) #define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) #define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) #define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) #define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) #define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) #define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) #define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) #define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) #define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) #define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) #define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) #define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) #define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) #define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) #define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) #define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) #define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) #define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) #define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) #define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) #endif /* GL_EXT_vertex_shader */ /* ------------------------ GL_EXT_vertex_weighting ------------------------ */ #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 #define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 #define GL_MODELVIEW0_EXT 0x1700 #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 #define GL_MODELVIEW1_MATRIX_EXT 0x8506 #define GL_VERTEX_WEIGHTING_EXT 0x8509 #define GL_MODELVIEW1_EXT 0x850A #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); #define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) #define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) #define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) #define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) #endif /* GL_EXT_vertex_weighting */ /* ------------------------- GL_EXT_x11_sync_object ------------------------ */ #ifndef GL_EXT_x11_sync_object #define GL_EXT_x11_sync_object 1 #define GL_SYNC_X11_FENCE_EXT 0x90E1 typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) #define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) #endif /* GL_EXT_x11_sync_object */ /* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ #ifndef GL_GREMEDY_frame_terminator #define GL_GREMEDY_frame_terminator 1 typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); #define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) #define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) #endif /* GL_GREMEDY_frame_terminator */ /* ------------------------ GL_GREMEDY_string_marker ----------------------- */ #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); #define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) #define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) #endif /* GL_GREMEDY_string_marker */ /* --------------------- GL_HP_convolution_border_modes -------------------- */ #ifndef GL_HP_convolution_border_modes #define GL_HP_convolution_border_modes 1 #define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) #endif /* GL_HP_convolution_border_modes */ /* ------------------------- GL_HP_image_transform ------------------------- */ #ifndef GL_HP_image_transform #define GL_HP_image_transform 1 typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); #define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) #define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) #define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) #define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) #define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) #define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) #define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) #endif /* GL_HP_image_transform */ /* -------------------------- GL_HP_occlusion_test ------------------------- */ #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 #define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) #endif /* GL_HP_occlusion_test */ /* ------------------------- GL_HP_texture_lighting ------------------------ */ #ifndef GL_HP_texture_lighting #define GL_HP_texture_lighting 1 #define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) #endif /* GL_HP_texture_lighting */ /* --------------------------- GL_IBM_cull_vertex -------------------------- */ #ifndef GL_IBM_cull_vertex #define GL_IBM_cull_vertex 1 #define GL_CULL_VERTEX_IBM 103050 #define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) #endif /* GL_IBM_cull_vertex */ /* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ #ifndef GL_IBM_multimode_draw_arrays #define GL_IBM_multimode_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); #define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) #define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) #define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) #endif /* GL_IBM_multimode_draw_arrays */ /* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ #ifndef GL_IBM_rasterpos_clip #define GL_IBM_rasterpos_clip 1 #define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 #define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) #endif /* GL_IBM_rasterpos_clip */ /* --------------------------- GL_IBM_static_data -------------------------- */ #ifndef GL_IBM_static_data #define GL_IBM_static_data 1 #define GL_ALL_STATIC_DATA_IBM 103060 #define GL_STATIC_VERTEX_ARRAY_IBM 103061 #define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) #endif /* GL_IBM_static_data */ /* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ #ifndef GL_IBM_texture_mirrored_repeat #define GL_IBM_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_IBM 0x8370 #define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) #endif /* GL_IBM_texture_mirrored_repeat */ /* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ #ifndef GL_IBM_vertex_array_lists #define GL_IBM_vertex_array_lists 1 #define GL_VERTEX_ARRAY_LIST_IBM 103070 #define GL_NORMAL_ARRAY_LIST_IBM 103071 #define GL_COLOR_ARRAY_LIST_IBM 103072 #define GL_INDEX_ARRAY_LIST_IBM 103073 #define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 #define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 #define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 #define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 #define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 #define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 #define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 #define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 #define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 #define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 #define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 #define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); #define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) #define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) #define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) #define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) #define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) #define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) #define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) #define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) #define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) #endif /* GL_IBM_vertex_array_lists */ /* -------------------------- GL_INGR_color_clamp -------------------------- */ #ifndef GL_INGR_color_clamp #define GL_INGR_color_clamp 1 #define GL_RED_MIN_CLAMP_INGR 0x8560 #define GL_GREEN_MIN_CLAMP_INGR 0x8561 #define GL_BLUE_MIN_CLAMP_INGR 0x8562 #define GL_ALPHA_MIN_CLAMP_INGR 0x8563 #define GL_RED_MAX_CLAMP_INGR 0x8564 #define GL_GREEN_MAX_CLAMP_INGR 0x8565 #define GL_BLUE_MAX_CLAMP_INGR 0x8566 #define GL_ALPHA_MAX_CLAMP_INGR 0x8567 #define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) #endif /* GL_INGR_color_clamp */ /* ------------------------- GL_INGR_interlace_read ------------------------ */ #ifndef GL_INGR_interlace_read #define GL_INGR_interlace_read 1 #define GL_INTERLACE_READ_INGR 0x8568 #define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) #endif /* GL_INGR_interlace_read */ /* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ #ifndef GL_INTEL_fragment_shader_ordering #define GL_INTEL_fragment_shader_ordering 1 #define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) #endif /* GL_INTEL_fragment_shader_ordering */ /* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ #ifndef GL_INTEL_framebuffer_CMAA #define GL_INTEL_framebuffer_CMAA 1 #define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) #endif /* GL_INTEL_framebuffer_CMAA */ /* -------------------------- GL_INTEL_map_texture ------------------------- */ #ifndef GL_INTEL_map_texture #define GL_INTEL_map_texture 1 #define GL_LAYOUT_DEFAULT_INTEL 0 #define GL_LAYOUT_LINEAR_INTEL 1 #define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 #define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); #define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) #define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) #define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) #define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) #endif /* GL_INTEL_map_texture */ /* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ #ifndef GL_INTEL_parallel_arrays #define GL_INTEL_parallel_arrays 1 #define GL_PARALLEL_ARRAYS_INTEL 0x83F4 #define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 #define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 #define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 #define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); #define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) #define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) #define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) #define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) #define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) #endif /* GL_INTEL_parallel_arrays */ /* ----------------------- GL_INTEL_performance_query ---------------------- */ #ifndef GL_INTEL_performance_query #define GL_INTEL_performance_query 1 #define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 #define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 #define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 #define GL_PERFQUERY_FLUSH_INTEL 0x83FA #define GL_PERFQUERY_WAIT_INTEL 0x83FB #define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 #define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 #define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 #define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 #define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 #define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 #define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 #define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 #define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA #define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB #define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC #define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD #define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE #define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF #define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) #define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) #define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) #define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) #define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) #define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) #define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) #define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) #define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) #define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) #define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) #endif /* GL_INTEL_performance_query */ /* ------------------------ GL_INTEL_texture_scissor ----------------------- */ #ifndef GL_INTEL_texture_scissor #define GL_INTEL_texture_scissor 1 typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); #define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) #define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) #define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) #endif /* GL_INTEL_texture_scissor */ /* --------------------- GL_KHR_blend_equation_advanced -------------------- */ #ifndef GL_KHR_blend_equation_advanced #define GL_KHR_blend_equation_advanced 1 #define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 #define GL_MULTIPLY_KHR 0x9294 #define GL_SCREEN_KHR 0x9295 #define GL_OVERLAY_KHR 0x9296 #define GL_DARKEN_KHR 0x9297 #define GL_LIGHTEN_KHR 0x9298 #define GL_COLORDODGE_KHR 0x9299 #define GL_COLORBURN_KHR 0x929A #define GL_HARDLIGHT_KHR 0x929B #define GL_SOFTLIGHT_KHR 0x929C #define GL_DIFFERENCE_KHR 0x929E #define GL_EXCLUSION_KHR 0x92A0 #define GL_HSL_HUE_KHR 0x92AD #define GL_HSL_SATURATION_KHR 0x92AE #define GL_HSL_COLOR_KHR 0x92AF #define GL_HSL_LUMINOSITY_KHR 0x92B0 typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); #define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) #define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) #endif /* GL_KHR_blend_equation_advanced */ /* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ #ifndef GL_KHR_blend_equation_advanced_coherent #define GL_KHR_blend_equation_advanced_coherent 1 #define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) #endif /* GL_KHR_blend_equation_advanced_coherent */ /* ---------------------- GL_KHR_context_flush_control --------------------- */ #ifndef GL_KHR_context_flush_control #define GL_KHR_context_flush_control 1 #define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC #define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) #endif /* GL_KHR_context_flush_control */ /* ------------------------------ GL_KHR_debug ----------------------------- */ #ifndef GL_KHR_debug #define GL_KHR_debug 1 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 #define GL_DEBUG_SOURCE_API 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #define GL_DEBUG_SOURCE_APPLICATION 0x824A #define GL_DEBUG_SOURCE_OTHER 0x824B #define GL_DEBUG_TYPE_ERROR 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_DEBUG_TYPE_OTHER 0x8251 #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_DEBUG_TYPE_POP_GROUP 0x826A #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D #define GL_BUFFER 0x82E0 #define GL_SHADER 0x82E1 #define GL_PROGRAM 0x82E2 #define GL_QUERY 0x82E3 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SAMPLER 0x82E6 #define GL_DISPLAY_LIST 0x82E7 #define GL_MAX_LABEL_LENGTH 0x82E8 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #define GL_DEBUG_SEVERITY_HIGH 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_OUTPUT 0x92E0 typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); #define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) #define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) #define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) #define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) #define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) #define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) #define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) #define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) #define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) #define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) #define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) #endif /* GL_KHR_debug */ /* ---------------------------- GL_KHR_no_error ---------------------------- */ #ifndef GL_KHR_no_error #define GL_KHR_no_error 1 #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 #define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) #endif /* GL_KHR_no_error */ /* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ #ifndef GL_KHR_robust_buffer_access_behavior #define GL_KHR_robust_buffer_access_behavior 1 #define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) #endif /* GL_KHR_robust_buffer_access_behavior */ /* --------------------------- GL_KHR_robustness --------------------------- */ #ifndef GL_KHR_robustness #define GL_KHR_robustness 1 #define GL_CONTEXT_LOST 0x0507 #define GL_LOSE_CONTEXT_ON_RESET 0x8252 #define GL_GUILTY_CONTEXT_RESET 0x8253 #define GL_INNOCENT_CONTEXT_RESET 0x8254 #define GL_UNKNOWN_CONTEXT_RESET 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY 0x8256 #define GL_NO_RESET_NOTIFICATION 0x8261 #define GL_CONTEXT_ROBUST_ACCESS 0x90F3 typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); #define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) #define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) #define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) #define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) #define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) #endif /* GL_KHR_robustness */ /* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ #ifndef GL_KHR_texture_compression_astc_hdr #define GL_KHR_texture_compression_astc_hdr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) #endif /* GL_KHR_texture_compression_astc_hdr */ /* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ #ifndef GL_KHR_texture_compression_astc_ldr #define GL_KHR_texture_compression_astc_ldr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) #endif /* GL_KHR_texture_compression_astc_ldr */ /* -------------------------- GL_KTX_buffer_region ------------------------- */ #ifndef GL_KTX_buffer_region #define GL_KTX_buffer_region 1 #define GL_KTX_FRONT_REGION 0x0 #define GL_KTX_BACK_REGION 0x1 #define GL_KTX_Z_REGION 0x2 #define GL_KTX_STENCIL_REGION 0x3 typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); #define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) #define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) #define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) #define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) #define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) #define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) #endif /* GL_KTX_buffer_region */ /* ------------------------- GL_MESAX_texture_stack ------------------------ */ #ifndef GL_MESAX_texture_stack #define GL_MESAX_texture_stack 1 #define GL_TEXTURE_1D_STACK_MESAX 0x8759 #define GL_TEXTURE_2D_STACK_MESAX 0x875A #define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B #define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C #define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D #define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E #define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) #endif /* GL_MESAX_texture_stack */ /* -------------------------- GL_MESA_pack_invert -------------------------- */ #ifndef GL_MESA_pack_invert #define GL_MESA_pack_invert 1 #define GL_PACK_INVERT_MESA 0x8758 #define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) #endif /* GL_MESA_pack_invert */ /* ------------------------- GL_MESA_resize_buffers ------------------------ */ #ifndef GL_MESA_resize_buffers #define GL_MESA_resize_buffers 1 typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); #define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) #define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) #endif /* GL_MESA_resize_buffers */ /* --------------------------- GL_MESA_window_pos -------------------------- */ #ifndef GL_MESA_window_pos #define GL_MESA_window_pos 1 typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) #define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) #define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) #define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) #define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) #define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) #define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) #define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) #define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) #define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) #define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) #define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) #define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) #define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) #define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) #define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) #define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) #define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) #define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) #define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) #define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) #define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) #define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) #define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) #define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) #endif /* GL_MESA_window_pos */ /* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ #ifndef GL_MESA_ycbcr_texture #define GL_MESA_ycbcr_texture 1 #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB #define GL_YCBCR_MESA 0x8757 #define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) #endif /* GL_MESA_ycbcr_texture */ /* ----------------------- GL_NVX_conditional_render ----------------------- */ #ifndef GL_NVX_conditional_render #define GL_NVX_conditional_render 1 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); #define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) #define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) #define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) #endif /* GL_NVX_conditional_render */ /* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ #ifndef GL_NVX_gpu_memory_info #define GL_NVX_gpu_memory_info 1 #define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 #define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 #define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 #define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B #define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) #endif /* GL_NVX_gpu_memory_info */ /* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ #ifndef GL_NV_bindless_multi_draw_indirect #define GL_NV_bindless_multi_draw_indirect 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) #define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) #define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) #endif /* GL_NV_bindless_multi_draw_indirect */ /* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ #ifndef GL_NV_bindless_multi_draw_indirect_count #define GL_NV_bindless_multi_draw_indirect_count 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); #define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) #define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) #define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) #endif /* GL_NV_bindless_multi_draw_indirect_count */ /* ------------------------- GL_NV_bindless_texture ------------------------ */ #ifndef GL_NV_bindless_texture #define GL_NV_bindless_texture 1 typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); #define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) #define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) #define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) #define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) #define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) #define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) #define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) #define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) #define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) #define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) #define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) #define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) #define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) #define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) #endif /* GL_NV_bindless_texture */ /* --------------------- GL_NV_blend_equation_advanced --------------------- */ #ifndef GL_NV_blend_equation_advanced #define GL_NV_blend_equation_advanced 1 #define GL_XOR_NV 0x1506 #define GL_RED_NV 0x1903 #define GL_GREEN_NV 0x1904 #define GL_BLUE_NV 0x1905 #define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 #define GL_BLEND_OVERLAP_NV 0x9281 #define GL_UNCORRELATED_NV 0x9282 #define GL_DISJOINT_NV 0x9283 #define GL_CONJOINT_NV 0x9284 #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 #define GL_SRC_NV 0x9286 #define GL_DST_NV 0x9287 #define GL_SRC_OVER_NV 0x9288 #define GL_DST_OVER_NV 0x9289 #define GL_SRC_IN_NV 0x928A #define GL_DST_IN_NV 0x928B #define GL_SRC_OUT_NV 0x928C #define GL_DST_OUT_NV 0x928D #define GL_SRC_ATOP_NV 0x928E #define GL_DST_ATOP_NV 0x928F #define GL_PLUS_NV 0x9291 #define GL_PLUS_DARKER_NV 0x9292 #define GL_MULTIPLY_NV 0x9294 #define GL_SCREEN_NV 0x9295 #define GL_OVERLAY_NV 0x9296 #define GL_DARKEN_NV 0x9297 #define GL_LIGHTEN_NV 0x9298 #define GL_COLORDODGE_NV 0x9299 #define GL_COLORBURN_NV 0x929A #define GL_HARDLIGHT_NV 0x929B #define GL_SOFTLIGHT_NV 0x929C #define GL_DIFFERENCE_NV 0x929E #define GL_MINUS_NV 0x929F #define GL_EXCLUSION_NV 0x92A0 #define GL_CONTRAST_NV 0x92A1 #define GL_INVERT_RGB_NV 0x92A3 #define GL_LINEARDODGE_NV 0x92A4 #define GL_LINEARBURN_NV 0x92A5 #define GL_VIVIDLIGHT_NV 0x92A6 #define GL_LINEARLIGHT_NV 0x92A7 #define GL_PINLIGHT_NV 0x92A8 #define GL_HARDMIX_NV 0x92A9 #define GL_HSL_HUE_NV 0x92AD #define GL_HSL_SATURATION_NV 0x92AE #define GL_HSL_COLOR_NV 0x92AF #define GL_HSL_LUMINOSITY_NV 0x92B0 #define GL_PLUS_CLAMPED_NV 0x92B1 #define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 #define GL_MINUS_CLAMPED_NV 0x92B3 #define GL_INVERT_OVG_NV 0x92B4 typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); #define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) #define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) #define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) #endif /* GL_NV_blend_equation_advanced */ /* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ #ifndef GL_NV_blend_equation_advanced_coherent #define GL_NV_blend_equation_advanced_coherent 1 #define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) #endif /* GL_NV_blend_equation_advanced_coherent */ /* --------------------------- GL_NV_blend_square -------------------------- */ #ifndef GL_NV_blend_square #define GL_NV_blend_square 1 #define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) #endif /* GL_NV_blend_square */ /* ------------------------- GL_NV_compute_program5 ------------------------ */ #ifndef GL_NV_compute_program5 #define GL_NV_compute_program5 1 #define GL_COMPUTE_PROGRAM_NV 0x90FB #define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC #define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) #endif /* GL_NV_compute_program5 */ /* ------------------------ GL_NV_conditional_render ----------------------- */ #ifndef GL_NV_conditional_render #define GL_NV_conditional_render 1 #define GL_QUERY_WAIT_NV 0x8E13 #define GL_QUERY_NO_WAIT_NV 0x8E14 #define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); #define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) #define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) #define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) #endif /* GL_NV_conditional_render */ /* ----------------------- GL_NV_conservative_raster ----------------------- */ #ifndef GL_NV_conservative_raster #define GL_NV_conservative_raster 1 #define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 #define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 #define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 #define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); #define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) #define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) #endif /* GL_NV_conservative_raster */ /* -------------------- GL_NV_conservative_raster_dilate ------------------- */ #ifndef GL_NV_conservative_raster_dilate #define GL_NV_conservative_raster_dilate 1 #define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 #define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A #define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); #define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) #define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) #endif /* GL_NV_conservative_raster_dilate */ /* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ #ifndef GL_NV_copy_depth_to_color #define GL_NV_copy_depth_to_color 1 #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F #define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) #endif /* GL_NV_copy_depth_to_color */ /* ---------------------------- GL_NV_copy_image --------------------------- */ #ifndef GL_NV_copy_image #define GL_NV_copy_image 1 typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) #define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) #endif /* GL_NV_copy_image */ /* -------------------------- GL_NV_deep_texture3D ------------------------- */ #ifndef GL_NV_deep_texture3D #define GL_NV_deep_texture3D 1 #define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 #define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 #define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) #endif /* GL_NV_deep_texture3D */ /* ------------------------ GL_NV_depth_buffer_float ----------------------- */ #ifndef GL_NV_depth_buffer_float #define GL_NV_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F_NV 0x8DAB #define GL_DEPTH32F_STENCIL8_NV 0x8DAC #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD #define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); #define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) #define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) #define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) #define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) #endif /* GL_NV_depth_buffer_float */ /* --------------------------- GL_NV_depth_clamp --------------------------- */ #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1 #define GL_DEPTH_CLAMP_NV 0x864F #define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) #endif /* GL_NV_depth_clamp */ /* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ #ifndef GL_NV_depth_range_unclamped #define GL_NV_depth_range_unclamped 1 #define GL_SAMPLE_COUNT_BITS_NV 0x8864 #define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 #define GL_QUERY_RESULT_NV 0x8866 #define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 #define GL_SAMPLE_COUNT_NV 0x8914 #define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) #endif /* GL_NV_depth_range_unclamped */ /* --------------------------- GL_NV_draw_texture -------------------------- */ #ifndef GL_NV_draw_texture #define GL_NV_draw_texture 1 typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); #define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) #define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) #endif /* GL_NV_draw_texture */ /* ---------------------------- GL_NV_evaluators --------------------------- */ #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #define GL_EVAL_2D_NV 0x86C0 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 #define GL_MAP_TESSELLATION_NV 0x86C2 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); #define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) #define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) #define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) #define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) #define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) #define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) #define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) #define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) #define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) #define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) #endif /* GL_NV_evaluators */ /* ----------------------- GL_NV_explicit_multisample ---------------------- */ #ifndef GL_NV_explicit_multisample #define GL_NV_explicit_multisample 1 #define GL_SAMPLE_POSITION_NV 0x8E50 #define GL_SAMPLE_MASK_NV 0x8E51 #define GL_SAMPLE_MASK_VALUE_NV 0x8E52 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 #define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 #define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 #define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 #define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); #define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) #define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) #define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) #define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) #endif /* GL_NV_explicit_multisample */ /* ------------------------------ GL_NV_fence ------------------------------ */ #ifndef GL_NV_fence #define GL_NV_fence 1 #define GL_ALL_COMPLETED_NV 0x84F2 #define GL_FENCE_STATUS_NV 0x84F3 #define GL_FENCE_CONDITION_NV 0x84F4 typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); #define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) #define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) #define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) #define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) #define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) #define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) #define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) #define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) #endif /* GL_NV_fence */ /* -------------------------- GL_NV_fill_rectangle ------------------------- */ #ifndef GL_NV_fill_rectangle #define GL_NV_fill_rectangle 1 #define GL_FILL_RECTANGLE_NV 0x933C #define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) #endif /* GL_NV_fill_rectangle */ /* --------------------------- GL_NV_float_buffer -------------------------- */ #ifndef GL_NV_float_buffer #define GL_NV_float_buffer 1 #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 #define GL_FLOAT_RGBA_NV 0x8883 #define GL_FLOAT_R16_NV 0x8884 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_RG16_NV 0x8886 #define GL_FLOAT_RG32_NV 0x8887 #define GL_FLOAT_RGB16_NV 0x8888 #define GL_FLOAT_RGB32_NV 0x8889 #define GL_FLOAT_RGBA16_NV 0x888A #define GL_FLOAT_RGBA32_NV 0x888B #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E #define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) #endif /* GL_NV_float_buffer */ /* --------------------------- GL_NV_fog_distance -------------------------- */ #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 #define GL_FOG_DISTANCE_MODE_NV 0x855A #define GL_EYE_RADIAL_NV 0x855B #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C #define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) #endif /* GL_NV_fog_distance */ /* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ #ifndef GL_NV_fragment_coverage_to_color #define GL_NV_fragment_coverage_to_color 1 #define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD #define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); #define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) #define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) #endif /* GL_NV_fragment_coverage_to_color */ /* ------------------------- GL_NV_fragment_program ------------------------ */ #ifndef GL_NV_fragment_program #define GL_NV_fragment_program 1 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); #define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) #define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) #define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) #define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) #define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) #define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) #define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) #endif /* GL_NV_fragment_program */ /* ------------------------ GL_NV_fragment_program2 ------------------------ */ #ifndef GL_NV_fragment_program2 #define GL_NV_fragment_program2 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 #define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 #define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 #define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) #endif /* GL_NV_fragment_program2 */ /* ------------------------ GL_NV_fragment_program4 ------------------------ */ #ifndef GL_NV_fragment_program4 #define GL_NV_fragment_program4 1 #define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) #endif /* GL_NV_fragment_program4 */ /* --------------------- GL_NV_fragment_program_option --------------------- */ #ifndef GL_NV_fragment_program_option #define GL_NV_fragment_program_option 1 #define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) #endif /* GL_NV_fragment_program_option */ /* -------------------- GL_NV_fragment_shader_interlock -------------------- */ #ifndef GL_NV_fragment_shader_interlock #define GL_NV_fragment_shader_interlock 1 #define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) #endif /* GL_NV_fragment_shader_interlock */ /* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ #ifndef GL_NV_framebuffer_mixed_samples #define GL_NV_framebuffer_mixed_samples 1 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GL_RASTER_MULTISAMPLE_EXT 0x9327 #define GL_RASTER_SAMPLES_EXT 0x9328 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C #define GL_DEPTH_SAMPLES_NV 0x932D #define GL_STENCIL_SAMPLES_NV 0x932E #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 #define GL_COVERAGE_MODULATION_NV 0x9332 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 #define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) #endif /* GL_NV_framebuffer_mixed_samples */ /* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ #ifndef GL_NV_framebuffer_multisample_coverage #define GL_NV_framebuffer_multisample_coverage 1 #define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB #define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 #define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 #define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) #define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) #endif /* GL_NV_framebuffer_multisample_coverage */ /* ------------------------ GL_NV_geometry_program4 ------------------------ */ #ifndef GL_NV_geometry_program4 #define GL_NV_geometry_program4 1 #define GL_GEOMETRY_PROGRAM_NV 0x8C26 #define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); #define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) #define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) #endif /* GL_NV_geometry_program4 */ /* ------------------------- GL_NV_geometry_shader4 ------------------------ */ #ifndef GL_NV_geometry_shader4 #define GL_NV_geometry_shader4 1 #define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) #endif /* GL_NV_geometry_shader4 */ /* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ #ifndef GL_NV_geometry_shader_passthrough #define GL_NV_geometry_shader_passthrough 1 #define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) #endif /* GL_NV_geometry_shader_passthrough */ /* --------------------------- GL_NV_gpu_program4 -------------------------- */ #ifndef GL_NV_gpu_program4 #define GL_NV_gpu_program4 1 #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 #define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 #define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 #define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 #define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 #define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 #define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); #define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) #define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) #define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) #define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) #define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) #define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) #define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) #define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) #define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) #define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) #define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) #define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) #define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) #endif /* GL_NV_gpu_program4 */ /* --------------------------- GL_NV_gpu_program5 -------------------------- */ #ifndef GL_NV_gpu_program5 #define GL_NV_gpu_program5 1 #define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C #define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F #define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) #endif /* GL_NV_gpu_program5 */ /* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ #ifndef GL_NV_gpu_program5_mem_extended #define GL_NV_gpu_program5_mem_extended 1 #define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) #endif /* GL_NV_gpu_program5_mem_extended */ /* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ #ifndef GL_NV_gpu_program_fp64 #define GL_NV_gpu_program_fp64 1 #define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) #endif /* GL_NV_gpu_program_fp64 */ /* --------------------------- GL_NV_gpu_shader5 --------------------------- */ #ifndef GL_NV_gpu_shader5 #define GL_NV_gpu_shader5 1 #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F #define GL_INT8_NV 0x8FE0 #define GL_INT8_VEC2_NV 0x8FE1 #define GL_INT8_VEC3_NV 0x8FE2 #define GL_INT8_VEC4_NV 0x8FE3 #define GL_INT16_NV 0x8FE4 #define GL_INT16_VEC2_NV 0x8FE5 #define GL_INT16_VEC3_NV 0x8FE6 #define GL_INT16_VEC4_NV 0x8FE7 #define GL_INT64_VEC2_NV 0x8FE9 #define GL_INT64_VEC3_NV 0x8FEA #define GL_INT64_VEC4_NV 0x8FEB #define GL_UNSIGNED_INT8_NV 0x8FEC #define GL_UNSIGNED_INT8_VEC2_NV 0x8FED #define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE #define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF #define GL_UNSIGNED_INT16_NV 0x8FF0 #define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 #define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 #define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 #define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 #define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 #define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 #define GL_FLOAT16_NV 0x8FF8 #define GL_FLOAT16_VEC2_NV 0x8FF9 #define GL_FLOAT16_VEC3_NV 0x8FFA #define GL_FLOAT16_VEC4_NV 0x8FFB typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); #define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) #define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) #define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) #define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) #define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) #define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) #define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) #define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) #define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) #define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) #define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) #define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) #define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) #define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) #define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) #define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) #define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) #define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) #define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) #define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) #define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) #define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) #define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) #define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) #define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) #define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) #define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) #define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) #define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) #define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) #define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) #define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) #define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) #define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) #define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) #endif /* GL_NV_gpu_shader5 */ /* ---------------------------- GL_NV_half_float --------------------------- */ #ifndef GL_NV_half_float #define GL_NV_half_float 1 #define GL_HALF_FLOAT_NV 0x140B typedef unsigned short GLhalf; typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); #define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) #define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) #define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) #define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) #define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) #define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) #define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) #define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) #define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) #define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) #define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) #define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) #define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) #define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) #define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) #define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) #define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) #define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) #define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) #define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) #define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) #define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) #define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) #define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) #define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) #define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) #define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) #define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) #define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) #define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) #define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) #define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) #define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) #define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) #define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) #define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) #define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) #define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) #define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) #define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) #define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) #define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) #define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) #define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) #define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) #define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) #define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) #endif /* GL_NV_half_float */ /* ------------------- GL_NV_internalformat_sample_query ------------------- */ #ifndef GL_NV_internalformat_sample_query #define GL_NV_internalformat_sample_query 1 #define GL_MULTISAMPLES_NV 0x9371 #define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 #define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 #define GL_CONFORMANT_NV 0x9374 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); #define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) #define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) #endif /* GL_NV_internalformat_sample_query */ /* ------------------------ GL_NV_light_max_exponent ----------------------- */ #ifndef GL_NV_light_max_exponent #define GL_NV_light_max_exponent 1 #define GL_MAX_SHININESS_NV 0x8504 #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) #endif /* GL_NV_light_max_exponent */ /* ----------------------- GL_NV_multisample_coverage ---------------------- */ #ifndef GL_NV_multisample_coverage #define GL_NV_multisample_coverage 1 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) #endif /* GL_NV_multisample_coverage */ /* --------------------- GL_NV_multisample_filter_hint --------------------- */ #ifndef GL_NV_multisample_filter_hint #define GL_NV_multisample_filter_hint 1 #define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 #define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) #endif /* GL_NV_multisample_filter_hint */ /* ------------------------- GL_NV_occlusion_query ------------------------- */ #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #define GL_PIXEL_COUNTER_BITS_NV 0x8864 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 #define GL_PIXEL_COUNT_NV 0x8866 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); #define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) #define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) #define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) #define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) #define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) #define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) #define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) #define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) #endif /* GL_NV_occlusion_query */ /* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ #ifndef GL_NV_packed_depth_stencil #define GL_NV_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_NV 0x84F9 #define GL_UNSIGNED_INT_24_8_NV 0x84FA #define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) #endif /* GL_NV_packed_depth_stencil */ /* --------------------- GL_NV_parameter_buffer_object --------------------- */ #ifndef GL_NV_parameter_buffer_object #define GL_NV_parameter_buffer_object 1 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 #define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 #define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 #define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); #define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) #define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) #define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) #define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) #endif /* GL_NV_parameter_buffer_object */ /* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ #ifndef GL_NV_parameter_buffer_object2 #define GL_NV_parameter_buffer_object2 1 #define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) #endif /* GL_NV_parameter_buffer_object2 */ /* -------------------------- GL_NV_path_rendering ------------------------- */ #ifndef GL_NV_path_rendering #define GL_NV_path_rendering 1 #define GL_CLOSE_PATH_NV 0x00 #define GL_BOLD_BIT_NV 0x01 #define GL_GLYPH_WIDTH_BIT_NV 0x01 #define GL_GLYPH_HEIGHT_BIT_NV 0x02 #define GL_ITALIC_BIT_NV 0x02 #define GL_MOVE_TO_NV 0x02 #define GL_RELATIVE_MOVE_TO_NV 0x03 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 #define GL_LINE_TO_NV 0x04 #define GL_RELATIVE_LINE_TO_NV 0x05 #define GL_HORIZONTAL_LINE_TO_NV 0x06 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 #define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 #define GL_VERTICAL_LINE_TO_NV 0x08 #define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 #define GL_QUADRATIC_CURVE_TO_NV 0x0A #define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B #define GL_CUBIC_CURVE_TO_NV 0x0C #define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D #define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E #define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F #define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 #define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 #define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 #define GL_SMALL_CCW_ARC_TO_NV 0x12 #define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 #define GL_SMALL_CW_ARC_TO_NV 0x14 #define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 #define GL_LARGE_CCW_ARC_TO_NV 0x16 #define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 #define GL_LARGE_CW_ARC_TO_NV 0x18 #define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 #define GL_CONIC_CURVE_TO_NV 0x1A #define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B #define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 #define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 #define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 #define GL_ROUNDED_RECT_NV 0xE8 #define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 #define GL_ROUNDED_RECT2_NV 0xEA #define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB #define GL_ROUNDED_RECT4_NV 0xEC #define GL_RELATIVE_ROUNDED_RECT4_NV 0xED #define GL_ROUNDED_RECT8_NV 0xEE #define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF #define GL_RESTART_PATH_NV 0xF0 #define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 #define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 #define GL_RECT_NV 0xF6 #define GL_RELATIVE_RECT_NV 0xF7 #define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 #define GL_CIRCULAR_CW_ARC_TO_NV 0xFA #define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC #define GL_ARC_TO_NV 0xFE #define GL_RELATIVE_ARC_TO_NV 0xFF #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_PRIMARY_COLOR 0x8577 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 #define GL_STANDARD_FONT_NAME_NV 0x9072 #define GL_SYSTEM_FONT_NAME_NV 0x9073 #define GL_FILE_NAME_NV 0x9074 #define GL_PATH_STROKE_WIDTH_NV 0x9075 #define GL_PATH_END_CAPS_NV 0x9076 #define GL_PATH_INITIAL_END_CAP_NV 0x9077 #define GL_PATH_TERMINAL_END_CAP_NV 0x9078 #define GL_PATH_JOIN_STYLE_NV 0x9079 #define GL_PATH_MITER_LIMIT_NV 0x907A #define GL_PATH_DASH_CAPS_NV 0x907B #define GL_PATH_INITIAL_DASH_CAP_NV 0x907C #define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D #define GL_PATH_DASH_OFFSET_NV 0x907E #define GL_PATH_CLIENT_LENGTH_NV 0x907F #define GL_PATH_FILL_MODE_NV 0x9080 #define GL_PATH_FILL_MASK_NV 0x9081 #define GL_PATH_FILL_COVER_MODE_NV 0x9082 #define GL_PATH_STROKE_COVER_MODE_NV 0x9083 #define GL_PATH_STROKE_MASK_NV 0x9084 #define GL_PATH_STROKE_BOUND_NV 0x9086 #define GL_COUNT_UP_NV 0x9088 #define GL_COUNT_DOWN_NV 0x9089 #define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A #define GL_CONVEX_HULL_NV 0x908B #define GL_BOUNDING_BOX_NV 0x908D #define GL_TRANSLATE_X_NV 0x908E #define GL_TRANSLATE_Y_NV 0x908F #define GL_TRANSLATE_2D_NV 0x9090 #define GL_TRANSLATE_3D_NV 0x9091 #define GL_AFFINE_2D_NV 0x9092 #define GL_AFFINE_3D_NV 0x9094 #define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 #define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 #define GL_UTF8_NV 0x909A #define GL_UTF16_NV 0x909B #define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C #define GL_PATH_COMMAND_COUNT_NV 0x909D #define GL_PATH_COORD_COUNT_NV 0x909E #define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F #define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 #define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 #define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 #define GL_SQUARE_NV 0x90A3 #define GL_ROUND_NV 0x90A4 #define GL_TRIANGULAR_NV 0x90A5 #define GL_BEVEL_NV 0x90A6 #define GL_MITER_REVERT_NV 0x90A7 #define GL_MITER_TRUNCATE_NV 0x90A8 #define GL_SKIP_MISSING_GLYPH_NV 0x90A9 #define GL_USE_MISSING_GLYPH_NV 0x90AA #define GL_PATH_ERROR_POSITION_NV 0x90AB #define GL_PATH_FOG_GEN_MODE_NV 0x90AC #define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD #define GL_ADJACENT_PAIRS_NV 0x90AE #define GL_FIRST_TO_REST_NV 0x90AF #define GL_PATH_GEN_MODE_NV 0x90B0 #define GL_PATH_GEN_COEFF_NV 0x90B1 #define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 #define GL_PATH_GEN_COMPONENTS_NV 0x90B3 #define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 #define GL_MOVE_TO_RESETS_NV 0x90B5 #define GL_MOVE_TO_CONTINUES_NV 0x90B6 #define GL_PATH_STENCIL_FUNC_NV 0x90B7 #define GL_PATH_STENCIL_REF_NV 0x90B8 #define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 #define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD #define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE #define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF #define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 #define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 #define GL_FONT_UNAVAILABLE_NV 0x936A #define GL_FONT_UNINTELLIGIBLE_NV 0x936B #define GL_STANDARD_FONT_FORMAT_NV 0x936C #define GL_FRAGMENT_INPUT_NV 0x936D #define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 #define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 #define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 #define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 #define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 #define GL_FONT_ASCENDER_BIT_NV 0x00200000 #define GL_FONT_DESCENDER_BIT_NV 0x00400000 #define GL_FONT_HEIGHT_BIT_NV 0x00800000 #define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 #define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 #define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); #define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) #define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) #define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) #define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) #define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) #define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) #define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) #define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) #define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) #define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) #define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) #define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) #define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) #define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) #define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) #define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) #define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) #define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) #define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) #define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) #define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) #define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) #define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) #define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) #define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) #define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) #define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) #define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) #define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) #define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) #define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) #define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) #define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) #define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) #define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) #define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) #define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) #define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) #define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) #define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) #define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) #define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) #define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) #define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) #define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) #define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) #define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) #define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) #define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) #define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) #define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) #define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) #define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) #define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) #define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) #define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) #define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) #define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) #define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) #define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) #define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) #define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) #define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) #define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) #define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) #endif /* GL_NV_path_rendering */ /* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ #ifndef GL_NV_path_rendering_shared_edge #define GL_NV_path_rendering_shared_edge 1 #define GL_SHARED_EDGE_NV 0xC0 #define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) #endif /* GL_NV_path_rendering_shared_edge */ /* ------------------------- GL_NV_pixel_data_range ------------------------ */ #ifndef GL_NV_pixel_data_range #define GL_NV_pixel_data_range 1 #define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 #define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 #define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A #define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B #define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); #define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) #define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) #define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) #endif /* GL_NV_pixel_data_range */ /* --------------------------- GL_NV_point_sprite -------------------------- */ #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #define GL_POINT_SPRITE_NV 0x8861 #define GL_COORD_REPLACE_NV 0x8862 #define GL_POINT_SPRITE_R_MODE_NV 0x8863 typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); #define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) #define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) #define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) #endif /* GL_NV_point_sprite */ /* -------------------------- GL_NV_present_video -------------------------- */ #ifndef GL_NV_present_video #define GL_NV_present_video 1 #define GL_FRAME_NV 0x8E26 #define GL_FIELDS_NV 0x8E27 #define GL_CURRENT_TIME_NV 0x8E28 #define GL_NUM_FILL_STREAMS_NV 0x8E29 #define GL_PRESENT_TIME_NV 0x8E2A #define GL_PRESENT_DURATION_NV 0x8E2B typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); #define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) #define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) #define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) #define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) #define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) #define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) #define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) #endif /* GL_NV_present_video */ /* ------------------------ GL_NV_primitive_restart ------------------------ */ #ifndef GL_NV_primitive_restart #define GL_NV_primitive_restart 1 #define GL_PRIMITIVE_RESTART_NV 0x8558 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); #define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) #define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) #define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) #endif /* GL_NV_primitive_restart */ /* ------------------------ GL_NV_register_combiners ----------------------- */ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #define GL_REGISTER_COMBINERS_NV 0x8522 #define GL_VARIABLE_A_NV 0x8523 #define GL_VARIABLE_B_NV 0x8524 #define GL_VARIABLE_C_NV 0x8525 #define GL_VARIABLE_D_NV 0x8526 #define GL_VARIABLE_E_NV 0x8527 #define GL_VARIABLE_F_NV 0x8528 #define GL_VARIABLE_G_NV 0x8529 #define GL_CONSTANT_COLOR0_NV 0x852A #define GL_CONSTANT_COLOR1_NV 0x852B #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_SPARE0_NV 0x852E #define GL_SPARE1_NV 0x852F #define GL_DISCARD_NV 0x8530 #define GL_E_TIMES_F_NV 0x8531 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 #define GL_UNSIGNED_IDENTITY_NV 0x8536 #define GL_UNSIGNED_INVERT_NV 0x8537 #define GL_EXPAND_NORMAL_NV 0x8538 #define GL_EXPAND_NEGATE_NV 0x8539 #define GL_HALF_BIAS_NORMAL_NV 0x853A #define GL_HALF_BIAS_NEGATE_NV 0x853B #define GL_SIGNED_IDENTITY_NV 0x853C #define GL_SIGNED_NEGATE_NV 0x853D #define GL_SCALE_BY_TWO_NV 0x853E #define GL_SCALE_BY_FOUR_NV 0x853F #define GL_SCALE_BY_ONE_HALF_NV 0x8540 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 #define GL_COMBINER_INPUT_NV 0x8542 #define GL_COMBINER_MAPPING_NV 0x8543 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 #define GL_COMBINER_MUX_SUM_NV 0x8547 #define GL_COMBINER_SCALE_NV 0x8548 #define GL_COMBINER_BIAS_NV 0x8549 #define GL_COMBINER_AB_OUTPUT_NV 0x854A #define GL_COMBINER_CD_OUTPUT_NV 0x854B #define GL_COMBINER_SUM_OUTPUT_NV 0x854C #define GL_MAX_GENERAL_COMBINERS_NV 0x854D #define GL_NUM_GENERAL_COMBINERS_NV 0x854E #define GL_COLOR_SUM_CLAMP_NV 0x854F #define GL_COMBINER0_NV 0x8550 #define GL_COMBINER1_NV 0x8551 #define GL_COMBINER2_NV 0x8552 #define GL_COMBINER3_NV 0x8553 #define GL_COMBINER4_NV 0x8554 #define GL_COMBINER5_NV 0x8555 #define GL_COMBINER6_NV 0x8556 #define GL_COMBINER7_NV 0x8557 typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); #define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) #define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) #define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) #define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) #define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) #define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) #define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) #define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) #define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) #define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) #define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) #define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) #define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) #define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) #endif /* GL_NV_register_combiners */ /* ----------------------- GL_NV_register_combiners2 ----------------------- */ #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 #define GL_PER_STAGE_CONSTANTS_NV 0x8535 typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); #define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) #define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) #define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) #endif /* GL_NV_register_combiners2 */ /* ------------------------- GL_NV_sample_locations ------------------------ */ #ifndef GL_NV_sample_locations #define GL_NV_sample_locations 1 #define GL_SAMPLE_LOCATION_NV 0x8E50 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); #define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) #define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) #define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) #endif /* GL_NV_sample_locations */ /* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ #ifndef GL_NV_sample_mask_override_coverage #define GL_NV_sample_mask_override_coverage 1 #define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) #endif /* GL_NV_sample_mask_override_coverage */ /* ---------------------- GL_NV_shader_atomic_counters --------------------- */ #ifndef GL_NV_shader_atomic_counters #define GL_NV_shader_atomic_counters 1 #define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) #endif /* GL_NV_shader_atomic_counters */ /* ----------------------- GL_NV_shader_atomic_float ----------------------- */ #ifndef GL_NV_shader_atomic_float #define GL_NV_shader_atomic_float 1 #define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) #endif /* GL_NV_shader_atomic_float */ /* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ #ifndef GL_NV_shader_atomic_fp16_vector #define GL_NV_shader_atomic_fp16_vector 1 #define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) #endif /* GL_NV_shader_atomic_fp16_vector */ /* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ #ifndef GL_NV_shader_atomic_int64 #define GL_NV_shader_atomic_int64 1 #define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) #endif /* GL_NV_shader_atomic_int64 */ /* ------------------------ GL_NV_shader_buffer_load ----------------------- */ #ifndef GL_NV_shader_buffer_load #define GL_NV_shader_buffer_load 1 #define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D #define GL_GPU_ADDRESS_NV 0x8F34 #define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); #define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) #define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) #define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) #define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) #define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) #define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) #define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) #define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) #define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) #define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) #define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) #define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) #define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) #define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) #endif /* GL_NV_shader_buffer_load */ /* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ #ifndef GL_NV_shader_storage_buffer_object #define GL_NV_shader_storage_buffer_object 1 #define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) #endif /* GL_NV_shader_storage_buffer_object */ /* ----------------------- GL_NV_shader_thread_group ----------------------- */ #ifndef GL_NV_shader_thread_group #define GL_NV_shader_thread_group 1 #define GL_WARP_SIZE_NV 0x9339 #define GL_WARPS_PER_SM_NV 0x933A #define GL_SM_COUNT_NV 0x933B #define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) #endif /* GL_NV_shader_thread_group */ /* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ #ifndef GL_NV_shader_thread_shuffle #define GL_NV_shader_thread_shuffle 1 #define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) #endif /* GL_NV_shader_thread_shuffle */ /* ---------------------- GL_NV_tessellation_program5 ---------------------- */ #ifndef GL_NV_tessellation_program5 #define GL_NV_tessellation_program5 1 #define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 #define GL_TESS_CONTROL_PROGRAM_NV 0x891E #define GL_TESS_EVALUATION_PROGRAM_NV 0x891F #define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 #define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 #define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) #endif /* GL_NV_tessellation_program5 */ /* -------------------------- GL_NV_texgen_emboss -------------------------- */ #ifndef GL_NV_texgen_emboss #define GL_NV_texgen_emboss 1 #define GL_EMBOSS_LIGHT_NV 0x855D #define GL_EMBOSS_CONSTANT_NV 0x855E #define GL_EMBOSS_MAP_NV 0x855F #define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) #endif /* GL_NV_texgen_emboss */ /* ------------------------ GL_NV_texgen_reflection ------------------------ */ #ifndef GL_NV_texgen_reflection #define GL_NV_texgen_reflection 1 #define GL_NORMAL_MAP_NV 0x8511 #define GL_REFLECTION_MAP_NV 0x8512 #define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) #endif /* GL_NV_texgen_reflection */ /* ------------------------- GL_NV_texture_barrier ------------------------- */ #ifndef GL_NV_texture_barrier #define GL_NV_texture_barrier 1 typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); #define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) #define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) #endif /* GL_NV_texture_barrier */ /* --------------------- GL_NV_texture_compression_vtc --------------------- */ #ifndef GL_NV_texture_compression_vtc #define GL_NV_texture_compression_vtc 1 #define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) #endif /* GL_NV_texture_compression_vtc */ /* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ #ifndef GL_NV_texture_env_combine4 #define GL_NV_texture_env_combine4 1 #define GL_COMBINE4_NV 0x8503 #define GL_SOURCE3_RGB_NV 0x8583 #define GL_SOURCE3_ALPHA_NV 0x858B #define GL_OPERAND3_RGB_NV 0x8593 #define GL_OPERAND3_ALPHA_NV 0x859B #define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) #endif /* GL_NV_texture_env_combine4 */ /* ---------------------- GL_NV_texture_expand_normal ---------------------- */ #ifndef GL_NV_texture_expand_normal #define GL_NV_texture_expand_normal 1 #define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F #define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) #endif /* GL_NV_texture_expand_normal */ /* ----------------------- GL_NV_texture_multisample ----------------------- */ #ifndef GL_NV_texture_multisample #define GL_NV_texture_multisample 1 #define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 #define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) #define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) #define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) #define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) #define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) #define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) #define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) #endif /* GL_NV_texture_multisample */ /* ------------------------ GL_NV_texture_rectangle ------------------------ */ #ifndef GL_NV_texture_rectangle #define GL_NV_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_NV 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 #define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) #endif /* GL_NV_texture_rectangle */ /* -------------------------- GL_NV_texture_shader ------------------------- */ #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_SHADER_CONSISTENT_NV 0x86DD #define GL_TEXTURE_SHADER_NV 0x86DE #define GL_SHADER_OPERATION_NV 0x86DF #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_PASS_THROUGH_NV 0x86E6 #define GL_CULL_FRAGMENT_NV 0x86E7 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8 #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA #define GL_DOT_PRODUCT_NV 0x86EC #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HI_SCALE_NV 0x870E #define GL_LO_SCALE_NV 0x870F #define GL_DS_SCALE_NV 0x8710 #define GL_DT_SCALE_NV 0x8711 #define GL_MAGNITUDE_SCALE_NV 0x8712 #define GL_VIBRANCE_SCALE_NV 0x8713 #define GL_HI_BIAS_NV 0x8714 #define GL_LO_BIAS_NV 0x8715 #define GL_DS_BIAS_NV 0x8716 #define GL_DT_BIAS_NV 0x8717 #define GL_MAGNITUDE_BIAS_NV 0x8718 #define GL_VIBRANCE_BIAS_NV 0x8719 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A #define GL_TEXTURE_HI_SIZE_NV 0x871B #define GL_TEXTURE_LO_SIZE_NV 0x871C #define GL_TEXTURE_DS_SIZE_NV 0x871D #define GL_TEXTURE_DT_SIZE_NV 0x871E #define GL_TEXTURE_MAG_SIZE_NV 0x871F #define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) #endif /* GL_NV_texture_shader */ /* ------------------------- GL_NV_texture_shader2 ------------------------- */ #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 1 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) #endif /* GL_NV_texture_shader2 */ /* ------------------------- GL_NV_texture_shader3 ------------------------- */ #ifndef GL_NV_texture_shader3 #define GL_NV_texture_shader3 1 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D #define GL_HILO8_NV 0x885E #define GL_SIGNED_HILO8_NV 0x885F #define GL_FORCE_BLUE_TO_ONE_NV 0x8860 #define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) #endif /* GL_NV_texture_shader3 */ /* ------------------------ GL_NV_transform_feedback ----------------------- */ #ifndef GL_NV_transform_feedback #define GL_NV_transform_feedback 1 #define GL_BACK_PRIMARY_COLOR_NV 0x8C77 #define GL_BACK_SECONDARY_COLOR_NV 0x8C78 #define GL_TEXTURE_COORD_NV 0x8C79 #define GL_CLIP_DISTANCE_NV 0x8C7A #define GL_VERTEX_ID_NV 0x8C7B #define GL_PRIMITIVE_ID_NV 0x8C7C #define GL_GENERIC_ATTRIB_NV 0x8C7D #define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 #define GL_ACTIVE_VARYINGS_NV 0x8C81 #define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 #define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 #define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 #define GL_PRIMITIVES_GENERATED_NV 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 #define GL_RASTERIZER_DISCARD_NV 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B #define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C #define GL_SEPARATE_ATTRIBS_NV 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); #define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) #define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) #define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) #define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) #define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) #define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) #define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) #define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) #define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) #define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) #define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) #define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) #endif /* GL_NV_transform_feedback */ /* ----------------------- GL_NV_transform_feedback2 ----------------------- */ #ifndef GL_NV_transform_feedback2 #define GL_NV_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK_NV 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); #define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) #define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) #define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) #define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) #define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) #define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) #define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) #define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) #endif /* GL_NV_transform_feedback2 */ /* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ #ifndef GL_NV_uniform_buffer_unified_memory #define GL_NV_uniform_buffer_unified_memory 1 #define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E #define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F #define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 #define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) #endif /* GL_NV_uniform_buffer_unified_memory */ /* -------------------------- GL_NV_vdpau_interop -------------------------- */ #ifndef GL_NV_vdpau_interop #define GL_NV_vdpau_interop 1 #define GL_SURFACE_STATE_NV 0x86EB #define GL_SURFACE_REGISTERED_NV 0x86FD #define GL_SURFACE_MAPPED_NV 0x8700 #define GL_WRITE_DISCARD_NV 0x88BE typedef GLintptr GLvdpauSurfaceNV; typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); #define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) #define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) #define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) #define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) #define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) #define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) #define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) #define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) #define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) #define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) #define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) #endif /* GL_NV_vdpau_interop */ /* ------------------------ GL_NV_vertex_array_range ----------------------- */ #ifndef GL_NV_vertex_array_range #define GL_NV_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_NV 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); #define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) #define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) #define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) #endif /* GL_NV_vertex_array_range */ /* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ #ifndef GL_NV_vertex_array_range2 #define GL_NV_vertex_array_range2 1 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 #define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) #endif /* GL_NV_vertex_array_range2 */ /* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ #ifndef GL_NV_vertex_attrib_integer_64bit #define GL_NV_vertex_attrib_integer_64bit 1 #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); #define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) #define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) #define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) #define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) #define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) #define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) #define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) #define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) #define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) #define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) #define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) #define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) #define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) #define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) #define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) #define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) #define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) #define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) #define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) #define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) #endif /* GL_NV_vertex_attrib_integer_64bit */ /* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ #ifndef GL_NV_vertex_buffer_unified_memory #define GL_NV_vertex_buffer_unified_memory 1 #define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E #define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F #define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 #define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 #define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 #define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 #define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 #define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 #define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 #define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 #define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 #define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 #define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A #define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B #define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C #define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D #define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E #define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F #define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 #define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 #define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 #define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 #define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 #define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 #define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); #define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) #define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) #define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) #define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) #define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) #define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) #define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) #define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) #define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) #define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) #define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) #define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) #define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) #endif /* GL_NV_vertex_buffer_unified_memory */ /* -------------------------- GL_NV_vertex_program ------------------------- */ #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #define GL_VERTEX_PROGRAM_NV 0x8620 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_STRING_NV 0x8628 #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_IDENTITY_NV 0x862A #define GL_INVERSE_NV 0x862B #define GL_TRANSPOSE_NV 0x862C #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX1_NV 0x8631 #define GL_MATRIX2_NV 0x8632 #define GL_MATRIX3_NV 0x8633 #define GL_MATRIX4_NV 0x8634 #define GL_MATRIX5_NV 0x8635 #define GL_MATRIX6_NV 0x8636 #define GL_MATRIX7_NV 0x8637 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_RESIDENT_NV 0x8647 #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_PROGRAM_ERROR_POSITION_NV 0x864B #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); #define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) #define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) #define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) #define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) #define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) #define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) #define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) #define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) #define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) #define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) #define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) #define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) #define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) #define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) #define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) #define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) #define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) #define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) #define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) #define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) #define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) #define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) #define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) #define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) #define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) #define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) #define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) #define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) #define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) #define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) #define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) #define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) #define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) #define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) #define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) #define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) #define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) #define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) #define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) #define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) #define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) #define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) #define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) #define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) #define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) #define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) #define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) #define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) #define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) #define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) #define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) #define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) #define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) #define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) #define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) #define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) #define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) #define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) #define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) #define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) #define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) #define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) #define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) #define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) #define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) #endif /* GL_NV_vertex_program */ /* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ #ifndef GL_NV_vertex_program1_1 #define GL_NV_vertex_program1_1 1 #define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) #endif /* GL_NV_vertex_program1_1 */ /* ------------------------- GL_NV_vertex_program2 ------------------------- */ #ifndef GL_NV_vertex_program2 #define GL_NV_vertex_program2 1 #define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) #endif /* GL_NV_vertex_program2 */ /* ---------------------- GL_NV_vertex_program2_option --------------------- */ #ifndef GL_NV_vertex_program2_option #define GL_NV_vertex_program2_option 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) #endif /* GL_NV_vertex_program2_option */ /* ------------------------- GL_NV_vertex_program3 ------------------------- */ #ifndef GL_NV_vertex_program3 #define GL_NV_vertex_program3 1 #define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) #endif /* GL_NV_vertex_program3 */ /* ------------------------- GL_NV_vertex_program4 ------------------------- */ #ifndef GL_NV_vertex_program4 #define GL_NV_vertex_program4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD #define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) #endif /* GL_NV_vertex_program4 */ /* -------------------------- GL_NV_video_capture -------------------------- */ #ifndef GL_NV_video_capture #define GL_NV_video_capture 1 #define GL_VIDEO_BUFFER_NV 0x9020 #define GL_VIDEO_BUFFER_BINDING_NV 0x9021 #define GL_FIELD_UPPER_NV 0x9022 #define GL_FIELD_LOWER_NV 0x9023 #define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 #define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 #define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 #define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 #define GL_VIDEO_BUFFER_PITCH_NV 0x9028 #define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 #define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A #define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B #define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C #define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D #define GL_PARTIAL_SUCCESS_NV 0x902E #define GL_SUCCESS_NV 0x902F #define GL_FAILURE_NV 0x9030 #define GL_YCBYCR8_422_NV 0x9031 #define GL_YCBAYCR8A_4224_NV 0x9032 #define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 #define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 #define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 #define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 #define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 #define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 #define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 #define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A #define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B #define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); #define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) #define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) #define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) #define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) #define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) #define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) #define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) #define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) #define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) #define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) #define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) #define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) #define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) #endif /* GL_NV_video_capture */ /* ------------------------- GL_NV_viewport_array2 ------------------------- */ #ifndef GL_NV_viewport_array2 #define GL_NV_viewport_array2 1 #define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) #endif /* GL_NV_viewport_array2 */ /* ------------------------ GL_OES_byte_coordinates ------------------------ */ #ifndef GL_OES_byte_coordinates #define GL_OES_byte_coordinates 1 #define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) #endif /* GL_OES_byte_coordinates */ /* ------------------- GL_OES_compressed_paletted_texture ------------------ */ #ifndef GL_OES_compressed_paletted_texture #define GL_OES_compressed_paletted_texture 1 #define GL_PALETTE4_RGB8_OES 0x8B90 #define GL_PALETTE4_RGBA8_OES 0x8B91 #define GL_PALETTE4_R5_G6_B5_OES 0x8B92 #define GL_PALETTE4_RGBA4_OES 0x8B93 #define GL_PALETTE4_RGB5_A1_OES 0x8B94 #define GL_PALETTE8_RGB8_OES 0x8B95 #define GL_PALETTE8_RGBA8_OES 0x8B96 #define GL_PALETTE8_R5_G6_B5_OES 0x8B97 #define GL_PALETTE8_RGBA4_OES 0x8B98 #define GL_PALETTE8_RGB5_A1_OES 0x8B99 #define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) #endif /* GL_OES_compressed_paletted_texture */ /* --------------------------- GL_OES_read_format -------------------------- */ #ifndef GL_OES_read_format #define GL_OES_read_format 1 #define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B #define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) #endif /* GL_OES_read_format */ /* ------------------------ GL_OES_single_precision ------------------------ */ #ifndef GL_OES_single_precision #define GL_OES_single_precision 1 typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); #define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) #define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) #define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) #define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) #define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) #define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) #define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) #endif /* GL_OES_single_precision */ /* ---------------------------- GL_OML_interlace --------------------------- */ #ifndef GL_OML_interlace #define GL_OML_interlace 1 #define GL_INTERLACE_OML 0x8980 #define GL_INTERLACE_READ_OML 0x8981 #define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) #endif /* GL_OML_interlace */ /* ---------------------------- GL_OML_resample ---------------------------- */ #ifndef GL_OML_resample #define GL_OML_resample 1 #define GL_PACK_RESAMPLE_OML 0x8984 #define GL_UNPACK_RESAMPLE_OML 0x8985 #define GL_RESAMPLE_REPLICATE_OML 0x8986 #define GL_RESAMPLE_ZERO_FILL_OML 0x8987 #define GL_RESAMPLE_AVERAGE_OML 0x8988 #define GL_RESAMPLE_DECIMATE_OML 0x8989 #define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) #endif /* GL_OML_resample */ /* ---------------------------- GL_OML_subsample --------------------------- */ #ifndef GL_OML_subsample #define GL_OML_subsample 1 #define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 #define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 #define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) #endif /* GL_OML_subsample */ /* ---------------------------- GL_OVR_multiview --------------------------- */ #ifndef GL_OVR_multiview #define GL_OVR_multiview 1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 #define GL_MAX_VIEWS_OVR 0x9631 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 #define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); #define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) #define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) #endif /* GL_OVR_multiview */ /* --------------------------- GL_OVR_multiview2 --------------------------- */ #ifndef GL_OVR_multiview2 #define GL_OVR_multiview2 1 #define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) #endif /* GL_OVR_multiview2 */ /* --------------------------- GL_PGI_misc_hints --------------------------- */ #ifndef GL_PGI_misc_hints #define GL_PGI_misc_hints 1 #define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 #define GL_CONSERVE_MEMORY_HINT_PGI 107005 #define GL_RECLAIM_MEMORY_HINT_PGI 107006 #define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 #define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 #define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 #define GL_ALWAYS_FAST_HINT_PGI 107020 #define GL_ALWAYS_SOFT_HINT_PGI 107021 #define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 #define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 #define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 #define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 #define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 #define GL_STRICT_LIGHTING_HINT_PGI 107031 #define GL_STRICT_SCISSOR_HINT_PGI 107032 #define GL_FULL_STIPPLE_HINT_PGI 107033 #define GL_CLIP_NEAR_HINT_PGI 107040 #define GL_CLIP_FAR_HINT_PGI 107041 #define GL_WIDE_LINE_HINT_PGI 107042 #define GL_BACK_NORMALS_HINT_PGI 107043 #define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) #endif /* GL_PGI_misc_hints */ /* -------------------------- GL_PGI_vertex_hints -------------------------- */ #ifndef GL_PGI_vertex_hints #define GL_PGI_vertex_hints 1 #define GL_VERTEX23_BIT_PGI 0x00000004 #define GL_VERTEX4_BIT_PGI 0x00000008 #define GL_COLOR3_BIT_PGI 0x00010000 #define GL_COLOR4_BIT_PGI 0x00020000 #define GL_EDGEFLAG_BIT_PGI 0x00040000 #define GL_INDEX_BIT_PGI 0x00080000 #define GL_MAT_AMBIENT_BIT_PGI 0x00100000 #define GL_VERTEX_DATA_HINT_PGI 107050 #define GL_VERTEX_CONSISTENT_HINT_PGI 107051 #define GL_MATERIAL_SIDE_HINT_PGI 107052 #define GL_MAX_VERTEX_HINT_PGI 107053 #define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 #define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 #define GL_MAT_EMISSION_BIT_PGI 0x00800000 #define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 #define GL_MAT_SHININESS_BIT_PGI 0x02000000 #define GL_MAT_SPECULAR_BIT_PGI 0x04000000 #define GL_NORMAL_BIT_PGI 0x08000000 #define GL_TEXCOORD1_BIT_PGI 0x10000000 #define GL_TEXCOORD2_BIT_PGI 0x20000000 #define GL_TEXCOORD3_BIT_PGI 0x40000000 #define GL_TEXCOORD4_BIT_PGI 0x80000000 #define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) #endif /* GL_PGI_vertex_hints */ /* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ #ifndef GL_REGAL_ES1_0_compatibility #define GL_REGAL_ES1_0_compatibility 1 typedef int GLclampx; typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); #define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) #define glClearColorx GLEW_GET_FUN(__glewClearColorx) #define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) #define glColor4x GLEW_GET_FUN(__glewColor4x) #define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) #define glFogx GLEW_GET_FUN(__glewFogx) #define glFogxv GLEW_GET_FUN(__glewFogxv) #define glFrustumf GLEW_GET_FUN(__glewFrustumf) #define glFrustumx GLEW_GET_FUN(__glewFrustumx) #define glLightModelx GLEW_GET_FUN(__glewLightModelx) #define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) #define glLightx GLEW_GET_FUN(__glewLightx) #define glLightxv GLEW_GET_FUN(__glewLightxv) #define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) #define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) #define glMaterialx GLEW_GET_FUN(__glewMaterialx) #define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) #define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) #define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) #define glNormal3x GLEW_GET_FUN(__glewNormal3x) #define glOrthof GLEW_GET_FUN(__glewOrthof) #define glOrthox GLEW_GET_FUN(__glewOrthox) #define glPointSizex GLEW_GET_FUN(__glewPointSizex) #define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) #define glRotatex GLEW_GET_FUN(__glewRotatex) #define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) #define glScalex GLEW_GET_FUN(__glewScalex) #define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) #define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) #define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) #define glTranslatex GLEW_GET_FUN(__glewTranslatex) #define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) #endif /* GL_REGAL_ES1_0_compatibility */ /* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ #ifndef GL_REGAL_ES1_1_compatibility #define GL_REGAL_ES1_1_compatibility 1 typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); #define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) #define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) #define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) #define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) #define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) #define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) #define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) #define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) #define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) #define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) #define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) #define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) #define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) #define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) #endif /* GL_REGAL_ES1_1_compatibility */ /* ---------------------------- GL_REGAL_enable ---------------------------- */ #ifndef GL_REGAL_enable #define GL_REGAL_enable 1 #define GL_ERROR_REGAL 0x9322 #define GL_DEBUG_REGAL 0x9323 #define GL_LOG_REGAL 0x9324 #define GL_EMULATION_REGAL 0x9325 #define GL_DRIVER_REGAL 0x9326 #define GL_MISSING_REGAL 0x9360 #define GL_TRACE_REGAL 0x9361 #define GL_CACHE_REGAL 0x9362 #define GL_CODE_REGAL 0x9363 #define GL_STATISTICS_REGAL 0x9364 #define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) #endif /* GL_REGAL_enable */ /* ------------------------- GL_REGAL_error_string ------------------------- */ #ifndef GL_REGAL_error_string #define GL_REGAL_error_string 1 typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); #define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) #define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) #endif /* GL_REGAL_error_string */ /* ------------------------ GL_REGAL_extension_query ----------------------- */ #ifndef GL_REGAL_extension_query #define GL_REGAL_extension_query 1 typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); #define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) #define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) #define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) #endif /* GL_REGAL_extension_query */ /* ------------------------------ GL_REGAL_log ----------------------------- */ #ifndef GL_REGAL_log #define GL_REGAL_log 1 #define GL_LOG_ERROR_REGAL 0x9319 #define GL_LOG_WARNING_REGAL 0x931A #define GL_LOG_INFO_REGAL 0x931B #define GL_LOG_APP_REGAL 0x931C #define GL_LOG_DRIVER_REGAL 0x931D #define GL_LOG_INTERNAL_REGAL 0x931E #define GL_LOG_DEBUG_REGAL 0x931F #define GL_LOG_STATUS_REGAL 0x9320 #define GL_LOG_HTTP_REGAL 0x9321 typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); #define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) #define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) #endif /* GL_REGAL_log */ /* ------------------------- GL_REGAL_proc_address ------------------------- */ #ifndef GL_REGAL_proc_address #define GL_REGAL_proc_address 1 typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); #define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) #define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) #endif /* GL_REGAL_proc_address */ /* ----------------------- GL_REND_screen_coordinates ---------------------- */ #ifndef GL_REND_screen_coordinates #define GL_REND_screen_coordinates 1 #define GL_SCREEN_COORDINATES_REND 0x8490 #define GL_INVERTED_SCREEN_W_REND 0x8491 #define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) #endif /* GL_REND_screen_coordinates */ /* ------------------------------- GL_S3_s3tc ------------------------------ */ #ifndef GL_S3_s3tc #define GL_S3_s3tc 1 #define GL_RGB_S3TC 0x83A0 #define GL_RGB4_S3TC 0x83A1 #define GL_RGBA_S3TC 0x83A2 #define GL_RGBA4_S3TC 0x83A3 #define GL_RGBA_DXT5_S3TC 0x83A4 #define GL_RGBA4_DXT5_S3TC 0x83A5 #define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) #endif /* GL_S3_s3tc */ /* -------------------------- GL_SGIS_color_range -------------------------- */ #ifndef GL_SGIS_color_range #define GL_SGIS_color_range 1 #define GL_EXTENDED_RANGE_SGIS 0x85A5 #define GL_MIN_RED_SGIS 0x85A6 #define GL_MAX_RED_SGIS 0x85A7 #define GL_MIN_GREEN_SGIS 0x85A8 #define GL_MAX_GREEN_SGIS 0x85A9 #define GL_MIN_BLUE_SGIS 0x85AA #define GL_MAX_BLUE_SGIS 0x85AB #define GL_MIN_ALPHA_SGIS 0x85AC #define GL_MAX_ALPHA_SGIS 0x85AD #define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) #endif /* GL_SGIS_color_range */ /* ------------------------- GL_SGIS_detail_texture ------------------------ */ #ifndef GL_SGIS_detail_texture #define GL_SGIS_detail_texture 1 typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); #define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) #define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) #define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) #endif /* GL_SGIS_detail_texture */ /* -------------------------- GL_SGIS_fog_function ------------------------- */ #ifndef GL_SGIS_fog_function #define GL_SGIS_fog_function 1 typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); #define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) #define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) #define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) #endif /* GL_SGIS_fog_function */ /* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ #ifndef GL_SGIS_generate_mipmap #define GL_SGIS_generate_mipmap 1 #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) #endif /* GL_SGIS_generate_mipmap */ /* -------------------------- GL_SGIS_multisample -------------------------- */ #ifndef GL_SGIS_multisample #define GL_SGIS_multisample 1 #define GL_MULTISAMPLE_SGIS 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F #define GL_SAMPLE_MASK_SGIS 0x80A0 #define GL_1PASS_SGIS 0x80A1 #define GL_2PASS_0_SGIS 0x80A2 #define GL_2PASS_1_SGIS 0x80A3 #define GL_4PASS_0_SGIS 0x80A4 #define GL_4PASS_1_SGIS 0x80A5 #define GL_4PASS_2_SGIS 0x80A6 #define GL_4PASS_3_SGIS 0x80A7 #define GL_SAMPLE_BUFFERS_SGIS 0x80A8 #define GL_SAMPLES_SGIS 0x80A9 #define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA #define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB #define GL_SAMPLE_PATTERN_SGIS 0x80AC typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) #define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) #define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) #endif /* GL_SGIS_multisample */ /* ------------------------- GL_SGIS_pixel_texture ------------------------- */ #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 #define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) #endif /* GL_SGIS_pixel_texture */ /* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ #ifndef GL_SGIS_point_line_texgen #define GL_SGIS_point_line_texgen 1 #define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 #define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 #define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 #define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 #define GL_EYE_POINT_SGIS 0x81F4 #define GL_OBJECT_POINT_SGIS 0x81F5 #define GL_EYE_LINE_SGIS 0x81F6 #define GL_OBJECT_LINE_SGIS 0x81F7 #define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) #endif /* GL_SGIS_point_line_texgen */ /* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ #ifndef GL_SGIS_sharpen_texture #define GL_SGIS_sharpen_texture 1 typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); #define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) #define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) #define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) #endif /* GL_SGIS_sharpen_texture */ /* --------------------------- GL_SGIS_texture4D --------------------------- */ #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); #define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) #define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) #define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) #endif /* GL_SGIS_texture4D */ /* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ #ifndef GL_SGIS_texture_border_clamp #define GL_SGIS_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_SGIS 0x812D #define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) #endif /* GL_SGIS_texture_border_clamp */ /* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ #ifndef GL_SGIS_texture_edge_clamp #define GL_SGIS_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_SGIS 0x812F #define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) #endif /* GL_SGIS_texture_edge_clamp */ /* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ #ifndef GL_SGIS_texture_filter4 #define GL_SGIS_texture_filter4 1 typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); #define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) #define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) #define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) #endif /* GL_SGIS_texture_filter4 */ /* -------------------------- GL_SGIS_texture_lod -------------------------- */ #ifndef GL_SGIS_texture_lod #define GL_SGIS_texture_lod 1 #define GL_TEXTURE_MIN_LOD_SGIS 0x813A #define GL_TEXTURE_MAX_LOD_SGIS 0x813B #define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C #define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D #define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) #endif /* GL_SGIS_texture_lod */ /* ------------------------- GL_SGIS_texture_select ------------------------ */ #ifndef GL_SGIS_texture_select #define GL_SGIS_texture_select 1 #define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) #endif /* GL_SGIS_texture_select */ /* ----------------------------- GL_SGIX_async ----------------------------- */ #ifndef GL_SGIX_async #define GL_SGIX_async 1 #define GL_ASYNC_MARKER_SGIX 0x8329 typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); #define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) #define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) #define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) #define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) #define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) #define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) #define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) #endif /* GL_SGIX_async */ /* ------------------------ GL_SGIX_async_histogram ------------------------ */ #ifndef GL_SGIX_async_histogram #define GL_SGIX_async_histogram 1 #define GL_ASYNC_HISTOGRAM_SGIX 0x832C #define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D #define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) #endif /* GL_SGIX_async_histogram */ /* -------------------------- GL_SGIX_async_pixel -------------------------- */ #ifndef GL_SGIX_async_pixel #define GL_SGIX_async_pixel 1 #define GL_ASYNC_TEX_IMAGE_SGIX 0x835C #define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D #define GL_ASYNC_READ_PIXELS_SGIX 0x835E #define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F #define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 #define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 #define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) #endif /* GL_SGIX_async_pixel */ /* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ #ifndef GL_SGIX_blend_alpha_minmax #define GL_SGIX_blend_alpha_minmax 1 #define GL_ALPHA_MIN_SGIX 0x8320 #define GL_ALPHA_MAX_SGIX 0x8321 #define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) #endif /* GL_SGIX_blend_alpha_minmax */ /* ---------------------------- GL_SGIX_clipmap ---------------------------- */ #ifndef GL_SGIX_clipmap #define GL_SGIX_clipmap 1 #define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) #endif /* GL_SGIX_clipmap */ /* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ #ifndef GL_SGIX_convolution_accuracy #define GL_SGIX_convolution_accuracy 1 #define GL_CONVOLUTION_HINT_SGIX 0x8316 #define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) #endif /* GL_SGIX_convolution_accuracy */ /* ------------------------- GL_SGIX_depth_texture ------------------------- */ #ifndef GL_SGIX_depth_texture #define GL_SGIX_depth_texture 1 #define GL_DEPTH_COMPONENT16_SGIX 0x81A5 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7 #define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) #endif /* GL_SGIX_depth_texture */ /* -------------------------- GL_SGIX_flush_raster ------------------------- */ #ifndef GL_SGIX_flush_raster #define GL_SGIX_flush_raster 1 typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); #define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) #define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) #endif /* GL_SGIX_flush_raster */ /* --------------------------- GL_SGIX_fog_offset -------------------------- */ #ifndef GL_SGIX_fog_offset #define GL_SGIX_fog_offset 1 #define GL_FOG_OFFSET_SGIX 0x8198 #define GL_FOG_OFFSET_VALUE_SGIX 0x8199 #define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) #endif /* GL_SGIX_fog_offset */ /* -------------------------- GL_SGIX_fog_texture -------------------------- */ #ifndef GL_SGIX_fog_texture #define GL_SGIX_fog_texture 1 #define GL_FOG_PATCHY_FACTOR_SGIX 0 #define GL_FRAGMENT_FOG_SGIX 0 #define GL_TEXTURE_FOG_SGIX 0 typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); #define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) #define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) #endif /* GL_SGIX_fog_texture */ /* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ #ifndef GL_SGIX_fragment_specular_lighting #define GL_SGIX_fragment_specular_lighting 1 typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); #define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) #define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) #define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) #define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) #define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) #define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) #define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) #define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) #define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) #define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) #define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) #define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) #define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) #define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) #define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) #define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) #define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) #define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) #endif /* GL_SGIX_fragment_specular_lighting */ /* --------------------------- GL_SGIX_framezoom --------------------------- */ #ifndef GL_SGIX_framezoom #define GL_SGIX_framezoom 1 typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) #define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) #endif /* GL_SGIX_framezoom */ /* --------------------------- GL_SGIX_interlace --------------------------- */ #ifndef GL_SGIX_interlace #define GL_SGIX_interlace 1 #define GL_INTERLACE_SGIX 0x8094 #define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) #endif /* GL_SGIX_interlace */ /* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ #ifndef GL_SGIX_ir_instrument1 #define GL_SGIX_ir_instrument1 1 #define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) #endif /* GL_SGIX_ir_instrument1 */ /* ------------------------- GL_SGIX_list_priority ------------------------- */ #ifndef GL_SGIX_list_priority #define GL_SGIX_list_priority 1 #define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) #endif /* GL_SGIX_list_priority */ /* ------------------------- GL_SGIX_pixel_texture ------------------------- */ #ifndef GL_SGIX_pixel_texture #define GL_SGIX_pixel_texture 1 typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) #define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) #endif /* GL_SGIX_pixel_texture */ /* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ #ifndef GL_SGIX_pixel_texture_bits #define GL_SGIX_pixel_texture_bits 1 #define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) #endif /* GL_SGIX_pixel_texture_bits */ /* ------------------------ GL_SGIX_reference_plane ------------------------ */ #ifndef GL_SGIX_reference_plane #define GL_SGIX_reference_plane 1 typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); #define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) #define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) #endif /* GL_SGIX_reference_plane */ /* ---------------------------- GL_SGIX_resample --------------------------- */ #ifndef GL_SGIX_resample #define GL_SGIX_resample 1 #define GL_PACK_RESAMPLE_SGIX 0x842E #define GL_UNPACK_RESAMPLE_SGIX 0x842F #define GL_RESAMPLE_DECIMATE_SGIX 0x8430 #define GL_RESAMPLE_REPLICATE_SGIX 0x8433 #define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 #define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) #endif /* GL_SGIX_resample */ /* ----------------------------- GL_SGIX_shadow ---------------------------- */ #ifndef GL_SGIX_shadow #define GL_SGIX_shadow 1 #define GL_TEXTURE_COMPARE_SGIX 0x819A #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D #define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) #endif /* GL_SGIX_shadow */ /* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ #ifndef GL_SGIX_shadow_ambient #define GL_SGIX_shadow_ambient 1 #define GL_SHADOW_AMBIENT_SGIX 0x80BF #define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) #endif /* GL_SGIX_shadow_ambient */ /* ----------------------------- GL_SGIX_sprite ---------------------------- */ #ifndef GL_SGIX_sprite #define GL_SGIX_sprite 1 typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); #define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) #define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) #define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) #define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) #define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) #endif /* GL_SGIX_sprite */ /* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ #ifndef GL_SGIX_tag_sample_buffer #define GL_SGIX_tag_sample_buffer 1 typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) #define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) #endif /* GL_SGIX_tag_sample_buffer */ /* ------------------------ GL_SGIX_texture_add_env ------------------------ */ #ifndef GL_SGIX_texture_add_env #define GL_SGIX_texture_add_env 1 #define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) #endif /* GL_SGIX_texture_add_env */ /* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ #ifndef GL_SGIX_texture_coordinate_clamp #define GL_SGIX_texture_coordinate_clamp 1 #define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 #define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A #define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B #define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) #endif /* GL_SGIX_texture_coordinate_clamp */ /* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ #ifndef GL_SGIX_texture_lod_bias #define GL_SGIX_texture_lod_bias 1 #define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) #endif /* GL_SGIX_texture_lod_bias */ /* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ #ifndef GL_SGIX_texture_multi_buffer #define GL_SGIX_texture_multi_buffer 1 #define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E #define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) #endif /* GL_SGIX_texture_multi_buffer */ /* ------------------------- GL_SGIX_texture_range ------------------------- */ #ifndef GL_SGIX_texture_range #define GL_SGIX_texture_range 1 #define GL_RGB_SIGNED_SGIX 0x85E0 #define GL_RGBA_SIGNED_SGIX 0x85E1 #define GL_ALPHA_SIGNED_SGIX 0x85E2 #define GL_LUMINANCE_SIGNED_SGIX 0x85E3 #define GL_INTENSITY_SIGNED_SGIX 0x85E4 #define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 #define GL_RGB16_SIGNED_SGIX 0x85E6 #define GL_RGBA16_SIGNED_SGIX 0x85E7 #define GL_ALPHA16_SIGNED_SGIX 0x85E8 #define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 #define GL_INTENSITY16_SIGNED_SGIX 0x85EA #define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB #define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC #define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED #define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE #define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF #define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 #define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 #define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 #define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 #define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 #define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 #define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 #define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 #define GL_MIN_LUMINANCE_SGIS 0x85F8 #define GL_MAX_LUMINANCE_SGIS 0x85F9 #define GL_MIN_INTENSITY_SGIS 0x85FA #define GL_MAX_INTENSITY_SGIS 0x85FB #define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) #endif /* GL_SGIX_texture_range */ /* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ #ifndef GL_SGIX_texture_scale_bias #define GL_SGIX_texture_scale_bias 1 #define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 #define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A #define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B #define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C #define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) #endif /* GL_SGIX_texture_scale_bias */ /* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ #ifndef GL_SGIX_vertex_preclip #define GL_SGIX_vertex_preclip 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) #endif /* GL_SGIX_vertex_preclip */ /* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ #ifndef GL_SGIX_vertex_preclip_hint #define GL_SGIX_vertex_preclip_hint 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) #endif /* GL_SGIX_vertex_preclip_hint */ /* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ #ifndef GL_SGIX_ycrcb #define GL_SGIX_ycrcb 1 #define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) #endif /* GL_SGIX_ycrcb */ /* -------------------------- GL_SGI_color_matrix -------------------------- */ #ifndef GL_SGI_color_matrix #define GL_SGI_color_matrix 1 #define GL_COLOR_MATRIX_SGI 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB #define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) #endif /* GL_SGI_color_matrix */ /* --------------------------- GL_SGI_color_table -------------------------- */ #ifndef GL_SGI_color_table #define GL_SGI_color_table 1 #define GL_COLOR_TABLE_SGI 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 #define GL_PROXY_COLOR_TABLE_SGI 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 #define GL_COLOR_TABLE_SCALE_SGI 0x80D6 #define GL_COLOR_TABLE_BIAS_SGI 0x80D7 #define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 #define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); #define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) #define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) #define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) #define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) #define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) #define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) #define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) #define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) #endif /* GL_SGI_color_table */ /* ----------------------- GL_SGI_texture_color_table ---------------------- */ #ifndef GL_SGI_texture_color_table #define GL_SGI_texture_color_table 1 #define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC #define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD #define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) #endif /* GL_SGI_texture_color_table */ /* ------------------------- GL_SUNX_constant_data ------------------------- */ #ifndef GL_SUNX_constant_data #define GL_SUNX_constant_data 1 #define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 #define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); #define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) #define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) #endif /* GL_SUNX_constant_data */ /* -------------------- GL_SUN_convolution_border_modes -------------------- */ #ifndef GL_SUN_convolution_border_modes #define GL_SUN_convolution_border_modes 1 #define GL_WRAP_BORDER_SUN 0x81D4 #define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) #endif /* GL_SUN_convolution_border_modes */ /* -------------------------- GL_SUN_global_alpha -------------------------- */ #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 #define GL_GLOBAL_ALPHA_SUN 0x81D9 #define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); #define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) #define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) #define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) #define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) #define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) #define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) #define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) #define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) #define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) #endif /* GL_SUN_global_alpha */ /* --------------------------- GL_SUN_mesh_array --------------------------- */ #ifndef GL_SUN_mesh_array #define GL_SUN_mesh_array 1 #define GL_QUAD_MESH_SUN 0x8614 #define GL_TRIANGLE_MESH_SUN 0x8615 #define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) #endif /* GL_SUN_mesh_array */ /* ------------------------ GL_SUN_read_video_pixels ----------------------- */ #ifndef GL_SUN_read_video_pixels #define GL_SUN_read_video_pixels 1 typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); #define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) #define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) #endif /* GL_SUN_read_video_pixels */ /* --------------------------- GL_SUN_slice_accum -------------------------- */ #ifndef GL_SUN_slice_accum #define GL_SUN_slice_accum 1 #define GL_SLICE_ACCUM_SUN 0x85CC #define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) #endif /* GL_SUN_slice_accum */ /* -------------------------- GL_SUN_triangle_list ------------------------- */ #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 #define GL_RESTART_SUN 0x01 #define GL_REPLACE_MIDDLE_SUN 0x02 #define GL_REPLACE_OLDEST_SUN 0x03 #define GL_TRIANGLE_LIST_SUN 0x81D7 #define GL_REPLACEMENT_CODE_SUN 0x81D8 #define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 #define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 #define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 #define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 #define GL_R1UI_V3F_SUN 0x85C4 #define GL_R1UI_C4UB_V3F_SUN 0x85C5 #define GL_R1UI_C3F_V3F_SUN 0x85C6 #define GL_R1UI_N3F_V3F_SUN 0x85C7 #define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 #define GL_R1UI_T2F_V3F_SUN 0x85C9 #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); #define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) #define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) #define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) #define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) #define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) #define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) #define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) #define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) #endif /* GL_SUN_triangle_list */ /* ----------------------------- GL_SUN_vertex ----------------------------- */ #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); #define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) #define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) #define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) #define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) #define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) #define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) #define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) #define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) #define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) #define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) #define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) #define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) #define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) #define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) #define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) #define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) #define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) #define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) #define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) #define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) #define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) #define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) #define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) #define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) #define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) #define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) #define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) #define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) #define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) #define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) #endif /* GL_SUN_vertex */ /* -------------------------- GL_WIN_phong_shading ------------------------- */ #ifndef GL_WIN_phong_shading #define GL_WIN_phong_shading 1 #define GL_PHONG_WIN 0x80EA #define GL_PHONG_HINT_WIN 0x80EB #define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) #endif /* GL_WIN_phong_shading */ /* -------------------------- GL_WIN_specular_fog -------------------------- */ #ifndef GL_WIN_specular_fog #define GL_WIN_specular_fog 1 #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC #define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) #endif /* GL_WIN_specular_fog */ /* ---------------------------- GL_WIN_swap_hint --------------------------- */ #ifndef GL_WIN_swap_hint #define GL_WIN_swap_hint 1 typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); #define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) #define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) #endif /* GL_WIN_swap_hint */ /* ------------------------------------------------------------------------- */ #if defined(GLEW_MX) && defined(_WIN32) #define GLEW_FUN_EXPORT #else #define GLEW_FUN_EXPORT GLEWAPI #endif /* GLEW_MX */ #if defined(GLEW_MX) #define GLEW_VAR_EXPORT #else #define GLEW_VAR_EXPORT GLEWAPI #endif /* GLEW_MX */ #if defined(GLEW_MX) && defined(_WIN32) struct GLEWContextStruct { #endif /* GLEW_MX */ GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; #if defined(GLEW_MX) && !defined(_WIN32) struct GLEWContextStruct { #endif /* GLEW_MX */ GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; #ifdef GLEW_MX }; /* GLEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------- */ /* error codes */ #define GLEW_OK 0 #define GLEW_NO_ERROR 0 #define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ #define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ #define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ /* string codes */ #define GLEW_VERSION 1 #define GLEW_VERSION_MAJOR 2 #define GLEW_VERSION_MINOR 3 #define GLEW_VERSION_MICRO 4 /* ------------------------------------------------------------------------- */ /* GLEW version info */ /* VERSION 1.13.0 VERSION_MAJOR 1 VERSION_MINOR 13 VERSION_MICRO 0 */ /* API */ #ifdef GLEW_MX typedef struct GLEWContextStruct GLEWContext; GLEWAPI GLenum GLEWAPIENTRY glewContextInit (GLEWContext *ctx); GLEWAPI GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext *ctx, const char *name); #define glewInit() glewContextInit(glewGetContext()) #define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) #define glewIsExtensionSupported(x) glewIsSupported(x) #define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) #ifdef _WIN32 # define GLEW_GET_FUN(x) glewGetContext()->x #else # define GLEW_GET_FUN(x) x #endif #else /* GLEW_MX */ GLEWAPI GLenum GLEWAPIENTRY glewInit (void); GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); #define glewIsExtensionSupported(x) glewIsSupported(x) #define GLEW_GET_VAR(x) (*(const GLboolean*)&x) #define GLEW_GET_FUN(x) x #endif /* GLEW_MX */ GLEWAPI GLboolean glewExperimental; GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); #ifdef __cplusplus } #endif #ifdef GLEW_APIENTRY_DEFINED #undef GLEW_APIENTRY_DEFINED #undef APIENTRY #endif #ifdef GLEW_CALLBACK_DEFINED #undef GLEW_CALLBACK_DEFINED #undef CALLBACK #endif #ifdef GLEW_WINGDIAPI_DEFINED #undef GLEW_WINGDIAPI_DEFINED #undef WINGDIAPI #endif #undef GLAPI /* #undef GLEWAPI */ #endif /* __glew_h__ */ ������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/glew/glxew.h�������������������������������������������������������������0000664�0000000�0000000�00000216600�12660066715�0020000�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net> ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org> ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org> ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* * Mesa 3-D graphics library * Version: 7.0 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * 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 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are 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 Materials. ** ** THE MATERIALS ARE 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __glxew_h__ #define __glxew_h__ #define __GLXEW_H__ #ifdef __glxext_h_ #error glxext.h included before glxew.h #endif #if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) #error glx.h included before glxew.h #endif #define __glxext_h_ #define GLX_H #define __GLX_glx_h__ #define __glx_h__ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xmd.h> #include "glew.h" #ifdef __cplusplus extern "C" { #endif /* ---------------------------- GLX_VERSION_1_0 --------------------------- */ #ifndef GLX_VERSION_1_0 #define GLX_VERSION_1_0 1 #define GLX_USE_GL 1 #define GLX_BUFFER_SIZE 2 #define GLX_LEVEL 3 #define GLX_RGBA 4 #define GLX_DOUBLEBUFFER 5 #define GLX_STEREO 6 #define GLX_AUX_BUFFERS 7 #define GLX_RED_SIZE 8 #define GLX_GREEN_SIZE 9 #define GLX_BLUE_SIZE 10 #define GLX_ALPHA_SIZE 11 #define GLX_DEPTH_SIZE 12 #define GLX_STENCIL_SIZE 13 #define GLX_ACCUM_RED_SIZE 14 #define GLX_ACCUM_GREEN_SIZE 15 #define GLX_ACCUM_BLUE_SIZE 16 #define GLX_ACCUM_ALPHA_SIZE 17 #define GLX_BAD_SCREEN 1 #define GLX_BAD_ATTRIBUTE 2 #define GLX_NO_EXTENSION 3 #define GLX_BAD_VISUAL 4 #define GLX_BAD_CONTEXT 5 #define GLX_BAD_VALUE 6 #define GLX_BAD_ENUM 7 typedef XID GLXDrawable; typedef XID GLXPixmap; #ifdef __sun typedef struct __glXContextRec *GLXContext; #else typedef struct __GLXcontextRec *GLXContext; #endif typedef unsigned int GLXVideoDeviceNV; extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); extern void glXDestroyContext (Display *dpy, GLXContext ctx); extern Bool glXIsDirect (Display *dpy, GLXContext ctx); extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); extern GLXContext glXGetCurrentContext (void); extern GLXDrawable glXGetCurrentDrawable (void); extern void glXWaitGL (void); extern void glXWaitX (void); extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); extern void glXUseXFont (Font font, int first, int count, int listBase); #define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) #endif /* GLX_VERSION_1_0 */ /* ---------------------------- GLX_VERSION_1_1 --------------------------- */ #ifndef GLX_VERSION_1_1 #define GLX_VERSION_1_1 #define GLX_VENDOR 0x1 #define GLX_VERSION 0x2 #define GLX_EXTENSIONS 0x3 extern const char* glXQueryExtensionsString (Display *dpy, int screen); extern const char* glXGetClientString (Display *dpy, int name); extern const char* glXQueryServerString (Display *dpy, int screen, int name); #define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) #endif /* GLX_VERSION_1_1 */ /* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ #ifndef GLX_VERSION_1_2 #define GLX_VERSION_1_2 1 typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); #define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) #define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) #endif /* GLX_VERSION_1_2 */ /* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ #ifndef GLX_VERSION_1_3 #define GLX_VERSION_1_3 1 #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 #define GLX_RGBA_BIT 0x00000001 #define GLX_WINDOW_BIT 0x00000001 #define GLX_COLOR_INDEX_BIT 0x00000002 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 #define GLX_PIXMAP_BIT 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 #define GLX_PBUFFER_BIT 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 #define GLX_AUX_BUFFERS_BIT 0x00000010 #define GLX_CONFIG_CAVEAT 0x20 #define GLX_DEPTH_BUFFER_BIT 0x00000020 #define GLX_X_VISUAL_TYPE 0x22 #define GLX_TRANSPARENT_TYPE 0x23 #define GLX_TRANSPARENT_INDEX_VALUE 0x24 #define GLX_TRANSPARENT_RED_VALUE 0x25 #define GLX_TRANSPARENT_GREEN_VALUE 0x26 #define GLX_TRANSPARENT_BLUE_VALUE 0x27 #define GLX_TRANSPARENT_ALPHA_VALUE 0x28 #define GLX_STENCIL_BUFFER_BIT 0x00000040 #define GLX_ACCUM_BUFFER_BIT 0x00000080 #define GLX_NONE 0x8000 #define GLX_SLOW_CONFIG 0x8001 #define GLX_TRUE_COLOR 0x8002 #define GLX_DIRECT_COLOR 0x8003 #define GLX_PSEUDO_COLOR 0x8004 #define GLX_STATIC_COLOR 0x8005 #define GLX_GRAY_SCALE 0x8006 #define GLX_STATIC_GRAY 0x8007 #define GLX_TRANSPARENT_RGB 0x8008 #define GLX_TRANSPARENT_INDEX 0x8009 #define GLX_VISUAL_ID 0x800B #define GLX_SCREEN 0x800C #define GLX_NON_CONFORMANT_CONFIG 0x800D #define GLX_DRAWABLE_TYPE 0x8010 #define GLX_RENDER_TYPE 0x8011 #define GLX_X_RENDERABLE 0x8012 #define GLX_FBCONFIG_ID 0x8013 #define GLX_RGBA_TYPE 0x8014 #define GLX_COLOR_INDEX_TYPE 0x8015 #define GLX_MAX_PBUFFER_WIDTH 0x8016 #define GLX_MAX_PBUFFER_HEIGHT 0x8017 #define GLX_MAX_PBUFFER_PIXELS 0x8018 #define GLX_PRESERVED_CONTENTS 0x801B #define GLX_LARGEST_PBUFFER 0x801C #define GLX_WIDTH 0x801D #define GLX_HEIGHT 0x801E #define GLX_EVENT_MASK 0x801F #define GLX_DAMAGED 0x8020 #define GLX_SAVED 0x8021 #define GLX_WINDOW 0x8022 #define GLX_PBUFFER 0x8023 #define GLX_PBUFFER_HEIGHT 0x8040 #define GLX_PBUFFER_WIDTH 0x8041 #define GLX_PBUFFER_CLOBBER_MASK 0x08000000 #define GLX_DONT_CARE 0xFFFFFFFF typedef XID GLXFBConfigID; typedef XID GLXPbuffer; typedef XID GLXWindow; typedef struct __GLXFBConfigRec *GLXFBConfig; typedef struct { int event_type; int draw_type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; unsigned int buffer_mask; unsigned int aux_buffer; int x, y; int width, height; int count; } GLXPbufferClobberEvent; typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; long pad[24]; } GLXEvent; typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); #define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) #define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) #define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) #define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) #define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) #define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) #define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) #define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) #define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) #define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) #define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) #define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) #define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) #define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) #define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) #define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) #define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) #define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) #endif /* GLX_VERSION_1_3 */ /* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ #ifndef GLX_VERSION_1_4 #define GLX_VERSION_1_4 1 #define GLX_SAMPLE_BUFFERS 100000 #define GLX_SAMPLES 100001 extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); #define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) #endif /* GLX_VERSION_1_4 */ /* -------------------------- GLX_3DFX_multisample ------------------------- */ #ifndef GLX_3DFX_multisample #define GLX_3DFX_multisample 1 #define GLX_SAMPLE_BUFFERS_3DFX 0x8050 #define GLX_SAMPLES_3DFX 0x8051 #define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) #endif /* GLX_3DFX_multisample */ /* ------------------------ GLX_AMD_gpu_association ------------------------ */ #ifndef GLX_AMD_gpu_association #define GLX_AMD_gpu_association 1 #define GLX_GPU_VENDOR_AMD 0x1F00 #define GLX_GPU_RENDERER_STRING_AMD 0x1F01 #define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define GLX_GPU_RAM_AMD 0x21A3 #define GLX_GPU_CLOCK_AMD 0x21A4 #define GLX_GPU_NUM_PIPES_AMD 0x21A5 #define GLX_GPU_NUM_SIMD_AMD 0x21A6 #define GLX_GPU_NUM_RB_AMD 0x21A7 #define GLX_GPU_NUM_SPI_AMD 0x21A8 typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); #define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) #define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) #define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) #define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) #define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) #define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) #define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) #define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) #define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) #define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) #endif /* GLX_AMD_gpu_association */ /* --------------------- GLX_ARB_context_flush_control --------------------- */ #ifndef GLX_ARB_context_flush_control #define GLX_ARB_context_flush_control 1 #define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 #define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 #define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 #define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) #endif /* GLX_ARB_context_flush_control */ /* ------------------------- GLX_ARB_create_context ------------------------ */ #ifndef GLX_ARB_create_context #define GLX_ARB_create_context 1 #define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GLX_CONTEXT_FLAGS_ARB 0x2094 typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); #define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) #define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) #endif /* GLX_ARB_create_context */ /* --------------------- GLX_ARB_create_context_profile -------------------- */ #ifndef GLX_ARB_create_context_profile #define GLX_ARB_create_context_profile 1 #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 #define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) #endif /* GLX_ARB_create_context_profile */ /* ------------------- GLX_ARB_create_context_robustness ------------------- */ #ifndef GLX_ARB_create_context_robustness #define GLX_ARB_create_context_robustness 1 #define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 #define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) #endif /* GLX_ARB_create_context_robustness */ /* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ #ifndef GLX_ARB_fbconfig_float #define GLX_ARB_fbconfig_float 1 #define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 #define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 #define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) #endif /* GLX_ARB_fbconfig_float */ /* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ #ifndef GLX_ARB_framebuffer_sRGB #define GLX_ARB_framebuffer_sRGB 1 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 #define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) #endif /* GLX_ARB_framebuffer_sRGB */ /* ------------------------ GLX_ARB_get_proc_address ----------------------- */ #ifndef GLX_ARB_get_proc_address #define GLX_ARB_get_proc_address 1 extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); #define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) #endif /* GLX_ARB_get_proc_address */ /* -------------------------- GLX_ARB_multisample -------------------------- */ #ifndef GLX_ARB_multisample #define GLX_ARB_multisample 1 #define GLX_SAMPLE_BUFFERS_ARB 100000 #define GLX_SAMPLES_ARB 100001 #define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) #endif /* GLX_ARB_multisample */ /* ---------------- GLX_ARB_robustness_application_isolation --------------- */ #ifndef GLX_ARB_robustness_application_isolation #define GLX_ARB_robustness_application_isolation 1 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) #endif /* GLX_ARB_robustness_application_isolation */ /* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ #ifndef GLX_ARB_robustness_share_group_isolation #define GLX_ARB_robustness_share_group_isolation 1 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) #endif /* GLX_ARB_robustness_share_group_isolation */ /* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ #ifndef GLX_ARB_vertex_buffer_object #define GLX_ARB_vertex_buffer_object 1 #define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 #define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) #endif /* GLX_ARB_vertex_buffer_object */ /* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ #ifndef GLX_ATI_pixel_format_float #define GLX_ATI_pixel_format_float 1 #define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 #define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) #endif /* GLX_ATI_pixel_format_float */ /* ------------------------- GLX_ATI_render_texture ------------------------ */ #ifndef GLX_ATI_render_texture #define GLX_ATI_render_texture 1 #define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 #define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 #define GLX_TEXTURE_FORMAT_ATI 0x9802 #define GLX_TEXTURE_TARGET_ATI 0x9803 #define GLX_MIPMAP_TEXTURE_ATI 0x9804 #define GLX_TEXTURE_RGB_ATI 0x9805 #define GLX_TEXTURE_RGBA_ATI 0x9806 #define GLX_NO_TEXTURE_ATI 0x9807 #define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 #define GLX_TEXTURE_1D_ATI 0x9809 #define GLX_TEXTURE_2D_ATI 0x980A #define GLX_MIPMAP_LEVEL_ATI 0x980B #define GLX_CUBE_MAP_FACE_ATI 0x980C #define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 #define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 #define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 #define GLX_FRONT_LEFT_ATI 0x9813 #define GLX_FRONT_RIGHT_ATI 0x9814 #define GLX_BACK_LEFT_ATI 0x9815 #define GLX_BACK_RIGHT_ATI 0x9816 #define GLX_AUX0_ATI 0x9817 #define GLX_AUX1_ATI 0x9818 #define GLX_AUX2_ATI 0x9819 #define GLX_AUX3_ATI 0x981A #define GLX_AUX4_ATI 0x981B #define GLX_AUX5_ATI 0x981C #define GLX_AUX6_ATI 0x981D #define GLX_AUX7_ATI 0x981E #define GLX_AUX8_ATI 0x981F #define GLX_AUX9_ATI 0x9820 #define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 #define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); #define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) #define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) #define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) #define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) #endif /* GLX_ATI_render_texture */ /* --------------------------- GLX_EXT_buffer_age -------------------------- */ #ifndef GLX_EXT_buffer_age #define GLX_EXT_buffer_age 1 #define GLX_BACK_BUFFER_AGE_EXT 0x20F4 #define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) #endif /* GLX_EXT_buffer_age */ /* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ #ifndef GLX_EXT_create_context_es2_profile #define GLX_EXT_create_context_es2_profile 1 #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) #endif /* GLX_EXT_create_context_es2_profile */ /* ------------------- GLX_EXT_create_context_es_profile ------------------- */ #ifndef GLX_EXT_create_context_es_profile #define GLX_EXT_create_context_es_profile 1 #define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) #endif /* GLX_EXT_create_context_es_profile */ /* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ #ifndef GLX_EXT_fbconfig_packed_float #define GLX_EXT_fbconfig_packed_float 1 #define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 #define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 #define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) #endif /* GLX_EXT_fbconfig_packed_float */ /* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ #ifndef GLX_EXT_framebuffer_sRGB #define GLX_EXT_framebuffer_sRGB 1 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 #define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) #endif /* GLX_EXT_framebuffer_sRGB */ /* ------------------------- GLX_EXT_import_context ------------------------ */ #ifndef GLX_EXT_import_context #define GLX_EXT_import_context 1 #define GLX_SHARE_CONTEXT_EXT 0x800A #define GLX_VISUAL_ID_EXT 0x800B #define GLX_SCREEN_EXT 0x800C typedef XID GLXContextID; typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); #define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) #define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) #define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) #define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) #define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) #endif /* GLX_EXT_import_context */ /* -------------------------- GLX_EXT_scene_marker ------------------------- */ #ifndef GLX_EXT_scene_marker #define GLX_EXT_scene_marker 1 #define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) #endif /* GLX_EXT_scene_marker */ /* -------------------------- GLX_EXT_stereo_tree -------------------------- */ #ifndef GLX_EXT_stereo_tree #define GLX_EXT_stereo_tree 1 #define GLX_STEREO_NOTIFY_EXT 0x00000000 #define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 #define GLX_STEREO_TREE_EXT 0x20F5 #define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) #endif /* GLX_EXT_stereo_tree */ /* -------------------------- GLX_EXT_swap_control ------------------------- */ #ifndef GLX_EXT_swap_control #define GLX_EXT_swap_control 1 #define GLX_SWAP_INTERVAL_EXT 0x20F1 #define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); #define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) #define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) #endif /* GLX_EXT_swap_control */ /* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ #ifndef GLX_EXT_swap_control_tear #define GLX_EXT_swap_control_tear 1 #define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 #define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) #endif /* GLX_EXT_swap_control_tear */ /* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ #ifndef GLX_EXT_texture_from_pixmap #define GLX_EXT_texture_from_pixmap 1 #define GLX_TEXTURE_1D_BIT_EXT 0x00000001 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_Y_INVERTED_EXT 0x20D4 #define GLX_TEXTURE_FORMAT_EXT 0x20D5 #define GLX_TEXTURE_TARGET_EXT 0x20D6 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA #define GLX_TEXTURE_1D_EXT 0x20DB #define GLX_TEXTURE_2D_EXT 0x20DC #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD #define GLX_FRONT_LEFT_EXT 0x20DE #define GLX_FRONT_RIGHT_EXT 0x20DF #define GLX_BACK_LEFT_EXT 0x20E0 #define GLX_BACK_RIGHT_EXT 0x20E1 #define GLX_AUX0_EXT 0x20E2 #define GLX_AUX1_EXT 0x20E3 #define GLX_AUX2_EXT 0x20E4 #define GLX_AUX3_EXT 0x20E5 #define GLX_AUX4_EXT 0x20E6 #define GLX_AUX5_EXT 0x20E7 #define GLX_AUX6_EXT 0x20E8 #define GLX_AUX7_EXT 0x20E9 #define GLX_AUX8_EXT 0x20EA #define GLX_AUX9_EXT 0x20EB typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); #define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) #define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) #define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) #endif /* GLX_EXT_texture_from_pixmap */ /* -------------------------- GLX_EXT_visual_info -------------------------- */ #ifndef GLX_EXT_visual_info #define GLX_EXT_visual_info 1 #define GLX_X_VISUAL_TYPE_EXT 0x22 #define GLX_TRANSPARENT_TYPE_EXT 0x23 #define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 #define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 #define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 #define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 #define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 #define GLX_NONE_EXT 0x8000 #define GLX_TRUE_COLOR_EXT 0x8002 #define GLX_DIRECT_COLOR_EXT 0x8003 #define GLX_PSEUDO_COLOR_EXT 0x8004 #define GLX_STATIC_COLOR_EXT 0x8005 #define GLX_GRAY_SCALE_EXT 0x8006 #define GLX_STATIC_GRAY_EXT 0x8007 #define GLX_TRANSPARENT_RGB_EXT 0x8008 #define GLX_TRANSPARENT_INDEX_EXT 0x8009 #define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) #endif /* GLX_EXT_visual_info */ /* ------------------------- GLX_EXT_visual_rating ------------------------- */ #ifndef GLX_EXT_visual_rating #define GLX_EXT_visual_rating 1 #define GLX_VISUAL_CAVEAT_EXT 0x20 #define GLX_SLOW_VISUAL_EXT 0x8001 #define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D #define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) #endif /* GLX_EXT_visual_rating */ /* -------------------------- GLX_INTEL_swap_event ------------------------- */ #ifndef GLX_INTEL_swap_event #define GLX_INTEL_swap_event 1 #define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 #define GLX_COPY_COMPLETE_INTEL 0x8181 #define GLX_FLIP_COMPLETE_INTEL 0x8182 #define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 #define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) #endif /* GLX_INTEL_swap_event */ /* -------------------------- GLX_MESA_agp_offset -------------------------- */ #ifndef GLX_MESA_agp_offset #define GLX_MESA_agp_offset 1 typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); #define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) #define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) #endif /* GLX_MESA_agp_offset */ /* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ #ifndef GLX_MESA_copy_sub_buffer #define GLX_MESA_copy_sub_buffer 1 typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); #define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) #define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) #endif /* GLX_MESA_copy_sub_buffer */ /* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ #ifndef GLX_MESA_pixmap_colormap #define GLX_MESA_pixmap_colormap 1 typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); #define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) #define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) #endif /* GLX_MESA_pixmap_colormap */ /* ------------------------ GLX_MESA_query_renderer ------------------------ */ #ifndef GLX_MESA_query_renderer #define GLX_MESA_query_renderer 1 #define GLX_RENDERER_VENDOR_ID_MESA 0x8183 #define GLX_RENDERER_DEVICE_ID_MESA 0x8184 #define GLX_RENDERER_VERSION_MESA 0x8185 #define GLX_RENDERER_ACCELERATED_MESA 0x8186 #define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 #define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 #define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 #define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A #define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B #define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C #define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D #define GLX_RENDERER_ID_MESA 0x818E typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); #define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) #define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) #define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) #define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) #define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) #endif /* GLX_MESA_query_renderer */ /* ------------------------ GLX_MESA_release_buffers ----------------------- */ #ifndef GLX_MESA_release_buffers #define GLX_MESA_release_buffers 1 typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); #define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) #define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) #endif /* GLX_MESA_release_buffers */ /* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ #ifndef GLX_MESA_set_3dfx_mode #define GLX_MESA_set_3dfx_mode 1 #define GLX_3DFX_WINDOW_MODE_MESA 0x1 #define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); #define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) #define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) #endif /* GLX_MESA_set_3dfx_mode */ /* ------------------------- GLX_MESA_swap_control ------------------------- */ #ifndef GLX_MESA_swap_control #define GLX_MESA_swap_control 1 typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); #define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) #define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) #define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) #endif /* GLX_MESA_swap_control */ /* --------------------------- GLX_NV_copy_buffer -------------------------- */ #ifndef GLX_NV_copy_buffer #define GLX_NV_copy_buffer 1 typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); #define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) #define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) #define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) #endif /* GLX_NV_copy_buffer */ /* --------------------------- GLX_NV_copy_image --------------------------- */ #ifndef GLX_NV_copy_image #define GLX_NV_copy_image 1 typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) #define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) #endif /* GLX_NV_copy_image */ /* ------------------------ GLX_NV_delay_before_swap ----------------------- */ #ifndef GLX_NV_delay_before_swap #define GLX_NV_delay_before_swap 1 typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); #define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) #define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) #endif /* GLX_NV_delay_before_swap */ /* -------------------------- GLX_NV_float_buffer -------------------------- */ #ifndef GLX_NV_float_buffer #define GLX_NV_float_buffer 1 #define GLX_FLOAT_COMPONENTS_NV 0x20B0 #define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) #endif /* GLX_NV_float_buffer */ /* ---------------------- GLX_NV_multisample_coverage ---------------------- */ #ifndef GLX_NV_multisample_coverage #define GLX_NV_multisample_coverage 1 #define GLX_COLOR_SAMPLES_NV 0x20B3 #define GLX_COVERAGE_SAMPLES_NV 100001 #define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) #endif /* GLX_NV_multisample_coverage */ /* -------------------------- GLX_NV_present_video ------------------------- */ #ifndef GLX_NV_present_video #define GLX_NV_present_video 1 #define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); #define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) #define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) #define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) #endif /* GLX_NV_present_video */ /* --------------------------- GLX_NV_swap_group --------------------------- */ #ifndef GLX_NV_swap_group #define GLX_NV_swap_group 1 typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); #define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) #define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) #define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) #define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) #define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) #define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) #define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) #endif /* GLX_NV_swap_group */ /* ----------------------- GLX_NV_vertex_array_range ----------------------- */ #ifndef GLX_NV_vertex_array_range #define GLX_NV_vertex_array_range 1 typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); #define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) #define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) #define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) #endif /* GLX_NV_vertex_array_range */ /* -------------------------- GLX_NV_video_capture ------------------------- */ #ifndef GLX_NV_video_capture #define GLX_NV_video_capture 1 #define GLX_DEVICE_ID_NV 0x20CD #define GLX_UNIQUE_ID_NV 0x20CE #define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF typedef XID GLXVideoCaptureDeviceNV; typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); #define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) #define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) #define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) #define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) #define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) #define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) #endif /* GLX_NV_video_capture */ /* ---------------------------- GLX_NV_video_out --------------------------- */ #ifndef GLX_NV_video_out #define GLX_NV_video_out 1 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 #define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 #define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define GLX_VIDEO_OUT_FRAME_NV 0x20C8 #define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 #define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA #define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB #define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); #define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) #define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) #define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) #define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) #define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) #endif /* GLX_NV_video_out */ /* -------------------------- GLX_OML_swap_method -------------------------- */ #ifndef GLX_OML_swap_method #define GLX_OML_swap_method 1 #define GLX_SWAP_METHOD_OML 0x8060 #define GLX_SWAP_EXCHANGE_OML 0x8061 #define GLX_SWAP_COPY_OML 0x8062 #define GLX_SWAP_UNDEFINED_OML 0x8063 #define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) #endif /* GLX_OML_swap_method */ /* -------------------------- GLX_OML_sync_control ------------------------- */ #ifndef GLX_OML_sync_control #define GLX_OML_sync_control 1 typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); #define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) #define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) #define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) #define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) #define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) #define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) #endif /* GLX_OML_sync_control */ /* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ #ifndef GLX_SGIS_blended_overlay #define GLX_SGIS_blended_overlay 1 #define GLX_BLENDED_RGBA_SGIS 0x8025 #define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) #endif /* GLX_SGIS_blended_overlay */ /* -------------------------- GLX_SGIS_color_range ------------------------- */ #ifndef GLX_SGIS_color_range #define GLX_SGIS_color_range 1 #define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) #endif /* GLX_SGIS_color_range */ /* -------------------------- GLX_SGIS_multisample ------------------------- */ #ifndef GLX_SGIS_multisample #define GLX_SGIS_multisample 1 #define GLX_SAMPLE_BUFFERS_SGIS 100000 #define GLX_SAMPLES_SGIS 100001 #define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) #endif /* GLX_SGIS_multisample */ /* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ #ifndef GLX_SGIS_shared_multisample #define GLX_SGIS_shared_multisample 1 #define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 #define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 #define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) #endif /* GLX_SGIS_shared_multisample */ /* --------------------------- GLX_SGIX_fbconfig --------------------------- */ #ifndef GLX_SGIX_fbconfig #define GLX_SGIX_fbconfig 1 #define GLX_RGBA_BIT_SGIX 0x00000001 #define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 #define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_SCREEN_EXT 0x800C #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_RENDER_TYPE_SGIX 0x8011 #define GLX_X_RENDERABLE_SGIX 0x8012 #define GLX_FBCONFIG_ID_SGIX 0x8013 #define GLX_RGBA_TYPE_SGIX 0x8014 #define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 typedef XID GLXFBConfigIDSGIX; typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); #define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) #define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) #define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) #define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) #define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) #define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) #define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) #endif /* GLX_SGIX_fbconfig */ /* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ #ifndef GLX_SGIX_hyperpipe #define GLX_SGIX_hyperpipe 1 #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 #define GLX_PIPE_RECT_SGIX 0x00000001 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 #define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 #define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 #define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 #define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 #define GLX_BAD_HYPERPIPE_SGIX 92 #define GLX_HYPERPIPE_ID_SGIX 0x8030 typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int networkId; } GLXHyperpipeNetworkSGIX; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int XOrigin; int YOrigin; int maxHeight; int maxWidth; } GLXPipeRectLimits; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int channel; unsigned int participationType; int timeSlice; } GLXHyperpipeConfigSGIX; typedef struct { char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; int srcXOrigin; int srcYOrigin; int srcWidth; int srcHeight; int destXOrigin; int destYOrigin; int destWidth; int destHeight; } GLXPipeRect; typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); #define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) #define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) #define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) #define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) #define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) #define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) #define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) #define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) #define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) #endif /* GLX_SGIX_hyperpipe */ /* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ #ifndef GLX_SGIX_pbuffer #define GLX_SGIX_pbuffer 1 #define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 #define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 #define GLX_PBUFFER_BIT_SGIX 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 #define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 #define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 #define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 #define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 #define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 #define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 #define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 #define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 #define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 #define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A #define GLX_PRESERVED_CONTENTS_SGIX 0x801B #define GLX_LARGEST_PBUFFER_SGIX 0x801C #define GLX_WIDTH_SGIX 0x801D #define GLX_HEIGHT_SGIX 0x801E #define GLX_EVENT_MASK_SGIX 0x801F #define GLX_DAMAGED_SGIX 0x8020 #define GLX_SAVED_SGIX 0x8021 #define GLX_WINDOW_SGIX 0x8022 #define GLX_PBUFFER_SGIX 0x8023 #define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 typedef XID GLXPbufferSGIX; typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); #define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) #define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) #define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) #define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) #define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) #define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) #endif /* GLX_SGIX_pbuffer */ /* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ #ifndef GLX_SGIX_swap_barrier #define GLX_SGIX_swap_barrier 1 typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); #define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) #define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) #define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) #endif /* GLX_SGIX_swap_barrier */ /* -------------------------- GLX_SGIX_swap_group -------------------------- */ #ifndef GLX_SGIX_swap_group #define GLX_SGIX_swap_group 1 typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); #define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) #define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) #endif /* GLX_SGIX_swap_group */ /* ------------------------- GLX_SGIX_video_resize ------------------------- */ #ifndef GLX_SGIX_video_resize #define GLX_SGIX_video_resize 1 #define GLX_SYNC_FRAME_SGIX 0x00000000 #define GLX_SYNC_SWAP_SGIX 0x00000001 typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); #define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) #define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) #define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) #define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) #define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) #define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) #endif /* GLX_SGIX_video_resize */ /* ---------------------- GLX_SGIX_visual_select_group --------------------- */ #ifndef GLX_SGIX_visual_select_group #define GLX_SGIX_visual_select_group 1 #define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 #define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) #endif /* GLX_SGIX_visual_select_group */ /* ---------------------------- GLX_SGI_cushion ---------------------------- */ #ifndef GLX_SGI_cushion #define GLX_SGI_cushion 1 typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); #define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) #define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) #endif /* GLX_SGI_cushion */ /* ----------------------- GLX_SGI_make_current_read ----------------------- */ #ifndef GLX_SGI_make_current_read #define GLX_SGI_make_current_read 1 typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); #define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) #define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) #define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) #endif /* GLX_SGI_make_current_read */ /* -------------------------- GLX_SGI_swap_control ------------------------- */ #ifndef GLX_SGI_swap_control #define GLX_SGI_swap_control 1 typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); #define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) #define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) #endif /* GLX_SGI_swap_control */ /* --------------------------- GLX_SGI_video_sync -------------------------- */ #ifndef GLX_SGI_video_sync #define GLX_SGI_video_sync 1 typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); #define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) #define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) #define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) #endif /* GLX_SGI_video_sync */ /* --------------------- GLX_SUN_get_transparent_index --------------------- */ #ifndef GLX_SUN_get_transparent_index #define GLX_SUN_get_transparent_index 1 typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); #define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) #define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) #endif /* GLX_SUN_get_transparent_index */ /* -------------------------- GLX_SUN_video_resize ------------------------- */ #ifndef GLX_SUN_video_resize #define GLX_SUN_video_resize 1 #define GLX_VIDEO_RESIZE_SUN 0x8171 #define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); #define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) #define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) #define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) #endif /* GLX_SUN_video_resize */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT #else #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT #endif /* GLEW_MX */ GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; #if defined(GLEW_MX) struct GLXEWContextStruct { #endif /* GLEW_MX */ GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; #ifdef GLEW_MX }; /* GLXEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------ */ #ifdef GLEW_MX typedef struct GLXEWContextStruct GLXEWContext; GLEWAPI GLenum GLEWAPIENTRY glxewContextInit (GLXEWContext *ctx); GLEWAPI GLboolean GLEWAPIENTRY glxewContextIsSupported (const GLXEWContext *ctx, const char *name); #define glxewInit() glxewContextInit(glxewGetContext()) #define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) #define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) #define GLXEW_GET_FUN(x) x #else /* GLEW_MX */ GLEWAPI GLenum GLEWAPIENTRY glxewInit (); GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); #define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) #define GLXEW_GET_FUN(x) x #endif /* GLEW_MX */ GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); #ifdef __cplusplus } #endif #endif /* __glxew_h__ */ ��������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/glew/wglew.h�������������������������������������������������������������0000664�0000000�0000000�00000173627�12660066715�0020012�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2008-2015, Nigel Stewart <nigels[]users sourceforge net> ** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org> ** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org> ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are 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 Materials. ** ** THE MATERIALS ARE 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __wglew_h__ #define __wglew_h__ #define __WGLEW_H__ #ifdef __wglext_h_ #error wglext.h included before wglew.h #endif #define __wglext_h_ #if !defined(WINAPI) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN 1 # endif #include <windows.h> # undef WIN32_LEAN_AND_MEAN #endif /* * GLEW_STATIC needs to be set when using the static version. * GLEW_BUILD is set when building the DLL version. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #ifdef __cplusplus extern "C" { #endif /* -------------------------- WGL_3DFX_multisample ------------------------- */ #ifndef WGL_3DFX_multisample #define WGL_3DFX_multisample 1 #define WGL_SAMPLE_BUFFERS_3DFX 0x2060 #define WGL_SAMPLES_3DFX 0x2061 #define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) #endif /* WGL_3DFX_multisample */ /* ------------------------- WGL_3DL_stereo_control ------------------------ */ #ifndef WGL_3DL_stereo_control #define WGL_3DL_stereo_control 1 #define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 #define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 #define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 #define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); #define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) #define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) #endif /* WGL_3DL_stereo_control */ /* ------------------------ WGL_AMD_gpu_association ------------------------ */ #ifndef WGL_AMD_gpu_association #define WGL_AMD_gpu_association 1 #define WGL_GPU_VENDOR_AMD 0x1F00 #define WGL_GPU_RENDERER_STRING_AMD 0x1F01 #define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define WGL_GPU_RAM_AMD 0x21A3 #define WGL_GPU_CLOCK_AMD 0x21A4 #define WGL_GPU_NUM_PIPES_AMD 0x21A5 #define WGL_GPU_NUM_SIMD_AMD 0x21A6 #define WGL_GPU_NUM_RB_AMD 0x21A7 #define WGL_GPU_NUM_SPI_AMD 0x21A8 typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); #define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) #define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) #define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) #define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) #define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) #define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) #define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) #define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) #define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) #define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) #endif /* WGL_AMD_gpu_association */ /* ------------------------- WGL_ARB_buffer_region ------------------------- */ #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); #define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) #define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) #define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) #define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) #define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) #endif /* WGL_ARB_buffer_region */ /* --------------------- WGL_ARB_context_flush_control --------------------- */ #ifndef WGL_ARB_context_flush_control #define WGL_ARB_context_flush_control 1 #define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 #define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 #define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 #define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) #endif /* WGL_ARB_context_flush_control */ /* ------------------------- WGL_ARB_create_context ------------------------ */ #ifndef WGL_ARB_create_context #define WGL_ARB_create_context 1 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 #define WGL_CONTEXT_FLAGS_ARB 0x2094 #define ERROR_INVALID_VERSION_ARB 0x2095 #define ERROR_INVALID_PROFILE_ARB 0x2096 typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); #define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) #define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) #endif /* WGL_ARB_create_context */ /* --------------------- WGL_ARB_create_context_profile -------------------- */ #ifndef WGL_ARB_create_context_profile #define WGL_ARB_create_context_profile 1 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) #endif /* WGL_ARB_create_context_profile */ /* ------------------- WGL_ARB_create_context_robustness ------------------- */ #ifndef WGL_ARB_create_context_robustness #define WGL_ARB_create_context_robustness 1 #define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 #define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) #endif /* WGL_ARB_create_context_robustness */ /* ----------------------- WGL_ARB_extensions_string ----------------------- */ #ifndef WGL_ARB_extensions_string #define WGL_ARB_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); #define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) #define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) #endif /* WGL_ARB_extensions_string */ /* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ #ifndef WGL_ARB_framebuffer_sRGB #define WGL_ARB_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 #define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) #endif /* WGL_ARB_framebuffer_sRGB */ /* ----------------------- WGL_ARB_make_current_read ----------------------- */ #ifndef WGL_ARB_make_current_read #define WGL_ARB_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) #define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) #define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) #endif /* WGL_ARB_make_current_read */ /* -------------------------- WGL_ARB_multisample -------------------------- */ #ifndef WGL_ARB_multisample #define WGL_ARB_multisample 1 #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 #define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) #endif /* WGL_ARB_multisample */ /* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 #define WGL_PBUFFER_LARGEST_ARB 0x2033 #define WGL_PBUFFER_WIDTH_ARB 0x2034 #define WGL_PBUFFER_HEIGHT_ARB 0x2035 #define WGL_PBUFFER_LOST_ARB 0x2036 DECLARE_HANDLE(HPBUFFERARB); typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); #define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) #define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) #define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) #define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) #define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) #define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) #endif /* WGL_ARB_pbuffer */ /* -------------------------- WGL_ARB_pixel_format ------------------------- */ #ifndef WGL_ARB_pixel_format #define WGL_ARB_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); #define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) #define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) #define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) #define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) #endif /* WGL_ARB_pixel_format */ /* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ #ifndef WGL_ARB_pixel_format_float #define WGL_ARB_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 #define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) #endif /* WGL_ARB_pixel_format_float */ /* ------------------------- WGL_ARB_render_texture ------------------------ */ #ifndef WGL_ARB_render_texture #define WGL_ARB_render_texture 1 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 #define WGL_TEXTURE_FORMAT_ARB 0x2072 #define WGL_TEXTURE_TARGET_ARB 0x2073 #define WGL_MIPMAP_TEXTURE_ARB 0x2074 #define WGL_TEXTURE_RGB_ARB 0x2075 #define WGL_TEXTURE_RGBA_ARB 0x2076 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 #define WGL_TEXTURE_1D_ARB 0x2079 #define WGL_TEXTURE_2D_ARB 0x207A #define WGL_MIPMAP_LEVEL_ARB 0x207B #define WGL_CUBE_MAP_FACE_ARB 0x207C #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 #define WGL_FRONT_LEFT_ARB 0x2083 #define WGL_FRONT_RIGHT_ARB 0x2084 #define WGL_BACK_LEFT_ARB 0x2085 #define WGL_BACK_RIGHT_ARB 0x2086 #define WGL_AUX0_ARB 0x2087 #define WGL_AUX1_ARB 0x2088 #define WGL_AUX2_ARB 0x2089 #define WGL_AUX3_ARB 0x208A #define WGL_AUX4_ARB 0x208B #define WGL_AUX5_ARB 0x208C #define WGL_AUX6_ARB 0x208D #define WGL_AUX7_ARB 0x208E #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); #define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) #define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) #define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) #define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) #endif /* WGL_ARB_render_texture */ /* ---------------- WGL_ARB_robustness_application_isolation --------------- */ #ifndef WGL_ARB_robustness_application_isolation #define WGL_ARB_robustness_application_isolation 1 #define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) #endif /* WGL_ARB_robustness_application_isolation */ /* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ #ifndef WGL_ARB_robustness_share_group_isolation #define WGL_ARB_robustness_share_group_isolation 1 #define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) #endif /* WGL_ARB_robustness_share_group_isolation */ /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ #ifndef WGL_ATI_pixel_format_float #define WGL_ATI_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 #define GL_RGBA_FLOAT_MODE_ATI 0x8820 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 #define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) #endif /* WGL_ATI_pixel_format_float */ /* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ #ifndef WGL_ATI_render_texture_rectangle #define WGL_ATI_render_texture_rectangle 1 #define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 #define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) #endif /* WGL_ATI_render_texture_rectangle */ /* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ #ifndef WGL_EXT_create_context_es2_profile #define WGL_EXT_create_context_es2_profile 1 #define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) #endif /* WGL_EXT_create_context_es2_profile */ /* ------------------- WGL_EXT_create_context_es_profile ------------------- */ #ifndef WGL_EXT_create_context_es_profile #define WGL_EXT_create_context_es_profile 1 #define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) #endif /* WGL_EXT_create_context_es_profile */ /* -------------------------- WGL_EXT_depth_float -------------------------- */ #ifndef WGL_EXT_depth_float #define WGL_EXT_depth_float 1 #define WGL_DEPTH_FLOAT_EXT 0x2040 #define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) #endif /* WGL_EXT_depth_float */ /* ---------------------- WGL_EXT_display_color_table ---------------------- */ #ifndef WGL_EXT_display_color_table #define WGL_EXT_display_color_table 1 typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); #define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) #define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) #define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) #define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) #define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) #endif /* WGL_EXT_display_color_table */ /* ----------------------- WGL_EXT_extensions_string ----------------------- */ #ifndef WGL_EXT_extensions_string #define WGL_EXT_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); #define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) #define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) #endif /* WGL_EXT_extensions_string */ /* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ #ifndef WGL_EXT_framebuffer_sRGB #define WGL_EXT_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 #define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) #endif /* WGL_EXT_framebuffer_sRGB */ /* ----------------------- WGL_EXT_make_current_read ----------------------- */ #ifndef WGL_EXT_make_current_read #define WGL_EXT_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) #define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) #define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) #endif /* WGL_EXT_make_current_read */ /* -------------------------- WGL_EXT_multisample -------------------------- */ #ifndef WGL_EXT_multisample #define WGL_EXT_multisample 1 #define WGL_SAMPLE_BUFFERS_EXT 0x2041 #define WGL_SAMPLES_EXT 0x2042 #define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) #endif /* WGL_EXT_multisample */ /* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ #ifndef WGL_EXT_pbuffer #define WGL_EXT_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_EXT 0x202D #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 #define WGL_PBUFFER_LARGEST_EXT 0x2033 #define WGL_PBUFFER_WIDTH_EXT 0x2034 #define WGL_PBUFFER_HEIGHT_EXT 0x2035 DECLARE_HANDLE(HPBUFFEREXT); typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); #define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) #define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) #define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) #define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) #define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) #define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) #endif /* WGL_EXT_pbuffer */ /* -------------------------- WGL_EXT_pixel_format ------------------------- */ #ifndef WGL_EXT_pixel_format #define WGL_EXT_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 #define WGL_DRAW_TO_WINDOW_EXT 0x2001 #define WGL_DRAW_TO_BITMAP_EXT 0x2002 #define WGL_ACCELERATION_EXT 0x2003 #define WGL_NEED_PALETTE_EXT 0x2004 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 #define WGL_SWAP_METHOD_EXT 0x2007 #define WGL_NUMBER_OVERLAYS_EXT 0x2008 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009 #define WGL_TRANSPARENT_EXT 0x200A #define WGL_TRANSPARENT_VALUE_EXT 0x200B #define WGL_SHARE_DEPTH_EXT 0x200C #define WGL_SHARE_STENCIL_EXT 0x200D #define WGL_SHARE_ACCUM_EXT 0x200E #define WGL_SUPPORT_GDI_EXT 0x200F #define WGL_SUPPORT_OPENGL_EXT 0x2010 #define WGL_DOUBLE_BUFFER_EXT 0x2011 #define WGL_STEREO_EXT 0x2012 #define WGL_PIXEL_TYPE_EXT 0x2013 #define WGL_COLOR_BITS_EXT 0x2014 #define WGL_RED_BITS_EXT 0x2015 #define WGL_RED_SHIFT_EXT 0x2016 #define WGL_GREEN_BITS_EXT 0x2017 #define WGL_GREEN_SHIFT_EXT 0x2018 #define WGL_BLUE_BITS_EXT 0x2019 #define WGL_BLUE_SHIFT_EXT 0x201A #define WGL_ALPHA_BITS_EXT 0x201B #define WGL_ALPHA_SHIFT_EXT 0x201C #define WGL_ACCUM_BITS_EXT 0x201D #define WGL_ACCUM_RED_BITS_EXT 0x201E #define WGL_ACCUM_GREEN_BITS_EXT 0x201F #define WGL_ACCUM_BLUE_BITS_EXT 0x2020 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 #define WGL_DEPTH_BITS_EXT 0x2022 #define WGL_STENCIL_BITS_EXT 0x2023 #define WGL_AUX_BUFFERS_EXT 0x2024 #define WGL_NO_ACCELERATION_EXT 0x2025 #define WGL_GENERIC_ACCELERATION_EXT 0x2026 #define WGL_FULL_ACCELERATION_EXT 0x2027 #define WGL_SWAP_EXCHANGE_EXT 0x2028 #define WGL_SWAP_COPY_EXT 0x2029 #define WGL_SWAP_UNDEFINED_EXT 0x202A #define WGL_TYPE_RGBA_EXT 0x202B #define WGL_TYPE_COLORINDEX_EXT 0x202C typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); #define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) #define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) #define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) #define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) #endif /* WGL_EXT_pixel_format */ /* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ #ifndef WGL_EXT_pixel_format_packed_float #define WGL_EXT_pixel_format_packed_float 1 #define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 #define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) #endif /* WGL_EXT_pixel_format_packed_float */ /* -------------------------- WGL_EXT_swap_control ------------------------- */ #ifndef WGL_EXT_swap_control #define WGL_EXT_swap_control 1 typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); #define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) #define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) #define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) #endif /* WGL_EXT_swap_control */ /* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ #ifndef WGL_EXT_swap_control_tear #define WGL_EXT_swap_control_tear 1 #define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) #endif /* WGL_EXT_swap_control_tear */ /* --------------------- WGL_I3D_digital_video_control --------------------- */ #ifndef WGL_I3D_digital_video_control #define WGL_I3D_digital_video_control 1 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) #define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) #define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) #endif /* WGL_I3D_digital_video_control */ /* ----------------------------- WGL_I3D_gamma ----------------------------- */ #ifndef WGL_I3D_gamma #define WGL_I3D_gamma 1 #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) #define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) #define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) #define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) #define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) #endif /* WGL_I3D_gamma */ /* ---------------------------- WGL_I3D_genlock ---------------------------- */ #ifndef WGL_I3D_genlock #define WGL_I3D_genlock 1 #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 #define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 #define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 #define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); #define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) #define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) #define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) #define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) #define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) #define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) #define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) #define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) #define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) #define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) #define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) #define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) #define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) #endif /* WGL_I3D_genlock */ /* -------------------------- WGL_I3D_image_buffer ------------------------- */ #ifndef WGL_I3D_image_buffer #define WGL_I3D_image_buffer 1 #define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 #define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); #define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) #define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) #define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) #define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) #define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) #endif /* WGL_I3D_image_buffer */ /* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ #ifndef WGL_I3D_swap_frame_lock #define WGL_I3D_swap_frame_lock 1 typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); #define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) #define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) #define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) #define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) #define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) #endif /* WGL_I3D_swap_frame_lock */ /* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ #ifndef WGL_I3D_swap_frame_usage #define WGL_I3D_swap_frame_usage 1 typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); #define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) #define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) #define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) #define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) #define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) #endif /* WGL_I3D_swap_frame_usage */ /* --------------------------- WGL_NV_DX_interop --------------------------- */ #ifndef WGL_NV_DX_interop #define WGL_NV_DX_interop 1 #define WGL_ACCESS_READ_ONLY_NV 0x0000 #define WGL_ACCESS_READ_WRITE_NV 0x0001 #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); #define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) #define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) #define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) #define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) #define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) #define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) #define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) #define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) #define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) #endif /* WGL_NV_DX_interop */ /* --------------------------- WGL_NV_DX_interop2 -------------------------- */ #ifndef WGL_NV_DX_interop2 #define WGL_NV_DX_interop2 1 #define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) #endif /* WGL_NV_DX_interop2 */ /* --------------------------- WGL_NV_copy_image --------------------------- */ #ifndef WGL_NV_copy_image #define WGL_NV_copy_image 1 typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) #define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) #endif /* WGL_NV_copy_image */ /* ------------------------ WGL_NV_delay_before_swap ----------------------- */ #ifndef WGL_NV_delay_before_swap #define WGL_NV_delay_before_swap 1 typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); #define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) #define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) #endif /* WGL_NV_delay_before_swap */ /* -------------------------- WGL_NV_float_buffer -------------------------- */ #ifndef WGL_NV_float_buffer #define WGL_NV_float_buffer 1 #define WGL_FLOAT_COMPONENTS_NV 0x20B0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 #define WGL_TEXTURE_FLOAT_R_NV 0x20B5 #define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 #define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 #define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 #define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) #endif /* WGL_NV_float_buffer */ /* -------------------------- WGL_NV_gpu_affinity -------------------------- */ #ifndef WGL_NV_gpu_affinity #define WGL_NV_gpu_affinity 1 #define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 #define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 DECLARE_HANDLE(HGPUNV); typedef struct _GPU_DEVICE { DWORD cb; CHAR DeviceName[32]; CHAR DeviceString[128]; DWORD Flags; RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE; typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); #define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) #define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) #define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) #define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) #define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) #define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) #endif /* WGL_NV_gpu_affinity */ /* ---------------------- WGL_NV_multisample_coverage ---------------------- */ #ifndef WGL_NV_multisample_coverage #define WGL_NV_multisample_coverage 1 #define WGL_COVERAGE_SAMPLES_NV 0x2042 #define WGL_COLOR_SAMPLES_NV 0x20B9 #define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) #endif /* WGL_NV_multisample_coverage */ /* -------------------------- WGL_NV_present_video ------------------------- */ #ifndef WGL_NV_present_video #define WGL_NV_present_video 1 #define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); #define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) #define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) #define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) #define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) #endif /* WGL_NV_present_video */ /* ---------------------- WGL_NV_render_depth_texture ---------------------- */ #ifndef WGL_NV_render_depth_texture #define WGL_NV_render_depth_texture 1 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 #define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 #define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 #define WGL_DEPTH_COMPONENT_NV 0x20A7 #define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) #endif /* WGL_NV_render_depth_texture */ /* -------------------- WGL_NV_render_texture_rectangle -------------------- */ #ifndef WGL_NV_render_texture_rectangle #define WGL_NV_render_texture_rectangle 1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2 #define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) #endif /* WGL_NV_render_texture_rectangle */ /* --------------------------- WGL_NV_swap_group --------------------------- */ #ifndef WGL_NV_swap_group #define WGL_NV_swap_group 1 typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); #define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) #define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) #define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) #define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) #define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) #define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) #define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) #endif /* WGL_NV_swap_group */ /* ----------------------- WGL_NV_vertex_array_range ----------------------- */ #ifndef WGL_NV_vertex_array_range #define WGL_NV_vertex_array_range 1 typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); #define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) #define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) #define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) #endif /* WGL_NV_vertex_array_range */ /* -------------------------- WGL_NV_video_capture ------------------------- */ #ifndef WGL_NV_video_capture #define WGL_NV_video_capture 1 #define WGL_UNIQUE_ID_NV 0x20CE #define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF DECLARE_HANDLE(HVIDEOINPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); #define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) #define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) #define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) #define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) #define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) #define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) #endif /* WGL_NV_video_capture */ /* -------------------------- WGL_NV_video_output -------------------------- */ #ifndef WGL_NV_video_output #define WGL_NV_video_output 1 #define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 #define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 #define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 #define WGL_VIDEO_OUT_COLOR_NV 0x20C3 #define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 #define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 #define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define WGL_VIDEO_OUT_FRAME 0x20C8 #define WGL_VIDEO_OUT_FIELD_1 0x20C9 #define WGL_VIDEO_OUT_FIELD_2 0x20CA #define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB #define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC DECLARE_HANDLE(HPVIDEODEV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); #define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) #define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) #define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) #define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) #define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) #define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) #define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) #endif /* WGL_NV_video_output */ /* -------------------------- WGL_OML_sync_control ------------------------- */ #ifndef WGL_OML_sync_control #define WGL_OML_sync_control 1 typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); #define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) #define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) #define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) #define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) #define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) #define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) #define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX #define WGLEW_FUN_EXPORT #define WGLEW_VAR_EXPORT #else #define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT #define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT #endif /* GLEW_MX */ #ifdef GLEW_MX struct WGLEWContextStruct { #endif /* GLEW_MX */ WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; #ifdef GLEW_MX }; /* WGLEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX typedef struct WGLEWContextStruct WGLEWContext; GLEWAPI GLenum GLEWAPIENTRY wglewContextInit (WGLEWContext *ctx); GLEWAPI GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext *ctx, const char *name); #define wglewInit() wglewContextInit(wglewGetContext()) #define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) #define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) #define WGLEW_GET_FUN(x) wglewGetContext()->x #else /* GLEW_MX */ GLEWAPI GLenum GLEWAPIENTRY wglewInit (); GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); #define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) #define WGLEW_GET_FUN(x) x #endif /* GLEW_MX */ GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); #ifdef __cplusplus } #endif #undef GLEWAPI #endif /* __wglew_h__ */ ���������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/���������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0016325�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Common.hpp�����������������������������������������������������������0000775�0000000�0000000�00000011765�12660066715�0020303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * $Log$ */ #ifndef COMMON_HPP #define COMMON_HPP #include <vector> #include <typeinfo> #include <cstdarg> #include <cassert> #ifdef _MSC_sVER #define strcasecmp(s, t) _strcmpi(s, t) #endif #ifdef _MSC_VER #pragma warning( disable : 4244 4305 4996; once : 4018 ) #define WIN32_LEAN_AND_MEAN #define NOMINMAX #include <windows.h> typedef unsigned int uint; #endif #ifdef DEBUG //extern FILE *debugFile; #endif #ifdef MACOS #include <cstdio> extern FILE *fmemopen(void *buf, size_t len, const char *pMode); #endif /** MACOS */ #include "dlldefs.h" #define DEFAULT_FONT_PATH "/home/carm/fonts/courier1.glf" #define MAX_TOKEN_SIZE 512 #define MAX_PATH_SIZE 4096 #define STRING_BUFFER_SIZE 1024*150 #define STRING_LINE_SIZE 1024 #ifdef LINUX #include <cstdlib> #define projectM_isnan isnan #endif #ifdef WIN32 #define projectM_isnan(x) ((x) != (x)) #endif #ifdef MACOS #define projectM_isnan(x) ((x) != (x)) #endif #ifdef LINUX #define projectM_fmax fmax #endif #ifdef WIN32 #define projectM_fmax(x,y) ((x) >= (y) ? (x): (y)) #endif #ifdef MACOS #define projectM_fmax(x,y) ((x) >= (y) ? (x): (y)) #endif #ifdef LINUX #define projectM_fmin fmin #endif #ifdef WIN32 #define projectM_fmin(x,y) ((x) <= (y) ? (x): (y)) #endif #ifdef MACOS #define projectM_fmin(x,y) ((x) <= (y) ? (x): (y)) #endif #ifndef TRUE #define TRUE true #endif #ifndef FALSE #define FALSE false #endif #define MAX_DOUBLE_SIZE 10000000.0 #define MIN_DOUBLE_SIZE -10000000.0 #define MAX_INT_SIZE 10000000 #define MIN_INT_SIZE -10000000 /* default float initial value */ #define DEFAULT_DOUBLE_IV 0.0 /* default float lower bound */ #define DEFAULT_DOUBLE_LB MIN_DOUBLE_SIZE /* default float upper bound */ #define DEFAULT_DOUBLE_UB MAX_DOUBLE_SIZE #ifdef WIN32 #include <float.h> #define isnan _isnan #endif /** WIN32 */ /** Per-platform path separators */ #define WIN32_PATH_SEPARATOR '\\' #define UNIX_PATH_SEPARATOR '/' #ifdef WIN32 #define PATH_SEPARATOR WIN32_PATH_SEPARATOR #else #define PATH_SEPARATOR UNIX_PATH_SEPARATOR #endif /** WIN32 */ #include <string> const unsigned int NUM_Q_VARIABLES(32); const std::string PROJECTM_FILE_EXTENSION("prjm"); const std::string MILKDROP_FILE_EXTENSION("milk"); const std::string PROJECTM_MODULE_EXTENSION("so"); template <class TraverseFunctor, class Container> void traverse(Container & container) { TraverseFunctor functor; for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos) { assert(pos->second); functor(pos->second); } } template <class TraverseFunctor, class Container> void traverseVector(Container & container) { TraverseFunctor functor; for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos) { assert(*pos); functor(*pos); } } template <class TraverseFunctor, class Container> void traverse(Container & container, TraverseFunctor & functor) { for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos) { assert(pos->second); functor(pos->second); } } namespace TraverseFunctors { template <class Data> class Delete { public: void operator() (Data * data) { assert(data); delete(data); } }; } inline std::string parseExtension(const std::string & filename) { const std::size_t start = filename.find_last_of('.'); if (start == std::string::npos || start >= (filename.length()-1)) return ""; else return filename.substr(start+1, filename.length()); } inline std::string parseFilename(const std::string & filename) { const std::size_t start = filename.find_last_of('/'); if (start == std::string::npos || start >= (filename.length()-1)) return ""; else return filename.substr(start+1, filename.length()); } inline double meanSquaredError(const double & x, const double & y) { return (x-y)*(x-y); } enum PresetRatingType { FIRST_RATING_TYPE = 0, HARD_CUT_RATING_TYPE = FIRST_RATING_TYPE, SOFT_CUT_RATING_TYPE, LAST_RATING_TYPE = SOFT_CUT_RATING_TYPE, TOTAL_RATING_TYPES = SOFT_CUT_RATING_TYPE+1 }; typedef std::vector<int> RatingList; #endif �����������silverjuke-16.2.3/src/prjm/src/ConfigFile.cpp�������������������������������������������������������0000664�0000000�0000000�00000006525�12660066715�0021046�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// ConfigFile.cpp #include "ConfigFile.h" using std::string; ConfigFile::ConfigFile( string filename, string delimiter, string comment, string sentry ) : myDelimiter(delimiter), myComment(comment), mySentry(sentry) { // Construct a ConfigFile, getting keys and values from given file std::ifstream in( filename.c_str() ); if( !in ) throw file_not_found( filename ); in >> (*this); } ConfigFile::ConfigFile() : myDelimiter( string(1,'=') ), myComment( string(1,'#') ) { // Construct a ConfigFile without a file; empty } void ConfigFile::remove( const string& key ) { // Remove key and its value myContents.erase( myContents.find( key ) ); return; } bool ConfigFile::keyExists( const string& key ) const { // Indicate whether key is found mapci p = myContents.find( key ); return ( p != myContents.end() ); } /* static */ void ConfigFile::trim( string& s ) { // Remove leading and trailing whitespace static const char whitespace[] = " \n\t\v\r\f"; s.erase( 0, s.find_first_not_of(whitespace) ); s.erase( s.find_last_not_of(whitespace) + 1U ); } std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ) { // Save a ConfigFile to os for( ConfigFile::mapci p = cf.myContents.begin(); p != cf.myContents.end(); ++p ) { os << p->first << " " << cf.myDelimiter << " "; os << p->second << std::endl; } return os; } std::istream& operator>>( std::istream& is, ConfigFile& cf ) { // Load a ConfigFile from is // Read in keys and values, keeping internal whitespace typedef string::size_type pos; const string& delim = cf.myDelimiter; // separator const string& comm = cf.myComment; // comment const string& sentry = cf.mySentry; // end of file sentry const pos skip = delim.length(); // length of separator string nextline = ""; // might need to read ahead to see where value ends while( is || nextline.length() > 0 ) { // Read an entire line at a time string line; if( nextline.length() > 0 ) { line = nextline; // we read ahead; use it now nextline = ""; } else { std::getline( is, line ); } // Ignore comments line = line.substr( 0, line.find(comm) ); // Check for end of file sentry if( sentry != "" && line.find(sentry) != string::npos ) return is; // Parse the line if it contains a delimiter pos delimPos = line.find( delim ); if( delimPos < string::npos ) { // Extract the key string key = line.substr( 0, delimPos ); line.replace( 0, delimPos+skip, "" ); // See if value continues on the next line // Stop at blank line, next line with a key, end of stream, // or end of file sentry bool terminate = false; while( !terminate && is ) { std::getline( is, nextline ); terminate = true; string nlcopy = nextline; ConfigFile::trim(nlcopy); if( nlcopy == "" ) continue; nextline = nextline.substr( 0, nextline.find(comm) ); if( nextline.find(delim) != string::npos ) continue; if( sentry != "" && nextline.find(sentry) != string::npos ) continue; nlcopy = nextline; ConfigFile::trim(nlcopy); if( nlcopy != "" ) line += "\n"; line += nextline; terminate = false; } // Store key and value ConfigFile::trim(key); ConfigFile::trim(line); cf.myContents[key] = line; // overwrites if key is repeated } } return is; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/ConfigFile.h���������������������������������������������������������0000664�0000000�0000000�00000016603�12660066715�0020511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// ConfigFile.h // Class for reading named values from configuration files // Richard J. Wagner v2.1 24 May 2004 wagnerr@umich.edu // Copyright (c) 2004 Richard J. Wagner // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // Typical usage // ------------- // // Given a configuration file "settings.inp": // atoms = 25 // length = 8.0 # nanometers // name = Reece Surcher // // Named values are read in various ways, with or without default values: // ConfigFile config( "settings.inp" ); // int atoms = config.read<int>( "atoms" ); // double length = config.read( "length", 10.0 ); // string author, title; // config.readInto( author, "name" ); // config.readInto( title, "title", string("Untitled") ); // // See file example.cpp for more examples. #ifndef CONFIGFILE_H #define CONFIGFILE_H #include <string> #include <map> #include <iostream> #include <fstream> #include <sstream> using std::string; class ConfigFile { // Data protected: string myDelimiter; // separator between key and value string myComment; // separator between value and comments string mySentry; // optional string to signal end of file std::map<string,string> myContents; // extracted keys and values typedef std::map<string,string>::iterator mapi; typedef std::map<string,string>::const_iterator mapci; // Methods public: ConfigFile( string filename, string delimiter = "=", string comment = "#", string sentry = "EndConfigFile" ); ConfigFile(); // Search for key and read value or optional default value template<class T> T read( const string& key ) const; // call as read<T> template<class T> T read( const string& key, const T& value ) const; template<class T> bool readInto( T& var, const string& key ) const; template<class T> bool readInto( T& var, const string& key, const T& value ) const; // Modify keys and values template<class T> void add( string key, const T& value ); void remove( const string& key ); // Check whether key exists in configuration bool keyExists( const string& key ) const; // Check or change configuration syntax string getDelimiter() const { return myDelimiter; } string getComment() const { return myComment; } string getSentry() const { return mySentry; } string setDelimiter( const string& s ) { string old = myDelimiter; myDelimiter = s; return old; } string setComment( const string& s ) { string old = myComment; myComment = s; return old; } // Write or read configuration friend std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ); friend std::istream& operator>>( std::istream& is, ConfigFile& cf ); protected: template<class T> static string T_as_string( const T& t ); template<class T> static T string_as_T( const string& s ); static void trim( string& s ); // Exception types public: struct file_not_found { string filename; file_not_found( const string& filename_ = string() ) : filename(filename_) {} }; struct key_not_found { // thrown only by T read(key) variant of read() string key; key_not_found( const string& key_ = string() ) : key(key_) {} }; }; /* static */ template<class T> string ConfigFile::T_as_string( const T& t ) { // Convert from a T to a string // Type T must support << operator std::ostringstream ost; ost << t; return ost.str(); } /* static */ template<class T> T ConfigFile::string_as_T( const string& s ) { // Convert from a string to a T // Type T must support >> operator T t; std::istringstream ist(s); ist >> t; return t; } /* static */ template<> inline string ConfigFile::string_as_T<string>( const string& s ) { // Convert from a string to a string // In other words, do nothing return s; } /* static */ template<> inline bool ConfigFile::string_as_T<bool>( const string& s ) { // Convert from a string to a bool // Interpret "false", "F", "no", "n", "0" as false // Interpret "true", "T", "yes", "y", "1", "-1", or anything else as true bool b = true; string sup = s; for( string::iterator p = sup.begin(); p != sup.end(); ++p ) *p = toupper(*p); // make string all caps if( sup==string("FALSE") || sup==string("F") || sup==string("NO") || sup==string("N") || sup==string("0") || sup==string("NONE") ) b = false; return b; } template<class T> T ConfigFile::read( const string& key ) const { // Read the value corresponding to key mapci p = myContents.find(key); if( p == myContents.end() ) throw key_not_found(key); return string_as_T<T>( p->second ); } template<class T> T ConfigFile::read( const string& key, const T& value ) const { // Return the value corresponding to key or given default value // if key is not found mapci p = myContents.find(key); if( p == myContents.end() ) return value; return string_as_T<T>( p->second ); } template<class T> bool ConfigFile::readInto( T& var, const string& key ) const { // Get the value corresponding to key and store in var // Return true if key is found // Otherwise leave var untouched mapci p = myContents.find(key); bool found = ( p != myContents.end() ); if( found ) var = string_as_T<T>( p->second ); return found; } template<class T> bool ConfigFile::readInto( T& var, const string& key, const T& value ) const { // Get the value corresponding to key and store in var // Return true if key is found // Otherwise set var to given default mapci p = myContents.find(key); bool found = ( p != myContents.end() ); if( found ) var = string_as_T<T>( p->second ); else var = value; return found; } template<class T> void ConfigFile::add( string key, const T& value ) { // Add a key with given value string v = T_as_string( value ); trim(key); trim(v); myContents[key] = v; return; } #endif // CONFIGFILE_H // Release notes: // v1.0 21 May 1999 // + First release // + Template read() access only through non-member readConfigFile() // + ConfigurationFileBool is only built-in helper class // // v2.0 3 May 2002 // + Shortened name from ConfigurationFile to ConfigFile // + Implemented template member functions // + Changed default comment separator from % to # // + Enabled reading of multiple-line values // // v2.1 24 May 2004 // + Made template specializations inline to avoid compiler-dependent linkage // + Allowed comments within multiple-line values // + Enabled blank line termination for multiple-line values // + Added optional sentry to detect end of configuration file // + Rewrote messy trimWhitespace() function as elegant trim() �����������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/HungarianMethod.hpp��������������������������������������������������0000664�0000000�0000000�00000017647�12660066715�0022132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef HUNGARIAN_METHOD_HPP #define HUNGARIAN_METHOD_HPP //#include "Common.hpp" #include <cstdlib> #include <cstdio> #include <cstring> #include <limits> /// A function object which calculates the maximum-weighted bipartite matching between /// two sets via the hungarian method. template <int N=20> class HungarianMethod { public : static const int MAX_SIZE = N; private: int n, max_match; //n workers and n jobs double lx[N], ly[N]; //labels of X and Y parts int xy[N]; //xy[x] - vertex that is matched with x, int yx[N]; //yx[y] - vertex that is matched with y bool S[N], T[N]; //sets S and T in algorithm double slack[N]; //as in the algorithm description double slackx[N]; //slackx[y] such a vertex, that // l(slackx[y]) + l(y) - w(slackx[y],y) = slack[y] int prev[N]; //array for memorizing alternating paths void init_labels(const double cost[N][N]) { memset(lx, 0, sizeof(lx)); memset(ly, 0, sizeof(ly)); for (int x = 0; x < n; x++) for (int y = 0; y < n; y++) lx[x] = std::max(lx[x], cost[x][y]); } void augment(const double cost[N][N]) //main function of the algorithm { if (max_match == n) return; //check wether matching is already perfect int x, y, root = 0; //just counters and root vertex int q[N], wr = 0, rd = 0; //q - queue for bfs, wr,rd - write and read //pos in queue memset(S, false, sizeof(S)); //init set S memset(T, false, sizeof(T)); //init set T memset(prev, -1, sizeof(prev)); //init set prev - for the alternating tree for (x = 0; x < n; x++) //finding root of the tree if (xy[x] == -1) { q[wr++] = root = x; prev[x] = -2; S[x] = true; break; } for (y = 0; y < n; y++) //initializing slack array { slack[y] = lx[root] + ly[y] - cost[root][y]; slackx[y] = root; } while (true) //main cycle { while (rd < wr) //building tree with bfs cycle { x = q[rd++]; //current vertex from X part for (y = 0; y < n; y++) //iterate through all edges in equality graph if (cost[x][y] == lx[x] + ly[y] && !T[y]) { if (yx[y] == -1) break; //an exposed vertex in Y found, so //augmenting path exists! T[y] = true; //else just add y to T, q[wr++] = yx[y]; //add vertex yx[y], which is matched //with y, to the queue add_to_tree(yx[y], x, cost); //add edges (x,y) and (y,yx[y]) to the tree } if (y < n) break; //augmenting path found! } if (y < n) break; //augmenting path found! update_labels(); //augmenting path not found, so improve labeling wr = rd = 0; for (y = 0; y < n; y++) //in this cycle we add edges that were added to the equality graph as a //result of improving the labeling, we add edge (slackx[y], y) to the tree if //and only if !T[y] && slack[y] == 0, also with this edge we add another one //(y, yx[y]) or augment the matching, if y was exposed if (!T[y] && slack[y] == 0) { if (yx[y] == -1) //exposed vertex in Y found - augmenting path exists! { x = slackx[y]; break; } else { T[y] = true; //else just add y to T, if (!S[yx[y]]) { q[wr++] = yx[y]; //add vertex yx[y], which is matched with //y, to the queue add_to_tree(yx[y], slackx[y],cost); //and add edges (x,y) and (y, //yx[y]) to the tree } } } if (y < n) break; //augmenting path found! } if (y < n) //we found augmenting path! { max_match++; //increment matching //in this cycle we inverse edges along augmenting path for (int cx = x, cy = y, ty; cx != -2; cx = prev[cx], cy = ty) { ty = xy[cx]; yx[cy] = cx; xy[cx] = cy; } augment(cost); //recall function, go to step 1 of the algorithm } }//end of augment() function void update_labels() { int x, y; double delta = std::numeric_limits<double>::max(); for (y = 0; y < n; y++) //calculate delta using slack if (!T[y]) delta = std::min(delta, slack[y]); for (x = 0; x < n; x++) //update X labels if (S[x]) lx[x] -= delta; for (y = 0; y < n; y++) //update Y labels if (T[y]) ly[y] += delta; for (y = 0; y < n; y++) //update slack array if (!T[y]) slack[y] -= delta; } void add_to_tree(int x, int prevx, const double cost[N][N]) //x - current vertex,prevx - vertex from X before x in the alternating path, //so we add edges (prevx, xy[x]), (xy[x], x) { S[x] = true; //add x to S prev[x] = prevx; //we need this when augmenting for (int y = 0; y < n; y++) //update slacks, because we add new vertex to S if (lx[x] + ly[y] - cost[x][y] < slack[y]) { slack[y] = lx[x] + ly[y] - cost[x][y]; slackx[y] = x; } } public: /// Computes the best matching of two sets given its cost matrix. /// See the matching() method to get the computed match result. /// \param cost a matrix of two sets I,J where cost[i][j] is the weight of edge i->j /// \param logicalSize the number of elements in both I and J /// \returns the total cost of the best matching inline double operator()(const double cost[N][N], int logicalSize) { n = logicalSize; assert(n <= N); double ret = 0; //weight of the optimal matching max_match = 0; //number of vertices in current matching memset(xy, -1, sizeof(xy)); memset(yx, -1, sizeof(yx)); init_labels(cost); //step 0 augment(cost); //steps 1-3 for (int x = 0; x < n; x++) //forming answer there ret += cost[x][xy[x]]; return ret; } /// Gets the matching element in 2nd set of the ith element in the first set /// \param i the index of the ith element in the first set (passed in operator()) /// \returns an index j, denoting the matched jth element of the 2nd set inline int matching(int i) const { return xy[i]; } /// Gets the matching element in 1st set of the jth element in the 2nd set /// \param j the index of the jth element in the 2nd set (passed in operator()) /// \returns an index i, denoting the matched ith element of the 1st set /// \note inverseMatching(matching(i)) == i inline int inverseMatching(int j) const { return yx[j]; } }; #endif �����������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/IdleTextures.hpp�����������������������������������������������������0000664�0000000�0000000�00001566110�12660066715�0021471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /* begin binary data: */ const int M_bytes = 27965; /* begin binary data: */ const unsigned char M_data[] = /* 27965 */ {0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00 ,0x01,0x20,0x08,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7D,0xFF,0x00 ,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xAD,0x00 ,0x00,0x00,0xFF,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC7,0xFF,0x00 ,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00 ,0x00,0xEC,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0xAC,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x13,0xFF,0x00,0x00,0x00 ,0x00,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xAD,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xC2,0xAD,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x5A,0xFF,0x00,0x00,0x00,0x00,0x9F,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x7D,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xC2,0x00,0x00,0x00,0x00,0x6C,0x83,0x00,0x00,0x00,0xFF,0x00,0x0D,0x0D,0x0D ,0xFF,0xA3,0x37,0x37,0x37,0xFF,0x00,0x2B,0x2B,0x2B,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xA4,0xFF,0x00,0x00,0x00,0x00,0x9F,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xC5,0x83,0x00,0x00,0x00,0xFF,0x00,0x34,0x34,0x34 ,0xFF,0xA3,0x37,0x37,0x37,0xFF,0x00,0x0D,0x0D,0x0D,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x6B,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFD ,0x82,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0xF9,0xF9,0xF9,0xFF,0xA2 ,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0x02,0xFF,0x00,0x00 ,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00 ,0xFC,0x82,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0xA3,0xFF,0xFF,0xFF ,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xBF,0x83,0x00,0x00,0x00,0xFF,0x00,0xB3,0xB3,0xB3,0xFF,0xA3,0xFF ,0xFF,0xFF,0xFF,0x00,0x3E,0x3E,0x3E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x37,0xFF,0x00,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x54,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0xA3,0xFF ,0xFF,0xFF,0xFF,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xBD,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x69,0x83,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0xA3,0xFF,0xFF,0xFF ,0xFF,0x00,0x87,0x87,0x87,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x80,0xFF,0x00,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x9C,0x83,0x00,0x00,0x00,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0xA3,0xFF,0xFF,0xFF ,0xFF,0x00,0x5B,0x5B,0x5B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0x66,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x00 ,0x00,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x0E,0x0E,0x0E,0xFF,0xF8,0xF8 ,0xF8,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0xFF,0x00,0x00,0x00,0x00,0x9D,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xE4,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03 ,0x03,0xFF,0xEF,0xEF,0xEF,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7 ,0xFF,0x0D,0x0D,0x0D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xFB ,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xBC,0x83,0x00,0x00,0x00,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0xA3,0xFF ,0xFF,0xFF,0xFF,0x00,0x1B,0x1B,0x1B,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xFE,0x00,0x00,0x00,0x15,0xFF,0x00,0x00,0x00,0x00,0x9B,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x83,0x00,0x00,0x00,0xFF,0x00,0x3A,0x3A ,0x3A,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0xAD,0xAD,0xAD,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x81,0x00,0x00,0x00,0x00,0x81,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x5A,0x5A ,0x5A,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x64,0x64,0x64,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x5D,0xFF,0x00,0x00,0x00,0x00,0x9B,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x83,0x00,0x00,0x00,0xFF,0x00,0x81,0x81 ,0x81,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x81,0x00,0x00,0x00,0x00,0x81,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF ,0x00,0xAD,0xAD,0xAD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6 ,0xFF,0x00,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBB ,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9,0xC9,0xC9,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF ,0x01,0xF4,0xF4,0xF4,0xFF,0x0A,0x0A,0x0A,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x10,0x81,0x00,0x00,0x00,0x00,0x82,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x83,0x00,0x00,0x00,0xFF,0x00,0xAE ,0xAE,0xAE,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x05,0x05 ,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00 ,0x02,0xFF,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x0A,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF ,0xFD,0xFD,0xFD,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3,0x82,0x00,0x00,0x00,0x00,0x82 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x58,0x58,0x58,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x40,0x40,0x40,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0xFF,0x00,0x00,0x00,0x00,0x99 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4B,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x59,0x59,0x59,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x51,0x51,0x51,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5C,0x82,0x00,0x00,0x00,0x00,0x82 ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFA,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF6,0xF6,0xF6,0xFF,0xA2,0xFF,0xFF ,0xFF,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x83,0xFF,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x93,0x83,0x00,0x00,0x00,0xFF,0x00,0xA0,0xA0,0xA0,0xFF,0xA2,0xFF,0xFF ,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x0D,0x82,0x00,0x00,0x00,0x00 ,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB7,0x83,0x00,0x00,0x00,0xFF ,0x00,0xAB,0xAB,0xAB,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xD3,0xD3,0xD3,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCC,0xFF,0x00,0x00,0x00,0x00 ,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x82,0x00,0x00,0x00,0xFF ,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 ,0xA3,0xA3,0xA3,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAE,0x83 ,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x55,0x55,0x55,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00 ,0x1D,0x1D,0x1D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x17,0xFF,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x22,0x83,0x00,0x00,0x00,0xFF,0x00,0x30,0x30,0x30,0xFF,0xA3,0xFF ,0xFF,0xFF,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x57,0x83,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0x10,0x00,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A ,0x0A,0xFF,0xF4,0xF4,0xF4,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x66,0x66,0x66 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0xFF,0x00,0x00,0x00 ,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6A,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x77,0x77,0x77,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xEF,0xEF,0xEF ,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF5 ,0x00,0x00,0x00,0x0B,0x83,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xB4,0x83,0x00,0x00,0x00,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0xA2 ,0xFF,0xFF,0xFF,0xFF,0x00,0xB0,0xB0,0xB0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xA9,0xFF,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xB2,0x83,0x00,0x00,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0xA2 ,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xA9,0x84,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x5E,0x83,0x00,0x00,0x00,0xFF,0x00,0x52,0x52,0x52,0xFF,0xA2 ,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x03,0xFF,0x00,0x00 ,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00 ,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0C,0x0C,0xFF,0xFA,0xFA,0xFA,0xFF ,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x47,0x47,0x47,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x52,0x84,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x09,0x09,0x09,0xFF,0xF3,0xF3,0xF3,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x43 ,0x43,0x43,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3C,0xFF,0x00 ,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xEB ,0xEB,0xEB,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xF2,0x00,0x00,0x00,0x08,0x84,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xB1,0x83,0x00,0x00,0x00,0xFF,0x00,0xA6,0xA6,0xA6 ,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x85,0xFF,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x89,0x83,0x00,0x00,0x00,0xFF,0x00,0x96,0x96,0x96 ,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xA4,0x85,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x5B,0x83,0x00,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F ,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xCF,0xFF,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xD1,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE ,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0x42,0x42,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x4D,0x85,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xF7,0x82,0x00,0x00,0x00,0xFF ,0x01,0x07,0x07,0x07,0xFF,0xF1,0xF1,0xF1,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 ,0x20,0x20,0x20,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x19,0xFF,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x1A,0x83,0x00,0x00,0x00,0xFF,0x00,0x25,0x25,0x25,0xFF,0xA2,0xFF ,0xFF,0xFF,0xFF,0x01,0xE8,0xE8,0xE8,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00 ,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xA3,0xA3,0xA3,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0xFF,0x00,0x00,0x00 ,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x94,0x94,0x94 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9F,0x86,0x00,0x00,0x00 ,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x4D,0x4D,0x4D,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xB3,0xB3,0xB3 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAB,0xFF,0x00,0x00,0x00 ,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0x3D,0x3D ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x48,0x86,0x00,0x00,0x00 ,0x00,0x86,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xF6 ,0x82,0x00,0x00,0x00,0xFF,0x01,0x06,0x06,0x06,0xFF,0xF0,0xF0,0xF0,0xFF,0xA1 ,0xFF,0xFF,0xFF,0xFF,0x01,0xF4,0xF4,0xF4,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x04,0xFF,0x00,0x00 ,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00 ,0xED,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF ,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xE4,0xE4,0xE4,0xFF,0x01,0x01,0x01,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x04,0x86,0x00 ,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x83,0x00 ,0x00,0x00,0xFF,0x00,0xA0,0xA0,0xA0,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x46 ,0x46,0x46,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0xFF,0x00 ,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x44,0x44,0x44,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x8F ,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9A,0x87,0x00 ,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x8F ,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0xFF,0x00 ,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x38 ,0x38,0x38,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x43,0x87,0x00 ,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00 ,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF,0xEE,0xEE,0xEE ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xD1,0xFF,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xC8,0x83,0x00,0x00,0x00,0xFF,0x00,0xD4,0xD4,0xD4 ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xE0,0xE0,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x03,0x87,0x00,0x00,0x00,0x00 ,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA9,0x83,0x00,0x00,0x00,0xFF ,0x00,0x9D,0x9D,0x9D,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x22,0x22,0x22,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1B,0xFF,0x00,0x00,0x00,0x00 ,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFD,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 ,0x8A,0x8A,0x8A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0x88 ,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x47,0x47,0x47,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 ,0x6C,0x6C,0x6C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x64,0xFF ,0x00,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 ,0x33,0x33,0x33,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0x88 ,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00 ,0x00,0x00,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC ,0xEC,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xAD,0xFF,0x00,0x00,0x00,0x00,0x8F,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB ,0xAB,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x02,0x88,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x9B,0x9B,0x9B,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6 ,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1 ,0x00,0x00,0x00,0x05,0xFF,0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xE6,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF ,0xEF,0xEF,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x90,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x83,0x00,0x00,0x00,0xFF,0x00,0x44 ,0x44,0x44,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0xFF,0x00,0x00,0x00,0x00,0x8D,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2F,0x83,0x00,0x00,0x00,0xFF,0x00,0x3A ,0x3A,0x3A,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x2E,0x2E,0x2E,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF1,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEA,0xEA,0xEA,0xFF,0xA1,0xFF,0xFF,0xFF ,0xFF,0x00,0x92,0x92,0x92,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x8A,0xFF,0x00,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x76,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0xA1,0xFF,0xFF,0xFF ,0xFF,0x00,0xD7,0xD7,0xD7,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE1,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0xFF,0x00,0x98,0x98,0x98,0xFF ,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xD3,0xFF,0x00,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9,0xC9,0xC9,0xFF ,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80,0x80,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x8B,0x8A,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00,0xFF,0x00,0x42,0x42,0x42,0xFF ,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x25,0x25,0x25,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x1D,0xFF,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x13,0x13,0x13,0xFF,0xFD,0xFD,0xFD,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x29 ,0x29,0x29,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34,0x8A,0x00 ,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00 ,0x00,0xF0,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xE8,0xE8,0xE8 ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x6E,0x6E,0x6E,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x66,0xFF,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x4E,0x83,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59 ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xD2,0xD2,0xD2,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xDD,0x8B,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x95,0x95,0x95 ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xB8,0xB8,0xB8,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xB0,0xFF,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x95,0x83,0x00,0x00,0x00,0xFF,0x00,0xA0,0xA0,0xA0 ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x7B,0x7B,0x7B,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x86,0x8B,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00,0x3F,0x3F,0x3F ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0A,0x0A,0x0A,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x06,0xFF ,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDD,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0xA1,0xFF ,0xFF,0xFF,0xFF,0x00,0x24,0x24,0x24,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x2F,0x8B,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02 ,0x02,0xFF,0xE6,0xE6,0xE6,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x4B,0x4B,0x4B ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x43,0xFF,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x30,0x30,0x30,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xCD,0xCD,0xCD ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD8,0x8C,0x00,0x00,0x00 ,0x00,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x92,0x92,0x92,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x94,0x94,0x94 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0xFF,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x77,0x77,0x77,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x76,0x76,0x76 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x81,0x8C,0x00,0x00,0x00 ,0x00,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x3C,0x3C,0x3C,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xDE,0xDE,0xDE ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0xFF,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x20,0x20,0x20 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2A,0x8C,0x00,0x00,0x00 ,0x00,0x8C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC ,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE4,0xE4,0xE4,0xFF,0xA1 ,0xFF,0xFF,0xFF,0xFF,0x00,0x27,0x27,0x27,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x1F,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x94 ,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x48,0xB7,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF5,0x82,0x00,0x00,0x00,0xFF,0x01,0x0C ,0x0C,0x0C,0xFF,0xFA,0xFA,0xFA,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8 ,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD3,0x8D,0x00,0x00 ,0x00,0x00,0x8D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x90,0x90,0x90,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x71,0x71 ,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0xB7,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xFD,0x94,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x05,0xB6,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF ,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x71,0x71,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x7C,0x8D,0x00,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF ,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xBA,0xBA,0xBA,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB2,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73 ,0x96,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B,0xB6,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x8C,0x83,0x00,0x00,0x00,0xFF,0x00,0x96,0x96,0x96,0xFF ,0xA0,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1B,0x1B,0x1B,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x8D,0x00,0x00,0x00,0x00,0x8D ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEA,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE2,0xE2,0xE2,0xFF,0xA0,0xFF,0xFF ,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0B,0x0B,0x0B,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x07,0xB6,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCB,0x96,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3 ,0xB6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x83,0x00,0x00,0x00,0xFF ,0x00,0xDE,0xDE,0xDE,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xC3,0xC3,0xC3,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0x8E,0x00,0x00,0x00,0x00 ,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00,0x00,0xFF ,0x00,0x8D,0x8D,0x8D,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x4D,0x4D,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0xB5,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x23,0x97,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2 ,0x00,0x00,0x00,0x08,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x26,0x26,0x26,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00 ,0x6C,0x6C,0x6C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x78,0x8E ,0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x37,0x37,0x37,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00 ,0x97,0x97,0x97,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0xB5 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7A,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x4D,0x4D,0x4D,0xFF,0x8E,0x9F,0x9F,0x9F,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0xB4,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x63,0x83,0x00,0x00,0x00,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xA0 ,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x18,0x18,0x18,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x21,0x8E,0x00,0x00,0x00,0x00,0x8E,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xE8,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xE0,0xE0,0xE0,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xE0 ,0xE0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD8,0xB5,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xD2,0x83,0x00,0x00,0x00,0xFF,0x00,0xC2,0xC2 ,0xC2,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0x9A,0x9A,0x9A,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xAA,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0xA0,0xFF,0xFF ,0xFF,0xFF,0x00,0xBE,0xBE,0xBE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xCA,0x8F,0x00,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x95,0x83,0x00,0x00,0x00,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0xA1,0xFF,0xFF ,0xFF,0xFF,0x00,0x2A,0x2A,0x2A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x22,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x1C,0x1C,0x1C,0xFF,0xFE,0xFE,0xFE,0xFF,0x8E,0xFF,0xFF,0xFF ,0xFF,0x01,0xED,0xED,0xED,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0xB2,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEF,0x82,0x00,0x00,0x00,0xFF,0x01,0x07 ,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x67,0x67 ,0x67,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x73,0x8F,0x00,0x00 ,0x00,0x00,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x34,0x34,0x34,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x73,0x73 ,0x73,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0xB3,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72 ,0x72,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x3B,0x83,0x00,0x00,0x00,0xFF,0x00,0x44,0x44,0x44,0xFF,0xA0,0xFF,0xFF ,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x14,0x14,0x14,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1D,0x8F,0x00,0x00,0x00,0x00 ,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00 ,0xBD,0xBD,0xBD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB4,0xB3 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x83,0x00,0x00,0x00,0xFF,0x00 ,0xCA,0xCA,0xCA,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0xA2,0xA2,0xA2,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB1,0xB2,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x82,0x83,0x00,0x00,0x00,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0xA0 ,0xFF,0xFF,0xFF,0xFF,0x00,0xB9,0xB9,0xB9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xC5,0x90,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x92,0x83,0x00,0x00,0x00,0xFF,0x00,0x87,0x87,0x87,0xFF,0xA0 ,0xFF,0xFF,0xFF,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x0C,0x0C,0x0C,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x08,0xB1,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x83,0x00,0x00,0x00,0xFF,0x00,0x22,0x22 ,0x22,0xFF,0x91,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x10 ,0xB1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00,0x00,0xFF ,0x00,0xD4,0xD4,0xD4,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x62,0x62,0x62,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6E,0x90,0x00,0x00,0x00,0x00 ,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x83,0x00,0x00,0x00,0xFF ,0x00,0x31,0x31,0x31,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x50,0x50,0x50,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x47,0xB1,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x89,0x83,0x00,0x00,0x00,0xFF,0x00,0x7A,0x7A,0x7A,0xFF ,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0x52,0x52,0x52,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x61,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14 ,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0xA0 ,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x19,0x90,0x00,0x00 ,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0xE4,0x83,0x00,0x00,0x00,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0xA0,0xFF,0xFF,0xFF ,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x91,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE0 ,0x83,0x00,0x00,0x00,0xFF,0x00,0xD2,0xD2,0xD2,0xFF,0x92,0xFF,0xFF,0xFF,0xFF ,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9 ,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x83,0x00,0x00,0x00,0xFF ,0x00,0x63,0x63,0x63,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xB4,0xB4,0xB4,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x91,0x00,0x00,0x00,0x00 ,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x00,0x00,0xFF ,0x00,0x85,0x85,0x85,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xE2,0xE2,0xE2,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDA,0xB0,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x2A,0x2A,0x2A,0xFF ,0x93,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C,0x0C,0x0C,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x15,0xAF,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB ,0xAB,0xAB,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0x91,0x00,0x00,0x00,0x00,0x91,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x2E ,0x2E,0x2E,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x24,0xAF,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x91,0x83,0x00,0x00,0x00,0xFF,0x00,0x81,0x81,0x81,0xFF,0x94,0xFF ,0xFF,0xFF,0xFF,0x00,0x59,0x59,0x59,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x68,0xAE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0xE8,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF,0xEF,0xEF ,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0E,0x0E,0x0E,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x15,0x91 ,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0xE2,0x83,0x00,0x00,0x00,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0xA0,0xFF ,0xFF,0xFF,0xFF,0x00,0x76,0x76,0x76,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x6D,0xAE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00 ,0x00,0xE6,0x83,0x00,0x00,0x00,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x94,0xFF,0xFF ,0xFF,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xC0,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x3A,0x3A,0x3A,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xAF,0xAF ,0xAF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB,0x92,0x00,0x00 ,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8D,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xBF,0xBF ,0xBF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0xAE,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x83,0x00,0x00,0x00,0xFF,0x00,0x31,0x31 ,0x31,0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10,0x10 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1A ,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x83,0x00,0x00,0x00,0xFF ,0x00,0x82,0x82,0x82,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x58,0x58,0x58,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x64,0x92,0x00,0x00,0x00,0x00 ,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x83,0x00,0x00,0x00,0xFF ,0x00,0x2C,0x2C,0x2C,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF ,0x0E,0x0E,0x0E,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00 ,0x00,0x00,0x09,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x89,0x89,0x89,0xFF,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0x61 ,0x61,0x61,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x70,0xAD,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9 ,0xC9,0xC9,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0B,0x0B ,0x0B,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00 ,0x12,0x92,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xDF,0x83,0x00,0x00,0x00,0xFF,0x00,0xD5,0xD5,0xD5,0xFF,0xA0,0xFF,0xFF,0xFF ,0xFF,0x00,0x52,0x52,0x52,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x4A,0xAC,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC ,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE0,0xE0,0xE0,0xFF,0x96 ,0xFF,0xFF,0xFF,0xFF,0x00,0xB9,0xB9,0xB9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xC7,0xAC,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00 ,0x00,0x00,0xFA,0x82,0x00,0x00,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFD,0xFD ,0xFD,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xB6,0x93,0x00,0x00,0x00,0x00,0x93,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x83,0x00,0x00,0x00,0xFF,0x00,0x7F,0x7F ,0x7F,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x93,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x48,0x83,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF,0x97,0xFF,0xFF ,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x15,0x15,0x15,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x20,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x50,0x83,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59,0xFF,0xA0,0xFF,0xFF,0xFF ,0xFF,0x00,0x53,0x53,0x53,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x5F,0x93,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x34,0x83,0x00,0x00,0x00,0xFF,0x00,0x29,0x29,0x29,0xFF,0xA0,0xFF,0xFF,0xFF ,0xFF,0x00,0xE5,0xE5,0xE5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xDD,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x91,0x91,0x91,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0xAB,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1 ,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x09,0x09,0x09,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x0F,0x93 ,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDD,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xD3,0xD3,0xD3,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00 ,0x2F,0x2F,0x2F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0xAA ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF0,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE6,0xE6,0xE6,0xFF,0x98,0xFF,0xFF ,0xFF,0xFF,0x00,0xC1,0xC1,0xC1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xCF,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0x9F,0xFF,0xFF,0xFF ,0xFF,0x00,0xA5,0xA5,0xA5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xB1,0x94,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x87,0x83,0x00,0x00,0x00,0xFF,0x00,0x7C,0x7C,0x7C,0xFF,0xA0,0xFF,0xFF,0xFF ,0xFF,0x00,0x78,0x78,0x78,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x70,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x41,0x41,0x41,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD ,0xFF,0x1B,0x1B,0x1B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x27 ,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83,0x00,0x00,0x00,0xFF ,0x00,0x30,0x30,0x30,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x4E,0x4E,0x4E,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A,0x94,0x00,0x00,0x00,0x00 ,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x83,0x00,0x00,0x00,0xFF ,0x00,0x26,0x26,0x26,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xC2,0xC2,0xC2,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9,0xAA,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF,0x00,0x98,0x98,0x98,0xFF ,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x70,0x70,0x70,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x7E,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F ,0x83,0x00,0x00,0x00,0xFF,0x00,0x78,0x78,0x78,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF ,0x01,0xF0,0xF0,0xF0,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0x94,0x00,0x00,0x00,0x00,0x95,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x83,0x00,0x00,0x00,0xFF,0x00,0xD0 ,0xD0,0xD0,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x10,0x10 ,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00 ,0x0A,0xA8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xF4 ,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC,0xEC,0xFF,0x9A ,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xD6,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB7,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00 ,0xA0,0xA0,0xA0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAC,0x95 ,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x7A,0x7A,0x7A,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00 ,0x55,0x55,0x55,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0xA8 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x48,0x48,0x48,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x21,0x21,0x21,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2E,0xA7,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xF6,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D ,0x0D,0x0D,0xFF,0xFA,0xFA,0xFA,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x49,0x49 ,0x49,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x55,0x95,0x00,0x00 ,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x24,0x24,0x24,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E ,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x96,0xA8,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xAF,0x83,0x00,0x00,0x00,0xFF,0x00,0xA0,0xA0 ,0xA0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x78,0x78,0x78,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F,0xFF,0x9F,0xFF,0xFF ,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x0A,0x95,0x00,0x00,0x00,0x00 ,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x83,0x00,0x00,0x00,0xFF ,0x00,0xCD,0xCD,0xCD,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF ,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDF,0xA7 ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xF8,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF0,0xF0,0xF0,0xFF,0x9C,0xFF,0xFF ,0xFF,0xFF,0x00,0xD0,0xD0,0xD0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xDD,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x96,0x96,0x96,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B ,0x9B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0x96,0x00,0x00 ,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x77,0x77,0x77,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x31,0x31 ,0x31,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x29,0xA6,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x5F,0x83,0x00,0x00,0x00,0xFF,0x00,0x50,0x50 ,0x50,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0x28,0x28,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x35,0xA6,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xD6,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x9F,0xFF,0xFF ,0xFF,0xFF,0x00,0x44,0x44,0x44,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x50,0x96,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x2B,0x83,0x00,0x00,0x00,0xFF,0x00,0x21,0x21,0x21,0xFF,0xA0,0xFF,0xFF ,0xFF,0xFF,0x00,0x7B,0x7B,0x7B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x72,0xA6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB7,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80 ,0x80,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D,0xA5,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x83,0x00,0x00,0x00,0xFF,0x00,0x26,0x26 ,0x26,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x03,0x03,0x03 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x07 ,0x96,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5 ,0x83,0x00,0x00,0x00,0xFF,0x00,0xCA,0xCA,0xCA,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF ,0x00,0xC4,0xC4,0xC4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBC ,0xA5,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xFB,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF5,0xF5,0xF5,0xFF,0x9E,0xFF ,0xFF,0xFF,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xE3,0x00,0x00,0x00,0x01,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0x9F,0xFF,0xFF ,0xFF,0xFF,0x00,0x96,0x96,0x96,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xA2,0x97,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x7F,0x83,0x00,0x00,0x00,0xFF,0x00,0x74,0x74,0x74,0xFF,0x9F,0xFF,0xFF ,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x0C,0xA4,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF ,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x3D,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE ,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF ,0x00,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B ,0x97,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F,0x1F,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF ,0x00,0x57,0x57,0x57,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4F ,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00,0xFF ,0x00,0xAF,0xAF,0xAF,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x87,0x87,0x87,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0xA3,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF1,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xE5 ,0xE5,0xE5,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xEE,0x00,0x00,0x00,0x05,0x97,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xD2,0x83,0x00,0x00,0x00,0xFF,0x00,0xC8,0xC8,0xC8 ,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x98,0xA3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x19,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x0F,0x0F,0x0F,0xFF ,0xF8,0xF8,0xF8,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x03,0xA2,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0x83,0x00,0x00,0x00,0xFF,0x00,0x44 ,0x44,0x44,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x91,0x91,0x91,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x98,0x00,0x00,0x00,0x00,0x98,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x71 ,0x71,0x71,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x01,0x01 ,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE1,0xA3,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF,0x00,0x5F,0x5F ,0x5F,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x37,0x37,0x37,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x44,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x85,0x83,0x00,0x00,0x00,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0x9F,0xFF,0xFF ,0xFF,0xFF,0x00,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x46,0x98,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x26,0x83,0x00,0x00,0x00,0xFF,0x01,0x1D,0x1D,0x1D,0xFF,0xFE,0xFE,0xFE ,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x2B,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xC6,0x83,0x00,0x00,0x00,0xFF,0x00,0xB7,0xB7,0xB7,0xFF,0xA2,0xFF,0xFF,0xFF ,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x9C,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xE1,0xE1,0xE1 ,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB ,0x00,0x00,0x00,0x04,0x98,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x9F ,0xFF,0xFF,0xFF,0xFF,0x00,0x7E,0x7E,0x7E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x74,0xA1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1F,0x00 ,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFB,0xFB ,0xFB,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xE5,0xE5,0xE5,0xFF,0x02,0x02,0x02 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x05 ,0xA0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xFE,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00 ,0x8C,0x8C,0x8C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x98,0x99 ,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00 ,0xC7,0xC7,0xC7,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBE,0xA1 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x67,0x67,0x67,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x3F,0x3F,0x3F,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B,0xA0,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x5C,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0x9F ,0xFF,0xFF,0xFF,0xFF,0x00,0x35,0x35,0x35,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x41,0x99,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF,0x01,0x1A,0x1A,0x1A,0xFF,0xFE ,0xFE,0xFE,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x13,0x13 ,0x13,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00 ,0x0D,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0x97,0x97 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3,0xA0,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xA4,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB ,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x02,0x99,0x00,0x00,0x00,0x00 ,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00,0xFF ,0x00,0xC2,0xC2,0xC2,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x5A,0x5A,0x5A,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0x9F,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x25,0x83,0x00,0x00,0x00,0xFF,0x01,0x19,0x19,0x19,0xFF ,0xFD,0xFD,0xFD,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x01,0xEA,0xEA,0xEA,0xFF,0x04 ,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00 ,0x00,0x08,0x9E,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0xEA,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF,0xEF,0xEF,0xFF ,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x87,0x87,0x87,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x93,0x9A,0x00,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00,0x00,0xFF,0x00,0x6C,0x6C,0x6C,0xFF ,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xA4,0xA4,0xA4,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x9A,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D ,0x83,0x00,0x00,0x00,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF ,0x00,0x47,0x47,0x47,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x53 ,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x83,0x00,0x00,0x00,0xFF ,0x00,0x3A,0x3A,0x3A,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3C,0x9A,0x00,0x00,0x00,0x00 ,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x83,0x00,0x00,0x00,0xFF ,0x01,0x18,0x18,0x18,0xFF,0xFD,0xFD,0xFD,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01 ,0xEB,0xEB,0xEB,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xE3,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0x83,0x00 ,0x00,0x00,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF,0x00,0x9E ,0x9E,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAA,0x9E,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x82 ,0x82,0x82,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x01,0x9A,0x00,0x00 ,0x00,0x00,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x37,0x37 ,0x37,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D,0x9D,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F ,0x1F,0xFF,0xA7,0xFF,0xFF,0xFF,0xFF,0x01,0xEF,0xEF,0xEF,0xFF,0x06,0x06,0x06 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C ,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x83,0x00,0x00,0x00,0xFF ,0x00,0xCA,0xCA,0xCA,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x82,0x82,0x82,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E,0x9B,0x00,0x00,0x00,0x00 ,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x83,0x00,0x00,0x00,0xFF ,0x00,0x69,0x69,0x69,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80,0x80,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0x9D,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x84,0x83,0x00,0x00,0x00,0xFF,0x00,0x76,0x76,0x76,0xFF ,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x5A,0x9C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0F ,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFD ,0xFD,0xFD,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x2B,0x2B,0x2B,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x37,0x9B,0x00,0x00,0x00,0x00,0x9B,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFE,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x16,0x16,0x16,0xFF,0xFC,0xFC,0xFC,0xFF,0x9E,0xFF,0xFF,0xFF ,0xFF,0x00,0xCA,0xCA,0xCA,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xC0,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xCE,0xCE,0xCE,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0xA6,0xA6,0xA6 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB2,0x9C,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x53,0x83,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59 ,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xDF,0x9C,0x00,0x00,0x00,0x00,0x9C,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xC7,0x83,0x00,0x00,0x00,0xFF,0x00,0xBD,0xBD,0xBD ,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x15,0x15,0x15,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x0F,0x9B ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x26,0x26,0x26,0xFF,0xA9,0xFF,0xFF,0xFF,0xFF,0x01,0xF4,0xF4,0xF4,0xFF,0x0A ,0x0A,0x0A,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00 ,0x00,0x10,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x7D,0x7D ,0x7D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x89,0x9C,0x00,0x00 ,0x00,0x00,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x66,0x66,0x66,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x5D,0x5D ,0x5D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x53,0x9B,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x83,0x00,0x00,0x00,0xFF,0x00,0x7E,0x7E ,0x7E,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xE2,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7 ,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x26,0x26,0x26,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x32,0x9C,0x00,0x00,0x00,0x00,0x9C,0x00,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF ,0x01,0x14,0x14,0x14,0xFF,0xFB,0xFB,0xFB,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00 ,0xA6,0xA6,0xA6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x9A ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE2,0x83,0x00 ,0x00,0x00,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0xAE ,0xAE,0xAE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x83,0x00,0x00,0x00,0xFF,0x00,0x30 ,0x30,0x30,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xCF,0xCF,0xCF,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDB,0x9D,0x00,0x00,0x00,0x00,0x9D,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x83,0x00,0x00,0x00,0xFF,0x00,0xBA ,0xBA,0xBA,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF,0x02,0x02 ,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE5,0x9A,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x83,0x00,0x00,0x00,0xFF,0x00,0x2E,0x2E ,0x2E,0xFF,0xAB,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0E,0x0E,0x0E ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x15 ,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x83,0x00,0x00,0x00,0xFF ,0x00,0x78,0x78,0x78,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x78,0x78,0x78,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x84,0x9D,0x00,0x00,0x00,0x00 ,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF ,0x00,0x64,0x64,0x64,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x39,0x39,0x39,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x30,0x99,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x93,0x83,0x00,0x00,0x00,0xFF,0x00,0x86,0x86,0x86,0xFF ,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x5E,0x5E,0x5E,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x69,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA ,0x83,0x00,0x00,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF ,0x00,0x21,0x21,0x21,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D ,0x9D,0x00,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1A ,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x12,0x12,0x12,0xFF,0xFB ,0xFB,0xFB,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x83,0x83,0x83,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0x98,0x00,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0x03,0x00,0x00,0x00,0xE8,0x83,0x00,0x00,0x00,0xFF,0x00,0xDD,0xDD ,0xDD,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x98,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x0A,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D ,0xFF,0xFA,0xFA,0xFA,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xCA,0xCA,0xCA,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x9E,0x00,0x00,0x00,0x00 ,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00,0xFF ,0x00,0xB7,0xB7,0xB7,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xCC,0xCC,0xCC,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC3,0x98,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x43,0x83,0x00,0x00,0x00,0xFF,0x00,0x35,0x35,0x35,0xFF ,0xAD,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x12,0x12,0x12,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1A,0x97,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00,0x4F ,0x4F,0x4F,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x73,0x73,0x73,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F,0x9E,0x00,0x00,0x00,0x00,0x9E,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00,0x00,0xFF,0x00,0x61 ,0x61,0x61,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x17,0x17 ,0x17,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00 ,0x10,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x8D,0x8D,0x8D,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0x65,0x65,0x65 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x70,0x97,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x91,0x83,0x00,0x00,0x00,0xFF,0x00,0x97,0x97,0x97 ,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1D,0x1D,0x1D,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x29,0x9E,0x00,0x00,0x00,0x00 ,0x9E,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFD,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x11,0x11,0x11,0xFF,0xFA,0xFA,0xFA,0xFF,0x9E,0xFF ,0xFF,0xFF,0xFF,0x00,0x5F,0x5F,0x5F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x56,0x96,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00 ,0x00,0xED,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE3,0xE3,0xE3 ,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0xBD,0xBD,0xBD,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xC8,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xD9,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x9D,0xFF,0xFF,0xFF ,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xD2,0x9F,0x00,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xBF,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x9E,0xFF,0xFF,0xFF ,0xFF,0x00,0xA9,0xA9,0xA9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x9F,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x3D,0x3D,0x3D,0xFF,0xAF,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD ,0xFF,0x18,0x18,0x18,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x20 ,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x83,0x00,0x00,0x00,0xFF ,0x00,0x26,0x26,0x26,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x6E,0x6E,0x6E,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7B,0x9F,0x00,0x00,0x00,0x00 ,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x83,0x00,0x00,0x00,0xFF ,0x00,0x5E,0x5E,0x5E,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xEE,0xEE,0xEE,0xFF ,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00 ,0x00,0x00,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x95,0x95,0x95,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0x6D ,0x6D,0x6D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0x95,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x83,0x00,0x00,0x00,0xFF,0x00,0x6E ,0x6E,0x6E,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x19,0x19 ,0x19,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x24,0x9F,0x00,0x00 ,0x00,0x00,0x9F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00 ,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x0F,0x0F,0x0F,0xFF,0xF9,0xF9,0xF9,0xFF ,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x3C,0x3C,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x32,0x94,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08 ,0x00,0x00,0x00,0xF2,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xE9 ,0xE9,0xE9,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0x95,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x9D,0xFF ,0xFF,0xFF,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xCD,0xA0,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xBC,0x83,0x00,0x00,0x00,0xFF,0x00,0xB2,0xB2,0xB2,0xFF,0x9E,0xFF ,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x7C,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x45,0x45,0x45,0xFF,0xB1,0xFF,0xFF,0xFF,0xFF,0x01,0xFE ,0xFE,0xFE,0xFF,0x1E,0x1E,0x1E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x27,0x93,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00 ,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF ,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x76,0xA0,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x5C,0x5C,0x5C,0xFF ,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xCF,0xCF,0xCF,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xC5,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA ,0x83,0x00,0x00,0x00,0xFF,0x00,0x9D,0x9D,0x9D,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF ,0x00,0x75,0x75,0x75,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F ,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x83,0x00,0x00,0x00,0xFF ,0x00,0x45,0x45,0x45,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF ,0x15,0x15,0x15,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x20,0xA0 ,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00 ,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7 ,0xF7,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x19,0x19,0x19,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x12,0x92,0x00,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF6,0x82,0x00,0x00,0x00,0xFF ,0x01,0x06,0x06,0x06,0xFF,0xEE,0xEE,0xEE,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF,0x00 ,0xCC,0xCC,0xCC,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x93 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x8C,0x8C,0x8C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xBB,0xBB,0xBB,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC8,0xA1,0x00,0x00,0x00,0x00,0xA1 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x83,0x00,0x00,0x00,0xFF,0x00 ,0xAF,0xAF,0xAF,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x62,0x62,0x62,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x58,0x92,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x59,0x83,0x00,0x00,0x00,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0xB4 ,0xFF,0xFF,0xFF,0xFF,0x00,0x25,0x25,0x25,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x2E,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00 ,0x64,0x64,0x64,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x71,0xA1 ,0x00,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00 ,0xAB,0xAB,0xAB,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA2,0x92 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB1,0x83,0x00,0x00,0x00,0xFF,0x00 ,0xA4,0xA4,0xA4,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0x7C,0x7C,0x7C,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0x91,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF,0x00,0x1C ,0x1C,0x1C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x12,0x12 ,0x12,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x1B,0xA1,0x00,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x12,0x00,0x00,0x00,0xFA,0x82,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0C,0x0C,0xFF ,0xF6,0xF6,0xF6,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x04 ,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00 ,0x00,0x01,0x90,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00 ,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x09,0x09,0x09,0xFF,0xF3,0xF3,0xF3,0xFF ,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xDD,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5F ,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF ,0x00,0xB6,0xB6,0xB6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC3 ,0xA2,0x00,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB6 ,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF ,0x00,0x3E,0x3E,0x3E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34 ,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x83,0x00,0x00,0x00,0xFF ,0x00,0x54,0x54,0x54,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x36,0x90,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xA7,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB,0xFF ,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x5F,0x5F,0x5F,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x6C,0xA2,0x00,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x60,0x83,0x00,0x00,0x00,0xFF,0x00,0x56,0x56,0x56,0xFF ,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x7E,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9 ,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF ,0x00,0x84,0x84,0x84,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D ,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xEC,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF,0xEF,0xEF,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0F,0x0F,0x0F,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x18,0xA2,0x00,0x00,0x00 ,0x00,0xA2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF9 ,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0xF5,0xF5,0xF5,0xFF,0x9D ,0xFF,0xFF,0xFF,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xC7,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x00 ,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7 ,0xF7,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0x01,0x8E,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x37,0x83,0x00,0x00,0x00,0xFF,0x00,0x3A,0x3A,0x3A ,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xBE,0xA3,0x00,0x00,0x00,0x00,0xA3,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xB4,0x83,0x00,0x00,0x00,0xFF,0x00,0xAA,0xAA,0xAA ,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x1B,0x1B,0x1B,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x13,0x8E,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x69,0x83,0x00,0x00,0x00,0xFF,0x00,0x5C,0x5C,0x5C,0xFF ,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x3D,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E ,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF ,0x00,0x5A,0x5A,0x5A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x67 ,0xA3,0x00,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D ,0x83,0x00,0x00,0x00,0xFF,0x00,0x53,0x53,0x53,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF ,0x00,0x64,0x64,0x64,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A ,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00,0x00,0xFF ,0x00,0xB4,0xB4,0xB4,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0x8C,0x8C,0x8C,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0x8E,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xC6,0x83,0x00,0x00,0x00,0xFF,0x00,0xCA,0xCA,0xCA,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C,0x0C,0x0C,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x14,0xA3,0x00 ,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00 ,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x09,0x09,0x09,0xFF,0xF3,0xF3,0xF3 ,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xAE,0xAE,0xAE,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xA4,0x8D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x1A,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x11,0x11,0x11,0xFF ,0xFA,0xFA,0xFA,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF,0x01,0xE2,0xE2,0xE2,0xFF,0x01 ,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00 ,0x00,0x03,0x8C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00 ,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFD,0xFD,0xFD,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB9,0xA4,0x00,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xB1,0x83,0x00,0x00,0x00,0xFF,0x00,0xA7,0xA7,0xA7,0xFF ,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x05,0x05,0x05,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0x02,0x8C,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x83,0x00,0x00,0x00,0xFF,0x00,0x63 ,0x63,0x63,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xE8,0xE8,0xE8,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0x3B,0x3B,0x3B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x44,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x59,0x59,0x59,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x55 ,0x55,0x55,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x62,0xA4,0x00 ,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x51,0x51,0x51,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x41 ,0x41,0x41,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x37,0x8C,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x83,0x00,0x00,0x00,0xFF,0x00,0xBB ,0xBB,0xBB,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x58,0x58 ,0x58,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x93,0x93,0x93,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x9C,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9C,0xFF,0xFF ,0xFF,0xFF,0x01,0xF4,0xF4,0xF4,0xFF,0x09,0x09,0x09,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x11,0xA4,0x00,0x00,0x00,0x00 ,0xA4,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xF7,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x08,0x08,0x08,0xFF,0xF2,0xF2,0xF2,0xFF,0x9D,0xFF ,0xFF,0xFF,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x80,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x16,0x16,0x16,0xFF,0xFC,0xFC,0xFC,0xFF,0x9B,0xFF,0xFF ,0xFF,0xFF,0x02,0xAF,0xAF,0xAF,0xFF,0x06,0x06,0x06,0xFF,0xF0,0xF0,0xF0,0xFF ,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xE8,0xE8,0xE8,0xFF,0x03,0x03,0x03,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x05,0x8B,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE5,0x82,0x00,0x00,0x00,0xFF,0x01,0x01 ,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xA7,0xA7 ,0xA7,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB4,0xA5,0x00,0x00 ,0x00,0x00,0xA5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xA4,0xA4,0xA4,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xD4 ,0xD4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0x8B,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x83,0x00,0x00,0x00,0xFF,0x00,0x6B,0x6B ,0x6B,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0x58,0x58,0x58,0xFF,0x00,0x00,0x00 ,0xFF,0xA4,0xA4,0xA4,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x43,0x43,0x43,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0x8A,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x30,0x30,0x30,0xFF ,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x50,0x50,0x50,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x5D,0xA5,0x00,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x58,0x83,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF ,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x1E,0x1E,0x1E,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x15,0x8A,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00,0xC3,0xC3,0xC3,0xFF,0x9B ,0xFF,0xFF,0xFF,0xFF,0x03,0xF5,0xF5,0xF5,0xFF,0x0B,0x0B,0x0B,0xFF,0x00,0x00 ,0x00,0xFF,0x51,0x51,0x51,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B,0x9B ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3,0x8A,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x75,0x83,0x00,0x00,0x00,0xFF,0x00,0x78,0x78,0x78 ,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF1,0xF1,0xF1,0xFF,0x07,0x07,0x07,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x0E,0xA5 ,0x00,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00 ,0x00,0x00,0xF6,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF0,0xF0 ,0xF0,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x67,0x67,0x67,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x5D,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x27,0x83,0x00,0x00,0x00,0xFF,0x01,0x1C,0x1C,0x1C,0xFF,0xFE,0xFE,0xFE ,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x81,0x00,0x00,0x00 ,0xFF,0x01,0x09,0x09,0x09,0xFF,0xF4,0xF4,0xF4,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF ,0x01,0xED,0xED,0xED,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x08,0x89,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xBD,0x83,0x00,0x00,0x00,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0xA2,0xA2,0xA2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xAF,0xA6,0x00,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9D,0xFF ,0xFF,0xFF,0xFF,0x00,0xB0,0xB0,0xB0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xA6,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x73,0x73,0x73,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x53 ,0x53,0x53,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0x4B,0x4B,0x4B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x53,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00 ,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xFA,0xFA,0xFA ,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x58,0xA6,0x00,0x00,0x00,0x00,0xA6,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x55,0x83,0x00,0x00,0x00,0xFF,0x00,0x4B,0x4B,0x4B ,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x06,0x06,0x06,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x02,0x88 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x83,0x00,0x00,0x00,0xFF,0x00 ,0xCB,0xCB,0xCB,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x09 ,0x09,0x09,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0xA3,0xA3,0xA3,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xAB,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xEE ,0xEE,0xEE,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xF5,0x00,0x00,0x00,0x0B,0xA6,0x00,0x00,0x00,0x00,0xA6,0x00,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF ,0x01,0x06,0x06,0x06,0xFF,0xEF,0xEF,0xEF,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00 ,0x43,0x43,0x43,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0x87 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2F,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x23,0x23,0x23,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xA6,0xA6,0xA6,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0C,0x0C,0xFF,0xF7,0xF7,0xF7,0xFF,0x9B,0xFF ,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0x87,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x94,0x83,0x00,0x00,0x00,0xFF,0x00,0x97,0x97,0x97 ,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xAA,0xA7,0x00,0x00,0x00,0x00,0xA7,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF,0x00,0x9F,0x9F,0x9F ,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x8D,0x8D,0x8D,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x83,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x87,0x83,0x00,0x00,0x00,0xFF,0x00,0x7A,0x7A,0x7A,0xFF,0x9C,0xFF,0xFF,0xFF ,0xFF,0x00,0x50,0x50,0x50,0xFF,0x84,0x00,0x00,0x00,0xFF,0x00,0xB1,0xB1,0xB1 ,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x52,0x52,0x52,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x5A,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xDC,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x9C,0xFF,0xFF,0xFF ,0xFF,0x00,0x45,0x45,0x45,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x53,0xA7,0x00,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x52,0x83,0x00,0x00,0x00,0xFF,0x00,0x48,0x48,0x48,0xFF,0x9D,0xFF,0xFF,0xFF ,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xCC,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDE,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xD2,0xD2,0xD2,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2 ,0xFF,0x08,0x08,0x08,0xFF,0x84,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB2,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x26,0x26,0x26,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x01,0xEA,0xEA,0xEA,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x09,0xA7,0x00,0x00,0x00,0x00,0xA7,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xF3,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF,0xED,0xED,0xED,0xFF,0x9D,0xFF,0xFF,0xFF ,0xFF,0x00,0x20,0x20,0x20,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xFE,0x00,0x00,0x00,0x17,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x2A,0x2A,0x2A,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0xA4,0xA4,0xA4,0xFF,0x85,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF ,0xF9,0xF9,0xF9,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C ,0x0C,0x0C,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00 ,0x00,0x10,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x6E,0x6E,0x6E,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0x97 ,0x97,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA5,0xA8,0x00,0x00 ,0x00,0x00,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69 ,0x69,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x85,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82 ,0x82,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x4D,0x4D,0xFF,0x86,0x00,0x00 ,0x00,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x5A,0x5A ,0x5A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x62,0x85,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xB3,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5 ,0xB5,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x40,0x40,0x40,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0xA8,0x00,0x00,0x00,0x00,0xA8,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x4F,0x83,0x00,0x00,0x00,0xFF,0x00,0x46,0x46 ,0x46,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xB3,0xB3,0xB3,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA9,0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0xE4,0x83,0x00,0x00,0x00,0xFF,0x00,0xDA,0xDA,0xDA ,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x06,0x06,0x06,0xFF ,0x86,0x00,0x00,0x00,0xFF,0x00,0x62,0x62,0x62,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9 ,0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xF4,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF,0x9B,0xFF ,0xFF,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x07,0xA8,0x00,0x00,0x00 ,0x00,0xA8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF1 ,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEB,0xEB,0xEB,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x03,0x83,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x83,0x00,0x00,0x00,0xFF,0x00,0x32,0x32 ,0x32,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x87,0x00,0x00 ,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0x9B,0xFF,0xFF,0xFF ,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x15,0x83,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x43,0x83,0x00,0x00,0x00,0xFF,0x00,0x45,0x45,0x45,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x00,0x92,0x92,0x92,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xA0,0xA9,0x00,0x00,0x00,0x00,0xA9,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0xFF,0x00,0x99,0x99,0x99,0xFF,0x9D ,0xFF,0xFF,0xFF,0xFF,0x00,0x46,0x46,0x46,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x3C,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 ,0x4B,0x4B,0x4B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF5,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xBB,0xBB,0xBB,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 ,0x62,0x62,0x62,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0x83 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x8D,0x8D,0x8D,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x3B,0x3B,0x3B,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x49,0xA9,0x00,0x00,0x00,0x00,0xA9 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x43,0x43,0x43,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x85,0x82,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEA,0x82,0x00,0x00,0x00,0xFF,0x01,0x01 ,0x01,0x01,0xFF,0xE0,0xE0,0xE0,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xEE,0xEE ,0xEE,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xF4,0x00,0x00,0x00,0x7B,0x83,0x00,0x00,0x00,0xFF,0x00,0x68,0x68,0x68,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xBA,0xBA,0xBA,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD2 ,0x83,0x00,0x00,0x00,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF ,0x01,0xE3,0xE3,0xE3,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x05,0xA9,0x00,0x00,0x00,0x00,0xA9,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xF0,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xE9,0xE9,0xE9,0xFF,0x9C,0xFF,0xFF,0xFF ,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xCF,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x39,0x39,0x39,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E,0x9E ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xA9,0x00,0x00,0x00,0x1E ,0x83,0x00,0x00,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD,0xFF,0x9B ,0xFF,0xFF,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x15,0x15,0x15,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1B,0x81,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x83,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C ,0x1C,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x8D,0x8D,0x8D,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x9B,0xAA,0x00,0x00,0x00,0x00,0xAA,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x96,0x96 ,0x96,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x22,0x22,0x22,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x19,0x81,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x00,0x91,0x91,0x91 ,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x02,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 ,0x69,0x69,0x69,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x70,0x81 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x64,0x64,0x64,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x36,0x36,0x36,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x44,0xAA,0x00,0x00,0x00,0x00,0xAA ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x40,0x40,0x40,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x6C,0x6C,0x6C,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x06,0x00,0x00,0x00,0xEF,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02 ,0xFF,0xE7,0xE7,0xE7,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF ,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0xF3,0x00 ,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xC1,0xC1,0xC1 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC8,0x81,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xAA,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB ,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xEA,0x00,0x00,0x00,0x03,0xAA,0x00,0x00,0x00,0x00 ,0xAA,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE7,0xE7,0xE7,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x02,0x00 ,0x00,0x00,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x41,0x41,0x41,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B,0x9B ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6,0x81,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF,0x01,0x1B,0x1B,0x1B ,0xFF,0xFE,0xFE,0xFE,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF ,0x1B,0x1B,0x1B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0x21,0x00 ,0x00,0x00,0x03,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03 ,0x03,0xFF,0xEF,0xEF,0xEF,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x96,0xAB,0x00,0x00,0x00 ,0x00,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9D,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x94,0x94,0x94,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6 ,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xF0 ,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xA5,0x83,0x00,0x00,0x00,0xFF,0x00,0x99 ,0x99,0x99,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x45,0x45,0x45,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x50,0x82,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0x71,0x71,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0x78,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x3B,0x3B ,0x3B,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x31,0x31,0x31,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x3F,0xAB,0x00,0x00,0x00,0x00,0xAB,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x3D,0x3D ,0x3D,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0xF3,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC,0xEC,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF ,0x01,0xEB,0xEB,0xEB,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x7B,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72,0x72,0xFF,0x9C,0xFF ,0xFF,0xFF,0xFF,0x00,0xC9,0xC9,0xC9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xCF,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82 ,0x82,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xDA,0xDA,0xDA,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xE6,0x00,0x00,0x00,0x02,0xAB,0x00,0x00,0x00 ,0x00,0xAB,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC ,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE5,0xE5,0xE5,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x00,0x92,0x92,0x92,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xD6,0x83,0x00,0x00,0x00,0xFF,0x00,0x49,0x49,0x49,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x00,0x98,0x98,0x98,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F,0x1F,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00 ,0x21,0x21,0x21,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE3,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xCA,0xCA,0xCA,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00 ,0x83,0x83,0x83,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x91,0xAC ,0x00,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x91,0x91,0x91,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 ,0xDC,0xDC,0xDC,0xFF,0x88,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0x42,0x42,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x4D,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x83 ,0x00,0x00,0x00,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 ,0x79,0x79,0x79,0xFF,0x87,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFD ,0xFD,0xFD,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3A,0xAC,0x00,0x00,0x00,0x00,0xAC,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x3B ,0x3B,0x3B,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x25,0x25,0x25,0xFF,0x86,0x00 ,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF1,0xF1,0xF1,0xFF,0x9B,0xFF,0xFF ,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x06,0x84,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x77,0x77,0x77,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0x87,0x00,0x00,0x00,0xFF ,0x00,0x59,0x59,0x59,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xD5,0xD5,0xD5,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x01,0xAC ,0x00,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00 ,0x00,0x00,0xEA,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE3,0xE3 ,0xE3,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0x86,0x00,0x00 ,0x00,0xFF,0x00,0x50,0x50,0x50,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x96,0x96 ,0x96,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0x85,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x24,0x24 ,0x24,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0x28,0x28,0xFF,0x86,0x00,0x00 ,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x7E,0x7E ,0x7E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0xAD,0x00,0x00 ,0x00,0x00,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x8E,0x8E,0x8E,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xB8,0xB8 ,0xB8,0xFF,0x86,0x00,0x00,0x00,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x9C,0xFF,0xFF ,0xFF,0xFF,0x00,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x4A,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xD0,0xD0,0xD0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80 ,0x80,0xFF,0x85,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE8,0xE8,0xE8 ,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x27,0x27,0x27,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x35,0xAD,0x00,0x00,0x00,0x00,0xAD,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x41,0x83,0x00,0x00,0x00,0xFF,0x00,0x38,0x38,0x38 ,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0A,0x0A,0x0A,0xFF ,0x84,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF5,0xF5,0xF5,0xFF,0x9B ,0xFF,0xFF,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x05,0x86,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x83,0x00,0x00,0x00,0xFF,0x00,0x7C,0x7C ,0x7C,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0x85,0x00,0x00 ,0x00,0xFF,0x00,0x30,0x30,0x30,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xD0,0xD0 ,0xD0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDE,0xAE,0x00,0x00 ,0x00,0x00,0xAD,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00 ,0xE8,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE1,0xE1,0xE1,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x4B,0x4B,0x4B,0xFF,0x84,0x00,0x00,0x00,0xFF ,0x00,0x58,0x58,0x58,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x93,0x93,0x93,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0x87,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x32,0x83,0x00,0x00,0x00,0xFF,0x00,0x29,0x29,0x29,0xFF ,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF,0x84,0x00,0x00,0x00,0xFF ,0x00,0x78,0x78,0x78,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x79,0x79,0x79,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0xAE,0x00,0x00,0x00,0x00 ,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x83,0x00,0x00,0x00,0xFF ,0x00,0x8B,0x8B,0x8B,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x95,0x95,0x95,0xFF ,0x84,0x00,0x00,0x00,0xFF,0x00,0xB0,0xB0,0xB0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0x3D,0x3D,0x3D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x48 ,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDE,0x83,0x00,0x00,0x00,0xFF ,0x00,0xD5,0xD5,0xD5,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88,0xFF ,0x84,0x00,0x00,0x00,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF ,0x00,0x23,0x23,0x23,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x30 ,0xAE,0x00,0x00,0x00,0x00,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F ,0x83,0x00,0x00,0x00,0xFF,0x00,0x35,0x35,0x35,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0xDE,0xDE,0xDE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x0F,0x0F,0x0F,0xFF ,0xF8,0xF8,0xF8,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xE5,0xE5,0xE5,0xFF,0x01 ,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00 ,0x00,0x04,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xDF,0xDF ,0xDF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xFA,0xFA,0xFA ,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xD9,0xAF,0x00,0x00,0x00,0x00,0xAE,0x00,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x83,0x00,0x00,0x00,0xFF ,0x00,0xDE,0xDE,0xDE,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0x28,0x28,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x00,0x60,0x60,0x60,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0x90,0x90,0x90,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9B ,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x83,0x00,0x00,0x00,0xFF ,0x00,0x2E,0x2E,0x2E,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x38,0x38,0x38,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF ,0x00,0x74,0x74,0x74,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83 ,0xAF,0x00,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x89,0x89,0x89,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0x71,0x71,0x71,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0xB8,0xB8,0xB8,0xFF ,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x45,0x89,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00,0xDA,0xDA,0xDA,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x98,0x98,0x98,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1E ,0x1E,0x1E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2C,0xAF,0x00 ,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x32,0x32,0x32,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xBB ,0xBB,0xBB,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x15,0x15,0x15,0xFF,0xFB,0xFB ,0xFB,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xE2,0xE2,0xE2,0xFF,0x01,0x01,0x01 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0x04 ,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x00,0x00,0xFF ,0x00,0x87,0x87,0x87,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xE4,0xE4,0xE4,0xFF ,0x01,0x01,0x01,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0xE1,0xE1,0xE1,0xFF,0x9A ,0xFF,0xFF,0xFF,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xD5,0xB0,0x00,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE4,0x83,0x00,0x00,0x00,0xFF,0x00,0xDC ,0xDC,0xDC,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x03,0xF9,0xF9,0xF9,0xFF,0x0B,0x0B ,0x0B,0xFF,0x00,0x00,0x00,0xFF,0x69,0x69,0x69,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0x8D,0x8D,0x8D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x99 ,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0x83,0x00,0x00,0x00,0xFF ,0x00,0x33,0x33,0x33,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x02,0x3D,0x3D,0x3D,0xFF ,0x00,0x00,0x00,0xFF,0x29,0x29,0x29,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x6F ,0x6F,0x6F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0xB0,0x00 ,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x86,0x86,0x86,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0x4E ,0x4E,0x4E,0xFF,0x00,0x00,0x00,0xFF,0xC1,0xC1,0xC1,0xFF,0x9C,0xFF,0xFF,0xFF ,0xFF,0x00,0x37,0x37,0x37,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x42,0x8B,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE7 ,0x83,0x00,0x00,0x00,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x02,0x94,0x94,0x94,0xFF,0x00,0x00,0x00,0xFF,0x72,0x72,0x72,0xFF,0x9A,0xFF ,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1A,0x1A,0x1A,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x27,0xB0,0x00,0x00,0x00,0x00,0xB0,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x30,0x30 ,0x30,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0x98,0x98,0x98,0xFF,0x1B,0x1B,0x1B ,0xFF,0xFE,0xFE,0xFE,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xE0,0xE0,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x03,0x8C ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x8C,0x8C,0x8C,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0xE8,0xE8,0xE8,0xFF,0x03 ,0x03,0x03,0xFF,0xBB,0xBB,0xBB,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xC1,0xC1 ,0xC1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD0,0xB1,0x00,0x00 ,0x00,0x00,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0xE1,0x83,0x00,0x00,0x00,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x9B,0xFF,0xFF,0xFF ,0xFF,0x01,0xE1,0xE1,0xE1,0xFF,0x72,0x72,0x72,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF ,0x00,0x8B,0x8B,0x8B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x96 ,0x8D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83,0x00,0x00,0x00,0xFF ,0x00,0x39,0x39,0x39,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0x4E,0x4E,0x4E,0xFF ,0xF8,0xF8,0xF8,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x6A,0x6A,0x6A,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0xB1,0x00,0x00,0x00,0x00,0xB1 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x83,0x83,0x83,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xE6,0xE6,0xE6,0xFF,0x9C ,0xFF,0xFF,0xFF,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x40,0x8D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00 ,0x00,0x00,0xEB,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE4,0xE4 ,0xE4,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0x9A,0xFF,0xFF ,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x17,0x17,0x17,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x22,0xB1,0x00,0x00,0x00,0x00,0xB1,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x36,0x83,0x00,0x00,0x00,0xFF,0x00,0x2D,0x2D,0x2D ,0xFF,0xB9,0xFF,0xFF,0xFF,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00,0x00,0xFF,0x00,0x91,0x91,0x91,0xFF ,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0xBC,0xBC,0xBC,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xCB,0xB2,0x00,0x00,0x00,0x00,0xB2,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xDF,0x83,0x00,0x00,0x00,0xFF,0x00,0xD7,0xD7,0xD7,0xFF ,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x93,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x3E,0x3E,0x3E,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF ,0x00,0x65,0x65,0x65,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x74 ,0xB2,0x00,0x00,0x00,0x00,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A ,0x83,0x00,0x00,0x00,0xFF,0x00,0x80,0x80,0x80,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF ,0x00,0x32,0x32,0x32,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3D ,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE8,0xE8,0xE8,0xFF,0xB6,0xFF ,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x13,0x13,0x13,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0xB2,0x00,0x00,0x00 ,0x00,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x2A,0x2A,0x2A,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x01 ,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF ,0x00,0x97,0x97,0x97,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0xB7,0xB7,0xB7,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC6,0xB3,0x00,0x00,0x00,0x00 ,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDD,0x83,0x00,0x00,0x00,0xFF ,0x00,0xD4,0xD4,0xD4,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00,0xFF,0x00,0x43,0x43,0x43,0xFF ,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x60,0x60,0x60,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x6F,0xB3,0x00,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x87,0x83,0x00,0x00,0x00,0xFF,0x00,0x7E,0x7E,0x7E,0xFF ,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x2F,0x2F,0x2F,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x3A,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07 ,0x00,0x00,0x00,0xF2,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEC ,0xEC,0xEC,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10 ,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 ,0x1A,0xB3,0x00,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x31,0x83,0x00,0x00,0x00,0xFF,0x00,0x27,0x27,0x27,0xFF,0xB5,0xFF,0xFF,0xFF ,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE3,0x00,0x00,0x00,0x01,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF ,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC1 ,0xB4,0x00,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA ,0x83,0x00,0x00,0x00,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF ,0x00,0x82,0x82,0x82,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E ,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00,0x00,0x00,0xFF ,0x00,0x48,0x48,0x48,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0x5B,0x5B,0x5B,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6A,0xB4,0x00,0x00,0x00,0x00 ,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x83,0x00,0x00,0x00,0xFF ,0x00,0x7B,0x7B,0x7B,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x38,0x93,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x05,0x05,0x05,0xFF,0xEF,0xEF,0xEF,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF,0x01,0xF7 ,0xF7,0xF7,0xFF,0x0D,0x0D,0x0D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xFC,0x00,0x00,0x00,0x16,0xB4,0x00,0x00,0x00,0x00,0xB4,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x2E,0x83,0x00,0x00,0x00,0xFF,0x00,0x25,0x25,0x25 ,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xE1,0x00,0x00,0x00,0x01,0x94,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF ,0xB2,0xFF,0xFF,0xFF,0xFF,0x00,0xAD,0xAD,0xAD,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xBC,0xB5,0x00,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xD7,0x83,0x00,0x00,0x00,0xFF,0x00,0xCE,0xCE,0xCE,0xFF ,0xB2,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0x7F,0x7F,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x8B,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF ,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65 ,0xB5,0x00,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x78,0x78,0x78,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF ,0x00,0x29,0x29,0x29,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x35 ,0x95,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF7,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF2,0xF2,0xF2,0xFF,0xB0,0xFF ,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0A,0x0A,0x0A,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x13,0xB5,0x00,0x00,0x00 ,0x00,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x22,0x22,0x22,0xFF,0xB1,0xFF,0xFF,0xFF,0xFF,0x00,0xD3,0xD3,0xD3 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDE,0x97,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xA6,0xA6,0xA6 ,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xB7,0xB6,0x00,0x00,0x00,0x00,0xB6,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xD5,0x83,0x00,0x00,0x00,0xFF,0x00,0xCC,0xCC,0xCC ,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0x7D,0x7D,0x7D,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x89,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x5C,0x83,0x00,0x00,0x00,0xFF,0x00,0x53,0x53,0x53,0xFF,0xB0,0xFF,0xFF,0xFF ,0xFF,0x00,0x51,0x51,0x51,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x60,0xB6,0x00,0x00,0x00,0x00,0xB6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x7E,0x83,0x00,0x00,0x00,0xFF,0x00,0x75,0x75,0x75,0xFF,0xB0,0xFF,0xFF,0xFF ,0xFF,0x00,0x27,0x27,0x27,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x33,0x97,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF9 ,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0xF5,0xF5,0xF5,0xFF,0xAE ,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x10,0xB6,0x00,0x00 ,0x00,0x00,0xB6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x20,0x20,0x20,0xFF,0xAF,0xFF,0xFF,0xFF,0xFF,0x00,0xD0,0xD0 ,0xD0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDC,0x99,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC ,0xAC,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0xA3,0xA3,0xA3,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xB2,0xB7,0x00,0x00,0x00,0x00,0xB7,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xD2,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9,0xC9 ,0xC9,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0x7A,0x7A,0x7A,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x61,0x83,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF,0xAE,0xFF,0xFF ,0xFF,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x5B,0xB7,0x00,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x73,0x73,0x73,0xFF,0xAE,0xFF,0xFF ,0xFF,0xFF,0x00,0x24,0x24,0x24,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x30,0x99,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00 ,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF ,0xAC,0xFF,0xFF,0xFF,0xFF,0x01,0xEF,0xEF,0xEF,0xFF,0x06,0x06,0x06,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x0D,0xB7,0x00 ,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x1E,0x1E,0x1E,0xFF,0xFE,0xFE,0xFE,0xFF,0xAC,0xFF,0xFF ,0xFF,0xFF,0x00,0xCD,0xCD,0xCD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xD9,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E ,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAD,0xB8,0x00,0x00 ,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x77,0x77 ,0x77,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x9B,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x83,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D ,0x5D,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x47,0x47,0x47,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x56,0xB8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x83,0x00,0x00,0x00,0xFF,0x00,0x70,0x70 ,0x70,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x21,0x21,0x21,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D,0x9B,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x16,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10 ,0xFF,0xFA,0xFA,0xFA,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x01,0xEC,0xEC,0xEC,0xFF ,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00 ,0x00,0x00,0x0A,0xB8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF,0x01,0x1B,0x1B,0x1B,0xFF,0xFE,0xFE ,0xFE,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xD7,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xC0,0x83,0x00,0x00,0x00,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0xAA,0xFF,0xFF ,0xFF,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xA8,0xB9,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xCC,0x83,0x00,0x00,0x00,0xFF,0x00,0xC3,0xC3,0xC3,0xFF,0xAA,0xFF,0xFF ,0xFF,0xFF,0x00,0x74,0x74,0x74,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x81,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x62,0x62,0x62,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0x42 ,0x42,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0xB9,0x00,0x00 ,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0x1F,0x1F ,0x1F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2B,0x9D,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF ,0x01,0xE8,0xE8,0xE8,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x08,0xB9,0x00,0x00,0x00,0x00,0xB9,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x83,0x00,0x00,0x00,0xFF,0x01,0x19 ,0x19,0x19,0xFF,0xFD,0xFD,0xFD,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8 ,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD4,0x9F,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0x83,0x00,0x00,0x00,0xFF,0x00,0xBB,0xBB ,0xBB,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0x94,0x94,0x94,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3,0xBA,0x00,0x00,0x00,0x00,0xBA,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00,0x00,0xFF,0x00,0xC1,0xC1 ,0xC1,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0x72,0x72,0x72,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x71,0x83,0x00,0x00,0x00,0xFF,0x00,0x68,0x68,0x68,0xFF,0xA8,0xFF,0xFF ,0xFF,0xFF,0x00,0x3D,0x3D,0x3D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x4C,0xBA,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x73,0x83,0x00,0x00,0x00,0xFF,0x00,0x6A,0x6A,0x6A,0xFF,0xA7,0xFF,0xFF ,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1D,0x1D,0x1D,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x28,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x1E,0x83,0x00,0x00,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD,0xFF ,0xA6,0xFF,0xFF,0xFF,0xFF,0x01,0xE4,0xE4,0xE4,0xFF,0x01,0x01,0x01,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x06,0xBA,0x00 ,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00 ,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD ,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xD2,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xCA,0x83,0x00,0x00,0x00,0xFF,0x00,0xC1,0xC1,0xC1,0xFF,0xA6,0xFF,0xFF,0xFF ,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x9E,0xBB,0x00,0x00,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xC7,0x83,0x00,0x00,0x00,0xFF,0x00,0xBE,0xBE,0xBE,0xFF,0xA6,0xFF,0xFF,0xFF ,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x7B,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF,0x00,0x38,0x38,0x38 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x47,0xBB,0x00,0x00,0x00 ,0x00,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x68,0x68,0x68,0xFF,0xA5,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE ,0xFF,0x1A,0x1A,0x1A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x25 ,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF ,0x01,0x1B,0x1B,0x1B,0xFF,0xFE,0xFE,0xFE,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x01 ,0xE0,0xE0,0xE0,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xEC,0x00,0x00,0x00,0x04,0xBB,0x00,0x00,0x00,0x00,0xBB,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x15,0x15,0x15,0xFF,0xFC,0xFC,0xFC,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF ,0x00,0xC2,0xC2,0xC2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF ,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF ,0x00,0xC6,0xC6,0xC6,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x8A,0x8A,0x8A,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x99,0xBC,0x00,0x00,0x00,0x00 ,0xBC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x83,0x00,0x00,0x00,0xFF ,0x00,0xBB,0xBB,0xBB,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x6C,0x6C,0x6C,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0xA3,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72,0x72,0xFF ,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x33,0x33,0x33,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x42,0xBC,0x00,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF,0x00,0x65,0x65,0x65,0xFF ,0xA3,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x18,0x18,0x18,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x23,0xA3,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x28,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F,0x1F,0xFF,0xA3 ,0xFF,0xFF,0xFF,0xFF,0x00,0xDC,0xDC,0xDC,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x03,0xBC,0x00,0x00,0x00,0x00,0xBC,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFD,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0xA2,0xFF,0xFF,0xFF ,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xCC,0xA5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0xBD,0x00,0x00,0x00 ,0x00,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xB9,0xB9,0xB9,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x76,0xA5,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x77,0x77,0x77 ,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x2E,0x2E,0x2E,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x3D,0xBD,0x00,0x00,0x00,0x00,0xBD,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00,0x00,0xFF,0x00,0x62,0x62,0x62 ,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x16,0x16,0x16,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x21,0xA5,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x24,0x24,0x24,0xFF ,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xD7,0xD7,0xD7,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x01,0xBD,0x00,0x00,0x00,0x00,0xBD ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xFD,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x11,0x11,0x11,0xFF,0xFA,0xFA,0xFA,0xFF,0xA0,0xFF,0xFF ,0xFF,0xFF,0x00,0xBD,0xBD,0xBD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xCA,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xD0,0xD0,0xD0,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80 ,0x80,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0xBE,0x00,0x00 ,0x00,0x00,0xBE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x66,0x66 ,0x66,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x74,0xA7,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x83,0x00,0x00,0x00,0xFF,0x00,0x7D,0x7D ,0x7D,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x29,0x29,0x29,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x38,0xBE,0x00,0x00,0x00,0x00,0xBE,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x83,0x00,0x00,0x00,0xFF,0x00,0x60,0x60 ,0x60,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x14,0x14,0x14 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E ,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00,0xFF ,0x00,0x29,0x29,0x29,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xD2,0xD2,0xD2,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x01,0xBE ,0x00,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x00 ,0x00,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0xF9,0xF9 ,0xF9,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xBA,0xBA,0xBA,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xC7,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xDE,0x83,0x00,0x00,0x00,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x9E,0xFF,0xFF ,0xFF,0xFF,0x00,0x7B,0x7B,0x7B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x8A,0xBF,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xBC,0x83,0x00,0x00,0x00,0xFF,0x00,0xB3,0xB3,0xB3,0xFF,0x9E,0xFF,0xFF ,0xFF,0xFF,0x00,0x64,0x64,0x64,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x71,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x24,0x24 ,0x24,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x33,0xBF,0x00,0x00 ,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFB,0xFB ,0xFB,0xFF,0x12,0x12,0x12,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xFE,0x00,0x00,0x00,0x1C,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x2E,0x2E,0x2E,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF ,0x00,0xCD,0xCD,0xCD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDC ,0xC0,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13 ,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0E,0x0E,0x0E,0xFF,0xF8 ,0xF8,0xF8,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xB7,0xB7,0xB7,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4,0xAA,0x00,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00,0xDB,0xDB ,0xDB,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x76,0x76,0x76,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x83,0x00,0x00,0x00,0xFF,0x00,0xB0,0xB0 ,0xB0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x61,0x61,0x61,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x6E,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x91,0x83,0x00,0x00,0x00,0xFF,0x00,0x87,0x87,0x87,0xFF,0x9C,0xFF,0xFF ,0xFF,0xFF,0x00,0x20,0x20,0x20,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x2F,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x00,0x5A,0x5A,0x5A,0xFF,0x9B,0xFF,0xFF ,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1A,0xAB,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x3D,0x83,0x00,0x00,0x00,0xFF,0x00,0x34,0x34,0x34,0xFF ,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xD7,0xC1,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFA,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xB4 ,0xB4,0xB4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC2,0xAC,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE7,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x71,0x71 ,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x81,0xC1,0x00,0x00 ,0x00,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB6,0x83,0x00,0x00 ,0x00,0xFF,0x00,0xAE,0xAE,0xAE,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x5E,0x5E ,0x5E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6C,0xAD,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x83,0x00,0x00,0x00,0xFF,0x00,0x8C,0x8C ,0x8C,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1C,0x1C,0x1C ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2A,0xC1,0x00,0x00,0x00 ,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x57,0x57,0x57,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8 ,0xFF,0x0F,0x0F,0x0F,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD ,0x00,0x00,0x00,0x18,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x00 ,0xC3,0xC3,0xC3,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD3,0xC2 ,0x00,0x00,0x00,0x00,0xC1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00 ,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF5,0xF5 ,0xF5,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xBF,0xAE,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x03,0x00,0x00,0x00,0xEB,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01 ,0xFF,0xE4,0xE4,0xE4,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0x6C,0x6C,0x6C,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7C,0xC2,0x00,0x00,0x00,0x00 ,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB3,0x83,0x00,0x00,0x00,0xFF ,0x00,0xAB,0xAB,0xAB,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0x5B,0x5B,0x5B,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0xAF,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00,0x00,0xFF,0x00,0x92,0x92,0x92,0xFF ,0x97,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x18,0x18,0x18,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x25,0xC2,0x00,0x00,0x00,0x00,0xC2 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x55,0x55,0x55,0xFF,0x97,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0D ,0x0D,0x0D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00 ,0x00,0x16,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x3E,0x3E,0x3E,0xFF,0x97,0xFF,0xFF,0xFF,0xFF,0x00,0xBE,0xBE ,0xBE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCE,0xC3,0x00,0x00 ,0x00,0x00,0xC2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00,0x00 ,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0xF4,0xF4,0xF4,0xFF ,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0xAF,0xAF,0xAF,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xBC,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05 ,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE8 ,0xE8,0xE8,0xFF,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0x67,0x67,0x67,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0xC3,0x00,0x00,0x00,0x00,0xC3,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xA8 ,0xA8,0xA8,0xFF,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0x59,0x59,0x59,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x66,0xB1,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x97,0x97,0x97,0xFF,0x95,0xFF ,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x14,0x14,0x14,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x20,0xC3,0x00,0x00,0x00,0x00,0xC3,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x83,0x00,0x00,0x00,0xFF,0x00,0x52,0x52 ,0x52,0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C,0x0C,0x0C ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x14 ,0xB1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00,0xFF ,0x00,0x43,0x43,0x43,0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0x00,0xB9,0xB9,0xB9,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC9,0xC4,0x00,0x00,0x00,0x00 ,0xC3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xF7,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x08,0x08,0x08,0xFF,0xF3,0xF3,0xF3,0xFF,0x94,0xFF ,0xFF,0xFF,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xBA,0xB2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00 ,0x00,0xF2,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC,0xEC ,0xFF,0x94,0xFF,0xFF,0xFF,0xFF,0x00,0x62,0x62,0x62,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x72,0xC4,0x00,0x00,0x00,0x00,0xC4,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00,0x00,0x00,0xFF,0x00,0xA5,0xA5,0xA5 ,0xFF,0x94,0xFF,0xFF,0xFF,0xFF,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x64,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xA6,0x83,0x00,0x00,0x00,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x93,0xFF,0xFF,0xFF ,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1C,0xC4,0x00,0x00,0x00,0x00,0xC4 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x4F,0x4F,0x4F,0xFF,0x93,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0A ,0x0A,0x0A,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00 ,0x00,0x12,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x49,0x49,0x49,0xFF,0x93,0xFF,0xFF,0xFF,0xFF,0x00,0xB4,0xB4 ,0xB4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4,0xC5,0x00,0x00 ,0x00,0x00,0xC4,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00 ,0xF5,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF1,0xF1,0xF1,0xFF ,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0xA9,0xA9,0xA9,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB7,0xB4,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x09 ,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF,0xEF ,0xEF,0xEF,0xFF,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6D,0xC5,0x00,0x00,0x00,0x00,0xC5,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA3 ,0xA3,0xA3,0xFF,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0x53,0x53,0x53,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0xB5,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x91,0xFF ,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0E,0x0E,0x0E,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x18,0xC5,0x00,0x00,0x00 ,0x00,0xC5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0x91,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3 ,0xFF,0x09,0x09,0x09,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA ,0x00,0x00,0x00,0x11,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0x91,0xFF,0xFF,0xFF,0xFF,0x00 ,0xAF,0xAF,0xAF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBF,0xC6 ,0x00,0x00,0x00,0x00,0xC5,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00 ,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x06,0x06,0x06,0xFF,0xEF,0xEF ,0xEF,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0xA6,0xA6,0xA6,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xB5,0xB6,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x0C,0x00,0x00,0x00,0xF7,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07 ,0xFF,0xF2,0xF2,0xF2,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x58,0x58,0x58,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x68,0xC6,0x00,0x00,0x00,0x00 ,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF ,0x00,0xA0,0xA0,0xA0,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x50,0x50,0x50,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5E,0xB7,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xA7,0xA7,0xA7,0xFF ,0x8F,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0B,0x0B,0x0B,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x15,0xC6,0x00 ,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0x01,0xF2 ,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xF9,0x00,0x00,0x00,0x0F,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x5C,0x83,0x00,0x00,0x00,0xFF,0x00,0x53,0x53,0x53,0xFF,0x8F,0xFF,0xFF,0xFF ,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xBA,0xC7,0x00,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x08,0x00,0x00,0x00,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF ,0xEE,0xEE,0xEE,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0xA4,0xA4,0xA4,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB2,0xB8,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A ,0x0A,0x0A,0xFF,0xF5,0xF5,0xF5,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0x53,0x53 ,0x53,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x63,0xC7,0x00,0x00 ,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x9D,0x9D,0x9D,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x4D ,0x4D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5C,0xB9,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC ,0xAC,0xFF,0x8D,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x09,0x09,0x09 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x12 ,0xC7,0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4F ,0x83,0x00,0x00,0x00,0xFF,0x00,0x47,0x47,0x47,0xFF,0x8D,0xFF,0xFF,0xFF,0xFF ,0x01,0xF0,0xF0,0xF0,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x0D,0xB9,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF,0x8D,0xFF ,0xFF,0xFF,0xFF,0x00,0xA5,0xA5,0xA5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xB5,0xC8,0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0x07,0x00,0x00,0x00,0xF1,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04 ,0x04,0xFF,0xEC,0xEC,0xEC,0xFF,0x8C,0xFF,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1 ,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAF,0xBA,0x00,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF ,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF,0x8C,0xFF,0xFF,0xFF,0xFF,0x00 ,0x4E,0x4E,0x4E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5E,0xC8 ,0x00,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x9A,0x9A,0x9A,0xFF,0x8C,0xFF,0xFF,0xFF,0xFF,0x00 ,0x4B,0x4B,0x4B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x59,0xBB ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x83,0x00,0x00,0x00,0xFF,0x00 ,0xB1,0xB1,0xB1,0xFF,0x8B,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x07 ,0x07,0x07,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00 ,0x00,0x0E,0xC8,0x00,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x4C,0x83,0x00,0x00,0x00,0xFF,0x00,0x44,0x44,0x44,0xFF,0x8B,0xFF,0xFF ,0xFF,0xFF,0x01,0xEE,0xEE,0xEE,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0xBB,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x67,0x83,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF ,0x8B,0xFF,0xFF,0xFF,0xFF,0x00,0xA0,0xA0,0xA0,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB0,0xC9,0x00,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xEF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x03,0x03,0x03,0xFF,0xEA,0xEA,0xEA,0xFF,0x8A,0xFF,0xFF,0xFF,0xFF,0x00,0x9E ,0x9E,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAD,0xBC,0x00 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xFD,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0xFA,0xFA,0xFA,0xFF,0x8A,0xFF,0xFF,0xFF ,0xFF,0x00,0x49,0x49,0x49,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x59,0xC9,0x00,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x98,0x98,0x98,0xFF,0x8A,0xFF,0xFF,0xFF ,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x56,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0x89,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED ,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6 ,0x00,0x00,0x00,0x0C,0xC9,0x00,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x49,0x83,0x00,0x00,0x00,0xFF,0x00,0x41,0x41,0x41,0xFF,0x89 ,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF5,0x00,0x00,0x00,0x0B,0xBD,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63 ,0x63,0xFF,0x89,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B,0x9B,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xAB,0xCA,0x00,0x00,0x00,0x00,0xC9,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE8,0xE8,0xE8,0xFF,0x88,0xFF,0xFF,0xFF,0xFF ,0x00,0x9B,0x9B,0x9B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAA ,0xBE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFE,0x82 ,0x00,0x00,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0x88,0xFF ,0xFF,0xFF,0xFF,0x00,0x44,0x44,0x44,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x54,0xCA,0x00,0x00,0x00,0x00,0xCA,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x00,0x95,0x95,0x95,0xFF,0x88,0xFF ,0xFF,0xFF,0xFF,0x00,0x45,0x45,0x45,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x54,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0x83,0x00 ,0x00,0x00,0xFF,0x00,0xBC,0xBC,0xBC,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x01,0xE9 ,0xE9,0xE9,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xF3,0x00,0x00,0x00,0x09,0xCA,0x00,0x00,0x00,0x00,0xCA,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x3F,0x3F,0x3F ,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x01,0xEB,0xEB,0xEB,0xFF,0x04,0x04,0x04,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x09,0xBF ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x68,0x68,0x68,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x00,0x96,0x96,0x96,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6,0xCB,0x00,0x00,0x00,0x00,0xCA ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE6,0xE6,0xE6,0xFF,0x86,0xFF,0xFF ,0xFF,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xA7,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD,0xFF,0x86,0xFF,0xFF,0xFF ,0xFF,0x00,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x4F,0xCB,0x00,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x9A,0x83,0x00,0x00,0x00,0xFF,0x00,0x92,0x92,0x92,0xFF,0x86,0xFF,0xFF,0xFF ,0xFF,0x00,0x42,0x42,0x42,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x51,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00,0x00 ,0xFF,0x00,0xC1,0xC1,0xC1,0xFF,0x85,0xFF,0xFF,0xFF,0xFF,0x01,0xE6,0xE6,0xE6 ,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1 ,0x00,0x00,0x00,0x07,0xCB,0x00,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x3C,0x3C,0x3C,0xFF,0x85 ,0xFF,0xFF,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x08,0xC1,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x83,0x00,0x00,0x00,0xFF,0x00,0x6D,0x6D ,0x6D,0xFF,0x85,0xFF,0xFF,0xFF,0xFF,0x00,0x91,0x91,0x91,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0xCC,0x00,0x00,0x00,0x00,0xCB,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEA,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE4,0xE4,0xE4,0xFF,0x84,0xFF,0xFF,0xFF,0xFF ,0x00,0x96,0x96,0x96,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA5 ,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF ,0x01,0x1B,0x1B,0x1B,0xFF,0xFE,0xFE,0xFE,0xFF,0x84,0xFF,0xFF,0xFF,0xFF,0x00 ,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4A,0xCC ,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x84,0xFF,0xFF,0xFF,0xFF,0x00 ,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0xC3 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0xC6,0xC6,0xC6,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0x01,0xE2,0xE2,0xE2,0xFF,0x01 ,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00 ,0x00,0x05,0xCC,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x41,0x83,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF,0x83,0xFF,0xFF ,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x07,0xC3,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72,0x72,0xFF ,0x83,0xFF,0xFF,0xFF,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x9C,0xCD,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE8,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x01,0x01,0x01,0xFF,0xE2,0xE2,0xE2,0xFF,0x82,0xFF,0xFF,0xFF,0xFF,0x00,0x93 ,0x93,0x93,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA2,0xC4,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F ,0x1F,0x1F,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0x00,0x35,0x35,0x35,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0xCD,0x00,0x00,0x00,0x00,0xCD,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x83,0x00,0x00,0x00,0xFF,0x00,0x8D ,0x8D,0x8D,0xFF,0x82,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0x3D,0x3D,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0xC5,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xD5,0x83,0x00,0x00,0x00,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x81,0xFF ,0xFF,0xFF,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xEA,0x00,0x00,0x00,0x03,0xCD,0x00,0x00,0x00,0x00,0xCD,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x83,0x00,0x00,0x00,0xFF,0x00,0x36,0x36 ,0x36,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0x01,0xE5,0xE5,0xE5,0xFF,0x01,0x01,0x01 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x06 ,0xC5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF ,0x00,0x78,0x78,0x78,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0x00,0x87,0x87,0x87,0xFF ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x97,0xCE,0x00,0x00,0x00,0x00 ,0xCD,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x83 ,0x00,0x00,0x00,0xFF,0x02,0xDF,0xDF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0x90,0x90 ,0x90,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9F,0xC6,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x24,0x24 ,0x24,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0xCE,0x00,0x00,0x00,0x00,0xCE,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x83,0x00,0x00,0x00,0xFF,0x02,0x8A,0x8A ,0x8A,0xFF,0xFF,0xFF,0xFF,0xFF,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x49,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA ,0x83,0x00,0x00,0x00,0xFF,0x01,0xD0,0xD0,0xD0,0xFF,0xD9,0xD9,0xD9,0xFF,0x83 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x02,0xCE,0x00 ,0x00,0x00,0x00,0xCE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x83,0x00 ,0x00,0x00,0xFF,0x02,0x34,0x34,0x34,0xFF,0xE2,0xE2,0xE2,0xFF,0x01,0x01,0x01 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x05 ,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x83,0x00,0x00,0x00,0xFF ,0x01,0x7D,0x7D,0x7D,0xFF,0x82,0x82,0x82,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x92,0xCF,0x00,0x00,0x00,0x00,0xCE,0x00,0x00,0x00,0x00,0x01 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00,0x6B ,0x6B,0x6B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0xC8,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00,0xFF,0x01,0x29 ,0x29,0x29,0xFF,0x2B,0x2B,0x2B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x3B,0xCF,0x00,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x8F,0x83,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0x01,0xFF,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x46,0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xDF,0x87,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00 ,0x01,0xCF,0x00,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x39,0x87,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x04 ,0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x87,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x8D,0xD0,0x00,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE1,0x86,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x9A,0xCA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x87 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x37,0xD0,0x00,0x00,0x00,0x00,0xD0 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x86,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x44,0xCA,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0xE3,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDF,0xD1,0x00 ,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x85,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEA,0x00,0x00,0x00,0x03,0xCB,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x89,0xD1,0x00,0x00,0x00,0x00,0xD1,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xDF,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x97,0xCC,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x32,0xD1,0x00,0x00,0x00,0x00,0xD1,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x89,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x41,0xCC,0x00,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE7,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xDA,0xD2,0x00,0x00,0x00,0x00,0xD1,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE8,0x00,0x00,0x00,0x02,0xCD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x84,0xD2,0x00,0x00,0x00,0x00 ,0xD2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x95,0xCE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D,0xD2,0x00,0x00,0x00,0x00 ,0xD2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x3F,0xCE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03 ,0x00,0x00,0x00,0xEB,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD5,0xD3 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49,0x4F,0x4E,0x2D,0x58,0x46 ,0x49,0x4C,0x45,0x2E,0x00}; /* end binary data. size = 27965 bytes */ /* begin binary data: */ const int project_bytes = 39085; const unsigned char project_data[] = /* 39085 */ {0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x01,0xB9 ,0x01,0x20,0x08,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xB2,0xFF ,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x90,0x00,0x00,0x00 ,0xD0,0x00,0x02,0x02,0xE9,0x00,0x00,0x00,0xFD,0x95,0x00,0x00,0x00,0xFF,0x05 ,0x00,0x01,0x01,0xF7,0x00,0x01,0x01,0xDB,0x00,0x00,0x00,0xBE,0x00,0x00,0x00 ,0xA3,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x17,0xFF,0xFF,0xFF,0xFF,0x00,0xE4 ,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xB0,0xFF,0xFF,0xFF,0x00,0x06 ,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0xFF,0x02,0x15,0x19,0xFE,0x03,0x2C,0x35,0xFF,0x05,0x3A,0x46,0xFF,0x95,0x05 ,0x3B,0x47,0xFF,0x02,0x04,0x37,0x41,0xFF,0x03,0x23,0x2A,0xFF,0x01,0x0D,0x0F ,0xFD,0x81,0x00,0x00,0x00,0xFF,0x03,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0xAA ,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0xE1,0xFF ,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xB0,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x65,0x00,0x00,0x00,0xFF,0x04,0x35,0x3F,0xFF,0x0C,0x93,0xAF,0xFF ,0x9B,0x0F,0xBF,0xE4,0xFF,0x06,0x0F,0xB9,0xDD,0xFF,0x0A,0x82,0x9B,0xFF,0x04 ,0x35,0x3F,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xCE ,0x00,0x00,0x00,0x2F,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xFF,0xFF,0xFF,0x00,0xFF ,0xFF,0xFF,0xFF,0x00,0xB0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x72,0x00 ,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x9F,0x0F,0xBF,0xE4,0xFF,0x05,0x0D,0xA8 ,0xC8,0xFF,0x07,0x56,0x67,0xFF,0x00,0x02,0x03,0xFE,0x00,0x01,0x01,0xFB,0x00 ,0x00,0x00,0x80,0x00,0x00,0x00,0x05,0xFF,0xFF,0xFF,0xFF,0x00,0xDE,0xFF,0xFF ,0xFF,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x33,0x00,0x00,0x00 ,0x92,0x00,0x00,0x00,0xC7,0x90,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00,0x30 ,0xFF,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x35 ,0x00,0x00,0x00,0xFF,0x07,0x5D,0x6F,0xFF,0xA1,0x0F,0xBF,0xE4,0xFF,0x04,0x0C ,0x9A,0xB7,0xFF,0x03,0x23,0x29,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD2 ,0x00,0x00,0x00,0x28,0xFF,0xFF,0xFF,0xFF,0x00,0xDD,0xFF,0xFF,0xFF,0x00,0x81 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x7C,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x01,0x10,0x13,0xFD,0x8D,0x02,0x16,0x1A,0xFD,0x00,0x01,0x09,0x0B,0xFE,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x01,0x01,0x64,0xFF,0xFF,0xFF,0xFF,0x00,0x98 ,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xF2,0x02,0x1F ,0x26,0xFE,0x0F,0xBE,0xE3,0xFF,0xA1,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBB,0xE0 ,0xFF,0x08,0x61,0x73,0xFF,0x00,0x03,0x03,0xFE,0x00,0x01,0x01,0xED,0x00,0x00 ,0x00,0x35,0xFF,0xFF,0xFF,0xFF,0x00,0xDC,0xFF,0xFF,0xFF,0x00,0x04,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xFF,0x03,0x24,0x2B,0xFE,0x0C ,0x97,0xB4,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB8,0xDC,0xFF,0x01,0x0F ,0x12,0xFD,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x45,0xFF,0xFF,0xFF,0xFF,0x00 ,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0xFF,0x0B ,0x86,0xA0,0xFF,0xA3,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x89,0xA4,0xFF,0x00,0x06 ,0x08,0xFD,0x00,0x01,0x01,0xF4,0x00,0x00,0x00,0x42,0xFF,0xFF,0xFF,0xFF,0x00 ,0xDB,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0xFD,0x02 ,0x1E,0x24,0xFE,0x0E,0xB2,0xD4,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xAC ,0xCD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x98,0xFF,0xFF,0xFF,0xFF,0x00 ,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x01,0x01,0xFA,0x03 ,0x2C,0x34,0xFF,0xA4,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x93,0xAF,0xFF,0x01,0x0A ,0x0C,0xFD,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x50,0xFF,0xFF,0xFF,0xFF,0x00 ,0xDA,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAC,0x00,0x01,0x01,0xFF,0x0D ,0xA5,0xC5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9,0xCA,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x8D,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0xFF,0x0C,0x93,0xAF,0xFF,0xA4 ,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x9B,0xB9,0xFF,0x01,0x0F,0x12,0xFD,0x00,0x01 ,0x01,0xF9,0x00,0x00,0x00,0x2F,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0xD7,0x02,0x1A,0x1F,0xFE,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0E,0xAF,0xD1,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAE,0xFF,0xFF ,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x27,0x00,0x00 ,0x00,0xFD,0x04,0x39,0x44,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x98,0xB6 ,0xFF,0x00,0x03,0x04,0xFE,0x00,0x01,0x01,0xD7,0x00,0x00,0x00,0x0A,0xFF,0xFF ,0xFF,0xFF,0x00,0xD8,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xED,0x03,0x21 ,0x28,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x31,0x3B,0xFF,0x00,0x01,0x01 ,0xFB,0x00,0x00,0x00,0x16,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0C,0x9E,0xBD,0xFF,0xA5,0x0F ,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xD8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x99,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x74,0xFF,0xFF,0xFF ,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x36,0x00,0x00,0x00 ,0xFF,0x05,0x46,0x53,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF ,0x04,0x35,0x3F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x53,0xFF,0xFF,0xFF ,0xFF,0x00,0xD7,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00 ,0xFF,0x07,0x55,0x66,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBA,0xDE,0xFF ,0x01,0x0C,0x0F,0xFE,0x00,0x01,0x01,0xD8,0xFF,0xFF,0xFF,0xFF,0x00,0x9D,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBF,0x00,0x02,0x03,0xFE,0x0D,0xA8,0xC8 ,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xAE,0xCF,0xFF,0x01,0x0F,0x12,0xFD ,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0x08,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xFF ,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x01,0xD9,0x01,0x0F,0x12 ,0xFD,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x52,0x62,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3B,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0xFF,0x06,0x52,0x61 ,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x69,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xFF,0xFF,0xFF,0x00,0x03 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9E ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBC,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x9D,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x01,0x01,0xD0,0x01,0x07,0x08,0xFE,0x0E,0xB0,0xD2,0xFF,0xA5,0x0F,0xBF ,0xE4,0xFF,0x03,0x0E,0xB8,0xDC,0xFF,0x01,0x0E,0x11,0xFD,0x00,0x01,0x01,0xDE ,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x03 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xFD,0x05,0x3D,0x48 ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x28,0x30,0xFF,0x00,0x01,0x01,0xF5 ,0x00,0x00,0x00,0x0D,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0xFF,0x07,0x5E,0x71,0xFF,0x81,0x0F,0xBF ,0xE4,0xFF,0x08,0x0E,0xB4,0xD7,0xFF,0x0B,0x91,0xAD,0xFF,0x0B,0x88,0xA2,0xFF ,0x0B,0x88,0xA3,0xFF,0x0B,0x91,0xAD,0xFF,0x0C,0x9A,0xB8,0xFF,0x0D,0xA3,0xC3 ,0xFF,0x0E,0xAC,0xCE,0xFF,0x0E,0xB6,0xD9,0xFF,0x9B,0x0F,0xBF,0xE4,0xFF,0x02 ,0x08,0x62,0x75,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x59,0xFF,0xFF,0xFF ,0xFF,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xB8,0x00,0x03,0x04,0xFE,0x0E,0xB0,0xD2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x09,0x73,0x8A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x66,0xFF,0xFF ,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x01 ,0x01,0xDF,0x01,0x0D,0x0F,0xFE,0x0C,0x9E,0xBD,0xFF,0x06,0x4A,0x59,0xFF,0x01 ,0x07,0x09,0xFE,0x87,0x00,0x00,0x00,0xFF,0x08,0x00,0x02,0x02,0xFF,0x01,0x0D ,0x0F,0xFD,0x02,0x1A,0x1E,0xFE,0x03,0x26,0x2E,0xFF,0x04,0x32,0x3C,0xFF,0x05 ,0x3F,0x4B,0xFF,0x06,0x4B,0x59,0xFF,0x08,0x69,0x7D,0xFF,0x0E,0xB6,0xD9,0xFF ,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x01,0x08,0x0A,0xFE,0x00 ,0x01,0x01,0xD1,0xFF,0xFF,0xFF,0xFF,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x81,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0xFF,0x08,0x6C,0x81 ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF,0x01,0x07,0x09,0xFE ,0x00,0x00,0x00,0xC9,0xFF,0xFF,0xFF,0xFF,0x00,0x9D,0xFF,0xFF,0xFF,0x00,0x11 ,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x00,0x01,0x02,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x01,0xC5,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x60,0x00,0x00 ,0x00,0x5E,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x82,0x00 ,0x00,0x00,0x8F,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0xAE,0x00,0x00,0x00,0xC0 ,0x00,0x00,0x00,0xD2,0x00,0x01,0x01,0xE4,0x00,0x01,0x01,0xF6,0x82,0x00,0x00 ,0x00,0xFF,0x02,0x01,0x0F,0x11,0xFD,0x08,0x6A,0x7F,0xFF,0x0F,0xB9,0xDD,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x56,0x67,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x45,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xFF,0xFF,0xFF,0x00,0x81,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x01,0x01,0xF0,0x03,0x23,0x2A ,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x49,0x58,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x2D,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0x09,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x75,0x8D,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x19 ,0x00,0x00,0x00,0x6D,0x00,0x01,0x01,0xE8,0x00,0x00,0x00,0xFF,0x02,0x1F,0x25 ,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA6,0xC6,0xFF ,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA9,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xFF ,0xFF,0xFF,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x97,0x00,0x00 ,0x00,0xFF,0x0C,0x9B,0xB9,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x94,0xB1 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x9D ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x79,0x00,0x04,0x04,0xDA,0x00,0x00 ,0x00,0x3D,0x90,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00 ,0x99,0x00,0x00,0x00,0xFF,0x09,0x75,0x8B,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 ,0x04,0x33,0x3D,0xFF,0x00,0x01,0x01,0xFA,0x00,0x00,0x00,0x13,0xFF,0xFF,0xFF ,0xFF,0x00,0xD3,0xFF,0xFF,0xFF,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x36,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0x91,0x0F,0xBF,0xE4,0xFF ,0x02,0x02,0x1F,0x25,0xFE,0x00,0x01,0x02,0xEE,0x00,0x00,0x00,0x07,0xFF,0xFF ,0xFF,0xFF,0x00,0xB1,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x01 ,0x02,0xEE,0x02,0x16,0x1B,0xFE,0x0F,0xBB,0xDF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0A,0x7D,0x95,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x70,0xFF,0xFF ,0xFF,0xFF,0x00,0xD3,0xFF,0xFF,0xFF,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x01,0x01,0xD7,0x01,0x0E,0x11,0xFD,0x0F,0xBB,0xE0,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x08,0x6A,0x7E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x57,0xFF ,0xFF,0xFF,0xFF,0x00,0xB2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x75,0x00 ,0x00,0x00,0xFF,0x09,0x70,0x85,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBA ,0xDE,0xFF,0x01,0x0D,0x10,0xFD,0x00,0x01,0x01,0xD5,0xFF,0xFF,0xFF,0xFF,0x00 ,0xD3,0xFF,0xFF,0xFF,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x76 ,0x00,0x00,0x00,0xFF,0x0A,0x82,0x9C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E ,0xB0,0xD2,0xFF,0x00,0x04,0x05,0xFE,0x00,0x00,0x00,0xBB,0xFF,0xFF,0xFF,0xFF ,0x00,0xB2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x01,0x02,0xEC ,0x02,0x19,0x1E,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x53,0x63,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x38,0xFF,0xFF,0xFF,0xFF,0x00,0xD2,0xFF,0xFF ,0xFF,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x19,0x00,0x00,0x00 ,0xFD,0x05,0x3A,0x46,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4C,0xFF ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x20,0xBA,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x14,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x50,0x92,0x00,0x00,0x00 ,0x60,0x00,0x00,0x00,0x00,0x1A,0xB2,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00 ,0x0D,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2A,0x00,0x00 ,0x00,0x22,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0xA5 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xFF,0x0C,0x97 ,0xB4,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x9C,0x9D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x09 ,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x5F,0x97,0x00,0x00 ,0x00,0x60,0x02,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x11 ,0xA6,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x38,0x00 ,0x00,0x00,0x55,0x00,0x00,0x00,0x5A,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x5E ,0x00,0x00,0x00,0x5F,0x98,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x53,0x00 ,0x00,0x00,0x16,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0B,0x00,0x00 ,0x00,0x5B,0x00,0x00,0x00,0xAA,0x9D,0x00,0x00,0x00,0xB8,0x03,0x00,0x00,0x00 ,0xB7,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0x33,0x99,0xFF ,0xFF,0xFF,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB5,0x00,0x02 ,0x03,0xFE,0x0E,0xAF,0xD0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0x93,0x00,0x00,0x00,0x48,0x07 ,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x38,0x00,0x00,0x00 ,0x31,0x00,0x00,0x00,0x2A,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1A,0x00,0x00 ,0x00,0x03,0x9C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00 ,0xAE,0x95,0x00,0x00,0x00,0xFF,0x00,0x00,0x02,0x03,0x63,0xAB,0xFF,0xFF,0xFF ,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3A,0x00,0x00,0x00,0x73,0x00 ,0x00,0x00,0x92,0x00,0x00,0x00,0xB1,0x00,0x00,0x00,0xCF,0x00,0x01,0x01,0xEF ,0x87,0x00,0x00,0x00,0xFF,0x06,0x00,0x00,0x00,0xFE,0x00,0x01,0x01,0xF2,0x00 ,0x00,0x00,0xC6,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x35 ,0x00,0x00,0x00,0x08,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3A,0x00 ,0x00,0x00,0xFF,0x07,0x54,0x64,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x29 ,0x31,0xFF,0x00,0x01,0x01,0xF4,0x00,0x00,0x00,0x0C,0x96,0xFF,0xFF,0xFF,0x00 ,0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x5E,0x00,0x00,0x00,0x85,0x00,0x00 ,0x00,0xA6,0x00,0x00,0x00,0xC6,0x00,0x01,0x01,0xE8,0x00,0x00,0x00,0xFE,0x9D ,0x00,0x00,0x00,0xFF,0x03,0x00,0x01,0x01,0xEC,0x00,0x00,0x00,0xBA,0x00,0x00 ,0x00,0x4E,0x00,0x00,0x00,0x01,0x9E,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 ,0x11,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xF0,0xA0,0x00 ,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0xFE,0x00,0x00,0x01,0xD3,0x00,0x00,0x00 ,0x85,0x00,0x00,0x00,0x0C,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x23 ,0x00,0x01,0x02,0xDD,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xFF,0x9D,0x01,0x0A ,0x0C,0xFD,0x00,0x01,0x09,0x0A,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x01 ,0x01,0xDC,0x00,0x00,0x00,0x53,0x97,0xFF,0xFF,0xFF,0x00,0x84,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7E,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x01,0x0F,0xBE,0xE2,0xFF,0x02,0x16,0x1B,0xFE,0x9B,0x00 ,0x00,0x00,0xFF,0x04,0x00,0x01,0x01,0xF9,0x00,0x01,0x01,0xD1,0x00,0x00,0x00 ,0xA5,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x13,0x98,0xFF,0xFF,0xFF,0x00,0x04 ,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0xFF,0x04,0x34,0x3F,0xFF,0x08,0x64,0x77 ,0xFF,0x0A,0x7B,0x93,0xFF,0x8E,0x0A,0x83,0x9C,0xFF,0x04,0x09,0x70,0x86,0xFF ,0x00,0x02,0x03,0xFF,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x97,0x00,0x00,0x00 ,0x29,0xA8,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x5A ,0x00,0x00,0x00,0xA5,0x00,0x01,0x02,0xEE,0x82,0x00,0x00,0x00,0xFF,0x0D,0x00 ,0x04,0x05,0xFE,0x02,0x18,0x1D,0xFE,0x04,0x2F,0x38,0xFF,0x05,0x46,0x53,0xFF ,0x07,0x5B,0x6D,0xFF,0x08,0x62,0x75,0xFF,0x07,0x5C,0x6E,0xFF,0x07,0x57,0x68 ,0xFF,0x06,0x51,0x61,0xFF,0x06,0x4B,0x59,0xFF,0x05,0x45,0x52,0xFF,0x05,0x40 ,0x4C,0xFF,0x04,0x2F,0x38,0xFF,0x01,0x0B,0x0D,0xFD,0x82,0x00,0x00,0x00,0xFF ,0x04,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0xA4,0x00,0x00 ,0x00,0x66,0x00,0x00,0x00,0x11,0x9A,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 ,0x01,0x00,0x01,0x01,0xE2,0x01,0x13,0x16,0xFE,0x0F,0xBE,0xE2,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x63,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x67 ,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0xFD,0x81,0x00,0x00,0x00,0xFF,0x06,0x00 ,0x01,0x01,0xFF,0x01,0x12,0x16,0xFD,0x03,0x2C,0x35,0xFF,0x05,0x45,0x52,0xFF ,0x07,0x5D,0x6F,0xFF,0x09,0x76,0x8C,0xFF,0x0B,0x88,0xA3,0xFF,0x97,0x0B,0x89 ,0xA4,0xFF,0x07,0x0A,0x80,0x99,0xFF,0x08,0x65,0x79,0xFF,0x06,0x49,0x58,0xFF ,0x04,0x2D,0x36,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01 ,0xD9,0x00,0x00,0x00,0x5F,0x9B,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x55 ,0x00,0x00,0x00,0xBC,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0xFF,0x00,0x02,0x02 ,0xFE,0x03,0x2C,0x35,0xFF,0x06,0x4C,0x5B,0xFF,0x08,0x68,0x7C,0xFF,0x0A,0x80 ,0x99,0xFF,0x9C,0x0A,0x83,0x9C,0xFF,0x05,0x09,0x76,0x8D,0xFF,0x05,0x44,0x51 ,0xFF,0x01,0x10,0x13,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDF,0x00,0x00 ,0x00,0x41,0x87,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x01,0x02 ,0xE6,0x00,0x01,0x01,0xFF,0x08,0x64,0x77,0xFF,0x0E,0xAF,0xD0,0xFF,0x9E,0x0F ,0xBF,0xE4,0xFF,0x05,0x0E,0xB0,0xD2,0xFF,0x0B,0x8F,0xAB,0xFF,0x07,0x54,0x64 ,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x94,0x96,0xFF ,0xFF,0xFF,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x01 ,0x01,0xEE,0x03,0x21,0x28,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x00,0x0B,0x92,0xAE ,0xFF,0x94,0x09,0x77,0x8E,0xFF,0x0D,0x09,0x76,0x8D,0xFF,0x09,0x70,0x86,0xFF ,0x08,0x6A,0x7E,0xFF,0x08,0x63,0x76,0xFF,0x07,0x5D,0x6F,0xFF,0x07,0x56,0x67 ,0xFF,0x06,0x4F,0x5F,0xFF,0x05,0x3A,0x46,0xFF,0x02,0x1B,0x20,0xFE,0x00,0x02 ,0x02,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0xB4,0x00 ,0x00,0x00,0x3C,0x95,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x36,0x00,0x00 ,0x00,0xFF,0x05,0x3B,0x47,0xFF,0x0F,0xBE,0xE2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x06,0x4B,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x5B,0xA8,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xC4,0x00,0x00,0x00 ,0xFD,0x81,0x00,0x00,0x00,0xFF,0x04,0x03,0x25,0x2C,0xFF,0x07,0x5F,0x72,0xFF ,0x0C,0x93,0xAF,0xFF,0x0E,0xAC,0xCE,0xFF,0x0F,0xBE,0xE3,0xFF,0x8C,0x0F,0xBF ,0xE4,0xFF,0x04,0x0D,0xA7,0xC7,0xFF,0x0A,0x83,0x9C,0xFF,0x07,0x5F,0x72,0xFF ,0x05,0x3B,0x47,0xFF,0x02,0x16,0x1B,0xFE,0x81,0x00,0x00,0x00,0xFF,0x03,0x00 ,0x01,0x01,0xFA,0x00,0x00,0x00,0xAD,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x05 ,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0xFF,0x0B ,0x90,0xAC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF,0x01,0x07 ,0x09,0xFE,0x00,0x00,0x01,0xC7,0x92,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00 ,0x3B,0x00,0x01,0x01,0xDB,0x00,0x00,0x00,0xFF,0x00,0x05,0x06,0xFE,0x05,0x3B ,0x47,0xFF,0x0A,0x7B,0x93,0xFF,0x0D,0xA3,0xC2,0xFF,0x0F,0xBA,0xDE,0xFF,0xA1 ,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xAF,0xD0,0xFF,0x07,0x5B,0x6D,0xFF,0x01,0x0A ,0x0C,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x0A,0x97 ,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xB8,0x00,0x00 ,0x00,0xFF,0x00,0x05,0x06,0xFE,0x05,0x3A,0x46,0xFF,0x09,0x76,0x8D,0xFF,0x0E ,0xB0,0xD2,0xFF,0xA2,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBE,0xE2,0xFF,0x08,0x69 ,0x7D,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x72,0x86 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0xFF,0x09,0x71 ,0x87,0xFF,0xA3,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xAA,0xCB,0xFF,0x03,0x29,0x31 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x59,0x95,0xFF,0xFF,0xFF,0x00,0x85 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xFF,0x0C,0x9A ,0xB7,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x06,0x0E,0xB8,0xDB,0xFF,0x0A,0x7F,0x97 ,0xFF,0x05,0x3A,0x46,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00 ,0x00,0x9F,0x00,0x00,0x00,0x15,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x7C,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01 ,0x02,0x1B,0x20,0xFE,0x00,0x01,0x01,0xE0,0xA7,0xFF,0xFF,0xFF,0x00,0x06,0x00 ,0x00,0x00,0x38,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0xFF,0x00,0x05,0x06,0xFE ,0x04,0x38,0x43,0xFF,0x09,0x72,0x88,0xFF,0x0D,0xAB,0xCC,0xFF,0x96,0x0F,0xBF ,0xE4,0xFF,0x07,0x0E,0xB1,0xD3,0xFF,0x09,0x73,0x8A,0xFF,0x04,0x2E,0x37,0xFF ,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xEC,0x00,0x00,0x00 ,0x93,0x00,0x00,0x00,0x35,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x30 ,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06 ,0x49,0x58,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2B,0x90,0xFF,0xFF,0xFF ,0x00,0x04,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0xFD,0x00,0x06,0x07,0xFE,0x08 ,0x67,0x7A,0xFF,0x0E,0xB5,0xD8,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB4 ,0xD7,0xFF,0x05,0x3E,0x4A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD1,0x00 ,0x00,0x00,0x10,0x95,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x5C,0x00,0x01 ,0x01,0xF7,0x00,0x01,0x01,0xFF,0x06,0x47,0x55,0xFF,0x0E,0xAF,0xD1,0xFF,0xA7 ,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xA3,0xC3,0xFF,0x02,0x1E,0x24,0xFE,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x70,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x1E,0x00,0x00,0x00,0xFE,0x04,0x33,0x3D,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0E,0xAF,0xD1,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x01,0x01,0xED,0x00,0x00,0x00 ,0x13,0x94,0xFF,0xFF,0xFF,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x34,0x00,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0xB2,0x0F,0xBF,0xE4,0xFF,0x04 ,0x0D,0xA2,0xC1,0xFF,0x04,0x32,0x3C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x02 ,0xEF,0x00,0x00,0x00,0x4C,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x84 ,0x00,0x00,0x00,0xFF,0x0D,0xA5,0xC5,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01,0x02 ,0x13,0x17,0xFE,0x00,0x00,0x00,0xCA,0xA5,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00 ,0x00,0x24,0x00,0x00,0x00,0xAB,0x00,0x00,0x00,0xFF,0x00,0x02,0x03,0xFE,0x06 ,0x4F,0x5E,0xFF,0x0E,0xAE,0xCF,0xFF,0x9C,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9 ,0xC9,0xFF,0x08,0x65,0x79,0xFF,0x02,0x20,0x26,0xFE,0x81,0x00,0x00,0x00,0xFF ,0x02,0x00,0x01,0x01,0xD8,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0x01,0x94,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xD5,0x01,0x0C,0x0E,0xFD,0x0F,0xBB,0xDF ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x93,0xAF,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x86,0x8F,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x5C,0x00 ,0x00,0x00,0xFF,0x03,0x2A,0x32,0xFF,0x0D,0xA3,0xC2,0xFF,0xAB,0x0F,0xBF,0xE4 ,0xFF,0x03,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB5,0x00 ,0x00,0x00,0x01,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x4F,0x00,0x01 ,0x01,0xFC,0x02,0x15,0x19,0xFE,0x0B,0x92,0xAE,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF ,0x03,0x0E,0xAF,0xD0,0xFF,0x02,0x1D,0x22,0xFE,0x00,0x01,0x01,0xF8,0x00,0x00 ,0x00,0x1B,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x42,0x00,0x00,0x00 ,0xFF,0x08,0x6A,0x7E,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x75,0x8B,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F,0x94,0xFF,0xFF,0xFF,0x00,0x86,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD5,0x01,0x0D,0x10,0xFD,0x0F,0xBB,0xDF ,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x03,0x0A,0x7D,0x95,0xFF,0x01,0x0F,0x11,0xFD ,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x79,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x7B,0x00,0x00,0x00,0xFF,0x0B,0x8B,0xA6,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x01,0x03,0x26,0x2E,0xFF,0x00,0x01,0x01,0xE2,0xA4,0xFF,0xFF,0xFF,0x00 ,0x04,0x00,0x00,0x00,0x2F,0x00,0x01,0x01,0xF0,0x00,0x00,0x00,0xFF,0x05,0x3C ,0x48,0xFF,0x0D,0xA2,0xC1,0xFF,0xA1,0x0F,0xBF,0xE4,0xFF,0x05,0x0C,0x9B,0xB9 ,0xFF,0x07,0x57,0x68,0xFF,0x01,0x0E,0x11,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x01,0xC7,0x00,0x00,0x00,0x35,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x7B,0x00,0x00,0x00,0xFF,0x0A,0x84,0x9D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0F,0xBE,0xE3,0xFF,0x02,0x15,0x19,0xFE,0x00,0x01,0x01,0xDD,0x8E,0xFF,0xFF ,0xFF,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x01,0x02,0xEE,0x01,0x0F,0x12,0xFD ,0x0E,0xB1,0xD3,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x47,0x55,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x81,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x39,0x00,0x01,0x01,0xF8,0x01,0x0F,0x11,0xFD,0x0D,0xA2,0xC1,0xFF,0xAC ,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x89,0xA4,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x96,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00,0x00 ,0xFF,0x0A,0x7F,0x98,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB6,0xD9,0xFF ,0x01,0x07,0x08,0xFE,0x00,0x00,0x00,0xCB,0x94,0xFF,0xFF,0xFF,0x00,0x86,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0xFF,0x0A,0x81,0x9A ,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x04,0x0D,0xA9,0xC9,0xFF,0x03,0x23,0x29,0xFE ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0x07,0x8F,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xFF,0x06,0x48,0x56,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x01,0x01,0xFC,0x00 ,0x00,0x00,0x12,0xA2,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x01 ,0x02,0xEA,0x00,0x04,0x04,0xFE,0x0B,0x87,0xA1,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF ,0x05,0x0E,0xB4,0xD7,0xFF,0x07,0x54,0x64,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x17,0x91,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xFF,0x05,0x40,0x4C,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x07,0x55,0x66,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x33,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF ,0x0A,0x7E,0x96,0xFF,0xAE,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB8,0xDC,0xFF,0x03 ,0x24,0x2B,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x2D,0x90,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xCC,0x00,0x04,0x05,0xFE,0x0C ,0x99,0xB6,0xFF,0xAE,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2A,0x32,0xFF,0x00,0x01 ,0x01,0xFA,0x00,0x00,0x00,0x11,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x4C,0x00,0x00,0x00,0xFF,0x08,0x66,0x7A,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x02 ,0x05,0x43,0x50,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x27,0x93,0xFF,0xFF ,0xFF,0x00,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x01,0x01 ,0xFC,0x04,0x38,0x43,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB7,0xDA,0xFF ,0x05,0x3D,0x49,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xAB,0x00,0x00,0x00 ,0x02,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD1,0x01,0x0A,0x0C,0xFE ,0x0F,0xB9,0xDD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7E,0x96,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x67,0xA1,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x1B,0x00,0x01,0x02,0xE1,0x00,0x02,0x02,0xFE,0x0A,0x81,0x9A,0xFF,0xA8 ,0x0F,0xBF,0xE4,0xFF,0x05,0x0D,0xA0,0xBE,0xFF,0x04,0x32,0x3C,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x05,0x90 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC5,0x00,0x06,0x07,0xFE,0x0E,0xB5 ,0xD8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x8A,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x09 ,0x00,0x01,0x01,0xF6,0x03,0x2C,0x35,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x02,0x0B ,0x91,0xAD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8C,0x90,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0xAF ,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x64,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01,0x01 ,0xEF,0x03,0x24,0x2B,0xFE,0xA7,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88,0xA3,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x83,0x93,0xFF,0xFF,0xFF,0x00,0x87,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB3,0x00,0x02,0x02,0xFE,0x0E,0xAD,0xCF ,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x05,0x40,0x4D,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x90,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x75,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0E,0xB8,0xDC,0xFF,0x01,0x08,0x0A,0xFE,0x00,0x00,0x00,0xC2,0xA1 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBB,0x00,0x00,0x00,0xFF,0x09,0x74 ,0x8B,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x04,0x0A,0x81,0x9A,0xFF,0x02,0x16,0x1B ,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDA,0x00,0x00,0x00,0x3D,0x8F,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x09,0x78,0x8F ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x17,0x1C,0xFE,0x00,0x01,0x01,0xE1 ,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xFF,0x09 ,0x6D,0x82,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02,0x17 ,0x1C,0xFE,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0x03,0x8F,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x01,0x01,0xD8,0x01,0x09,0x0B,0xFE,0x0E,0xAF,0xD1,0xFF,0xAF,0x0F ,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x00,0x04,0x04,0xFE,0x00,0x00,0x00 ,0xBD,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0xFF ,0x0D,0xA1,0xC0,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x01 ,0x10,0x13,0xFD,0x00,0x01,0x01,0xDF,0x00,0x00,0x00,0x01,0x92,0xFF,0xFF,0xFF ,0x00,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0xFF ,0x08,0x67,0x7B,0xFF,0xB6,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBA,0xDE,0xFF,0x04 ,0x30,0x39,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x73,0x8E,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xFE,0x05,0x3D,0x48,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x46,0x53,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00 ,0x00,0x1E,0x9F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x00 ,0xFD,0x05,0x3A,0x46,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB8,0xDC,0xFF ,0x07,0x5F,0x72,0xFF,0x00,0x05,0x06,0xFE,0x00,0x01,0x01,0xF9,0x00,0x00,0x00 ,0x51,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0xFC ,0x04,0x34,0x3E,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x58,0x6A,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x37,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xA0,0x00,0x00,0x00,0xFF,0x0D,0xA9,0xCA,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF ,0x02,0x07,0x5E,0x70,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0x8E,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xFF,0x06,0x4E,0x5D ,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x45,0xFF,0x00,0x00,0x00,0xFD ,0x00,0x00,0x00,0x18,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x43,0x00 ,0x00,0x00,0xFF,0x07,0x5F,0x72,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x53 ,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3B,0x92,0xFF,0xFF,0xFF,0x00 ,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x01,0x01,0xED,0x02 ,0x1F,0x25,0xFE,0xB7,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB4,0xD7,0xFF,0x03,0x21 ,0x27,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x58,0x8E,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xC0,0x00,0x05,0x05,0xFE,0x0E,0xB3,0xD6,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x0B,0x8A,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x77,0x9F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xFF ,0x0A,0x7C,0x94,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x9D,0xBB,0xFF,0x01 ,0x11,0x14,0xFD,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x63,0x8E,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xB5,0x00,0x02,0x02,0xFE,0x0E,0xAD,0xCF,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x8E,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x02,0xE9,0x03,0x25,0x2C ,0xFF,0xB2,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA4,0xC4,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0xA6,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6D,0x00 ,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C ,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6E,0x82,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xE9,0x02,0x1D,0x22,0xFE,0xA7,0x0F ,0xBF,0xE4,0xFF,0x02,0x0C,0x99,0xB6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x97,0x92,0xFF,0xFF,0xFF,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x92,0x00,0x00,0x00,0xFF,0x0C,0x97,0xB5,0xFF,0xB7,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0D,0xAB,0xCC,0xFF,0x02,0x15,0x19,0xFD,0x00,0x01,0x01,0xFA,0x00,0x00,0x00 ,0x40,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0xFF ,0x09,0x75,0x8B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01 ,0x10,0x13,0xFD,0x00,0x01,0x01,0xD3,0x9F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xBE,0x00,0x05,0x06,0xFE,0x0E,0xB5,0xD8,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF ,0x03,0x0D,0xA6,0xC6,0xFF,0x02,0x18,0x1D,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x77,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5A,0x00,0x00,0x00 ,0xFF,0x08,0x6C,0x81,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1A,0x1F,0xFE ,0x00,0x01,0x02,0xE5,0x00,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x08,0x00,0x00,0x00,0xFF,0x05,0x46,0x53,0xFF,0xB3,0x0F,0xBF,0xE4 ,0xFF,0x02,0x03,0x2B,0x34,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x0E,0x8D ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAB,0x00,0x02,0x02,0xFE,0x0E,0xB7 ,0xDA,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB7,0xDA,0xFF,0x01,0x07,0x09 ,0xFE,0x00,0x00,0x00,0xC6,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92 ,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB8,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x02,0x02 ,0x1E,0x24,0xFE,0x00,0x01,0x01,0xEE,0x00,0x00,0x00,0x06,0x91,0xFF,0xFF,0xFF ,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xFF ,0x06,0x4F,0x5E,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xA0,0xBF,0xFF,0x01 ,0x0B,0x0E,0xFD,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x2D,0x8C,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x01,0x01,0xFA,0x04,0x31,0x3A,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x52,0x62,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x2D,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x16,0x00,0x00,0x00 ,0xFD,0x05,0x3C,0x48,0xFF,0x96,0x0F,0xBF,0xE4,0xFF,0x07,0x0E,0xB7,0xDA,0xFF ,0x0B,0x8D,0xA8,0xFF,0x0A,0x84,0x9D,0xFF,0x0A,0x7E,0x96,0xFF,0x09,0x78,0x8F ,0xFF,0x09,0x76,0x8C,0xFF,0x0C,0x95,0xB2,0xFF,0x0E,0xB8,0xDC,0xFF,0x93,0x0F ,0xBF,0xE4,0xFF,0x04,0x0E,0xAD,0xCF,0xFF,0x03,0x22,0x28,0xFE,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x01,0x8B,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x0B,0x00,0x01,0x01,0xF5,0x03,0x28,0x30,0xFF,0x91,0x0F,0xBF ,0xE4,0xFF,0x02,0x07,0x5C,0x6E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3C ,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xFF,0x07 ,0x5C,0x6E,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x63,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0xBD,0x01,0x0C,0x0F,0xFD,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x43,0x50,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x39,0x00,0x00,0x00,0xFF,0x07,0x58,0x6A,0xFF,0xA7,0x0F,0xBF,0xE4 ,0xFF,0x02,0x08,0x64,0x77,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x50,0x91 ,0xFF,0xFF,0xFF,0x00,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xD2,0x01 ,0x0C,0x0E,0xFD,0x0F,0xBA,0xDE,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x92 ,0xAE,0xFF,0x00,0x05,0x06,0xFE,0x00,0x01,0x01,0xDA,0x00,0x00,0x00,0x08,0x8C ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB1,0x00,0x01,0x01,0xFF,0x0D,0xAB ,0xCC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x88,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4C ,0x00,0x00,0x00,0xFF,0x09,0x70,0x86,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x03,0x0D ,0xA9,0xC9,0xFF,0x09,0x6E,0x83,0xFF,0x04,0x35,0x3F,0xFF,0x00,0x04,0x05,0xFE ,0x85,0x00,0x00,0x00,0xFF,0x03,0x00,0x02,0x02,0xFE,0x03,0x21,0x28,0xFE,0x06 ,0x49,0x57,0xFF,0x0C,0x94,0xB0,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB3 ,0xD6,0xFF,0x03,0x2C,0x34,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7C,0x8C ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0xFF,0x0D,0xA3 ,0xC3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x92,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x44 ,0x00,0x00,0x00,0xFF,0x09,0x73,0x8A,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x0E ,0xB2,0xD5,0xFF,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xC1,0x8D,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0xCB,0x02,0x16,0x1B,0xFE,0xB3,0x0F,0xBF,0xE4,0xFF ,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x77,0x82,0xFF ,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE1,0x02,0x16,0x1A ,0xFE,0x0F,0xBE,0xE3,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA8,0xC8,0xFF ,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAC,0x91,0xFF,0xFF,0xFF,0x00,0x89,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0xFF,0x0A,0x7F,0x97 ,0xFF,0xB9,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6D,0x82,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x8B,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x56,0x00 ,0x00,0x00,0xFF,0x08,0x69,0x7D,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1A ,0x1F,0xFE,0x00,0x01,0x02,0xE3,0x00,0x00,0x00,0x01,0x9C,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0xFF,0x0A,0x82,0x9B,0xFF,0x92,0x0F ,0xBF,0xE4,0xFF,0x11,0x09,0x6F,0x84,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00 ,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x70,0x00,0x00 ,0x00,0x5A,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4E,0x00,0x00,0x00,0x4D,0x00 ,0x00,0x00,0x77,0x00,0x00,0x00,0xA9,0x00,0x01,0x01,0xDC,0x00,0x00,0x00,0xFE ,0x00,0x00,0x00,0xFF,0x04,0x2D,0x35,0xFF,0x0B,0x86,0xA0,0xFF,0x0F,0xBE,0xE3 ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB7,0xDA,0xFF,0x02,0x1E,0x24,0xFE ,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x3B,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x4A,0x00,0x00,0x00,0xFF,0x08,0x60,0x72,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x02,0x1D,0x23,0xFE,0x00,0x01,0x02,0xE9,0x00,0x00,0x00,0x02,0x88 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xFF,0x0B,0x89 ,0xA4,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x00,0x00 ,0xFE,0x00,0x00,0x00,0x20,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0xD9 ,0x03,0x21,0x27,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x01 ,0x0C,0x0E,0xFE,0x00,0x01,0x01,0xD1,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0xFF,0x0C,0x94,0xB0,0xFF,0x95,0x0F,0xBF,0xE4,0xFF ,0x01,0x0F,0xBE,0xE2,0xFF,0x0C,0x9D,0xBC,0xFF,0x8B,0x0C,0x9B,0xB9,0xFF,0x00 ,0x0D,0xA5,0xC5,0xFF,0x82,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2F,0x38,0xFF,0x00 ,0x01,0x01,0xF9,0x00,0x00,0x00,0x10,0x90,0xFF,0xFF,0xFF,0x00,0x89,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x16,0x00,0x01,0x01,0xFB,0x04,0x36,0x40,0xFF ,0xB9,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x04,0x2D,0x35,0xFF,0x00 ,0x01,0x01,0xFD,0x00,0x00,0x00,0x37,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x09,0x00,0x01,0x01,0xF3,0x03,0x25,0x2C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF ,0x02,0x07,0x5E,0x71,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3E,0x9C,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xB1,0xD3,0xFF,0x05,0x3A,0x46,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDB,0x00,0x00,0x00,0x52,0x00,0x00,0x00 ,0x0B,0x88,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x9A ,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0xFF,0x04,0x31,0x3B,0xFF,0x0E,0xB7,0xDA ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x9D,0xBC,0xFF,0x00,0x06,0x07,0xFE ,0x00,0x01,0x01,0xE3,0x00,0x00,0x00,0x11,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x04,0x00,0x01,0x01,0xEB,0x02,0x1C,0x21,0xFE,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x07,0x5F,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x40,0x88 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xFF,0x0B,0x8D ,0xA8,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x7D,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xE8 ,0x03,0x2A,0x32,0xFF,0x9A,0x0F,0xBF,0xE4,0xFF,0x09,0x0E,0xB2,0xD4,0xFF,0x0C ,0x99,0xB6,0xFF,0x0C,0x93,0xAF,0xFF,0x0C,0x99,0xB6,0xFF,0x0D,0xA0,0xBE,0xFF ,0x0D,0xA6,0xC6,0xFF,0x0E,0xAC,0xCE,0xFF,0x0E,0xB3,0xD6,0xFF,0x0F,0xB9,0xDD ,0xFF,0x0F,0xBE,0xE3,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4B,0x59,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x29,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x30,0x00,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0x93,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0F,0xBB,0xE0,0xFF,0x08,0x6C,0x81,0xFF,0x02,0x19,0x1E,0xFE,0x8D ,0x00,0x00,0x00,0xFF,0x05,0x04,0x2E,0x37,0xFF,0x0A,0x81,0x9A,0xFF,0x0F,0xBE ,0xE2,0xFF,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x64,0x90 ,0xFF,0xFF,0xFF,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB0,0x00 ,0x02,0x02,0xFE,0x0D,0xAC,0xCD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x00,0x09,0x72 ,0x88,0xFF,0x8E,0x06,0x4D,0x5C,0xFF,0x03,0x07,0x5B,0x6C,0xFF,0x09,0x78,0x8F ,0xFF,0x0C,0x94,0xB1,0xFF,0x0E,0xB1,0xD3,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0D,0xA3,0xC2,0xFF,0x00,0x05,0x06,0xFE,0x00,0x01,0x01,0xD7,0x00,0x00,0x00 ,0x07,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF ,0x0D,0xA1,0xC0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC2,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x98,0x9C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x7F,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBC,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x04,0x0F,0xBA,0xDE,0xFF,0x02,0x19,0x1E,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x9E,0x00,0x00,0x00,0x0B,0x8C,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00 ,0x1A,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0xFF,0x03,0x2B,0x34,0xFF,0x0E,0xB4 ,0xD7,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x73,0x89,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0xAF,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x94 ,0x00,0x00,0x00,0xFF,0x0C,0x98,0xB6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D ,0xA0,0xBF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x97,0x88,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0xFF,0x0B,0x89,0xA4,0xFF,0xB4 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBC,0xE0,0xFF,0x01,0x0F,0x12,0xFE,0x00,0x01 ,0x01,0xDB,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xF6,0x04,0x34,0x3E ,0xFF,0x96,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xA9,0xC9,0xFF,0x06,0x4A,0x59,0xFF ,0x03,0x24,0x2B,0xFF,0x01,0x09,0x0B,0xFE,0x89,0x00,0x00,0x00,0xFF,0x0B,0x00 ,0x05,0x06,0xFE,0x01,0x0B,0x0D,0xFE,0x01,0x11,0x14,0xFE,0x02,0x17,0x1C,0xFE ,0x02,0x1E,0x24,0xFF,0x03,0x24,0x2B,0xFF,0x03,0x2B,0x33,0xFF,0x04,0x37,0x42 ,0xFF,0x07,0x56,0x67,0xFF,0x09,0x76,0x8D,0xFF,0x0C,0x96,0xB3,0xFF,0x0E,0xB5 ,0xD8,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8E,0xA9,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x81,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD9 ,0x01,0x10,0x13,0xFE,0x0F,0xBD,0xE1,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x03,0x09 ,0x77,0x8E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xEF,0x00,0x00,0x00,0x93 ,0x8B,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0xA1,0x00,0x01,0x01,0xF9,0x00 ,0x00,0x00,0xFF,0x04,0x2D,0x36,0xFF,0x0C,0x9A,0xB8,0xFF,0x00,0x05,0x06,0xFE ,0x00,0x00,0x00,0xC0,0x90,0xFF,0xFF,0xFF,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xFF,0x08,0x66,0x7A,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x00,0x09,0x70,0x85,0xFF,0x92,0x00,0x00,0x00,0xFF,0x01,0x03,0x26 ,0x2D,0xFE,0x0B,0x8B,0xA5,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x86,0x8B,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFF,0x07,0x5D,0x6F,0xFF,0x91,0x0F,0xBF ,0xE4,0xFF,0x02,0x03,0x27,0x2E,0xFF,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x06 ,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xFF,0x0D ,0xAC,0xCD,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x6B,0x80,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x79,0x90,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 ,0x85,0x00,0x00,0x00,0xFF,0x03,0x26,0x2D,0xFE,0x0E,0xB5,0xD8,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x6B,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0xFF ,0x07,0x54,0x64,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x27,0xFE,0x00 ,0x01,0x02,0xEC,0x00,0x00,0x00,0x03,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x5A,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0x95,0x0F,0xBF,0xE4,0xFF ,0x04,0x0E,0xB7,0xDA,0xFF,0x0D,0xA6,0xC6,0xFF,0x0C,0x94,0xB1,0xFF,0x0A,0x83 ,0x9C,0xFF,0x09,0x78,0x8F,0xFF,0x8C,0x09,0x77,0x8E,0xFF,0x07,0x0A,0x79,0x91 ,0xFF,0x0A,0x7E,0x96,0xFF,0x0A,0x82,0x9C,0xFF,0x0B,0x87,0xA1,0xFF,0x0B,0x8B ,0xA6,0xFF,0x0B,0x8F,0xAB,0xFF,0x0C,0x94,0xB0,0xFF,0x0D,0xA8,0xC8,0xFF,0x85 ,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x39,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00 ,0xFF,0x05,0x3D,0x49,0xFF,0x95,0x0F,0xBF,0xE4,0xFF,0x16,0x09,0x70,0x85,0xFF ,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDF,0x00,0x00,0x00 ,0xBD,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x72,0x00,0x00 ,0x00,0x7A,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x8F,0x00 ,0x00,0x00,0x98,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xAA,0x00,0x00,0x00,0xB3 ,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0xC5,0x00,0x00,0x00,0xCE,0x00,0x00,0x00 ,0xD7,0x00,0x01,0x01,0xE0,0x00,0x01,0x01,0xEA,0x00,0x01,0x01,0xF9,0x83,0x00 ,0x00,0x00,0xFF,0x06,0x02,0x15,0x19,0xFE,0x04,0x36,0x40,0xFF,0x08,0x67,0x7B ,0xFF,0x0E,0xB7,0xDA,0xFF,0x0F,0xBE,0xE2,0xFF,0x01,0x12,0x15,0xFE,0x00,0x01 ,0x01,0xDA,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7F,0x00,0x00,0x00 ,0xFF,0x0B,0x8C,0xA7,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF ,0x02,0x1F,0x25,0xFE,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x10,0x8D,0xFF,0xFF ,0xFF,0x00,0x06,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFE ,0x01,0x09,0x0A,0xFE,0x01,0x10,0x13,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x1E,0x8F,0xFF,0xFF,0xFF,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x05,0x00,0x01,0x01,0xEB,0x02,0x1D,0x23,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0E,0xAF,0xD1,0xFF,0x00,0x03,0x03,0xFE,0x00,0x00,0x00,0xC6,0x8C,0x00,0x00 ,0x00,0x18,0x07,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x7B ,0x00,0x00,0x00,0xA7,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0xFF,0x04,0x38,0x43 ,0xFF,0x0E,0xB5,0xD8,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF ,0x03,0x28,0x30,0xFE,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x34,0x8A,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xE9,0x02,0x1A,0x1F,0xFE ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x6B,0x80,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x4E,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00 ,0x00,0xFF,0x0F,0xBA,0xDE,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD8 ,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x01,0x02,0xE4,0x00,0x00,0x00,0x07,0x91,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x07,0x54,0x64 ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD7,0xFF,0x02,0x18,0x1D,0xFD ,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x2E,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x01,0x01,0xDF,0x01,0x12,0x15,0xFE,0x0F,0xBE,0xE2,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x08,0x62,0x75,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x44,0x87 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xFF,0x0A,0x82 ,0x9B,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x99,0xB6,0xFF,0x06,0x4F,0x5E ,0xFF,0x01,0x0E,0x11,0xFE,0x99,0x00,0x00,0x00,0xFF,0x03,0x01,0x0D,0x10,0xFE ,0x04,0x35,0x3F,0xFF,0x09,0x73,0x8A,0xFF,0x0E,0xB5,0xD7,0xFF,0x81,0x0F,0xBF ,0xE4,0xFF,0x02,0x0C,0x9A,0xB7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x97 ,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xF7,0x04,0x34,0x3E,0xFF,0x94 ,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x88,0xA2,0xFF,0x00,0x01,0x01,0xFF,0x00,0x01 ,0x01,0xDE,0x00,0x00,0x00,0x46,0x92,0xFF,0xFF,0xFF,0x00,0x0C,0x00,0x00,0x00 ,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x75,0x00,0x00 ,0x00,0x9F,0x00,0x00,0x00,0xC9,0x00,0x01,0x01,0xF3,0x00,0x00,0x00,0xFF,0x01 ,0x0F,0x11,0xFD,0x08,0x67,0x7B,0xFF,0x06,0x4C,0x5A,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x32,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x27,0x00 ,0x00,0x00,0xFF,0x06,0x4A,0x59,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB ,0xDF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xAA,0x90,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x44,0x00,0x01,0x02,0xEA,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x78,0x8F,0xFF,0xFF,0xFF,0x00,0x8B,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0xFF,0x0C,0x95,0xB2,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x04,0x36,0x40,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x18 ,0x8F,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA1,0x00 ,0x00,0x00,0xFF,0x03,0x22,0x28,0xFE,0x0D,0xAB,0xCC,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0D,0xA0,0xBE,0xFF,0x00,0x04,0x05,0xFE,0x00,0x01,0x01,0xD4,0x00 ,0x00,0x00,0x06,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x91,0x00,0x00 ,0x00,0xFF,0x0C,0x95,0xB2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAD,0xCF ,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0xA9,0x9B,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0xAC,0x00,0x03,0x03,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x61,0x74,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x64,0x92,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC2,0x00,0x02,0x02,0xFE,0x0C ,0x9A,0xB7,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x02 ,0x03,0xFE,0x00,0x00,0x00,0xC0,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x84,0x00,0x00,0x00,0xFF,0x0B,0x8C,0xA7,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0D,0xA3,0xC3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0x87,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0xFF,0x0A,0x7A,0x92,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x07,0x0A,0x7D,0x95,0xFF,0x00,0x02,0x03,0xFE,0x00 ,0x00,0x00,0xFF,0x00,0x01,0x01,0xD0,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x5A,0x8D,0x00,0x00,0x00,0x48,0x11,0x00 ,0x00,0x00,0x4A,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x5C ,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x70,0x00,0x00,0x00 ,0x98,0x00,0x00,0x00,0xCC,0x00,0x01,0x01,0xFA,0x00,0x00,0x00,0xFF,0x01,0x07 ,0x08,0xFE,0x06,0x49,0x57,0xFF,0x0E,0xAD,0xCF,0xFF,0x0F,0xBF,0xE4,0xFF,0x02 ,0x20,0x26,0xFE,0x00,0x01,0x01,0xEF,0x00,0x00,0x00,0x07,0x8A,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0xD5,0x02,0x1A,0x1F,0xFE,0x93,0x0F,0xBF,0xE4,0xFF ,0x03,0x0E,0xB6,0xD9,0xFF,0x01,0x0B,0x0D,0xFD,0x00,0x01,0x01,0xF0,0x00,0x00 ,0x00,0x24,0x99,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00 ,0x6A,0x00,0x01,0x01,0xE6,0x00,0x00,0x00,0xFF,0x00,0x02,0x02,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x8B,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 ,0xCF,0x01,0x0B,0x0D,0xFE,0x0F,0xBB,0xDF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0F,0xBC,0xE0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA8,0x91,0xFF,0xFF ,0xFF,0x00,0x03,0x00,0x00,0x00,0x21,0x00,0x01,0x02,0xDD,0x00,0x00,0x00,0xFF ,0x00,0x00,0x01,0xD5,0x8F,0xFF,0xFF,0xFF,0x00,0x8B,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0xFF,0x06,0x4D,0x5C,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0A,0x79,0x91,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F ,0x91,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xFE,0x02 ,0x15,0x19,0xFE,0x0E,0xAC,0xCE,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x63 ,0x76,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7E,0x8A,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0xFF,0x06,0x52,0x61,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x04,0x34,0x3E,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00,0x00 ,0x0D,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xFF ,0x0E,0xB3,0xD6,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x45,0xFF,0x00 ,0x00,0x00,0xFD,0x00,0x00,0x00,0x04,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x29,0x00,0x01,0x01,0xFA,0x03,0x26,0x2D,0xFE,0x0F,0xBD,0xE1,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4F,0x5F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x4F,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00 ,0xFF,0x06,0x48,0x56,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x24,0x2C,0xFF ,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x05,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x30,0x00,0x00,0x00,0xFF,0x07,0x5F,0x72,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0D,0xA3,0xC3,0xFF,0x00,0x02,0x02,0xFE,0x00,0x01,0x02,0xE5,0x00 ,0x00,0x00,0x34,0x9B,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x0F,0x00,0x00 ,0x00,0x66,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0D,0xFD,0x09 ,0x73,0x8A,0xFF,0x08,0x66,0x7A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x53 ,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB4,0x00,0x03,0x04,0xFE,0x0F ,0xBD,0xE1,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x76,0x8D,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x6B,0x9C,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00 ,0x08,0x00,0x00,0x00,0x71,0x00,0x01,0x01,0xF1,0x00,0x00,0x00,0xFF,0x00,0x01 ,0x01,0xE3,0x00,0x00,0x00,0x01,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x76,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0F,0xBE,0xE3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA8,0x92,0xFF,0xFF ,0xFF,0x00,0x03,0x00,0x00,0x00,0x21,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x31,0x8E,0xFF,0xFF,0xFF,0x00,0x8C,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x01,0x01,0xD0,0x01,0x0A,0x0C,0xFD,0x0F,0xB9,0xDD,0xFF,0x8F,0x0F,0xBF ,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xC9 ,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xFF,0x03 ,0x2B,0x34,0xFF,0x0F,0xBB,0xDF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBC ,0xE0,0xFF,0x02,0x1F,0x25,0xFE,0x00,0x01,0x02,0xF5,0x00,0x00,0x00,0x16,0x8A ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDD,0x01,0x10,0x13,0xFE,0x0F,0xBD ,0xE1,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78,0x8F,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x5F,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x81 ,0x00,0x00,0x00,0xFF,0x0D,0xA2,0xC1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x04 ,0x35,0x3F,0xFF,0x00,0x01,0x01,0xF7,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x84,0x00,0x00,0x00,0xFF,0x08,0x6C,0x81,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x03,0x0E,0xAF,0xD1,0xFF,0x01,0x09,0x0B,0xFD,0x00,0x01,0x01,0xDA,0x00,0x00 ,0x00,0x04,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xCE,0x01,0x09,0x0B ,0xFE,0x0F,0xB9,0xDD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x49,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x0A,0x00,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x09,0x70,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4D,0x9F ,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x48,0x00,0x01,0x02,0xE3,0x00,0x00 ,0x00,0xFF,0x02,0x1C,0x21,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB1,0x8A ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xFF,0x0D,0xA8 ,0xC8,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2F,0x38,0xFF,0x00,0x01,0x01 ,0xF8,0x00,0x00,0x00,0x10,0x9E,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x4B ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3C,0x82,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xFE,0x05,0x43,0x50,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x01,0x01,0x0C,0x0E,0xFE,0x00,0x01,0x01,0xD6,0x93 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6C,0x00,0x01,0x01,0xF6,0x00,0x00 ,0x00,0x52,0x8E,0xFF,0xFF,0xFF,0x00,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x6E,0x00,0x00,0x00,0xFF,0x0A,0x7C,0x94,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x05,0x40,0x4C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x23,0x92,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xFF,0x06,0x4E,0x5D ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x90,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x82,0x00 ,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5 ,0xD7,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xB9,0x9A,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x0B,0x90,0xAC,0xFF,0x8E,0x0F ,0xBF,0xE4,0xFF,0x01,0x04,0x31,0x3B,0xFF,0x00,0x01,0x02,0xF0,0x95,0xFF,0xFF ,0xFF,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x01,0x01,0xDC,0x01,0x08,0x0A,0xFD ,0x0D,0xAA,0xCB,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x6D,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x73,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0D,0xA6,0xC6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0x87,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x01,0x02,0xE3,0x03,0x24,0x2B,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x05,0x3E,0x4A,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00,0x0D ,0xA0,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x94,0x81 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x14,0x89,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0xFF,0x0B,0x8E,0xAA ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBA,0xDE,0xFF,0x00,0x01,0x02,0xFF ,0x00,0x00,0x00,0xAE,0xA0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x6D,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xC5,0x01,0x07,0x09,0xFE,0x0E,0xB8,0xDB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x06,0x4C,0x5A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x30,0x92,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x8F,0xFF,0xFF ,0xFF,0x00,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x01,0x01 ,0xFB,0x04,0x34,0x3F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7C,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x04,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0xFF,0x0A,0x7B,0x93,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x28,0x30,0xFF,0x00,0x01,0x01,0xF9,0x00 ,0x00,0x00,0x1E,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x27,0x00,0x00 ,0x00,0xFF,0x05,0x46,0x53,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4C ,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x18,0x99,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xFF,0x0A,0x7F,0x97,0xFF,0x8E,0x0F,0xBF ,0xE4,0xFF,0x01,0x04,0x2E,0x37,0xFF,0x00,0x02,0x02,0xE8,0x96,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0xFF,0x05,0x3D,0x48,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xB9,0xDD,0xFF,0x02,0x15,0x1A,0xFD,0x00,0x01 ,0x02,0xEE,0x00,0x00,0x00,0x0F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x1B,0x00,0x00,0x00,0xFD,0x05,0x3C,0x48,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 ,0x03,0x28,0x2F,0xFF,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x06,0x86,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0xB9,0x01,0x07,0x08,0xFE,0x0F,0xBE,0xE3,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x01,0x04,0x34,0x3E,0xFF,0x00,0x01,0x01,0xF6,0xA3 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6E,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x6D,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00 ,0x00,0x00,0xFF,0x09,0x76,0x8C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA2 ,0xC1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x88,0xA0,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x84,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x6D,0x00,0x00,0x00,0xFF,0x0A,0x7E,0x96,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0B,0x90,0xAC,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8B ,0xA4,0xFF,0xFF,0xFF,0x00,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAE ,0x00,0x01,0x01,0xFF,0x0D,0xAA,0xCB,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F ,0xBB,0xDF,0xFF,0x01,0x0B,0x0D,0xFE,0x00,0x01,0x01,0xD6,0x93,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x01,0x02,0xEB,0x01,0x0F,0x12,0xFD,0x0E ,0xB3,0xD6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8E,0xA9,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x9E,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 ,0xCE,0x01,0x09,0x0B,0xFE,0x0E,0xB8,0xDC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x84,0x9D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F,0x99,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFF,0x09,0x6D,0x82,0xFF ,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x03,0x2C,0x35,0xFF,0x00,0x01,0x02,0xEF,0x97 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0xFF,0x0A,0x85 ,0x9E,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7B,0x93,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x8A,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBE ,0x00,0x04,0x05,0xFE,0x0E,0xB3,0xD6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x69,0x7D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4D,0x86,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xFF,0x0D,0xA9,0xC9,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x49,0x58,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x10,0xA3,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6B,0x00,0x00,0x01 ,0xFC,0x00,0x00,0x00,0x70,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2C ,0x00,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0B ,0x88,0xA3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x68,0xA7,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x01,0xFD,0x05,0x3C,0x48,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02,0x15,0x19,0xFE,0x00,0x01 ,0x01,0xE4,0x00,0x00,0x00,0x02,0xA3,0xFF,0xFF,0xFF,0x00,0x8D,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x4D,0x00,0x00,0x00,0xFF,0x08,0x64,0x77,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4A,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x2F,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5E,0x00,0x00,0x00 ,0xFF,0x06,0x50,0x60,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x33,0x3D,0xFF ,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x28,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x72,0x00,0x00,0x00,0xFF,0x0A,0x7E,0x96,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x01,0x01,0xCB,0x99 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xFF,0x07,0x5B ,0x6D,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4D,0x5C,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x22,0x96,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x16 ,0x00,0x01,0x01,0xF0,0x02,0x15,0x18,0xFD,0x0E,0xB6,0xD9,0xFF,0x8E,0x0F,0xBF ,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x03,0x27,0x2E,0xFE,0x00,0x01,0x01,0xF9 ,0x00,0x00,0x00,0x1F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x63,0x00 ,0x00,0x00,0xFF,0x09,0x74,0x8B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9 ,0xC9,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA4,0x86,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x0B,0x8B,0xA6,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x2B,0xA4,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x19,0x8A,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xEE,0x03,0x27,0x2E,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x71,0x87,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x4A,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBC,0x00,0x04,0x05 ,0xFE,0x0E,0xB4,0xD7,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x58,0x6A,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x40,0xA3,0xFF,0xFF,0xFF,0x00,0x8D,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xEA,0x02,0x1B,0x20 ,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8D,0xA8,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x88,0x94,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xC1,0x00 ,0x01,0x01,0xFF,0x0C,0x9A,0xB8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97 ,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFD,0x05,0x3A,0x46,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x25,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFF ,0x06,0x48,0x56,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x77,0x8E,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x5A,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x66,0x00,0x00,0x00,0xFF,0x07,0x55,0x65,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x02,0x0B,0x8B,0xA6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x91,0x88,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x01,0x01,0xF9,0x04,0x31,0x3A ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2B,0x33,0xFF,0x00,0x01,0x01,0xF4 ,0x00,0x00,0x00,0x08,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x42,0x00 ,0x00,0x00,0xFF,0x09,0x6D,0x83,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x76 ,0x8D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x51,0xB1,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0E,0xB3,0xD6,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x0A,0x7D,0x95,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x5C,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xFF ,0x09,0x77,0x8E,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0xA3,0xFF,0xFF,0xFF,0x00,0x8E,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF,0x0C,0x93,0xAF,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x01,0x12,0x15,0xFE,0x00 ,0x01,0x01,0xE2,0x00,0x00,0x00,0x01,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x2B,0x00,0x01,0x01,0xFB,0x03,0x2A,0x32,0xFF,0x0F,0xBE,0xE3,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3D,0x48,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00 ,0x00,0x33,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBD,0x00,0x04,0x05 ,0xFE,0x0E,0xB2,0xD4,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x91,0xAD,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x80,0x99,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x01,0x01,0xE6,0x03,0x24,0x2B,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA2 ,0xC1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x92,0x97,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC5,0x00,0x02,0x02,0xFE,0x0C,0x9C ,0xBA,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x22,0x29,0xFE,0x00,0x01,0x01 ,0xF4,0x00,0x00,0x00,0x0F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAE ,0x00,0x01,0x01,0xFF,0x0D,0xAB,0xCC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x6C,0x81,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x51,0x85,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFF,0x06,0x50,0x60,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA2,0xC1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x97,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00 ,0xFF,0x0A,0x83,0x9C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9B,0xB9,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x82,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x11,0x00,0x01,0x01,0xFA,0x04,0x34,0x3F,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x03,0x21,0x27,0xFE,0x00,0x01,0x01,0xF1,0x00,0x00,0x00,0x07,0xA2 ,0xFF,0xFF,0xFF,0x00,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2D,0x00 ,0x00,0x00,0xFF,0x06,0x4B,0x59,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x54 ,0x64,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3B,0x94,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0xFF,0x0A,0x7B,0x93,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x0D,0xA0,0xBE,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00 ,0xB9,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0xFF ,0x09,0x73,0x89,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE3,0xFF,0x02 ,0x15,0x19,0xFE,0x00,0x01,0x02,0xDB,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xAE,0x00,0x02,0x03,0xFE,0x0E,0xB8,0xDC,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF ,0x02,0x0F,0xBE,0xE3,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00,0xCA,0x98,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0xFE,0x05,0x3F,0x4B ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x77,0x8E,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x75,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53,0x00 ,0x00,0x00,0xFF,0x08,0x68,0x7C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xAC ,0xCD,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA8,0x86,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x01,0x01,0xF4,0x04,0x32,0x3C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x01 ,0x02,0x18,0x1D,0xFE,0x00,0x01,0x01,0xE0,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x27,0x00,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0E,0xB8,0xDC,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA9,0xA9 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB2,0x00,0x02,0x02,0xFE,0x0E,0xAF ,0xD1,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x51,0xA2,0xFF,0xFF,0xFF,0x00,0x8F,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xCC,0x01,0x09,0x0B,0xFD,0x0E,0xB8,0xDB,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x95,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x01,0x02,0xF1 ,0x02,0x1A,0x1F,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x05 ,0x46,0x53,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x31,0x88,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x0F,0x00,0x01,0x01,0xF9,0x04,0x2E,0x37,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x59,0x6A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x35,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00 ,0xFF,0x0B,0x92,0xAE,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x36,0x40,0xFF ,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x08,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0xB2,0x00,0x01,0x01,0xFF,0x0D,0xA4,0xC4,0xFF,0x8E,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0F,0xBB,0xDF,0xFF,0x01,0x11,0x14,0xFE,0x00,0x01,0x01,0xE3,0x00 ,0x00,0x00,0x04,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x01 ,0x01,0xF1,0x03,0x24,0x2B,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2E,0x37 ,0xFF,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x0A,0x85,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0xCB,0x02,0x14,0x18,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06 ,0x4F,0x5E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x27,0xB1,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x01,0x01,0xE5,0x02,0x1F,0x25,0xFE,0x91,0x0F,0xBF,0xE4,0xFF ,0x01,0x02,0x16,0x1B,0xFE,0x00,0x00,0x00,0xD0,0xA9,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x5A,0x00,0x00,0x00,0xFF,0x09,0x70,0x85,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0D,0xA9,0xC9,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAC ,0xA2,0xFF,0xFF,0xFF,0x00,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6C ,0x00,0x00,0x00,0xFF,0x0A,0x7A,0x92,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x02 ,0x1B,0x20,0xFE,0x00,0x01,0x01,0xEB,0x00,0x00,0x00,0x04,0x94,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0xFF,0x09,0x73,0x89,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9B,0xB9,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0xA0,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01 ,0xFF,0x0D,0xA9,0xCA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x90,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x40,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7E,0xFF,0x8E,0x0F,0xBF,0xE4 ,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3A,0x98 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3B,0x00,0x00,0x00,0xFF,0x06,0x4D ,0x5C,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x62,0x75,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x59,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9D ,0x00,0x00,0x00,0xFF,0x0D,0xA0,0xBF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09 ,0x6F,0x84,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56,0x85,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF,0x0E,0xAF,0xD1,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x70,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00 ,0xFF,0x0E,0xAC,0xCE,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x35,0x3F,0xFF ,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x01,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x0C,0x00,0x01,0x01,0xF6,0x04,0x2E,0x37,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0F,0xA1 ,0xFF,0xFF,0xFF,0x00,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x12,0x00 ,0x01,0x01,0xFA,0x04,0x32,0x3C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5E ,0x70,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0x94,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x0B,0x00,0x01,0x02,0xEB,0x02,0x14,0x18,0xFE,0x0F,0xB9 ,0xDD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2D,0x36,0xFF,0x00,0x01,0x01 ,0xF9,0x00,0x00,0x00,0x16,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53 ,0x00,0x00,0x00,0xFF,0x08,0x67,0x7A,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03 ,0x20,0x27,0xFE,0x00,0x01,0x02,0xEA,0x00,0x00,0x00,0x03,0x97,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xFD,0x05,0x41,0x4E,0xFF,0x8E ,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x72,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC4,0x00,0x05,0x06 ,0xFE,0x0E,0xAE,0xCF,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB0,0xD2,0xFF ,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xCB,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x42,0x00,0x00,0x00,0xFF,0x07,0x5C,0x6E,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0E,0xAE,0xCF,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAD,0x85 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFF,0x0A,0x79 ,0x91,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB7,0xDA,0xFF,0x00,0x04,0x05 ,0xFE,0x00,0x00,0x00,0xB8,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5F ,0x00,0x00,0x00,0xFF,0x0A,0x7B,0x93,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07 ,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x22,0xA9,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xA9,0x00,0x01,0x01,0xFF,0x0D,0xAA,0xCB,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x62,0xA1,0xFF,0xFF,0xFF,0x00,0x90,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xAB,0x00,0x01,0x01,0xFF,0x0D,0xA9,0xC9,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x02,0x0D,0xA1,0xC0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA2,0x95,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6F,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7F ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x80,0x99,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x7D,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00 ,0x01,0x01,0xF1,0x03,0x23,0x2A,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65 ,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x46,0x98,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x01,0x01,0xD3,0x02,0x18,0x1C,0xFE,0x8E,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0E,0xB6,0xD9,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xC1,0x99,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x4E,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6D,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x3D,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x01 ,0x01,0xE6,0x02,0x18,0x1C,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x31,0x3A ,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x0C,0x84,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xFD,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x04,0x32,0x3C,0xFF,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x09 ,0xB0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFF,0x06 ,0x49,0x58,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x82,0x9B,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x6B,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x51,0x00,0x00,0x00,0xFF,0x08,0x69,0x7D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0E,0xB2,0xD4,0xFF,0x00,0x04,0x05,0xFE,0x00,0x00,0x00,0xBD,0xA1,0xFF,0xFF ,0xFF,0x00,0x90,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4B,0x00,0x00,0x00 ,0xFF,0x08,0x61,0x74,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x25,0x2C,0xFF ,0x00,0x01,0x01,0xF3,0x00,0x00,0x00,0x09,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x07,0x00,0x01,0x02,0xE4,0x01,0x0F,0x12,0xFE,0x0E,0xB6,0xD9,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x02,0x15,0x19,0xFD,0x00 ,0x01,0x01,0xE7,0x00,0x00,0x00,0x05,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x9E,0x00,0x00,0x00,0xFF,0x0C,0x9F,0xBE,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0D,0xA9,0xC9,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA1,0x98,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0xFF,0x0E,0xAF,0xD1 ,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3E,0x4A,0xFF,0x00,0x00,0x00,0xFD ,0x00,0x00,0x00,0x1A,0x98,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00 ,0x01,0x01,0xD7,0x01,0x0C,0x0E,0xFD,0x0E,0xB6,0xD9,0xFF,0x8E,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0D,0xA0,0xBF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0x88 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF,0x0C,0x94 ,0xB1,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x5A,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC8 ,0x01,0x0C,0x0E,0xFE,0x0F,0xBD,0xE1,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0xB1,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x01,0x01,0xDA,0x02,0x16,0x1B,0xFE,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0E,0xB7,0xDA,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xBC,0xA9,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x01,0x01,0xF1,0x03,0x26,0x2D ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x00,0x00,0xFD ,0x00,0x00,0x00,0x1A,0xA0,0xFF,0xFF,0xFF,0x00,0x90,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xE8,0x02,0x19,0x1E,0xFE,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x08,0x67,0x7B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x55 ,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xFF,0x08 ,0x61,0x74,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x5A,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x43,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6D,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 ,0x04,0x2E,0x36,0xFF,0x00,0x01,0x02,0xF4,0x00,0x00,0x00,0x09,0x97,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF ,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7F,0x98,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x6F,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x61,0x00,0x00 ,0x00,0xFF,0x08,0x6A,0x7E,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x24,0x2B ,0xFE,0x00,0x01,0x01,0xEF,0x00,0x00,0x00,0x05,0x87,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xFF,0x06,0x50,0x60,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0E,0xB0,0xD2,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00,0x00,0xB1 ,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xFF,0x0B ,0x92,0xAE,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x91,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x96,0x00,0x00,0x00,0xFF,0x0D,0xA5,0xC5,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x05,0x3A,0x46,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00,0x11,0xA9,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF,0x0D,0xA3,0xC3,0xFF ,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7F,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x72,0xA0,0xFF,0xFF,0xFF,0x00,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x8A,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF,0x8F,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0D,0xA9,0xCA,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAE,0x95 ,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xDC,0x01,0x0A ,0x0C,0xFE,0x0E,0xB2,0xD4,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3 ,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xC8,0x88,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xE7,0x02,0x17,0x1C,0xFE,0x0F,0xBE,0xE3 ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x57,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1C,0x00 ,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8 ,0xDC,0xFF,0x01,0x08,0x09,0xFD,0x00,0x00,0x00,0xC6,0x99,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x06,0x00,0x01,0x01,0xE5,0x02,0x14,0x18,0xFD,0x0F,0xBB ,0xE0,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x64,0x77,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x47,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD8 ,0x01,0x0F,0x12,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04 ,0x34,0x3F,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0F,0x84,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xFF,0x07,0x5A,0x6B,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x14,0x18,0xFE,0x00,0x01,0x01,0xDA,0xB1,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xFF,0x09,0x73,0x8A ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x76,0x8D,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x5D,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x47,0x00 ,0x00,0x00,0xFF,0x08,0x61,0x74,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8 ,0xDC,0xFF,0x01,0x09,0x0B,0xFE,0x00,0x01,0x01,0xCE,0xA0,0xFF,0xFF,0xFF,0x00 ,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2A,0x00,0x00,0x00,0xFF,0x06 ,0x49,0x57,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x01 ,0x01,0xF9,0x00,0x00,0x00,0x0F,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x5A,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x06,0x4A,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x37,0x88,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0xFF,0x0C,0x94,0xB0,0xFF ,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD4,0xFF,0x00,0x03,0x04,0xFE,0x00 ,0x00,0x00,0xB1,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xC7,0x01,0x08 ,0x0A,0xFE,0x0F,0xB9,0xDD,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x43,0x50 ,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0x99,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0xFF,0x09,0x79,0x90,0xFF,0x8E,0x0F,0xBF ,0xE4,0xFF,0x02,0x0D,0xA3,0xC2,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9C ,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0xFF,0x0B ,0x88,0xA3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x75,0x8B,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x5E,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x01,0x00,0x01,0x01,0xEB,0x03,0x22,0x29,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x01 ,0x06,0x4B,0x59,0xFF,0x00,0x00,0x00,0xFF,0xA5,0x00,0x01,0x01,0xF9,0x05,0x00 ,0x01,0x01,0xF8,0x00,0x01,0x01,0xDD,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0x8D ,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x23,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x13,0x00,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0E,0xB0,0xD2,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0xAD,0xA9 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xEB,0x02,0x1F ,0x25,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x47,0x55,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x28,0x9F,0xFF,0xFF,0xFF,0x00,0x92,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xCA,0x01,0x08,0x0A,0xFE,0x0E,0xB7,0xDA,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x61,0x95,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xD3 ,0x01,0x07,0x08,0xFE,0x0E,0xAD,0xCF,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C ,0x9C,0xBA,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA3,0x88,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0xFF,0x06,0x4F,0x5F,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x45,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00 ,0x00,0x12,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00 ,0xFF,0x0A,0x84,0x9D,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x74,0x99,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x0D,0x00,0x01,0x02,0xF1,0x03,0x20,0x27,0xFE,0x0F,0xBE,0xE3,0xFF ,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x28,0xFE,0x00,0x01,0x01,0xED,0x00 ,0x00,0x00,0x04,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00 ,0x00,0xFF,0x05,0x44,0x51,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5 ,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00,0x00,0xB5,0x85,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0xFF,0x0D,0xAA,0xCB,0xFF,0x8F,0x0F,0xBF ,0xE4,0xFF,0x00,0x0B,0x8E,0xAA,0xFF,0xA6,0x05,0x3B,0x47,0xFF,0x02,0x04,0x39 ,0x44,0xFF,0x02,0x20,0x26,0xFE,0x00,0x05,0x05,0xFE,0x81,0x00,0x00,0x00,0xFF ,0x01,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x6A,0x85,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0xCE,0x01,0x0F,0x12,0xFE,0x0F,0xBE,0xE3,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x04,0x2F,0x38,0xFF,0x00,0x01,0x01,0xF6,0x00,0x00,0x00,0x09 ,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xFF,0x0C ,0x9D,0xBB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA6,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x83,0x9F,0xFF,0xFF,0xFF,0x00,0x92,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xFF,0x09,0x78,0x8F,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00 ,0x00,0xBB,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00,0x00,0x00 ,0xFF,0x06,0x51,0x61,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2B,0x34,0xFF ,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x0B,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x01,0x01,0xDA,0x01,0x0E,0x11,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0A,0x7E,0x96,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x67,0x97 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xFF,0x05,0x46 ,0x53,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x01,0x0B,0x0D ,0xFD,0x00,0x00,0x00,0xCB,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x86 ,0x00,0x00,0x00,0xFF,0x0B,0x87,0xA1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x61,0x73,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x44,0x88,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xC7,0x01,0x07,0x09,0xFE,0x0E,0xB8,0xDB,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x37,0x42,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00 ,0x00,0x11,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x58,0x00,0x00,0x00 ,0xFF,0x09,0x73,0x89,0xFF,0xB9,0x0F,0xBF,0xE4,0xFF,0x05,0x0F,0xBE,0xE2,0xFF ,0x0D,0xA6,0xC6,0xFF,0x0A,0x82,0x9B,0xFF,0x02,0x19,0x1E,0xFE,0x00,0x00,0x00 ,0xFD,0x00,0x00,0x00,0x2E,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8B ,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x6B,0x80,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4E,0xA9,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6C,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01,0x12,0x15,0xFE,0x00,0x01 ,0x01,0xDE,0x9F,0xFF,0xFF,0xFF,0x00,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x11,0x00,0x01,0x01,0xF9,0x04,0x30,0x39,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x04,0x38,0x43,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x18,0x96,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC9,0x00,0x04,0x05,0xFE,0x0D,0xA8,0xC8 ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6F,0x84,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x5A,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7E,0x00 ,0x00,0x00,0xFF,0x0B,0x88,0xA2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8 ,0xDC,0xFF,0x01,0x09,0x0A,0xFE,0x00,0x00,0x00,0xC2,0x98,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xCC,0x01,0x0A,0x0C,0xFE,0x0F,0xBB,0xDF,0xFF,0x8E,0x0F ,0xBF,0xE4,0xFF,0x02,0x06,0x49,0x57,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x22,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x01,0x01,0xF9 ,0x04,0x2E,0x37,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA0,0xBE,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x98,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x6C,0x00,0x00,0x00,0xFF,0x0A,0x7C,0x94,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x09,0x79,0x90,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x63,0x84,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFD,0x05,0x3B,0x47 ,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB8,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0xA5,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3A,0x00 ,0x00,0x00,0xFF,0x07,0x5B,0x6D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA7 ,0xC7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0xA9,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE5,0x02,0x18,0x1D,0xFE,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x07,0x54,0x64,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x39,0x9E,0xFF,0xFF,0xFF,0x00,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0xA9,0x00,0x01,0x01,0xFF,0x0D,0xA6,0xC6,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6E,0x96,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xFF,0x06,0x4A,0x59,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAF,0xD0,0xFF,0x00,0x02,0x03,0xFE,0x00 ,0x00,0x00,0xB5,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00 ,0x00,0xFF,0x05,0x43,0x50,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x46,0x54 ,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0x97,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0x0B,0x88,0xA3,0xFF,0x8E,0x0F,0xBF ,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x79 ,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0xFF,0x0D ,0xA5,0xC5,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1E,0x24,0xFE,0x00,0x01 ,0x01,0xEA,0x00,0x00,0x00,0x03,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x16,0x00,0x01,0x01,0xFC,0x04,0x39,0x44,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0E,0xB4,0xD7,0xFF,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xBA,0x85,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0xC5,0x01,0x07,0x09,0xFE,0x0F,0xBB,0xDF,0xFF ,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2E,0x36,0xFF,0x00,0x01,0x01,0xF8,0x00 ,0x00,0x00,0x10,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x01 ,0x01,0xE3,0x02,0x1A,0x1F,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x23,0x2A ,0xFE,0x00,0x01,0x01,0xED,0x00,0x00,0x00,0x06,0xA9,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF,0x0C,0x96,0xB3,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0C,0x98,0xB6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x94 ,0x9E,0xFF,0xFF,0xFF,0x00,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x49 ,0x00,0x00,0x00,0xFF,0x07,0x5F,0x72,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E ,0xB7,0xDA,0xFF,0x01,0x07,0x08,0xFE,0x00,0x00,0x01,0xC7,0x97,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xC6,0x01,0x07,0x08,0xFE,0x0E,0xB5,0xD8,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x36,0x40,0xFF,0x00,0x00,0x01,0xFC,0x00,0x00 ,0x00,0x14,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC9,0x01,0x07,0x09 ,0xFE,0x0E,0xB7,0xDA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x78,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x25,0x00,0x00,0x00,0xFF,0x06,0x49,0x58,0xFF,0x8E,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x01,0x01,0xD6,0x00 ,0x00,0x00,0x01,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x43,0x00,0x00 ,0x00,0xFF,0x08,0x61,0x74,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5E,0x70 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x41,0x88,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0xB7,0x00,0x03,0x04,0xFE,0x0E,0xB1,0xD3,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00,0x14 ,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0xFF,0x0B ,0x8B,0xA6,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78,0x8F,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x6A,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x8E,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB7,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x08,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x5C,0xA9,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1D,0x22,0xFE,0x00,0x01,0x01,0xEB,0x00 ,0x00,0x00,0x04,0x9D,0xFF,0xFF,0xFF,0x00,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x03,0x00,0x01,0x01,0xE6,0x02,0x18,0x1C,0xFE,0x0F,0xBE,0xE3,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x42,0x4F,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x22,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00 ,0x00,0xFF,0x09,0x74,0x8B,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x79,0x90 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6A,0x88,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x6F,0x00,0x00,0x00,0xFF,0x0A,0x7C,0x94,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01,0x10,0x13,0xFD,0x00,0x01,0x01,0xD3 ,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xD2,0x01,0x0D,0x10,0xFD,0x0F ,0xBC,0xE0,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x59,0x6A,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x4B,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x03,0x00,0x01,0x02,0xE9,0x02,0x1E,0x24,0xFE,0x8E,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0C,0x9D,0xBB,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x95,0x88,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFF,0x09,0x70,0x86,0xFF ,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x67,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2A,0x00,0x00 ,0x00,0xFF,0x05,0x44,0x51,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8,0xDB ,0xFF,0x01,0x09,0x0B,0xFE,0x00,0x01,0x01,0xCE,0x84,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x01,0x07,0x08,0xFE,0x00,0x00,0x00,0xCB ,0xAA,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDD,0x01,0x12,0x15,0xFE,0x0F ,0xBE,0xE2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x61,0x74,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x49,0x9D,0xFF,0xFF,0xFF,0x00,0x94,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x7B,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01 ,0xF5,0x03,0x2B,0x34,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF ,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xC5,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x17,0x00,0x00,0x01,0xFD,0x04,0x38,0x43,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x07,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2D,0x97 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0x0A,0x7D ,0x95,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAD,0xCF,0xFF,0x00,0x04,0x05 ,0xFE,0x00,0x00,0x00,0xC4,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92 ,0x00,0x00,0x00,0xFF,0x0C,0x9B,0xB9,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x02 ,0x1B,0x20,0xFE,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0x02,0x87,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01,0xF6,0x04,0x2D,0x35,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB6,0xD9,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00 ,0x00,0xBE,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC2,0x00,0x04,0x05 ,0xFE,0x0E,0xB1,0xD3,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x30,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x01,0x00,0x01,0x01,0xE2,0x02,0x19,0x1D,0xFE,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x06,0x4E,0x5D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3A,0xA9 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0xFF,0x0B,0x8E ,0xAA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA5,0xC5,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0xA4,0x9D,0xFF,0xFF,0xFF,0x00,0x94,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0xFF,0x06,0x46,0x54,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xE0,0xFF,0x01,0x0D,0x0F,0xFE,0x00,0x01,0x01 ,0xD5,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF ,0x0D,0xA3,0xC2,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4C,0xFF,0x00 ,0x00,0x00,0xFE,0x00,0x00,0x00,0x20,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xB9,0x00,0x03,0x04,0xFE,0x0E,0xB0,0xD2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x88,0x97,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x13,0x00,0x01,0x01,0xF6,0x03,0x26,0x2E ,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x3D,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x39,0x00 ,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5B ,0x6C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3D,0x88,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xA6,0x00,0x01,0x01,0xFF,0x0D,0xA8,0xC8,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x05,0x3D,0x49,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 ,0x18,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5A,0x00,0x00,0x00,0xFF ,0x08,0x69,0x7D,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x93,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x8C,0x00,0x00,0x00,0xFF,0x0C,0x98,0xB6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0D,0xA0,0xBF,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAA,0xA9,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5B ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2A,0x32,0xFF,0x00,0x01,0x01,0xF5 ,0x00,0x00,0x00,0x0B,0x9C,0xFF,0xFF,0xFF,0x00,0x95,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0xC7,0x01,0x07,0x09,0xFE,0x0E,0xB6,0xD9,0xFF,0x8F,0x0F,0xBF ,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2E ,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x07 ,0x5B,0x6C,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x76,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x5F,0x00,0x00,0x00,0xFF,0x09,0x70,0x86,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 ,0x02,0x1B,0x20,0xFE,0x00,0x01,0x02,0xE3,0x00,0x00,0x00,0x01,0x97,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF ,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA4,0xC4,0xFF,0x00,0x01,0x01,0xFF,0x00 ,0x00,0x00,0xB5,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xE0,0x02,0x15 ,0x19,0xFE,0x0F,0xBE,0xE3,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB7 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x91,0x88,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0A,0x7F,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6B ,0x84,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x01,0x01,0xEB,0x02 ,0x1B,0x20,0xFE,0x0F,0xBE,0xE3,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21 ,0x28,0xFE,0x00,0x01,0x01,0xF0,0x00,0x00,0x00,0x06,0x83,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x04,0x34,0x3F,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00 ,0x1D,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD4,0x01,0x0C,0x0F,0xFE ,0x0F,0xBB,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x5A,0x9C,0xFF,0xFF,0xFF,0x00,0x95,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xFF,0x09,0x76,0x8D,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8F,0xAB,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x87,0x96,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01 ,0x01,0xDE,0x02,0x13,0x17,0xFE,0x0F,0xBD,0xE1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF ,0x02,0x0F,0xBB,0xE0,0xFF,0x01,0x09,0x0B,0xFD,0x00,0x00,0x00,0xBF,0x88,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0D,0x00,0x01,0x01,0xF7,0x03,0x2C,0x35 ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5F,0x72,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x3E,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x23,0x00 ,0x00,0x00,0xFD,0x05,0x3A,0x45,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40 ,0x4C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2F,0x99,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBB,0xFF,0x8E,0x0F ,0xBF,0xE4,0xFF,0x02,0x02,0x19,0x1E,0xFE,0x00,0x01,0x02,0xE6,0x00,0x00,0x00 ,0x01,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01,0x01,0xED ,0x03,0x20,0x27,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8,0xDB,0xFF,0x01 ,0x07,0x09,0xFE,0x00,0x00,0x00,0xC2,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0xFF,0x0B,0x8E,0xA9,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF ,0x02,0x08,0x64,0x77,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x42,0x84,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDD,0x01,0x0F,0x12,0xFD,0x0F,0xBB,0xDF ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88,0xA2,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x88,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7A,0x00 ,0x00,0x00,0xFF,0x0B,0x88,0xA2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAF ,0xD0,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00,0x00,0xB5,0x9C,0xFF,0xFF,0xFF,0x00 ,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0F,0x00,0x01,0x01,0xF8,0x04 ,0x2E,0x36,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x02,0x14 ,0x17,0xFE,0x00,0x01,0x01,0xE1,0x00,0x00,0x00,0x01,0x96,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0xFF,0x0B,0x89,0xA4,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x05,0x3C,0x48,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00,0x00 ,0x0C,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAA,0x00,0x01,0x01,0xFF ,0x0D,0xA8,0xC8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC3,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x99,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0D,0xA2,0xC1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF ,0x02,0x0C,0x99,0xB6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA6,0x99,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xFF,0x08,0x6C,0x81 ,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x58,0x6A,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x34,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x96,0x00 ,0x00,0x00,0xFF,0x0C,0x9D,0xBB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x41 ,0x4E,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1B,0x84,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFE,0x05,0x40,0x4C,0xFF,0xBC,0x0F ,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x87,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xFF ,0x0A,0x7E,0x96,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02 ,0x1C,0x21,0xFE,0x00,0x01,0x01,0xEE,0x00,0x00,0x00,0x09,0xA8,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFF,0x05,0x45,0x52,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x37,0x41,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00 ,0x00,0x15,0x9B,0xFF,0xFF,0xFF,0x00,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xA6,0x00,0x00,0x00,0xFF,0x0D,0xA5,0xC5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x02,0x07,0x56,0x67,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3A,0x96,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xFF,0x06,0x4D,0x5C ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x70,0x86,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x4F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00 ,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x27 ,0x2F,0xFF,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x06,0x97,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x3A,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5B,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x04,0x33,0x3D,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 ,0x23,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01,0xFC ,0x05,0x3B,0x47,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA6,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x68,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x3B,0x00,0x00,0x00,0xFF,0x07,0x58,0x6A,0xFF,0x90,0x0F,0xBF,0xE4,0xFF ,0x02,0x0A,0x82,0x9B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x70,0x85,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB8,0x00,0x03,0x04,0xFE,0x0E,0xAE,0xCF ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB6,0xD9,0xFF,0x07,0x5C,0x6E,0xFF ,0x07,0x58,0x69,0xFF,0x07,0x54,0x64,0xFF,0x06,0x50,0x60,0xFF,0x97,0x06,0x4E ,0x5D,0xFF,0x00,0x0A,0x7A,0x92,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE ,0xE2,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00,0xCC,0x84,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x15,0x00,0x01,0x01,0xFA,0x04,0x2F,0x38,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x66,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC9,0x01,0x09,0x0A,0xFE ,0x0E,0xB8,0xDC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7B,0x93,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x6B,0x9B,0xFF,0xFF,0xFF,0x00,0x96,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFF,0x07,0x5E,0x70,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB7,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x94,0x97,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x02,0xEA,0x03,0x26 ,0x2E,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA4,0xC4,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x97,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x06 ,0x00,0x01,0x01,0xEF,0x03,0x21,0x27,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x6C,0x81,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4E,0x98,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x01,0xC6,0x00,0x05,0x06,0xFE,0x0E,0xAF,0xD1,0xFF,0x8E ,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8D,0xA8,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x98,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC8,0x01,0x0B,0x0D ,0xFE,0x0F,0xBE,0xE2,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0x88,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x01,0x00,0x01,0x01,0xE0,0x02,0x15,0x19,0xFE,0x0F,0xBE,0xE3,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xB9,0xDD,0xFF,0x01,0x09,0x0B,0xFE,0x00 ,0x00,0x01,0xC7,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00 ,0x00,0xFF,0x08,0x64,0x78,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x00,0x04,0x35,0x3F ,0xFF,0x9A,0x00,0x00,0x00,0xFF,0x00,0x02,0x1F,0x26,0xFE,0x8E,0x0F,0xBF,0xE4 ,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x13,0x84 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xFF,0x0D,0xA0 ,0xBF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB6,0xD9,0xFF,0x01,0x0A,0x0C ,0xFD,0x00,0x01,0x01,0xD5,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71 ,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E ,0xB7,0xDA,0xFF,0x01,0x07,0x08,0xFE,0x00,0x00,0x00,0xC6,0x9B,0xFF,0xFF,0xFF ,0x00,0x96,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xE4 ,0x02,0x16,0x1A,0xFE,0x0F,0xBE,0xE3,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x02 ,0x1D,0x22,0xFE,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0x03,0x96,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xB1,0x00,0x04,0x05,0xFE,0x0F,0xBB,0xDF,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x18,0x1D,0xFE,0x00,0x01,0x01,0xE0,0x89,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBB ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAD,0xCF,0xFF,0x00,0x02,0x02,0xFE ,0x00,0x00,0x00,0xA9,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x52,0x00 ,0x00,0x00,0xFF,0x08,0x60,0x72,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x26 ,0x2E,0xFE,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x18,0x98,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB7,0xFF,0x8E,0x0F ,0xBF,0xE4,0xFF,0x01,0x02,0x16,0x1B,0xFE,0x00,0x00,0x00,0xCD,0x89,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF ,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x44,0x51,0xFF,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x1E,0x84,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x01 ,0x01,0xE5,0x02,0x17,0x1B,0xFD,0x0F,0xBE,0xE2,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x04,0x0B,0x92,0xAE,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB7,0x00,0x00 ,0x00,0x1B,0x00,0x00,0x00,0x18,0x95,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00 ,0x9E,0x00,0x00,0x00,0xFF,0x0D,0xA6,0xC6,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02 ,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x55,0x84,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x06,0x52,0x62,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x55,0x65,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x49,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1B,0x00,0x00 ,0x00,0xFD,0x05,0x3E,0x4A,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x43,0x50 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x21,0x9A,0xFF,0xFF,0xFF,0x00,0x97 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xFF,0x0B,0x8D ,0xA8,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x47,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x84 ,0x00,0x00,0x00,0xFF,0x0C,0x9F,0xBE,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06 ,0x4D,0x5C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x27,0x88,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x34,0x3F,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00 ,0x00,0x0D,0x97,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01 ,0xDD,0x01,0x0E,0x10,0xFD,0x0E,0xB3,0xD6,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x80,0x99,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x95,0x98,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7E,0xFF ,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3D,0x49,0xFF,0x00,0x01,0x01,0xFA,0x00 ,0x00,0x00,0x06,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00 ,0x00,0xFF,0x06,0x4C,0x5B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x74,0x85,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xFF,0x0B,0x88,0xA3,0xFF,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x24 ,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0xFF,0x09 ,0x6D,0x82,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA6,0xC6,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x9A,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 ,0xD8,0x01,0x0B,0x0D,0xFE,0x0E,0xB8,0xDB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0D,0xAA,0xCB,0xFF,0x00,0x06,0x07,0xFE,0x00,0x01,0x01,0xD3,0x00,0x00,0x00 ,0x03,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC0,0x00,0x05,0x06,0xFE ,0x0E,0xB5,0xD8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88,0xA2,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x7B,0x9A,0xFF,0xFF,0xFF,0x00,0x97,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xFF,0x05,0x45,0x52,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC3,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0xA0,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00 ,0x00,0xFF,0x0C,0x9B,0xB9,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x82,0x9B ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6E,0x88,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE4,0x02,0x16,0x1A,0xFE,0x0F,0xBE,0xE3 ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78,0x8F,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x5F,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x57,0x00 ,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE ,0xE3,0xFF,0x04,0x2D,0x35,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x32,0x97 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFF,0x06,0x4D ,0x5C,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x63,0x76,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x32,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD1 ,0x01,0x0C,0x0F,0xFD,0x0F,0xBB,0xDF,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F ,0xBB,0xDF,0xFF,0x01,0x0A,0x0C,0xFE,0x00,0x01,0x01,0xCC,0x85,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x1B,0x00,0x01,0x01,0xFC,0x05,0x3B,0x47,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x9C,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x01,0x01 ,0xF6,0x04,0x33,0x3D,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x19,0x1E,0xFE ,0x00,0x01,0x01,0xE0,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x70,0x00 ,0x00,0x00,0xFF,0x09,0x76,0x8D,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5C ,0x6E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x66,0xA8,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xFF,0x0A,0x79,0x91,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x0F,0xBC,0xE0,0xFF,0x01,0x0E,0x11,0xFE,0x00,0x01,0x01 ,0xD7,0x9A,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0xC5,0x01,0x07,0x08,0xFE,0x0E,0xB5,0xD7,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 ,0x03,0x27,0x2E,0xFF,0x00,0x01,0x02,0xF3,0x00,0x00,0x00,0x08,0x95,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xFF,0x0C,0x9B,0xB9,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0xA4,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8A,0x00,0x00 ,0x00,0xFF,0x0B,0x91,0xAD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8 ,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xBA,0x99,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0xBE,0x00,0x02,0x02,0xFE,0x0C,0x9C,0xBA,0xFF,0x8E,0x0F,0xBF ,0xE4,0xFF,0x03,0x0C,0x9D,0xBC,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00,0x00,0xC8 ,0x00,0x00,0x00,0x01,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x01,0x00 ,0x01,0x01,0xF9,0x04,0x36,0x40,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88 ,0xA3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x65,0x89,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9E,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x06,0x47,0x55,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x22,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAE,0x00,0x01,0x01,0xFF ,0x0C,0x9F,0xBE,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x27,0x2E,0xFF,0x00 ,0x01,0x01,0xFB,0x00,0x00,0x00,0x1D,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xB0,0x00,0x03,0x04,0xFE,0x0E,0xB5,0xD7,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF ,0x02,0x06,0x4D,0x5C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x24,0x84,0xFF ,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x01,0x01,0xF7,0x03,0x21,0x28 ,0xFE,0x0F,0xBE,0xE3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD8,0xFF ,0x01,0x0F,0x12,0xFD,0x00,0x01,0x01,0xEA,0x00,0x00,0x00,0x0D,0xA7,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x01,0x01,0xFC,0x04,0x37,0x41,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x50,0x60,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x31,0x99,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x65,0x00,0x00,0x00,0xFF,0x09,0x74,0x8B,0xFF,0x8F,0x0F,0xBF,0xE4 ,0xFF,0x02,0x08,0x6A,0x7E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x54,0x95 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0xFF,0x0D,0xAB ,0xCC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x15,0x19,0xFE,0x00,0x00,0x01 ,0xD4,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xFF ,0x06,0x4D,0x5C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4D,0xFF,0x00 ,0x00,0x01,0xFD,0x00,0x00,0x00,0x18,0x98,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x2B,0x00,0x01,0x01,0xFC,0x03,0x2C,0x34,0xFF,0x0F,0xBE,0xE3,0xFF,0x8E ,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x56,0x67,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x64,0x97,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xDD,0x02,0x1F,0x25 ,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAF,0xD0,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x97,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1C,0x00 ,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88 ,0xA3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x78,0x85,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xFE,0x05,0x3A,0x45,0xFF,0x90,0x0F ,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x93,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xFF ,0x0A,0x82,0x9C,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x81,0x9A,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x69,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x8E,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x91,0x0F,0xBF,0xE4,0xFF ,0x02,0x09,0x71,0x87,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x87,0xA8,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB7,0x00,0x02,0x03,0xFE,0x0E,0xB1,0xD3 ,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x94,0xB1,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x8C,0x99,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x0E,0x00,0x01,0x01,0xF7,0x03,0x2C,0x35,0xFF,0x8F,0x0F,0xBF ,0xE4,0xFF,0x02,0x0D,0xAC,0xCD,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAD ,0x94,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x02,0xED,0x03 ,0x24,0x2C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x00 ,0x01,0xFC,0x00,0x00,0x00,0x07,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 ,0xD6,0x01,0x0C,0x0F,0xFE,0x0F,0xBB,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x85,0x9E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F,0x99,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0xFF,0x09,0x79,0x90,0xFF ,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB6,0xD9,0xFF,0x02,0x13,0x17,0xFE,0x00 ,0x01,0x02,0xEE,0x00,0x00,0x00,0x1E,0x96,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0xBD,0x01,0x07,0x09,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x13,0x17 ,0xFD,0x00,0x00,0x00,0xCA,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC0 ,0x00,0x06,0x07,0xFE,0x0E,0xB5,0xD8,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F ,0xBB,0xE0,0xFF,0x01,0x0D,0x0F,0xFE,0x00,0x01,0x01,0xD0,0x86,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x03,0x20,0x26,0xFE,0x00,0x01 ,0x01,0xF8,0x00,0x00,0x00,0x2A,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x39,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7F,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0E,0xB2,0xD5,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAE,0x85,0xFF,0xFF ,0xFF,0x00,0x03,0x00,0x00,0x00,0x17,0x00,0x01,0x01,0xF6,0x03,0x21,0x28,0xFE ,0x0F,0xBE,0xE3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x03 ,0x20,0x27,0xFE,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x31,0xA7,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x5E,0x00,0x00,0x00,0xFF,0x09,0x72,0x88,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x18,0x1D,0xFE,0x00,0x01,0x01,0xE6,0x00,0x00 ,0x00,0x02,0x98,0xFF,0xFF,0xFF,0x00,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xA4,0x00,0x00,0x00,0xFF,0x0D,0xA3,0xC3,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x02,0x04,0x31,0x3A,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0F,0x93,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xFF,0x08,0x61,0x74 ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5E,0x71,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x32,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7B,0x00 ,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBB ,0xDF,0xFF,0x01,0x0C,0x0F,0xFD,0x00,0x01,0x01,0xD1,0x00,0x00,0x00,0x01,0x98 ,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x01,0x02,0xE9,0x01,0x10 ,0x13,0xFD,0x0E,0xB5,0xD7,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0A,0x84,0x9D ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x06,0x95,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF,0x0E,0xB2,0xD5 ,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x01,0x01,0xF8 ,0x00,0x00,0x00,0x04,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x65,0x00 ,0x00,0x00,0xFF,0x09,0x79,0x90,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4A ,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x26,0x85,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x22,0x00,0x01,0x01,0xFA,0x03,0x2A,0x32,0xFE,0x90,0x0F ,0xBF,0xE4,0xFF,0x03,0x0B,0x92,0xAE,0xFF,0x00,0x02,0x03,0xFE,0x00,0x01,0x01 ,0xD6,0x00,0x00,0x00,0x0A,0x94,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21 ,0x00,0x00,0x00,0xFF,0x07,0x5A,0x6B,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x03 ,0x28,0x30,0xFF,0x00,0x01,0x01,0xEF,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x8B,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x91,0x0F,0xBF,0xE4,0xFF ,0x03,0x0C,0x9B,0xB9,0xFF,0x00,0x04,0x04,0xFE,0x00,0x01,0x01,0xD6,0x00,0x00 ,0x00,0x08,0xA6,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x01,0x01 ,0xF8,0x04,0x30,0x39,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5D,0x6F,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x42,0x98,0xFF,0xFF,0xFF,0x00,0x99,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6D ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x60,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0C,0x00 ,0x01,0x02,0xE3,0x01,0x0C,0x0E,0xFD,0x0E,0xAF,0xD1,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x62,0x89 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xFF,0x05,0x42 ,0x4F,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5A,0x6B,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x61,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5E ,0x00,0x00,0x00,0xFF,0x07,0x54,0x64,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x07 ,0x55,0x66,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x93,0x95,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0F,0xBB,0xDF,0xFF,0x8E ,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x2E,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x01,0x01 ,0xFA,0x04,0x35,0x3F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA6,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7D,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x91,0x00,0x00,0x00,0xFF,0x0A,0x82,0x9B,0xFF,0x90,0x0F,0xBF,0xE4 ,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA0,0x94 ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xFF,0x07,0x53 ,0x63,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4D,0x5C,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x11,0x85,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x15 ,0x00,0x01,0x01,0xF5,0x03,0x21,0x28,0xFE,0x0F,0xBE,0xE3,0xFF,0x91,0x0F,0xBF ,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8E ,0xA7,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0D ,0xAC,0xCD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA1,0xC0,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x9C,0x98,0xFF,0xFF,0xFF,0x00,0x99,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xE2,0x02,0x14,0x18,0xFE,0x0F ,0xBE,0xE2,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x00,0x04 ,0x05,0xFE,0x00,0x00,0x00,0xBA,0x91,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 ,0x03,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xFF,0x09,0x71,0x87,0xFF,0x92,0x0F ,0xBF,0xE4,0xFF,0x02,0x0D,0xA6,0xC6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x8F,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC6,0x01,0x07,0x08,0xFE ,0x0E,0xB6,0xD9,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD8,0xFF,0x01 ,0x10,0x13,0xFD,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0x0F,0x98,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC4,0x00,0x02,0x03,0xFE,0x0C ,0x9E,0xBD,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBC,0xE0,0xFF,0x04,0x2E ,0x36,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x57,0x94,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0xC9,0x01,0x13,0x16,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x7F,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x59,0x8A,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0xAF,0x00,0x02,0x02,0xFE,0x0E,0xAE,0xCF,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01,0x0F,0x12,0xFE,0x00 ,0x01,0x01,0xD5,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x01 ,0x01,0xF3,0x02,0x1C,0x22,0xFD,0x0F,0xBC,0xE0,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x03,0x0F,0xBE,0xE3,0xFF,0x04,0x36,0x40,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x60,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00 ,0xFF,0x09,0x6F,0x84,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x31,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x87,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x04,0x2D,0x35,0xFF,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x57,0xA6,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00 ,0x00,0xFF,0x08,0x6B,0x80,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x26,0x2D ,0xFE,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x09,0x97,0xFF,0xFF,0xFF,0x00,0x9A ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0xFF,0x0B,0x8B ,0xA5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x00,0x01 ,0xFD,0x00,0x00,0x00,0x17,0x8F,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x0A ,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF,0x05,0x3F,0x4B,0xFF,0x0F,0xBE,0xE2 ,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xE0,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0xA7,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6B,0x00 ,0x00,0x00,0xFF,0x0A,0x7A,0x92,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x09,0x73 ,0x8A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x0B,0x98 ,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x01,0xFD,0x03,0x27 ,0x2F,0xFE,0x0F,0xBA,0xDE,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xAC,0xCE ,0xFF,0x01,0x11,0x14,0xFD,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x51,0x93,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x02,0x02,0xE8,0x03,0x2A,0x32,0xFF,0x8F,0x0F,0xBF ,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56 ,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xFF,0x09 ,0x6D,0x82,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4E,0x5D,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x2A,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x7D,0x00,0x00,0x00,0xFF,0x09,0x72,0x88,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0E,0xB0,0xD2,0xFF,0x01,0x13,0x17,0xFD,0x00,0x01,0x01,0xF6,0x00,0x00,0x00 ,0x2E,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0xFF ,0x0B,0x90,0xAC,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x50,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x13,0x00,0x01,0x02,0xF4,0x03,0x21,0x28,0xFE,0x0F,0xBE,0xE2,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x04,0x0D,0xA6,0xC6,0xFF,0x01,0x0D,0x10,0xFD,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x04,0xA4,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x09,0x00,0x01,0x01,0xF4,0x03,0x28,0x30,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x83,0x97,0xFF,0xFF,0xFF,0x00,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x24,0x00,0x00,0x00,0xFF,0x05,0x43,0x50,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0A,0x7E,0x96,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6D,0x8D,0xFF,0xFF ,0xFF,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x4C,0x00,0x01,0x02,0xE1 ,0x00,0x00,0x00,0xFF,0x05,0x3F,0x4B,0xFF,0x0F,0xBC,0xE0,0xFF,0x94,0x0F,0xBF ,0xE4,0xFF,0x01,0x01,0x09,0x0B,0xFD,0x00,0x00,0x00,0xBB,0x8A,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x15,0x00,0x01,0x01,0xFC,0x04,0x36,0x40,0xFF,0x91 ,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBE,0xE2,0xFF,0x06,0x4C,0x5A,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x01,0x01,0xD2,0x00,0x00,0x00,0x48,0x98,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x03,0x0C,0x98,0xB6,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x00,0x00 ,0xFD,0x00,0x00,0x00,0x6D,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1D ,0x00,0x00,0x00,0xFD,0x05,0x40,0x4D,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09 ,0x76,0x8C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4D,0x8A,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x01,0x01,0xF2,0x03,0x29,0x31,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8E,0xAA,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x81,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0B,0x00,0x01,0x01 ,0xE8,0x01,0x11,0x15,0xFD,0x0E,0xB7,0xDA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0B,0x91,0xAD,0xFF,0x00,0x02,0x02,0xFE,0x00,0x01,0x01,0xF2,0x00,0x00,0x00 ,0x4B,0x90,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x01,0x01,0xF9 ,0x03,0x25,0x2C,0xFE,0x0F,0xBE,0xE3,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0C ,0x94,0xB1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x70,0x87,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0xFF,0x09,0x6D,0x83,0xFF,0x92 ,0x0F,0xBF,0xE4,0xFF,0x08,0x0D,0xA7,0xC7,0xFF,0x03,0x27,0x2F,0xFE,0x00,0x00 ,0x00,0xFF,0x00,0x01,0x01,0xE0,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x3D,0x00 ,0x00,0x00,0x2B,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x09,0xA0,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0xFF,0x0D,0xA6,0xC6,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xB6,0xD9,0xFF,0x03,0x23,0x2A,0xFE,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0x0C,0x94 ,0xFF,0xFF,0xFF,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC2,0x00 ,0x05,0x06,0xFE,0x0E,0xB4,0xD7,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB8 ,0xDB,0xFF,0x01,0x08,0x0A,0xFE,0x00,0x01,0x01,0xCC,0x00,0x00,0x00,0x22,0x00 ,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00 ,0x00,0x4C,0x00,0x00,0x00,0x9C,0x00,0x01,0x01,0xEA,0x00,0x00,0x00,0xFF,0x01 ,0x09,0x0B,0xFD,0x09,0x70,0x86,0xFF,0x0F,0xBE,0xE3,0xFF,0x95,0x0F,0xBF,0xE4 ,0xFF,0x01,0x02,0x18,0x1D,0xFE,0x00,0x00,0x00,0xD0,0x8B,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0xB6,0x00,0x02,0x03,0xFE,0x0E,0xAF,0xD0,0xFF,0x92,0x0F ,0xBF,0xE4,0xFF,0x07,0x08,0x65,0x79,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x01,0xC7,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x5C,0x00,0x00 ,0x00,0x43,0x00,0x00,0x00,0x31,0x8C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00 ,0x1B,0x85,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xB6 ,0x00,0x00,0x00,0xFF,0x09,0x73,0x8A,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x04,0x0D ,0xA5,0xC5,0xFF,0x02,0x1A,0x1F,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8B ,0x00,0x00,0x00,0x01,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB6,0x00 ,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6E ,0x83,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x44,0x8B,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0xFF,0x0D,0xA4,0xC4,0xFF,0x8F,0x0F ,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE2,0xFF,0x01,0x11,0x14,0xFE,0x00,0x01,0x01 ,0xD9,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xFF ,0x08,0x62,0x75,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x04,0x0B,0x8D,0xA8,0xFF,0x01 ,0x0D,0x10,0xFD,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x17 ,0x8D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x01,0x01,0xE3,0x00 ,0x00,0x00,0xFF,0x0B,0x90,0xAC,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xAC ,0xCD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8F,0x87,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x0A,0x00,0x01,0x02,0xDE,0x01,0x07,0x09,0xFE,0x0D,0xA7 ,0xC7,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x07,0x5F,0x72 ,0xFF,0x02,0x16,0x1A,0xFE,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x01,0x01,0xF8 ,0x00,0x01,0x01,0xEA,0x90,0x00,0x01,0x01,0xE9,0x03,0x00,0x01,0x01,0xDA,0x00 ,0x00,0x00,0xA2,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x1F,0x83,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xB1,0x84,0x00,0x01,0x01,0xE9,0x02,0x00,0x01,0x01 ,0xF3,0x00,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01 ,0x0E,0xAE,0xCF,0xFF,0x02,0x1F,0x25,0xFE,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x01,0x01,0xEF,0x88,0x00,0x01,0x01,0xE9,0x04,0x00,0x01,0x01,0xE8,0x00,0x00 ,0x00,0xD7,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x1F,0x85 ,0xFF,0xFF,0xFF,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00 ,0x00,0x00,0xFF,0x09,0x72,0x88,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x00,0x05,0x45 ,0x52,0xFF,0x81,0x00,0x00,0x00,0xFF,0x0A,0x00,0x00,0x01,0xFC,0x00,0x01,0x01 ,0xDD,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x74,0x00,0x00 ,0x00,0x72,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA9,0x00 ,0x00,0x00,0xBD,0x00,0x01,0x01,0xF4,0x81,0x00,0x00,0x00,0xFF,0x02,0x03,0x21 ,0x28,0xFE,0x07,0x5E,0x71,0xFF,0x0D,0xAB,0xCC,0xFF,0x97,0x0F,0xBF,0xE4,0xFF ,0x01,0x03,0x28,0x2F,0xFF,0x00,0x01,0x01,0xE5,0x8B,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x5B,0x00,0x00,0x00,0xFF,0x09,0x6E,0x83,0xFF,0x93,0x0F,0xBF ,0xE4,0xFF,0x02,0x0D,0xA8,0xC8,0xFF,0x06,0x4E,0x5D,0xFF,0x00,0x04,0x05,0xFE ,0x91,0x00,0x00,0x00,0xFF,0x02,0x00,0x01,0x01,0xD0,0x00,0x00,0x00,0x80,0x00 ,0x00,0x00,0x14,0x83,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x01 ,0x02,0xDE,0x00,0x04,0x05,0xFE,0x0C,0x97,0xB4,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF ,0x05,0x0E,0xB0,0xD2,0xFF,0x03,0x2A,0x32,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01 ,0x01,0xC8,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x01,0x8B,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0xFF,0x05,0x46 ,0x53,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x67,0x7B,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x3B,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x44 ,0x00,0x00,0x00,0xFF,0x08,0x61,0x73,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06 ,0x51,0x61,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2F,0x86,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xDA,0x01,0x09,0x0A,0xFD,0x0E ,0xAF,0xD1,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x06,0x0D,0xA8,0xC8,0xFF,0x03,0x28 ,0x30,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x97,0x00 ,0x00,0x00,0x46,0x00,0x00,0x00,0x0C,0x87,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00 ,0x00,0x06,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x9A,0x00,0x01,0x01,0xFB,0x00 ,0x05,0x06,0xFE,0x09,0x73,0x8A,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE ,0xE3,0xFF,0x00,0x02,0x02,0xFF,0x00,0x00,0x00,0xAE,0x88,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0xFF,0x04,0x34,0x3E,0xFF,0x94,0x0F ,0xBF,0xE4,0xFF,0x07,0x0F,0xBE,0xE3,0xFF,0x0C,0x93,0xAF,0xFF,0x08,0x67,0x7B ,0xFF,0x07,0x5B,0x6C,0xFF,0x06,0x4E,0x5D,0xFF,0x05,0x41,0x4E,0xFF,0x04,0x35 ,0x3F,0xFF,0x03,0x2B,0x33,0xFF,0x90,0x03,0x29,0x31,0xFF,0x05,0x02,0x1D,0x23 ,0xFE,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xFA,0x00,0x00 ,0x00,0x91,0x00,0x00,0x00,0x15,0x81,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x76,0x00,0x00,0x00,0xFF,0x02,0x19,0x1E,0xFF,0x84,0x03,0x29,0x31,0xFF,0x00 ,0x06,0x4B,0x59,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBE,0xE3,0xFF,0x0B ,0x8C,0xA7,0xFF,0x07,0x5C,0x6E,0xFF,0x05,0x43,0x50,0xFF,0x04,0x2D,0x36,0xFF ,0x89,0x03,0x29,0x31,0xFF,0x05,0x02,0x1B,0x21,0xFF,0x00,0x06,0x07,0xFE,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0x0F ,0x83,0xFF,0xFF,0xFF,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0D ,0x00,0x01,0x01,0xF6,0x03,0x2A,0x32,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x05,0x0D ,0xA6,0xC6,0xFF,0x09,0x6F,0x84,0xFF,0x07,0x55,0x65,0xFF,0x05,0x3B,0x47,0xFF ,0x03,0x21,0x28,0xFF,0x01,0x07,0x09,0xFE,0x85,0x00,0x00,0x00,0xFF,0x03,0x01 ,0x09,0x0B,0xFD,0x03,0x2A,0x33,0xFF,0x08,0x67,0x7B,0xFF,0x0D,0xA5,0xC5,0xFF ,0x9A,0x0F,0xBF,0xE4,0xFF,0x01,0x04,0x36,0x40,0xFF,0x00,0x01,0x01,0xF9,0x8B ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01,0xF6,0x03,0x2A ,0x32,0xFF,0x95,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xAF,0xD1,0xFF,0x0C,0x93,0xAF ,0xFF,0x0A,0x80,0x99,0xFF,0x09,0x6D,0x83,0xFF,0x08,0x60,0x72,0xFF,0x8C,0x07 ,0x5F,0x72,0xFF,0x04,0x05,0x43,0x50,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00 ,0xFF,0x00,0x01,0x02,0xE8,0x00,0x00,0x00,0x45,0x83,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0x2F,0x00,0x01,0x01,0xF7,0x02,0x14,0x18,0xFD,0x0E,0xAF,0xD0 ,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x08,0x0E,0xB8,0xDC,0xFF,0x07,0x55,0x66,0xFF ,0x01,0x08,0x09,0xFD,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD8,0x00,0x00,0x00 ,0x77,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x83,0xFF ,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1E,0x00,0x00,0x00 ,0x5F,0x00,0x00,0x00,0xA7,0x00,0x01,0x01,0xF6,0x00,0x00,0x00,0xFF,0x05,0x3F ,0x4B,0xFF,0x0E,0xB3,0xD6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x61,0x73 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x32,0x8B,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x03,0x00,0x01,0x02,0xE8,0x02,0x1D,0x22,0xFE,0x90,0x0F,0xBF ,0xE4,0xFF,0x02,0x0B,0x92,0xAE,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x85 ,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xFF,0x05 ,0x3E,0x4A,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x01,0x0B,0x86,0xA0,0xFF,0x03,0x28 ,0x30,0xFF,0x81,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 ,0xCF,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x8C,0x00,0x00 ,0x00,0x86,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0xC4,0x00 ,0x01,0x01,0xF2,0x81,0x00,0x00,0x00,0xFF,0x01,0x03,0x25,0x2C,0xFE,0x0C,0x9D ,0xBB,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B ,0x00,0x00,0x00,0xFF,0x09,0x76,0x8C,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x09,0x0E ,0xB3,0xD6,0xFF,0x0B,0x87,0xA1,0xFF,0x03,0x2B,0x33,0xFE,0x00,0x00,0x00,0xFF ,0x00,0x01,0x01,0xEB,0x00,0x00,0x00,0x1D,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x23,0x00,0x00,0x00,0xFF,0x06,0x4B,0x59,0xFF,0xA8,0x0F,0xBF,0xE4,0xFF,0x05 ,0x0F,0xBE,0xE3,0xFF,0x0B,0x89,0xA4,0xFF,0x04,0x31,0x3B,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x01,0x01,0xE3,0x00,0x00,0x00,0x2F,0x82,0xFF,0xFF,0xFF,0x00,0x9C ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF,0x0D,0xA1 ,0xC0,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xAE,0xCF,0xFF,0x0C,0x94,0xB1 ,0xFF,0x0C,0x93,0xAF,0xFF,0x0D,0xA0,0xBF,0xFF,0x0E,0xAF,0xD0,0xFF,0x0F,0xBC ,0xE0,0xFF,0x9E,0x0F,0xBF,0xE4,0xFF,0x01,0x04,0x34,0x3E,0xFF,0x00,0x01,0x01 ,0xF7,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF ,0x0D,0xA6,0xC6,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBC,0xE0,0xFF,0x09 ,0x78,0x8F,0xFF,0x01,0x0B,0x0D,0xFD,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x67 ,0x83,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFF,0x04 ,0x30,0x39,0xFF,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2 ,0xD4,0xFF,0x08,0x61,0x74,0xFF,0x01,0x0E,0x11,0xFD,0x82,0x00,0x00,0x00,0xFF ,0x05,0x00,0x01,0x01,0xFB,0x00,0x01,0x02,0xF2,0x00,0x02,0x02,0xEB,0x00,0x02 ,0x02,0xE4,0x00,0x02,0x02,0xEF,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF ,0x01,0x03,0x23,0x2A,0xFE,0x0B,0x87,0xA1,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02 ,0x07,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x28,0x8C,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0xFF,0x0C,0x99,0xB6,0xFF ,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE3,0xFF,0x02,0x13,0x17,0xFE,0x00 ,0x01,0x01,0xDD,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA9,0x00,0x00 ,0x00,0xFF,0x08,0x6C,0x81,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x04,0x0C,0x9B,0xB9 ,0xFF,0x08,0x6C,0x81,0xFF,0x05,0x3D,0x49,0xFF,0x02,0x13,0x17,0xFE,0x00,0x03 ,0x04,0xFE,0x83,0x00,0x00,0x00,0xFF,0x04,0x00,0x05,0x06,0xFE,0x02,0x15,0x19 ,0xFE,0x03,0x2B,0x34,0xFF,0x08,0x64,0x78,0xFF,0x0D,0xA3,0xC2,0xFF,0x93,0x0F ,0xBF,0xE4,0xFF,0x02,0x0E,0xB3,0xD6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x9F,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0F,0x00,0x02,0x02,0xE7 ,0x01,0x0B,0x0D,0xFE,0x0E,0xAC,0xCE,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x07,0x09 ,0x76,0x8C,0xFF,0x00,0x01,0x01,0xFF,0x00,0x01,0x01,0xCB,0x00,0x00,0x00,0x07 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xD0,0x01,0x0E,0x10,0xFD,0x0F,0xBD,0xE1 ,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x03,0x09,0x76,0x8C,0xFF,0x00,0x04,0x05,0xFE ,0x00,0x01,0x01,0xD8,0x00,0x00,0x00,0x09,0x81,0xFF,0xFF,0xFF,0x00,0x9C,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A ,0xFF,0xB9,0x0F,0xBF,0xE4,0xFF,0x01,0x03,0x24,0x2B,0xFF,0x00,0x01,0x01,0xE3 ,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0xFF,0x08 ,0x62,0x75,0xFF,0xA9,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xAA,0xCB,0xFF,0x02,0x16 ,0x1A,0xFE,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x32,0x83,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0xFF,0x07,0x55,0x66,0xFF,0x92,0x0F ,0xBF,0xE4,0xFF,0x0C,0x0F,0xB9,0xDD,0xFF,0x0C,0x97,0xB5,0xFF,0x09,0x76,0x8C ,0xFF,0x07,0x54,0x64,0xFF,0x05,0x3B,0x47,0xFF,0x04,0x35,0x3F,0xFF,0x04,0x30 ,0x39,0xFF,0x03,0x2B,0x34,0xFF,0x04,0x32,0x3C,0xFF,0x05,0x40,0x4D,0xFF,0x06 ,0x4F,0x5F,0xFF,0x09,0x76,0x8C,0xFF,0x0D,0xAB,0xCC,0xFF,0x94,0x0F,0xBF,0xE4 ,0xFF,0x02,0x02,0x1E,0x24,0xFE,0x00,0x01,0x01,0xED,0x00,0x00,0x00,0x03,0x8C ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0xFF,0x07,0x55 ,0x65,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x54,0x64,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x33,0x87,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0D ,0x00,0x01,0x01,0xDB,0x00,0x03,0x04,0xFE,0x0C,0x96,0xB3,0xFF,0x98,0x0F,0xBF ,0xE4,0xFF,0x03,0x0E,0xB7,0xDA,0xFF,0x0D,0xA9,0xCA,0xFF,0x0D,0xA6,0xC6,0xFF ,0x0E,0xB5,0xD8,0xFF,0x98,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9,0xC9,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x92,0x8A,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x4E,0x00,0x00,0x00,0xFF,0x05,0x3A,0x45,0xFF,0x0F,0xBE,0xE3,0xFF,0xAF ,0x0F,0xBF,0xE4,0xFF,0x06,0x07,0x5B,0x6D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x0B ,0x8E,0xA9,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x86,0x81,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE0,0x01,0x12,0x16,0xFD,0x0F ,0xBD,0xE1,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x14,0x18,0xFE,0x00,0x00 ,0x00,0xCE,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01,0x01 ,0xED,0x02,0x1E,0x24,0xFE,0xAA,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF ,0x00,0x03,0x04,0xFE,0x00,0x00,0x00,0xBB,0x83,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x05,0x00,0x00,0x01,0xC4,0x00,0x00,0x00,0xFF,0x09,0x6E,0x83,0xFF ,0xB2,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC3,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x9F,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDA,0x01,0x12 ,0x15,0xFE,0x0F,0xBE,0xE2,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x95,0xB2 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8A,0x88,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0x2F,0x00,0x01,0x01,0xF8,0x02,0x15,0x1A,0xFD,0x0E,0xB2,0xD4 ,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x85,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA6,0x00 ,0x00,0x00,0xFF,0x07,0x5A,0x6B,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x06,0x0F,0xBE ,0xE2,0xFF,0x04,0x34,0x3F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x42,0x00 ,0x00,0x00,0x2B,0x00,0x00,0x00,0xFF,0x06,0x4F,0x5F,0xFF,0xAB,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0F,0xBE,0xE2,0xFF,0x01,0x13,0x16,0xFE,0x00,0x00,0x00,0xCC,0x81 ,0xFF,0xFF,0xFF,0x00,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x81,0x00 ,0x00,0x00,0xFF,0x0B,0x88,0xA3,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x01,0x00,0x05 ,0x06,0xFE,0x00,0x00,0x00,0xBB,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x97,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB8,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x02 ,0x05,0x42,0x4F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x28,0x83,0xFF,0xFF ,0xFF,0x00,0x04,0x00,0x00,0x00,0x19,0x00,0x01,0x02,0xDE,0x00,0x00,0x00,0xFF ,0x07,0x57,0x68,0xFF,0x0F,0xBE,0xE3,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4E,0x8E,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x0B,0x8D,0xA8,0xFF,0x8F ,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE3,0xFF,0x02,0x16,0x1B,0xFE,0x00,0x01 ,0x01,0xE1,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x65,0x00,0x00,0x00 ,0xFF,0x04,0x38,0x43,0xFF,0x0F,0xBE,0xE3,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0C,0x94,0xB0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x77,0x8B,0xFF,0xFF ,0xFF,0x00,0x03,0x00,0x00,0x00,0x0B,0x00,0x01,0x01,0xCB,0x00,0x00,0x00,0xFF ,0x09,0x70,0x85,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x06,0x0C,0x9B,0xB9,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x94,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x01,0xDA ,0x01,0x11,0x14,0xFD,0x0F,0xBE,0xE2,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x03,0x04 ,0x39,0x44,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x05,0xFF,0xFF,0xFF,0x00 ,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xFE,0x05 ,0x40,0x4D,0xFF,0xB7,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD4,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0xA7,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x3C,0x00,0x00,0x00,0xFF,0x07,0x57,0x68,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0B,0x8E,0xA9,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8A,0x84,0xFF,0xFF ,0xFF,0x00,0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0xC4,0x00,0x00,0x00,0xFF ,0x05,0x3E,0x4A,0xFF,0x0E,0xB8,0xDC,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x02,0x04 ,0x2D,0x36,0xFF,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x09,0x8E,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xFF,0x06,0x49,0x57,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x57,0x68,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x37,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00 ,0xFF,0x08,0x65,0x79,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x50,0x8C,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x16,0x00,0x01,0x01,0xDD,0x00,0x01,0x01,0xFF,0x0A,0x84,0x9D,0xFF ,0xAF,0x0F,0xBF,0xE4,0xFF,0x05,0x02,0x15,0x19,0xFE,0x00,0x01,0x01,0xE1,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xFF,0x0B,0x92,0xAE,0xFF ,0xAB,0x0F,0xBF,0xE4,0xFF,0x03,0x07,0x5E,0x70,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x2F,0xFF,0xFF,0xFF,0x00,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0xC0,0x00,0x04,0x05,0xFE,0x0E,0xB2,0xD5,0xFF,0xB6,0x0F,0xBF,0xE4,0xFF ,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6A,0x8D,0xFF ,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE1,0x02,0x13,0x17 ,0xFE,0x0F,0xBE,0xE2,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x00,0x0E,0xB4,0xD7,0xFF ,0x94,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02,0x17,0x1C,0xFE,0x00 ,0x01,0x01,0xE8,0x00,0x00,0x00,0x04,0x84,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00 ,0x00,0x07,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF,0x03,0x29,0x31,0xFE,0x0E ,0xAE,0xCF,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x87,0xA1,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0xA8,0x90,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01 ,0xE5,0x03,0x25,0x2D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x98,0xB6,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8E,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00 ,0x00,0x00,0x0B,0x00,0x01,0x01,0xD8,0x00,0x02,0x02,0xFE,0x0B,0x91,0xAD,0xFF ,0xB2,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x27,0xFE,0x00,0x01,0x01,0xEF,0x00 ,0x00,0x00,0x06,0x8D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x01 ,0x02,0xEC,0x00,0x06,0x07,0xFE,0x0C,0x95,0xB2,0xFF,0xAE,0x0F,0xBF,0xE4,0xFF ,0x05,0x06,0x50,0x60,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2E,0x00,0x00 ,0x00,0x33,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF ,0x03,0x0A,0x82,0x9C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x60,0xFF,0xFF ,0xFF,0x00,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x61,0x00,0x00,0x00 ,0xFF,0x09,0x77,0x8E,0xFF,0xB6,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x28,0x2F,0xFF ,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x0F,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x87,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB,0xFF,0x92,0x0F,0xBF,0xE4 ,0xFF,0x02,0x06,0x4C,0x5A,0xFF,0x00,0x05,0x05,0xFE,0x0C,0x9D,0xBC,0xFF,0x94 ,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x4D,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00 ,0xFF,0x01,0x0E,0x10,0xFD,0x0A,0x7E,0x96,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0E,0xAC,0xCE,0xFF,0x01,0x0E,0x11,0xFD,0x00,0x01,0x02,0xED,0x00,0x00,0x00 ,0x1B,0x90,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xE8,0x03,0x2C,0x35,0xFF ,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x19,0x1E,0xFE,0x00,0x01,0x02,0xE5,0x00 ,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x2B,0x00,0x01 ,0x01,0xF6,0x01,0x12,0x15,0xFE,0x0D,0xAC,0xCD,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF ,0x02,0x0C,0x9A,0xB8,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9A,0x8F,0xFF ,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x35,0x00,0x01,0x01,0xF5,0x01,0x0D,0x10 ,0xFD,0x0B,0x8B,0xA6,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x06,0x0B,0x8B,0xA5,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7A,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x01 ,0xE1,0x02,0x15,0x19,0xFE,0x0F,0xBE,0xE3,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x03 ,0x0D,0xA7,0xC7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x91,0xFF,0xFF,0xFF ,0x00,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFF ,0x06,0x51,0x61,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0xA2,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x2C,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x92,0x0F,0xBF,0xE4,0xFF ,0x03,0x05,0x40,0x4C,0xFF,0x00,0x00,0x00,0xFF,0x03,0x28,0x30,0xFE,0x0F,0xBE ,0xE2,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA8,0xC8,0xFF,0x00,0x01,0x01 ,0xFF,0x00,0x00,0x00,0xAE,0x87,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x4D ,0x00,0x01,0x02,0xE9,0x00,0x00,0x00,0xFF,0x05,0x3D,0x49,0xFF,0x0E,0xAF,0xD0 ,0xFF,0xA8,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x04,0x33,0x3C,0xFE ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4B,0x91,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x01,0x01,0xEF,0x04,0x32,0x3C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5A ,0x6B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3C,0x8A,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0xFF,0x02,0x18,0x1D,0xFD,0x0D,0xA5 ,0xC5,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x54,0x64,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x3E,0x90,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x47 ,0x00,0x01,0x02,0xF1,0x00,0x01,0x01,0xFF,0x07,0x55,0x65,0xFF,0x0F,0xBA,0xDE ,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x06,0x0F,0xBB,0xDF,0xFF,0x01,0x09,0x0A,0xFE ,0x00,0x00,0x00,0xC7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00 ,0xFF,0x0C,0x97,0xB4,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x02,0x01,0x0B,0x0D,0xFD ,0x00,0x00,0x00,0xC3,0xFF,0xFF,0xFF,0x00,0x9F,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x01,0x01,0xF1,0x04,0x30,0x39,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4B ,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3E,0x90,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x01,0xD4,0x01,0x0F,0x11,0xFD,0x0F,0xBD,0xE1,0xFF,0x91,0x0F ,0xBF,0xE4,0xFF,0x00,0x07,0x59,0x6A,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x08 ,0x6B,0x80,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x32,0x3C,0xFF,0x00,0x01 ,0x01,0xFB,0x00,0x00,0x00,0x15,0x87,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00 ,0x12,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xFF,0x01,0x0E,0x11,0xFD,0x09,0x6E ,0x83,0xFF,0x0E,0xB7,0xDA,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xAE,0xCF ,0xFF,0x04,0x37,0x41,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8F,0x91,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFF,0x06,0x4B,0x59 ,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x82,0x8B,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x63,0x00 ,0x00,0x01,0xFD,0x01,0x10,0x13,0xFD,0x0C,0x9C,0xBA,0xFF,0xAD,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0D,0xA5,0xC5,0xFF,0x01,0x0B,0x0D,0xFD,0x00,0x01,0x01,0xE1,0x00 ,0x00,0x00,0x01,0x91,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x1E,0x00,0x00 ,0x01,0xC3,0x00,0x00,0x00,0xFF,0x03,0x22,0x29,0xFE,0x0C,0x9F,0xBE,0xFF,0xAB ,0x0F,0xBF,0xE4,0xFF,0x05,0x05,0x40,0x4C,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00 ,0x00,0x16,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0xAB ,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x30,0x39,0xFF,0x00,0x01,0x01,0xF3,0x00,0x00 ,0x00,0x01,0x9F,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xEC,0x04,0x31,0x3B ,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x01,0x01,0xCA,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x80,0x00 ,0x00,0x00,0xFF,0x0B,0x90,0xAC,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x04,0x09,0x72 ,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFE,0x01,0x07,0x08,0xFD,0x0D ,0xA8,0xC8,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x72,0x89,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00 ,0x53,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0E,0xFE,0x07,0x5B ,0x6C,0xFF,0x0D,0xAC,0xCD,0xFF,0xA2,0x0F,0xBF,0xE4,0xFF,0x04,0x0B,0x86,0xA0 ,0xFF,0x01,0x0F,0x12,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA4,0x00,0x00 ,0x00,0x06,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x67,0x00,0x00,0x00 ,0xFF,0x0A,0x7F,0x98,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA1,0xC0,0xFF ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x83,0x8C,0xFF,0xFF,0xFF,0x00,0x04,0x00 ,0x00,0x00,0x50,0x00,0x01,0x01,0xF9,0x01,0x09,0x0B,0xFD,0x09,0x76,0x8D,0xFF ,0x0F,0xBE,0xE3,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB2,0xD5,0xFF,0x02 ,0x1F,0x25,0xFE,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x4B,0x93,0xFF,0xFF,0xFF ,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7F,0x00,0x00,0x01,0xFD,0x00 ,0x05,0x06,0xFE,0x08,0x66,0x7A,0xFF,0x0E,0xB1,0xD3,0xFF,0xA9,0x0F,0xBF,0xE4 ,0xFF,0x05,0x0A,0x7A,0x92,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x61,0x00 ,0x00,0x00,0x02,0x00,0x01,0x01,0xE8,0x02,0x19,0x1E,0xFE,0xAB,0x0F,0xBF,0xE4 ,0xFF,0x02,0x07,0x55,0x65,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x25,0x9E ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0xFE,0x05,0x3E ,0x4A,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x03,0x08,0x6A,0x7F,0xFF,0x00,0x03,0x04 ,0xFE,0x00,0x01,0x02,0xE7,0x00,0x00,0x00,0x1B,0x91,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0x91,0x0F,0xBF ,0xE4,0xFF,0x04,0x09,0x79,0x90,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x98 ,0x00,0x00,0x00,0xFE,0x04,0x36,0x40,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x0F ,0xB9,0xDD,0xFF,0x01,0x0B,0x0D,0xFE,0x00,0x01,0x01,0xD4,0x8A,0xFF,0xFF,0xFF ,0x00,0x06,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x69,0x00,0x01,0x01,0xDB,0x00 ,0x00,0x00,0xFF,0x00,0x03,0x04,0xFE,0x05,0x46,0x53,0xFF,0x0C,0x9B,0xB9,0xFF ,0x9D,0x0F,0xBF,0xE4,0xFF,0x05,0x0F,0xBE,0xE3,0xFF,0x0B,0x8B,0xA6,0xFF,0x05 ,0x3F,0x4B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x56 ,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB2,0x00,0x01,0x01,0xFF,0x0E ,0xB2,0xD4,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x87,0xA1,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x6E,0x8D,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00 ,0x3F,0x00,0x01,0x02,0xE8,0x00,0x00,0x00,0xFF,0x03,0x2C,0x34,0xFE,0x0C,0x9B ,0xB9,0xFF,0xA8,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x88,0xA2,0xFF,0x01,0x13,0x17 ,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x76,0x96,0xFF,0xFF,0xFF,0x00,0x06 ,0x00,0x00,0x00,0x3B,0x00,0x01,0x01,0xE1,0x00,0x00,0x00,0xFF,0x00,0x03,0x04 ,0xFE,0x05,0x3B,0x47,0xFF,0x0A,0x81,0x9A,0xFF,0x0F,0xBA,0xDE,0xFF,0xA6,0x0F ,0xBF,0xE4,0xFF,0x07,0x0E,0xB2,0xD4,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00 ,0xAE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xFF,0x0B,0x8E ,0xAA,0xFF,0x0F,0xBB,0xDF,0xFF,0xA9,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x79,0x90 ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56,0x9D,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0x05,0x00,0x01,0x01,0xD2,0x00,0x02,0x02,0xFE,0x0C,0x97,0xB5 ,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xB8,0xDC,0xFF,0x0A,0x7B,0x93,0xFF ,0x04,0x2D,0x35,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD8,0x00,0x00,0x00 ,0x2C,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFF ,0x06,0x49,0x57,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x06,0x07,0x58,0x6A,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0xFF ,0x06,0x49,0x58,0xFF,0x0F,0xBC,0xE0,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x06 ,0x4E,0x5D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x35,0x8B,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4E,0x00,0x00,0x00,0xC1,0x81 ,0x00,0x00,0x00,0xFF,0x02,0x04,0x31,0x3B,0xFF,0x0B,0x86,0xA0,0xFF,0x0F,0xBA ,0xDE,0xFF,0x97,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x0D,0xA0,0xBF ,0xFF,0x08,0x60,0x72,0xFF,0x02,0x16,0x1B,0xFE,0x81,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xB6,0x00,0x00,0x00,0x1A,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x0E,0x00,0x01,0x01,0xF9,0x04,0x31,0x3A,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x03,0x0F,0xBB,0xDF,0xFF,0x04,0x31,0x3B,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x1F,0x8E,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x0D,0x00,0x00 ,0x00,0x8B,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0xFF,0x02,0x1C,0x21,0xFE,0x06 ,0x52,0x62,0xFF,0x0B,0x88,0xA2,0xFF,0x0E,0xB8,0xDC,0xFF,0x9F,0x0F,0xBF,0xE4 ,0xFF,0x07,0x0F,0xBE,0xE3,0xFF,0x0D,0xAB,0xCC,0xFF,0x0A,0x84,0x9D,0xFF,0x06 ,0x4D,0x5C,0xFF,0x02,0x15,0x19,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x02,0xF1 ,0x00,0x00,0x00,0x5B,0x98,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x0B,0x00 ,0x00,0x00,0x5C,0x00,0x00,0x00,0xB8,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0xFF ,0x01,0x0C,0x0E,0xFD,0x06,0x4D,0x5C,0xFF,0x0C,0x93,0xAF,0xFF,0xA5,0x0F,0xBF ,0xE4,0xFF,0x03,0x04,0x2F,0x38,0xFF,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x07 ,0x00,0x00,0x00,0x44,0x82,0x00,0x00,0x00,0xFF,0x05,0x01,0x0A,0x0C,0xFE,0x02 ,0x1B,0x20,0xFF,0x05,0x3A,0x45,0xFF,0x08,0x69,0x7D,0xFF,0x0C,0x98,0xB6,0xFF ,0x0F,0xBD,0xE1,0xFF,0xA3,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBC,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x87,0x9C,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x10,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF,0x07,0x56,0x67,0xFF,0xAD ,0x0F,0xBF,0xE4,0xFF,0x08,0x0F,0xBC,0xE0,0xFF,0x0D,0xA6,0xC6,0xFF,0x0B,0x8A ,0xA5,0xFF,0x06,0x4C,0x5B,0xFF,0x01,0x09,0x0B,0xFE,0x00,0x00,0x00,0xFF,0x00 ,0x01,0x01,0xFB,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x0A,0x93,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xFF,0x09,0x76,0x8C,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x08,0x0C,0x9A,0xB8,0xFF,0x01,0x0A,0x0C,0xFD,0x00,0x01 ,0x01,0xEA,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0xFF,0x03,0x28,0x30,0xFE,0x0B,0x91,0xAD,0xFF,0x91,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x96,0x8E ,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0xA5,0x00,0x01 ,0x01,0xFC,0x00,0x00,0x00,0xFF,0x00,0x04,0x05,0xFE,0x03,0x2A,0x32,0xFF,0x07 ,0x55,0x66,0xFF,0x0A,0x80,0x99,0xFF,0x0D,0xAB,0xCC,0xFF,0x8C,0x0F,0xBF,0xE4 ,0xFF,0x07,0x0F,0xBB,0xE0,0xFF,0x0D,0xAC,0xCD,0xFF,0x0C,0x9B,0xB9,0xFF,0x0B ,0x8B,0xA5,0xFF,0x09,0x76,0x8C,0xFF,0x06,0x51,0x61,0xFF,0x03,0x2C,0x35,0xFF ,0x01,0x07,0x09,0xFE,0x81,0x00,0x00,0x00,0xFF,0x02,0x00,0x01,0x01,0xE5,0x00 ,0x00,0x00,0x88,0x00,0x00,0x00,0x2A,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0x04,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0xFF,0x06,0x52,0x61,0xFF,0x8F ,0x0C,0x95,0xB2,0xFF,0x04,0x0B,0x8C,0xA7,0xFF,0x08,0x6C,0x81,0xFF,0x03,0x29 ,0x31,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB0,0x91,0xFF,0xFF,0xFF,0x00 ,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x96,0x00,0x01,0x01,0xE1,0x81,0x00 ,0x00,0x00,0xFF,0x0E,0x00,0x02,0x02,0xFE,0x02,0x18,0x1C,0xFD,0x04,0x34,0x3E ,0xFF,0x06,0x4E,0x5D,0xFF,0x08,0x68,0x7C,0xFF,0x0A,0x7D,0x95,0xFF,0x0A,0x85 ,0x9F,0xFF,0x0B,0x8D,0xA8,0xFF,0x0C,0x94,0xB0,0xFF,0x0C,0x9B,0xB9,0xFF,0x0D ,0xA2,0xC1,0xFF,0x0D,0xA9,0xCA,0xFF,0x0E,0xB0,0xD2,0xFF,0x0E,0xB8,0xDB,0xFF ,0x0F,0xBE,0xE3,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x0D,0x0F,0xBE,0xE2,0xFF,0x0E ,0xB4,0xD7,0xFF,0x0D,0xAA,0xCB,0xFF,0x0D,0xA0,0xBE,0xFF,0x0C,0x96,0xB3,0xFF ,0x0B,0x8B,0xA6,0xFF,0x0A,0x82,0x9B,0xFF,0x09,0x77,0x8E,0xFF,0x09,0x6D,0x82 ,0xFF,0x08,0x63,0x76,0xFF,0x07,0x55,0x66,0xFF,0x05,0x3C,0x48,0xFF,0x03,0x21 ,0x27,0xFE,0x00,0x06,0x07,0xFE,0x82,0x00,0x00,0x00,0xFF,0x02,0x00,0x01,0x01 ,0xD7,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x1D,0x9C,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x71,0x00,0x01,0x01,0xCE,0x81,0x00,0x00 ,0x00,0xFF,0x04,0x02,0x19,0x1D,0xFE,0x06,0x4E,0x5D,0xFF,0x09,0x70,0x85,0xFF ,0x0B,0x91,0xAD,0xFF,0x0E,0xB2,0xD5,0xFF,0xA0,0x0F,0xBF,0xE4,0xFF,0x09,0x08 ,0x6A,0x7E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x03 ,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xA8,0x00,0x00,0x00 ,0xBD,0x00,0x00,0x00,0xD3,0x00,0x00,0x01,0xFC,0x81,0x00,0x00,0x00,0xFF,0x02 ,0x01,0x09,0x0B,0xFE,0x06,0x4A,0x59,0xFF,0x0D,0xA0,0xBF,0xFF,0xA1,0x0F,0xBF ,0xE4,0xFF,0x02,0x0F,0xBC,0xE0,0xFF,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xB9 ,0x9B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0xB2,0x00,0x01,0x01,0xFA,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x03,0x28,0x30,0xFF,0xAB,0x04,0x2F,0x38,0xFF,0x02 ,0x04,0x2E,0x37,0xFF,0x02,0x18,0x1D,0xFE,0x00,0x02,0x03,0xFE,0x82,0x00,0x00 ,0x00,0xFF,0x02,0x00,0x00,0x00,0xCD,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0x14 ,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0xFF,0x05,0x3D,0x49,0xFF,0x8D,0x06,0x47,0x55,0xFF,0x05,0x06,0x46 ,0x54,0xFF,0x04,0x2E,0x37,0xFF,0x01,0x0A,0x0C,0xFE,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0xFD,0x00,0x00,0x00,0x43,0x81,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00 ,0x00,0x04,0x00,0x00,0x00,0x8C,0x00,0x01,0x01,0xFA,0x00,0x00,0x00,0xFF,0x01 ,0x12,0x16,0xFD,0x05,0x41,0x4E,0xFF,0x90,0x06,0x47,0x55,0xFF,0x02,0x00,0x04 ,0x04,0xFF,0x00,0x01,0x01,0xF0,0x00,0x00,0x00,0x08,0x8F,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0xB5,0x00,0x01 ,0x01,0xEE,0x82,0x00,0x00,0x00,0xFF,0x0C,0x02,0x15,0x19,0xFE,0x04,0x34,0x3F ,0xFF,0x05,0x42,0x4F,0xFF,0x06,0x4F,0x5E,0xFF,0x07,0x5B,0x6D,0xFF,0x08,0x67 ,0x7B,0xFF,0x08,0x67,0x7A,0xFF,0x07,0x5D,0x6F,0xFF,0x06,0x4E,0x5D,0xFF,0x05 ,0x3D,0x49,0xFF,0x04,0x2D,0x36,0xFF,0x02,0x1C,0x22,0xFF,0x01,0x0B,0x0D,0xFE ,0x85,0x00,0x00,0x00,0xFF,0x04,0x00,0x01,0x02,0xED,0x00,0x00,0x00,0xB9,0x00 ,0x00,0x00,0x86,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x02,0x95,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xAB,0x95,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x04,0x94,0xFF,0xFF,0xFF,0x00,0x04 ,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xAA,0x00,0x00,0x00 ,0xCE,0x00,0x01,0x01,0xF2,0x8B,0x00,0x00,0x00,0xFF,0x05,0x00,0x05,0x06,0xFE ,0x01,0x0C,0x0F,0xFD,0x02,0x13,0x17,0xFE,0x01,0x12,0x15,0xFE,0x01,0x08,0x0A ,0xFE,0x00,0x01,0x01,0xFF,0x89,0x00,0x00,0x00,0xFF,0x05,0x00,0x00,0x00,0xFD ,0x00,0x01,0x01,0xDF,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x92,0x00,0x00,0x00 ,0x67,0x00,0x00,0x00,0x20,0xA2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x29 ,0x00,0x00,0x00,0x85,0x00,0x01,0x01,0xDF,0x83,0x00,0x00,0x00,0xFF,0x03,0x00 ,0x06,0x07,0xFE,0x01,0x11,0x14,0xFE,0x02,0x1D,0x23,0xFF,0x03,0x28,0x30,0xFF ,0x9C,0x04,0x2F,0x38,0xFF,0x02,0x03,0x23,0x2A,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x95,0x85,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x0B,0x00,0x00 ,0x00,0x46,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0xFF,0x00 ,0x01,0x01,0xFF,0x04,0x38,0x43,0xFF,0x0B,0x8F,0xAB,0xFF,0x8E,0x0F,0xBF,0xE4 ,0xFF,0x00,0x05,0x3D,0x48,0xFF,0x90,0x04,0x2F,0x38,0xFF,0x01,0x00,0x06,0x07 ,0xFF,0x00,0x01,0x01,0xEB,0x9B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x04,0x04,0xB3 ,0xAF,0x00,0x02,0x02,0xEA,0x05,0x00,0x02,0x02,0xE8,0x00,0x00,0x00,0xCD,0x00 ,0x00,0x00,0xAC,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x2C ,0x97,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x06,0x08,0x97,0x91,0x00,0x00,0x00,0xFF ,0x03,0x00,0x01,0x01,0xF3,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0x95,0x00,0x00 ,0x00,0x4F,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00 ,0x86,0x00,0x01,0x01,0xD3,0x93,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5B ,0x92,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x00 ,0x00,0x00,0x61,0x00,0x00,0x00,0x9B,0x00,0x01,0x01,0xD5,0x00,0x01,0x01,0xF8 ,0x86,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0x00,0xFE,0x00,0x01,0x02,0xEE,0x00 ,0x00,0x00,0xD5,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x92 ,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x4C,0x00,0x00,0x00 ,0x1E,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2D,0x93,0x00,0x00,0x00 ,0x70,0x02,0x00,0x00,0x00,0x6B,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x18,0x9B ,0xFF,0xFF,0xFF,0x00,0x1C,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x38,0x00,0x00 ,0x00,0x52,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x70,0x00 ,0x00,0x00,0x7A,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x98 ,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0xAD,0x00,0x00,0x00,0xB7,0x00,0x00,0x00 ,0xC1,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0xBC,0x00,0x00 ,0x00,0xAE,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x86,0x00 ,0x00,0x00,0x78,0x00,0x00,0x00,0x6B,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0x50 ,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x25,0x00,0x00,0x00 ,0x07,0xAA,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x42 ,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0xB9,0x00,0x00,0x00 ,0xC6,0x00,0x00,0x00,0xD3,0x00,0x01,0x02,0xE3,0x00,0x02,0x02,0xE9,0x9C,0x00 ,0x02,0x02,0xEA,0x01,0x00,0x01,0x02,0xEA,0x00,0x00,0x00,0xC9,0x89,0xFF,0xFF ,0xFF,0x00,0x06,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xA9,0x00,0x00,0x01,0xFD ,0x00,0x00,0x00,0xFF,0x03,0x26,0x2D,0xFE,0x0A,0x7C,0x94,0xFF,0x0F,0xBC,0xE0 ,0xFF,0x8B,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x46,0x53,0xFF,0x00,0x00,0x00,0xFF ,0x00,0x01,0x02,0xF0,0x8F,0x00,0x02,0x02,0xEA,0x00,0x00,0x00,0x00,0xE8,0xEA ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0x91,0x00,0x00,0x00,0x08,0x00 ,0x00,0x00,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x92 ,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x04,0x98,0xFF,0xFF,0xFF,0x00,0x07 ,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x25,0x00,0x00,0x00 ,0x33,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2D,0x00,0x00,0x00,0x19,0x00,0x00 ,0x00,0x04,0xFF,0xFF,0xFF,0xFF,0x00,0xD3,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00 ,0x00,0x21,0x00,0x00,0x00,0x92,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0xFF,0x02 ,0x15,0x1A,0xFD,0x09,0x70,0x85,0xFF,0x0F,0xBE,0xE2,0xFF,0x89,0x0F,0xBF,0xE4 ,0xFF,0x02,0x0A,0x84,0x9D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x71,0x90 ,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF ,0xFF,0xFF,0xFF,0x00,0x95,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x12,0x00 ,0x00,0x00,0x7C,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0xFF,0x03,0x2A,0x33,0xFF ,0x0D,0xA0,0xBF,0xFF,0x88,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xB9,0xDD,0xFF,0x01 ,0x08,0x0A,0xFE,0x00,0x00,0x00,0xC4,0x90,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF ,0xFF,0x00,0xEE,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00 ,0xA2,0x00,0x00,0x00,0xD6,0x00,0x01,0x02,0xED,0x00,0x00,0x00,0xFD,0x8C,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x01,0x01,0xE4,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF ,0xFF,0x00,0x94,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,0x00,0x00 ,0x8E,0x00,0x00,0x00,0xFD,0x00,0x04,0x05,0xFE,0x08,0x63,0x76,0xFF,0x0F,0xBC ,0xE0,0xFF,0x87,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x41,0x4E,0xFF,0x00,0x00,0x00 ,0xFE,0x00,0x00,0x00,0x19,0x8F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00 ,0xED,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xB5,0x00 ,0x00,0x00,0xFF,0x02,0x17,0x1B,0xFF,0x04,0x2E,0x37,0xFF,0x05,0x3F,0x4B,0xFF ,0x8B,0x05,0x41,0x4E,0xFF,0x02,0x03,0x27,0x2E,0xFF,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x3E,0xFF,0xFF,0xFF,0xFF,0x00,0x96,0xFF,0xFF,0xFF,0x00,0x04,0x00 ,0x00,0x00,0x37,0x00,0x01,0x01,0xD5,0x00,0x00,0x00,0xFF,0x05,0x3B,0x47,0xFF ,0x0F,0xBA,0xDE,0xFF,0x86,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x80,0x99,0xFF,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x6B,0x8F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF ,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x01,0x01 ,0xD8,0x00,0x00,0x00,0xFF,0x06,0x46,0x54,0xFF,0x0F,0xBD,0xE1,0xFF,0x8D,0x0F ,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x97,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00 ,0x06,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF,0x04,0x34,0x3E,0xFF,0x0E,0xB8 ,0xDB,0xFF,0x85,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB7,0xDA,0xFF,0x00,0x06,0x07 ,0xFE,0x00,0x00,0x00,0xBE,0x8F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00 ,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFF,0x06 ,0x52,0x61,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x28,0xFE,0x00,0x01 ,0x02,0xEE,0x00,0x00,0x00,0x04,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0xFF,0xFF,0xFF ,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xFF,0x03 ,0x2C,0x34,0xFE,0x0E,0xB5,0xD7,0xFF,0x85,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3D ,0x49,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x15,0x8E,0xFF,0xFF,0xFF,0x00 ,0xFF,0xFF,0xFF,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71 ,0x00,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 ,0x65,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4A,0xFF,0xFF,0xFF,0xFF ,0x00,0x99,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF ,0x05,0x3A,0x45,0xFF,0x0F,0xBE,0xE3,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x02,0x0A ,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x65,0x8E,0xFF,0xFF,0xFF ,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x44,0x00,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 ,0x0D,0xA7,0xC7,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA3,0xFF,0xFF,0xFF ,0xFF,0x00,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00 ,0xFF,0x08,0x65,0x79,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD7,0xFF ,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xB8,0x8E,0xFF,0xFF,0xFF,0x00,0xFF,0xFF ,0xFF,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01 ,0x01,0xF2,0x03,0x2A,0x32,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2B,0x34 ,0xFF,0x00,0x01,0x01,0xF4,0x00,0x00,0x00,0x09,0xFF,0xFF,0xFF,0xFF,0x00,0x99 ,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0A,0x00,0x01,0x01,0xD4,0x00,0x02 ,0x02,0xFE,0x0B,0x8E,0xAA,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x39,0x44 ,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x11,0x8D,0xFF,0xFF,0xFF,0x00,0xFF ,0xFF,0xFF,0xFF,0x00,0xED,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA8,0x00 ,0x01,0x01,0xFF,0x0E,0xAE,0xCF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6F ,0x84,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56,0xFF,0xFF,0xFF,0xFF,0x00 ,0x9A,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x01,0x02,0xF3,0x01 ,0x12,0x15,0xFE,0x0E,0xB7,0xDA,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78 ,0x8F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x5F,0x8D,0xFF,0xFF,0xFF,0x00 ,0xFF,0xFF,0xFF,0xFF,0x00,0xED,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5A ,0x00,0x00,0x00,0xFF,0x09,0x75,0x8B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E ,0xAF,0xD0,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0xAF,0xFF,0xFF,0xFF,0xFF ,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xFF ,0x07,0x5E,0x71,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x00 ,0x03,0x04,0xFE,0x00,0x00,0x00,0xB2,0x8D,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF ,0xFF,0x00,0xED,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x01,0x01 ,0xFC,0x05,0x3A,0x46,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x35,0x3F,0xFF ,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x10,0xFF,0xFF,0xFF,0xFF,0x00,0x9A,0xFF ,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xD4,0x01,0x07,0x09 ,0xFE,0x0E,0xAC,0xCE,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x35,0x3F,0xFF ,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0D,0x8C,0xFF,0xFF,0xFF,0x00,0xFF,0xFF ,0xFF,0xFF,0x00,0xEE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBE,0x01,0x07 ,0x08,0xFE,0x0E,0xB8,0xDC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x77,0x8E ,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0x00,0x9B ,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0xFF,0x04,0x30 ,0x39,0xFF,0x83,0x07,0x59,0x6A,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x59,0x8C,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00 ,0xEE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xFF,0x0B ,0x86,0xA0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x70,0x85,0xFF,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x52,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xB8,0x86,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xAE,0x8C,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEE,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x90 ,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00 ,0x00,0x13,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x10,0x86,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x23,0x8C,0xFF,0xFF ,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEF,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01 ,0x01,0xD5,0x01,0x11,0x14,0xFD,0x0F,0xBE,0xE3,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF ,0x02,0x0D,0xA8,0xC8,0xFF,0x01,0x0A,0x0C,0xFE,0x00,0x00,0x01,0xD2,0xFF,0xFF ,0xFF,0xFF,0x00,0xB3,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEF,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xFF,0x04,0x35,0x3F ,0xFF,0x8C,0x05,0x3B,0x47,0xFF,0x04,0x05,0x3C,0x48,0xFF,0x03,0x2B,0x33,0xFF ,0x01,0x0B,0x0D,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x53,0xFF,0xFF,0xFF ,0xFF,0x00,0xB3,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEF,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x38,0x8E,0x00,0x00,0x00,0xFF,0x03,0x00,0x00 ,0x00,0xFE,0x00,0x01,0x01,0xE7,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x6C,0xFF ,0xFF,0xFF,0xFF,0x00,0xB4,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49 ,0x4F,0x4E,0x2D,0x58,0x46,0x49,0x4C,0x45,0x2E,0x00}; /* end binary data. size = 39085 bytes */ /* begin binary data: */ const int headphones_bytes = 22402; const unsigned char headphones_data[] = /* 22402 */ {0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xEB ,0x00,0x20,0x08,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xFF,0xFF ,0xFF,0xFF,0x00,0xEA,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x77,0x00,0x00,0x00,0x10,0xFF,0xFF,0xFF,0xFF,0x00,0xCC,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x0E,0x8B ,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8B ,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0xDF,0x00,0x00,0x00,0x34,0xFF,0xFF,0xFF,0xFF,0x00,0xC9,0xFF,0xFF,0xFF ,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xFB,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0xAC,0x8B,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 ,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x3D,0x00,0x00,0x00,0xFB,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xF9,0x00,0x00,0x00,0x6B,0xFF,0xFF,0xFF,0xFF,0x00,0xC7,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0xB2,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x6F,0x8A,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x16,0x00 ,0x00,0x00,0xE5,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0xFF,0xFF ,0xFF,0xFF,0x00,0xC6,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x00 ,0x00,0xF3,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00 ,0x38,0x89,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 ,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xBC ,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x90,0xFF,0xFF,0xFF,0xFF,0x00 ,0xC8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x56,0x84,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x11,0x88,0xFF,0xFF,0xFF,0x00,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x65,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC7,0x00 ,0x00,0x00,0x05,0xFF,0xFF,0xFF,0xFF,0x00,0xC9,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x90,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0x88,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x87,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xED,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x1D,0x89,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0x00 ,0xB2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0xC2,0x00 ,0x00,0x00,0x07,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00 ,0x00,0xC5,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 ,0x32,0x87,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 ,0x00,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9D,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x48,0x89,0xFF,0xFF,0xFF,0x00 ,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xF2,0x00,0x00 ,0x00,0x65,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00 ,0x72,0x00,0x00,0x00,0x1D,0xFF,0xFF,0xFF,0xFF,0x00,0x8E,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xB2,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x87,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1C,0x00 ,0x00,0x00,0xF0,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC8,0x00,0x00 ,0x00,0x01,0x86,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 ,0x00,0x00,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x3A,0x00,0x00,0x00 ,0xFE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x89,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xEB,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x72,0x98,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0E ,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xE1,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x57,0xEE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 ,0x00,0x8D,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0F,0x9C,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x67,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC ,0x00,0x00,0x00,0x37,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6E,0x84 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65,0x86,0xFF,0xFF,0xFF,0x00,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xD0,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xEE,0x00,0x00,0x00,0x14,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xAD,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00 ,0x0F,0x85,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01 ,0x8D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x7A,0x00 ,0x00,0x00,0xC2,0x00,0x00,0x00,0xFB,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x89,0xED,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x14,0x81,0x00,0x00 ,0x00,0xFF,0x04,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0x7C ,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x90,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x1B,0x00,0x00,0x00,0x2B,0x85,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0xBC,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xD7,0x00,0x00,0x00,0x08,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x03 ,0x00,0x00,0x00,0xD1,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00 ,0x00,0x00,0x11,0x85,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x58,0x84,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x68,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x58,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0x86,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0xC5,0x00,0x00,0x00 ,0x2E,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x9E ,0x00,0x00,0x00,0xFC,0x87,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB,0xED ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x46,0x85,0x00,0x00,0x00,0xFF,0x03 ,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0x57,0x00,0x00,0x00 ,0x03,0x8B,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x72 ,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x03,0x85,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xF1,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x8C,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x3C,0x00,0x00,0x00,0xFE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7D ,0x85,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0x85,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0x02,0x88,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xEC,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x97,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x44,0x81,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x16,0x87,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0xF9 ,0x85,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0x18,0x18,0x18,0xFF,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xED,0xED,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x78,0x88,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xD8,0x00 ,0x00,0x00,0x57,0x00,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x12,0x00,0x00,0x00,0xEB,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x70,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x64,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x3A,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xA1,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEA ,0x00,0x00,0x00,0x09,0x84,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x48,0x84 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3B,0x89,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xAF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDE,0x00 ,0x00,0x00,0x0C,0x85,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00 ,0x00,0xD9,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D,0x87,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xCC,0x83,0x00,0x00,0x00 ,0xFF,0x05,0x02,0x02,0x02,0xFF,0x1C,0x1C,0x1C,0xFF,0x3C,0x3C,0x3C,0xFF,0x60 ,0x60,0x60,0xFF,0x73,0x73,0x73,0xFF,0x53,0x53,0x53,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x1F,0xEC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xAA,0x81,0x00,0x00,0x00,0xFF,0x02,0x13,0x13,0x13,0xFF,0x23,0x23,0x23,0xFF ,0x05,0x05,0x05,0xFF,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD0,0x00 ,0x00,0x00,0x30,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x61,0x81,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x1A,0x86,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0xB7,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xDA,0x00,0x00,0x00,0x09,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x1C,0x00,0x00,0x00,0xFA,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B ,0x84,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0x84,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xC2,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x56 ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3E,0x86 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x7C,0x81,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x0C,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x32,0x00,0x00,0x00,0xE4,0x82,0x00,0x00,0x00,0xFF,0x07,0x01,0x01 ,0x01,0xFF,0x20,0x20,0x20,0xFF,0x51,0x51,0x51,0xFF,0x63,0x63,0x63,0xFF,0x68 ,0x68,0x68,0xFF,0x6E,0x6E,0x6E,0xFF,0x73,0x73,0x73,0xFF,0x69,0x69,0x69,0xFF ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0xEC,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xDD,0x81,0x00,0x00,0x00,0xFF,0x05,0x37,0x37,0x37,0xFF ,0x73,0x73,0x73,0xFF,0x6E,0x6E,0x6E,0xFF,0x4E,0x4E,0x4E,0xFF,0x2D,0x2D,0x2D ,0xFF,0x0B,0x0B,0x0B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4 ,0x00,0x00,0x00,0x51,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00 ,0x00,0x00,0xC3,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA8,0x86,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xEF,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x80,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDF,0x00,0x00,0x00 ,0x04,0x83,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 ,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x38,0x84,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x4B,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xCB,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0x86,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xF6,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x54,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x34 ,0x00,0x00,0x00,0xF5,0x82,0x00,0x00,0x00,0xFF,0x09,0x10,0x10,0x10,0xFF,0x44 ,0x44,0x44,0xFF,0x56,0x56,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x61,0x61,0x61,0xFF ,0x66,0x66,0x66,0xFF,0x6C,0x6C,0x6C,0xFF,0x71,0x71,0x71,0xFF,0x73,0x73,0x73 ,0xFF,0x0C,0x0C,0x0C,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x84 ,0xEB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x10,0x82,0x00,0x00,0x00,0xFF ,0x07,0x4E,0x4E,0x4E,0xFF,0x73,0x73,0x73,0xFF,0x6F,0x6F,0x6F,0xFF,0x69,0x69 ,0x69,0xFF,0x64,0x64,0x64,0xFF,0x5D,0x5D,0x5D,0xFF,0x35,0x35,0x35,0xFF,0x09 ,0x09,0x09,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00 ,0x00,0x7B,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2D,0x00,0x00,0x00 ,0xFB,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x44,0x86,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x5E,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE6,0x00,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x27 ,0x00,0x00,0x00,0xFD,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A,0x83 ,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x83 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x33,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE6,0x00,0x00 ,0x00,0x09,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB3,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x08,0x00,0x00,0x00,0xD7,0x82,0x00,0x00,0x00,0xFF,0x0A,0x17,0x17,0x17 ,0xFF,0x47,0x47,0x47,0xFF,0x4F,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A ,0x5A,0xFF,0x5F,0x5F,0x5F,0xFF,0x64,0x64,0x64,0xFF,0x6A,0x6A,0x6A,0xFF,0x6F ,0x6F,0x6F,0xFF,0x73,0x73,0x73,0xFF,0x23,0x23,0x23,0xFF,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xB6,0xEB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x41,0x82,0x00,0x00,0x00,0xFF,0x08,0x65,0x65,0x65,0xFF,0x72,0x72,0x72,0xFF ,0x6D,0x6D,0x6D,0xFF,0x67,0x67,0x67,0xFF,0x62,0x62,0x62,0xFF,0x5D,0x5D,0x5D ,0xFF,0x57,0x57,0x57,0xFF,0x4F,0x4F,0x4F,0xFF,0x26,0x26,0x26,0xFF,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x8B,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD8,0x00,0x00 ,0x00,0x01,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCE,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x54,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0x83,0xFF,0xFF ,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x5D,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x9C,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x86,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x25,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xF7,0x00,0x00,0x00,0x23,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x90 ,0x82,0x00,0x00,0x00,0xFF,0x0B,0x1B,0x1B,0x1B,0xFF,0x42,0x42,0x42,0xFF,0x48 ,0x48,0x48,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF ,0x5D,0x5D,0x5D,0xFF,0x62,0x62,0x62,0xFF,0x68,0x68,0x68,0xFF,0x6D,0x6D,0x6D ,0xFF,0x72,0x72,0x72,0xFF,0x3A,0x3A,0x3A,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xE8,0xEB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x74,0x81 ,0x00,0x00,0x00,0xFF,0x0B,0x09,0x09,0x09,0xFF,0x73,0x73,0x73,0xFF,0x70,0x70 ,0x70,0xFF,0x6B,0x6B,0x6B,0xFF,0x65,0x65,0x65,0xFF,0x60,0x60,0x60,0xFF,0x5B ,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF,0x50,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF ,0x2D,0x2D,0x2D,0xFF,0x02,0x02,0x02,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xFB,0x00,0x00,0x00,0x35,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x0C,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x40,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x66,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xBD,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x33,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x25,0x82,0xFF,0xFF,0xFF ,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE6,0x00,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0F ,0x00,0x00,0x00,0xF5,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00 ,0x00,0x00,0x1E,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x85,0x81,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9A,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x42,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF,0x0C,0x0C,0x0C ,0x0C,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x46,0x46,0x46,0xFF,0x4B ,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x56,0x56,0x56,0xFF,0x5B,0x5B,0x5B,0xFF ,0x60,0x60,0x60,0xFF,0x66,0x66,0x66,0xFF,0x6B,0x6B,0x6B,0xFF,0x70,0x70,0x70 ,0xFF,0x50,0x50,0x50,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1A ,0xEA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA6,0x81,0x00,0x00,0x00,0xFF ,0x0C,0x1F,0x1F,0x1F,0xFF,0x73,0x73,0x73,0xFF,0x6E,0x6E,0x6E,0xFF,0x69,0x69 ,0x69,0xFF,0x63,0x63,0x63,0xFF,0x5E,0x5E,0x5E,0xFF,0x59,0x59,0x59,0xFF,0x53 ,0x53,0x53,0xFF,0x4E,0x4E,0x4E,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF ,0x2F,0x2F,0x2F,0xFF,0x01,0x01,0x01,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xD7,0x00,0x00,0x00,0x09,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x7E,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0x86,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF2,0x81,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x26,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F ,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0x82,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xBD,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x8F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6D ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3,0x86,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x38,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC5,0x81 ,0x00,0x00,0x00,0xFF,0x0D,0x02,0x02,0x02,0xFF,0x2C,0x2C,0x2C,0xFF,0x39,0x39 ,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44,0xFF,0x49,0x49,0x49,0xFF,0x4E ,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x59,0x59,0x59,0xFF,0x5E,0x5E,0x5E,0xFF ,0x64,0x64,0x64,0xFF,0x69,0x69,0x69,0xFF,0x6E,0x6E,0x6E,0xFF,0x67,0x67,0x67 ,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4D,0xEA,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xD9,0x81,0x00,0x00,0x00,0xFF,0x0C,0x36,0x36,0x36 ,0xFF,0x71,0x71,0x71,0xFF,0x6C,0x6C,0x6C,0xFF,0x67,0x67,0x67,0xFF,0x61,0x61 ,0x61,0xFF,0x5C,0x5C,0x5C,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF,0x4C ,0x4C,0x4C,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C,0xFF ,0x1D,0x1D,0x1D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x90,0x87 ,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFD,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0xF5,0x00,0x00,0x00,0x0D,0x86,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x96,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x74,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xD9,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1A ,0x00,0x00,0x00,0xFD,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x36,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD5,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x4B,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x48,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD7,0x86,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF,0x0E,0x18 ,0x18,0x18,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF,0x3C,0x3C,0x3C,0xFF ,0x42,0x42,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C,0xFF,0x52,0x52,0x52 ,0xFF,0x57,0x57,0x57,0xFF,0x5C,0x5C,0x5C,0xFF,0x62,0x62,0x62,0xFF,0x67,0x67 ,0x67,0xFF,0x6C,0x6C,0x6C,0xFF,0x72,0x72,0x72,0xFF,0x0A,0x0A,0x0A,0xFF,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F,0xE9,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF,0x0D,0x4C ,0x4C,0x4C,0xFF,0x6F,0x6F,0x6F,0xFF,0x6A,0x6A,0x6A,0xFF,0x65,0x65,0x65,0xFF ,0x5F,0x5F,0x5F,0xFF,0x5A,0x5A,0x5A,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F ,0xFF,0x4A,0x4A,0x4A,0xFF,0x45,0x45,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A ,0x3A,0xFF,0x35,0x35,0x35,0xFF,0x0B,0x0B,0x0B,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x12,0x87,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xBA,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x63,0x86 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2F,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x08,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x1D,0x00,0x00,0x00,0xFE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x33,0x81,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 ,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x70,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xDB,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x3E,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE1,0x00,0x00,0x00 ,0x02,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA9,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x75,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x6E,0x81,0x00,0x00,0x00,0xFF,0x0F,0x01,0x01,0x01,0xFF,0x27,0x27,0x27,0xFF ,0x30,0x30,0x30,0xFF,0x35,0x35,0x35,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40 ,0xFF,0x45,0x45,0x45,0xFF,0x4A,0x4A,0x4A,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55 ,0x55,0xFF,0x5A,0x5A,0x5A,0xFF,0x60,0x60,0x60,0xFF,0x65,0x65,0x65,0xFF,0x6A ,0x6A,0x6A,0xFF,0x70,0x70,0x70,0xFF,0x21,0x21,0x21,0xFF,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xB1,0xE9,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x3D,0x82,0x00,0x00,0x00,0xFF,0x0D,0x63,0x63,0x63,0xFF,0x6D,0x6D,0x6D,0xFF ,0x68,0x68,0x68,0xFF,0x63,0x63,0x63,0xFF,0x5D,0x5D,0x5D,0xFF,0x58,0x58,0x58 ,0xFF,0x53,0x53,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43 ,0x43,0xFF,0x3D,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x26 ,0x26,0x26,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x87,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x58,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xC5,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC7,0x82,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0xC2,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x88,0x81,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x81,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB7,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x82,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA7,0x82,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7B,0x86,0xFF,0xFF,0xFF,0x00,0x04,0x00 ,0x00,0x00,0x12,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFB ,0x00,0x00,0x00,0x18,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC3,0x81 ,0x00,0x00,0x00,0xFF,0x0F,0x09,0x09,0x09,0xFF,0x28,0x28,0x28,0xFF,0x2E,0x2E ,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF,0x3E,0x3E,0x3E,0xFF,0x43 ,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E,0xFF,0x53,0x53,0x53,0xFF ,0x58,0x58,0x58,0xFF,0x5E,0x5E,0x5E,0xFF,0x63,0x63,0x63,0xFF,0x68,0x68,0x68 ,0xFF,0x6E,0x6E,0x6E,0xFF,0x37,0x37,0x37,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xE3,0xE9,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x70,0x81 ,0x00,0x00,0x00,0xFF,0x0F,0x07,0x07,0x07,0xFF,0x71,0x71,0x71,0xFF,0x6B,0x6B ,0x6B,0xFF,0x66,0x66,0x66,0xFF,0x61,0x61,0x61,0xFF,0x5B,0x5B,0x5B,0xFF,0x56 ,0x56,0x56,0xFF,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF ,0x41,0x41,0x41,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31 ,0xFF,0x2B,0x2B,0x2B,0xFF,0x08,0x08,0x08,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB6,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x08,0x00 ,0x00,0x00,0xEE,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x86,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x60,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xC3,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x69,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC9,0x81,0xFF,0xFF,0xFF,0x00,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x02,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x03,0x00,0x00,0x00,0xF2,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x34,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xEF,0x81,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x19,0x86,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x65,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3 ,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFE,0x81 ,0x00,0x00,0x00,0xFF,0x0F,0x13,0x13,0x13,0xFF,0x26,0x26,0x26,0xFF,0x2C,0x2C ,0x2C,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36,0xFF,0x3C,0x3C,0x3C,0xFF,0x41 ,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C,0x4C,0xFF,0x51,0x51,0x51,0xFF ,0x56,0x56,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x61,0x61,0x61,0xFF,0x66,0x66,0x66 ,0xFF,0x6C,0x6C,0x6C,0xFF,0x4D,0x4D,0x4D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x16,0xE8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA2,0x81 ,0x00,0x00,0x00,0xFF,0x0F,0x1D,0x1D,0x1D,0xFF,0x6F,0x6F,0x6F,0xFF,0x69,0x69 ,0x69,0xFF,0x64,0x64,0x64,0xFF,0x5F,0x5F,0x5F,0xFF,0x59,0x59,0x59,0xFF,0x54 ,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF,0x44,0x44,0x44,0xFF ,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34,0xFF,0x2F,0x2F,0x2F ,0xFF,0x29,0x29,0x29,0xFF,0x14,0x14,0x14,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x11,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x95,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0x86,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xEF,0x81,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x05,0x88,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x22,0x83,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00 ,0xFB,0x00,0x00,0x00,0x0C,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x35,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x03,0x88,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xC0,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9A,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x4C,0x82,0x00,0x00,0x00,0xFF,0x0F,0x1C,0x1C,0x1C,0xFF,0x24,0x24,0x24 ,0xFF,0x2A,0x2A,0x2A,0xFF,0x2F,0x2F,0x2F,0xFF,0x34,0x34,0x34,0xFF,0x3A,0x3A ,0x3A,0xFF,0x3F,0x3F,0x3F,0xFF,0x44,0x44,0x44,0xFF,0x4A,0x4A,0x4A,0xFF,0x4F ,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A,0x5A,0xFF,0x5F,0x5F,0x5F,0xFF ,0x64,0x64,0x64,0xFF,0x6A,0x6A,0x6A,0xFF,0x62,0x62,0x62,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x48,0xE8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xD4,0x81,0x00,0x00,0x00,0xFF,0x0F,0x33,0x33,0x33,0xFF,0x6D,0x6D,0x6D ,0xFF,0x67,0x67,0x67,0xFF,0x62,0x62,0x62,0xFF,0x5D,0x5D,0x5D,0xFF,0x57,0x57 ,0x57,0xFF,0x52,0x52,0x52,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42 ,0x42,0x42,0xFF,0x3D,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF ,0x2D,0x2D,0x2D,0xFF,0x27,0x27,0x27,0xFF,0x1E,0x1E,0x1E,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x60,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x51,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA8,0x87,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0xB6,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x2F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE3,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0x46,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x74 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x52,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E ,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCB,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x2F,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5D ,0x81,0x00,0x00,0x00,0xFF,0x11,0x01,0x01,0x01,0xFF,0x1F,0x1F,0x1F,0xFF,0x22 ,0x22,0x22,0xFF,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32,0xFF ,0x38,0x38,0x38,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48,0x48 ,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF,0x5D,0x5D ,0x5D,0xFF,0x62,0x62,0x62,0xFF,0x68,0x68,0x68,0xFF,0x6D,0x6D,0x6D,0xFF,0x08 ,0x08,0x08,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7A,0xE7,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xFC,0x81,0x00,0x00 ,0x00,0xFF,0x10,0x48,0x48,0x48,0xFF,0x6B,0x6B,0x6B,0xFF,0x65,0x65,0x65,0xFF ,0x60,0x60,0x60,0xFF,0x5B,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF,0x50,0x50,0x50 ,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40,0xFF,0x3B,0x3B ,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B,0x2B,0xFF,0x25 ,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x05,0x05,0x05,0xFF,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x94,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x21,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD9,0x87,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x85,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x60,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA4,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xB2,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0x89,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x83,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5E,0x86 ,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF7,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x05,0x86,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x6F,0x81,0x00,0x00,0x00,0xFF,0x11,0x03,0x03,0x03,0xFF ,0x1F,0x1F,0x1F,0xFF,0x20,0x20,0x20,0xFF,0x26,0x26,0x26,0xFF,0x2B,0x2B,0x2B ,0xFF,0x30,0x30,0x30,0xFF,0x36,0x36,0x36,0xFF,0x3B,0x3B,0x3B,0xFF,0x40,0x40 ,0x40,0xFF,0x46,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x56 ,0x56,0x56,0xFF,0x5B,0x5B,0x5B,0xFF,0x60,0x60,0x60,0xFF,0x66,0x66,0x66,0xFF ,0x6B,0x6B,0x6B,0xFF,0x1E,0x1E,0x1E,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xAC,0xE7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x39,0x82,0x00 ,0x00,0x00,0xFF,0x10,0x5D,0x5D,0x5D,0xFF,0x69,0x69,0x69,0xFF,0x63,0x63,0x63 ,0xFF,0x5E,0x5E,0x5E,0xFF,0x59,0x59,0x59,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E ,0x4E,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39 ,0x39,0x39,0xFF,0x33,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF ,0x23,0x23,0x23,0xFF,0x1F,0x1F,0x1F,0xFF,0x09,0x09,0x09,0xFF,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA5,0x88,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 ,0x00,0xEF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x0C,0x86 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x54,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x91,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x66,0x83 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC4,0xFF,0xFF,0xFF,0x00,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0xEC,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3A,0x89,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0xB3,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x2E,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2C,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xCB,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x80,0x81,0x00,0x00,0x00,0xFF,0x00,0x05,0x05,0x05,0xFF,0x81,0x1F,0x1F ,0x1F,0xFF,0x0E,0x24,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E,0x2E,0xFF ,0x34,0x34,0x34,0xFF,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44 ,0xFF,0x49,0x49,0x49,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x59,0x59 ,0x59,0xFF,0x5E,0x5E,0x5E,0xFF,0x64,0x64,0x64,0xFF,0x69,0x69,0x69,0xFF,0x33 ,0x33,0x33,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDE,0xE7,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6C,0x81,0x00,0x00,0x00,0xFF,0x11,0x05 ,0x05,0x05,0xFF,0x6B,0x6B,0x6B,0xFF,0x67,0x67,0x67,0xFF,0x61,0x61,0x61,0xFF ,0x5C,0x5C,0x5C,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF,0x4C,0x4C,0x4C ,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C,0xFF,0x37,0x37 ,0x37,0xFF,0x31,0x31,0x31,0xFF,0x2C,0x2C,0x2C,0xFF,0x27,0x27,0x27,0xFF,0x21 ,0x21,0x21,0xFF,0x1F,0x1F,0x1F,0xFF,0x0B,0x0B,0x0B,0xFF,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xB5,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xBF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3B,0x86,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x23,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xC2,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x27,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x83,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x05,0x89,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00 ,0x00,0x00,0x04,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5D,0x81,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9A,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x92,0x81,0x00,0x00,0x00,0xFF,0x00,0x07,0x07,0x07,0xFF,0x81,0x1F ,0x1F,0x1F,0xFF,0x0E,0x22,0x22,0x22,0xFF,0x27,0x27,0x27,0xFF,0x2C,0x2C,0x2C ,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF,0x3C,0x3C,0x3C,0xFF,0x42,0x42 ,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C,0xFF,0x52,0x52,0x52,0xFF,0x57 ,0x57,0x57,0xFF,0x5C,0x5C,0x5C,0xFF,0x62,0x62,0x62,0xFF,0x67,0x67,0x67,0xFF ,0x48,0x48,0x48,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x11,0xE6 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9E,0x81,0x00,0x00,0x00,0xFF,0x0E ,0x1A,0x1A,0x1A,0xFF,0x6A,0x6A,0x6A,0xFF,0x65,0x65,0x65,0xFF,0x5F,0x5F,0x5F ,0xFF,0x5A,0x5A,0x5A,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A ,0x4A,0xFF,0x45,0x45,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35 ,0x35,0x35,0xFF,0x2F,0x2F,0x2F,0xFF,0x2A,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF ,0x81,0x1F,0x1F,0x1F,0xFF,0x00,0x0D,0x0D,0x0D,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xC6,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8F ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0x86,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xF0,0x81,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0xEF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1C,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD5,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x15,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCD,0x87,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8D,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x68,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA4,0x81,0x00 ,0x00,0x00,0xFF,0x00,0x09,0x09,0x09,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0D,0x25 ,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF,0x35,0x35,0x35,0xFF ,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45,0xFF,0x4A,0x4A,0x4A ,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55,0x55,0xFF,0x5A,0x5A,0x5A,0xFF,0x60,0x60 ,0x60,0xFF,0x65,0x65,0x65,0xFF,0x5B,0x5B,0x5B,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x43,0xE6,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD0 ,0x81,0x00,0x00,0x00,0xFF,0x0E,0x2F,0x2F,0x2F,0xFF,0x68,0x68,0x68,0xFF,0x63 ,0x63,0x63,0xFF,0x5D,0x5D,0x5D,0xFF,0x58,0x58,0x58,0xFF,0x53,0x53,0x53,0xFF ,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF,0x3D,0x3D,0x3D ,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D,0xFF,0x28,0x28 ,0x28,0xFF,0x23,0x23,0x23,0xFF,0x81,0x1F,0x1F,0x1F,0xFF,0x00,0x10,0x10,0x10 ,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x88,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x5E,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x9C,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC1,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x24,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xCA,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x41,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xB1,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x46,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9C,0x87,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xBC,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x38,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA6,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x0A,0x0A,0x0A,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0E,0x23,0x23,0x23 ,0xFF,0x28,0x28,0x28,0xFF,0x2E,0x2E,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38 ,0x38,0xFF,0x3E,0x3E,0x3E,0xFF,0x43,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E ,0x4E,0x4E,0xFF,0x53,0x53,0x53,0xFF,0x58,0x58,0x58,0xFF,0x5E,0x5E,0x5E,0xFF ,0x63,0x63,0x63,0xFF,0x68,0x68,0x68,0xFF,0x06,0x06,0x06,0xFF,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x75,0xE5,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x08,0x00,0x00,0x00,0xFB,0x81,0x00,0x00,0x00,0xFF,0x0E,0x43,0x43,0x43 ,0xFF,0x66,0x66,0x66,0xFF,0x61,0x61,0x61,0xFF,0x5B,0x5B,0x5B,0xFF,0x56,0x56 ,0x56,0xFF,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41 ,0x41,0x41,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF ,0x2B,0x2B,0x2B,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x81,0x1F,0x1F ,0x1F,0xFF,0x00,0x12,0x12,0x12,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xE6,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x31,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x90,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x55,0x89,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x67,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D,0x89,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x77,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x6C,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC9,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x25,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x86,0x81,0x00,0x00,0x00,0xFF,0x00,0x06,0x06,0x06,0xFF,0x82,0x1F,0x1F ,0x1F,0xFF,0x0E,0x21,0x21,0x21,0xFF,0x26,0x26,0x26,0xFF,0x2C,0x2C,0x2C,0xFF ,0x31,0x31,0x31,0xFF,0x36,0x36,0x36,0xFF,0x3C,0x3C,0x3C,0xFF,0x41,0x41,0x41 ,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C,0x4C,0xFF,0x51,0x51,0x51,0xFF,0x56,0x56 ,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x61,0x61,0x61,0xFF,0x66,0x66,0x66,0xFF,0x1B ,0x1B,0x1B,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0xE5,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x35,0x82,0x00,0x00,0x00,0xFF,0x0D,0x56 ,0x56,0x56,0xFF,0x64,0x64,0x64,0xFF,0x5F,0x5F,0x5F,0xFF,0x59,0x59,0x59,0xFF ,0x54,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF,0x44,0x44,0x44 ,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34,0xFF,0x2F,0x2F ,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF,0x82,0x1F,0x1F,0x1F,0xFF ,0x00,0x12,0x12,0x12,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE9 ,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x24,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xCA,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5F ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x85,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x82,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x68,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x8F,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x49 ,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCB,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x22,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x65 ,0x81,0x00,0x00,0x00,0xFF,0x00,0x02,0x02,0x02,0xFF,0x83,0x1F,0x1F,0x1F,0xFF ,0x0D,0x24,0x24,0x24,0xFF,0x2A,0x2A,0x2A,0xFF,0x2F,0x2F,0x2F,0xFF,0x34,0x34 ,0x34,0xFF,0x3A,0x3A,0x3A,0xFF,0x3F,0x3F,0x3F,0xFF,0x44,0x44,0x44,0xFF,0x4A ,0x4A,0x4A,0xFF,0x4F,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A,0x5A,0xFF ,0x5F,0x5F,0x5F,0xFF,0x64,0x64,0x64,0xFF,0x2F,0x2F,0x2F,0xFF,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xD9,0xE5,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x68,0x81,0x00,0x00,0x00,0xFF,0x0E,0x03,0x03,0x03,0xFF,0x65,0x65,0x65 ,0xFF,0x62,0x62,0x62,0xFF,0x5D,0x5D,0x5D,0xFF,0x57,0x57,0x57,0xFF,0x52,0x52 ,0x52,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42,0x42,0x42,0xFF,0x3D ,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF,0x2D,0x2D,0x2D,0xFF ,0x27,0x27,0x27,0xFF,0x22,0x22,0x22,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x00,0x0D ,0x0D,0x0D,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0x88,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xCC,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x48,0x82,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x5E,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB1,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x46,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x8D,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x49,0x87,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCE,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x1E,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x45,0x82,0x00 ,0x00,0x00,0xFF,0x00,0x1D,0x1D,0x1D,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0D,0x22 ,0x22,0x22,0xFF,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32,0xFF ,0x38,0x38,0x38,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48,0x48 ,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF,0x5D,0x5D ,0x5D,0xFF,0x62,0x62,0x62,0xFF,0x43,0x43,0x43,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x0D,0xE4,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x9A,0x81,0x00,0x00,0x00,0xFF,0x0E,0x17,0x17,0x17,0xFF,0x65 ,0x65,0x65,0xFF,0x60,0x60,0x60,0xFF,0x5B,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF ,0x50,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40 ,0xFF,0x3B,0x3B,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B ,0x2B,0xFF,0x25,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x82,0x1F,0x1F,0x1F,0xFF ,0x00,0x09,0x09,0x09,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA8 ,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x1D,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xCE,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x49 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x3F,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4 ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x35,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x8B,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4A ,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD0,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x1B,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x24 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x19,0x19,0x19,0xFF,0x82,0x1F,0x1F,0x1F,0xFF ,0x0D,0x20,0x20,0x20,0xFF,0x26,0x26,0x26,0xFF,0x2B,0x2B,0x2B,0xFF,0x30,0x30 ,0x30,0xFF,0x36,0x36,0x36,0xFF,0x3B,0x3B,0x3B,0xFF,0x40,0x40,0x40,0xFF,0x46 ,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x56,0x56,0x56,0xFF ,0x5B,0x5B,0x5B,0xFF,0x60,0x60,0x60,0xFF,0x56,0x56,0x56,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0xE4,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xCC,0x81,0x00,0x00,0x00,0xFF,0x0D,0x2B,0x2B,0x2B,0xFF,0x63,0x63,0x63 ,0xFF,0x5E,0x5E,0x5E,0xFF,0x59,0x59,0x59,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E ,0x4E,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39 ,0x39,0x39,0xFF,0x33,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF ,0x23,0x23,0x23,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x05,0x05,0x05,0xFF,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0x88,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x1A,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD1,0x87 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4A,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x8A,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x32,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x2A,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x89,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B,0x87,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xD2,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x17,0x87 ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xFD,0x81,0x00 ,0x00,0x00,0xFF,0x00,0x15,0x15,0x15,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0D,0x24 ,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E,0x2E,0xFF,0x34,0x34,0x34,0xFF ,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44,0xFF,0x49,0x49,0x49 ,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x59,0x59,0x59,0xFF,0x5E,0x5E ,0x5E,0xFF,0x63,0x63,0x63,0xFF,0x05,0x05,0x05,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x70,0xE3,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05 ,0x00,0x00,0x00,0xF9,0x81,0x00,0x00,0x00,0xFF,0x0D,0x3F,0x3F,0x3F,0xFF,0x61 ,0x61,0x61,0xFF,0x5C,0x5C,0x5C,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF ,0x4C,0x4C,0x4C,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C ,0xFF,0x37,0x37,0x37,0xFF,0x31,0x31,0x31,0xFF,0x2C,0x2C,0x2C,0xFF,0x27,0x27 ,0x27,0xFF,0x21,0x21,0x21,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x01,0x01,0x01 ,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65,0x88,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x16,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xD3,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4B,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x89,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x26,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDB,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE2,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x1E,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x87,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0x87,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xD5,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x14,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE3,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x10,0x10,0x10,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0D,0x22,0x22,0x22 ,0xFF,0x27,0x27,0x27,0xFF,0x2C,0x2C,0x2C,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37 ,0x37,0xFF,0x3C,0x3C,0x3C,0xFF,0x42,0x42,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C ,0x4C,0x4C,0xFF,0x52,0x52,0x52,0xFF,0x57,0x57,0x57,0xFF,0x5C,0x5C,0x5C,0xFF ,0x62,0x62,0x62,0xFF,0x18,0x18,0x18,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0xA2,0xE3,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x31,0x82,0x00 ,0x00,0x00,0xFF,0x0C,0x51,0x51,0x51,0xFF,0x5F,0x5F,0x5F,0xFF,0x5A,0x5A,0x5A ,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A,0x4A,0xFF,0x45,0x45 ,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35,0x35,0x35,0xFF,0x2F ,0x2F,0x2F,0xFF,0x2A,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF,0x83,0x1F,0x1F,0x1F ,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x43,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x13,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xD5,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x4C,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0x89,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x1A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xE6,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xEE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x12,0x89,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x85,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x4D,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD7,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x11,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xC2,0x81,0x00,0x00,0x00,0xFF,0x00,0x0B,0x0B,0x0B,0xFF,0x84,0x1F,0x1F,0x1F ,0xFF,0x0C,0x25,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF,0x35 ,0x35,0x35,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45,0xFF ,0x4A,0x4A,0x4A,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55,0x55,0xFF,0x5A,0x5A,0x5A ,0xFF,0x60,0x60,0x60,0xFF,0x2B,0x2B,0x2B,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xD4,0xE3,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x63,0x81 ,0x00,0x00,0x00,0xFF,0x0D,0x02,0x02,0x02,0xFF,0x61,0x61,0x61,0xFF,0x5D,0x5D ,0x5D,0xFF,0x58,0x58,0x58,0xFF,0x53,0x53,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48 ,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF,0x3D,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF ,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D,0xFF,0x28,0x28,0x28,0xFF,0x23,0x23,0x23 ,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x18,0x18,0x18,0xFF,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x22,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x15,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x87,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x4D,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x85,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x0E,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xF1,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xF9,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x06,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x84,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x4E,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xC3,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2E,0x88,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x8B,0x81,0x00,0x00,0x00,0xFF,0x00,0x03,0x03,0x03 ,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0C,0x23,0x23,0x23,0xFF,0x28,0x28,0x28,0xFF ,0x2E,0x2E,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF,0x3E,0x3E,0x3E ,0xFF,0x43,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E,0xFF,0x53,0x53 ,0x53,0xFF,0x58,0x58,0x58,0xFF,0x5E,0x5E,0x5E,0xFF,0x3E,0x3E,0x3E,0xFF,0x81 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x0A,0xE2,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x96,0x81,0x00,0x00,0x00,0xFF,0x0D,0x14 ,0x14,0x14,0xFF,0x61,0x61,0x61,0xFF,0x5B,0x5B,0x5B,0xFF,0x56,0x56,0x56,0xFF ,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41,0x41,0x41 ,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF,0x2B,0x2B ,0x2B,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x83,0x1F,0x1F,0x1F,0xFF ,0x00,0x13,0x13,0x13,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB ,0x00,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3C,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB6,0x87,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x4E,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xFC,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xFC,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x03,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x4F,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x96,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5B,0x88,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x45,0x82,0x00,0x00,0x00,0xFF,0x00,0x19,0x19,0x19,0xFF,0x83 ,0x1F,0x1F,0x1F,0xFF,0x0C,0x21,0x21,0x21,0xFF,0x26,0x26,0x26,0xFF,0x2C,0x2C ,0x2C,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36,0xFF,0x3C,0x3C,0x3C,0xFF,0x41 ,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C,0x4C,0xFF,0x51,0x51,0x51,0xFF ,0x56,0x56,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x50,0x50,0x50,0xFF,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0xE2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xC8,0x81,0x00,0x00,0x00,0xFF,0x0C,0x27,0x27,0x27,0xFF,0x5F,0x5F,0x5F ,0xFF,0x59,0x59,0x59,0xFF,0x54,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49 ,0x49,0xFF,0x44,0x44,0x44,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34 ,0x34,0x34,0xFF,0x2F,0x2F,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF ,0x84,0x1F,0x1F,0x1F,0xFF,0x00,0x0A,0x0A,0x0A,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xC4,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x69 ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x89,0x87,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x4F,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x81 ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x08,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xF8,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xEF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x12 ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x56,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6A ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0x88,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xF6,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x11,0x11,0x11,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0C,0x24,0x24,0x24,0xFF,0x2A ,0x2A,0x2A,0xFF,0x2F,0x2F,0x2F,0xFF,0x34,0x34,0x34,0xFF,0x3A,0x3A,0x3A,0xFF ,0x3F,0x3F,0x3F,0xFF,0x44,0x44,0x44,0xFF,0x4A,0x4A,0x4A,0xFF,0x4F,0x4F,0x4F ,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A,0x5A,0xFF,0x5E,0x5E,0x5E,0xFF,0x03,0x03 ,0x03,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0xE1,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF6,0x81,0x00,0x00,0x00 ,0xFF,0x0C,0x3A,0x3A,0x3A,0xFF,0x5D,0x5D,0x5D,0xFF,0x57,0x57,0x57,0xFF,0x52 ,0x52,0x52,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42,0x42,0x42,0xFF ,0x3D,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF,0x2D,0x2D,0x2D ,0xFF,0x27,0x27,0x27,0xFF,0x22,0x22,0x22,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x00 ,0x02,0x02,0x02,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x95,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x5D,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x61,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7D,0x89,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x17,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xEA,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x21,0x89,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x63,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x85,0x87 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3D,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xB4,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB9,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x08,0x08,0x08,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0C ,0x22,0x22,0x22,0xFF,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32 ,0xFF,0x38,0x38,0x38,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48 ,0x48,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF,0x5D ,0x5D,0x5D,0xFF,0x15,0x15,0x15,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x9D,0xE1,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2D,0x82,0x00,0x00 ,0x00,0xFF,0x0C,0x4C,0x4C,0x4C,0xFF,0x5B,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF ,0x50,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40 ,0xFF,0x3B,0x3B,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B ,0x2B,0xFF,0x25,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x83,0x1F,0x1F,0x1F,0xFF ,0x00,0x18,0x18,0x18,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x38 ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC2,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x30,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x96 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x54,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x26,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDC ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD2 ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x30,0x89,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x2E,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB ,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x11,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xE0,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x73 ,0x81,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0x1E,0x1E,0x1E,0xFF,0x83 ,0x1F,0x1F,0x1F,0xFF,0x0C,0x20,0x20,0x20,0xFF,0x25,0x25,0x25,0xFF,0x2B,0x2B ,0x2B,0xFF,0x30,0x30,0x30,0xFF,0x36,0x36,0x36,0xFF,0x3B,0x3B,0x3B,0xFF,0x40 ,0x40,0x40,0xFF,0x46,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF ,0x56,0x56,0x56,0xFF,0x5B,0x5B,0x5B,0xFF,0x28,0x28,0x28,0xFF,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0xE1,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x5F,0x81,0x00,0x00,0x00,0xFF,0x0C,0x02,0x02,0x02,0xFF,0x5B,0x5B,0x5B ,0xFF,0x59,0x59,0x59,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E,0x4E,0xFF,0x49,0x49 ,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39,0x39,0x39,0xFF,0x33 ,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF,0x23,0x23,0x23,0xFF ,0x84,0x1F,0x1F,0x1F,0xFF,0x00,0x0F,0x0F,0x0F,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x03,0x89,0xFF,0xFF,0xFF,0x00,0x03 ,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0x00 ,0x07,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCB,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x1F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x35,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCE,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x3F,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x03,0x00,0x00,0x00,0xF5,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF ,0x00,0x00,0x00,0x01,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE5,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x0E,0x88,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x2C,0x82,0x00,0x00,0x00,0xFF,0x00,0x16,0x16,0x16,0xFF,0x84 ,0x1F,0x1F,0x1F,0xFF,0x0B,0x24,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E ,0x2E,0xFF,0x34,0x34,0x34,0xFF,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44 ,0x44,0x44,0xFF,0x49,0x49,0x49,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF ,0x59,0x59,0x59,0xFF,0x39,0x39,0x39,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xFA,0x00,0x00,0x00,0x07,0xE0,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x92,0x81,0x00,0x00,0x00,0xFF,0x0C,0x11,0x11,0x11,0xFF,0x5C,0x5C,0x5C ,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF,0x4C,0x4C,0x4C,0xFF,0x47,0x47 ,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C,0xFF,0x37,0x37,0x37,0xFF,0x31 ,0x31,0x31,0xFF,0x2C,0x2C,0x2C,0xFF,0x27,0x27,0x27,0xFF,0x21,0x21,0x21,0xFF ,0x84,0x1F,0x1F,0x1F,0xFF,0x00,0x07,0x07,0x07,0xFF,0x81,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x1D ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD7,0x87,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF9,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xE9,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x44,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB6,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x50,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC2,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x87,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xB8,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE6,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x0B,0x0B,0x0B,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0B,0x22,0x22,0x22,0xFF,0x27 ,0x27,0x27,0xFF,0x2C,0x2C,0x2C,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF ,0x3C,0x3C,0x3C,0xFF,0x42,0x42,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C ,0xFF,0x52,0x52,0x52,0xFF,0x57,0x57,0x57,0xFF,0x4A,0x4A,0x4A,0xFF,0x82,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34,0xE0,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0xC4,0x81,0x00,0x00,0x00,0xFF,0x0B,0x24,0x24,0x24,0xFF,0x5A,0x5A ,0x5A,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A,0x4A,0xFF,0x45 ,0x45,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35,0x35,0x35,0xFF ,0x2F,0x2F,0x2F,0xFF,0x2A,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF,0x84,0x1F,0x1F ,0x1F,0xFF,0x00,0x1D,0x1D,0x1D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x66,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x70,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x36,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3,0x8A,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x58,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xB0,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x9A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x73,0x8A,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x8D,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x5C,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6D,0x81,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xB5,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x94,0x82,0x00,0x00,0x00,0xFF,0x00,0x1A,0x1A,0x1A,0xFF,0x84,0x1F,0x1F ,0x1F,0xFF,0x0B,0x25,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF ,0x35,0x35,0x35,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45 ,0xFF,0x4A,0x4A,0x4A,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55,0x55,0xFF,0x58,0x58 ,0x58,0xFF,0x02,0x02,0x02,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x66,0xDF,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xF4 ,0x81,0x00,0x00,0x00,0xFF,0x0B,0x35,0x35,0x35,0xFF,0x58,0x58,0x58,0xFF,0x53 ,0x53,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF ,0x3D,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D ,0xFF,0x28,0x28,0x28,0xFF,0x23,0x23,0x23,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x00 ,0x12,0x12,0x12,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x20,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD2,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x4E,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6B,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x8A,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0x8A,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x57,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x92,0x87 ,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xF8,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x1B,0x88,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xFA,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x0C,0x0C,0x0C,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0B,0x23,0x23,0x23,0xFF,0x28 ,0x28,0x28,0xFF,0x2E,0x2E,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF ,0x3E,0x3E,0x3E,0xFF,0x43,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E ,0xFF,0x53,0x53,0x53,0xFF,0x58,0x58,0x58,0xFF,0x12,0x12,0x12,0xFF,0x81,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x98,0xDF,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x29,0x82,0x00,0x00,0x00,0xFF,0x0B,0x46,0x46,0x46,0xFF,0x56,0x56 ,0x56,0xFF,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41 ,0x41,0x41,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF ,0x2B,0x2B,0x2B,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x83,0x1F,0x1F ,0x1F,0xFF,0x01,0x1E,0x1E,0x1E,0xFF,0x04,0x04,0x04,0xFF,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0xCB,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x35,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x04 ,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA0,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x48,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAB ,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xC9,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x22 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC8,0x88,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xA7,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7B ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9C,0x82,0x00,0x00,0x00,0xFF ,0x00,0x1B,0x1B,0x1B,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0B,0x21,0x21,0x21,0xFF ,0x26,0x26,0x26,0xFF,0x2C,0x2C,0x2C,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36 ,0xFF,0x3C,0x3C,0x3C,0xFF,0x41,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C ,0x4C,0xFF,0x51,0x51,0x51,0xFF,0x56,0x56,0x56,0xFF,0x24,0x24,0x24,0xFF,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCB,0xDF,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x5B,0x81,0x00,0x00,0x00,0xFF,0x0B,0x01,0x01,0x01,0xFF,0x55 ,0x55,0x55,0xFF,0x54,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF ,0x44,0x44,0x44,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34 ,0xFF,0x2F,0x2F,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF,0x84,0x1F ,0x1F,0x1F,0xFF,0x00,0x13,0x13,0x13,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x4E,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x97,0x81,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x88,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0xD6,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x13,0x8A,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD6,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x3B,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x1E,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00 ,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xEB,0x81,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x07,0x87,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x44,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xDD,0x00,0x00,0x00,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x22 ,0x00,0x00,0x00,0xFB,0x81,0x00,0x00,0x00,0xFF,0x00,0x0C,0x0C,0x0C,0xFF,0x84 ,0x1F,0x1F,0x1F,0xFF,0x0A,0x24,0x24,0x24,0xFF,0x2A,0x2A,0x2A,0xFF,0x2F,0x2F ,0x2F,0xFF,0x34,0x34,0x34,0xFF,0x3A,0x3A,0x3A,0xFF,0x3F,0x3F,0x3F,0xFF,0x44 ,0x44,0x44,0xFF,0x4A,0x4A,0x4A,0xFF,0x4F,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF ,0x35,0x35,0x35,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00 ,0x00,0x00,0x04,0xDE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8E,0x81,0x00 ,0x00,0x00,0xFF,0x0B,0x0F,0x0F,0x0F,0xFF,0x57,0x57,0x57,0xFF,0x52,0x52,0x52 ,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42,0x42,0x42,0xFF,0x3D,0x3D ,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF,0x2D,0x2D,0x2D,0xFF,0x27 ,0x27,0x27,0xFF,0x22,0x22,0x22,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x01,0x1E,0x1E ,0x1E,0xFF,0x04,0x04,0x04,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xCF,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xF0 ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x87,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xFD,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xDD,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00 ,0x00,0x00,0xFB,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x12,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0xF3,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1E,0x8A,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0xB5,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x58,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0xDF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x42,0x89,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xA0,0x81,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01 ,0xFF,0x18,0x18,0x18,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0A,0x22,0x22,0x22,0xFF ,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32,0xFF,0x38,0x38,0x38 ,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48,0x48,0xFF,0x4D,0x4D ,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x45,0x45,0x45,0xFF,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x2F,0xDE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0 ,0x81,0x00,0x00,0x00,0xFF,0x0B,0x20,0x20,0x20,0xFF,0x55,0x55,0x55,0xFF,0x50 ,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40,0xFF ,0x3B,0x3B,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B,0x2B ,0xFF,0x25,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00 ,0x13,0x13,0x13,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0x89 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5B,0x81,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xC2,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x71,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA0,0x8A,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x2C,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE8,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0xCB,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x55,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x60,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x7E,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x89,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xFC,0x81,0x00,0x00,0x00 ,0xFF,0x01,0x03,0x03,0x03,0xFF,0x1C,0x1C,0x1C,0xFF,0x82,0x1F,0x1F,0x1F,0xFF ,0x0B,0x20,0x20,0x20,0xFF,0x25,0x25,0x25,0xFF,0x2B,0x2B,0x2B,0xFF,0x30,0x30 ,0x30,0xFF,0x35,0x35,0x35,0xFF,0x3B,0x3B,0x3B,0xFF,0x40,0x40,0x40,0xFF,0x46 ,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x53,0x53,0x53,0xFF ,0x01,0x01,0x01,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0xDD ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xF1,0x81,0x00 ,0x00,0x00,0xFF,0x0A,0x31,0x31,0x31,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E,0x4E ,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39,0x39 ,0x39,0xFF,0x33,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF,0x23 ,0x23,0x23,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x01,0x1C,0x1C,0x1C,0xFF,0x03,0x03 ,0x03,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00,0x00,0x00 ,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xD9 ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x88,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xD4,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x41 ,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xBB,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8F,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x0B,0x00,0x00,0x00,0xF2,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x20,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x1D,0x00,0x00,0x00,0xF9,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x66 ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x81,0x82,0x00,0x00,0x00,0xFF ,0x01,0x06,0x06,0x06,0xFF,0x1E,0x1E,0x1E,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0A ,0x24,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E,0x2E,0xFF,0x34,0x34,0x34 ,0xFF,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44,0xFF,0x49,0x49 ,0x49,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x10,0x10,0x10,0xFF,0x81 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x93,0xDD,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x25,0x82,0x00,0x00,0x00,0xFF,0x0A,0x42,0x42,0x42,0xFF,0x51 ,0x51,0x51,0xFF,0x4C,0x4C,0x4C,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF ,0x3C,0x3C,0x3C,0xFF,0x37,0x37,0x37,0xFF,0x31,0x31,0x31,0xFF,0x2C,0x2C,0x2C ,0xFF,0x27,0x27,0x27,0xFF,0x21,0x21,0x21,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x01 ,0x1E,0x1E,0x1E,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x57,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x94,0x81,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x0A,0x87,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x39,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xDD,0x00,0x00,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xB2,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x7A,0xFF,0xFF,0xFF,0x00 ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE4,0x8B ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9B,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x85,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x77,0x81 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x22,0x88,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xA9,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0x1E,0x1E,0x1E,0xFF,0x81,0x1F,0x1F,0x1F ,0xFF,0x0A,0x22,0x22,0x22,0xFF,0x27,0x27,0x27,0xFF,0x2C,0x2C,0x2C,0xFF,0x32 ,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF,0x3C,0x3C,0x3C,0xFF,0x42,0x42,0x42,0xFF ,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C,0xFF,0x52,0x52,0x52,0xFF,0x20,0x20,0x20 ,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC6,0xDD,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x57,0x82,0x00,0x00,0x00,0xFF,0x09,0x50,0x50,0x50 ,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A,0x4A,0xFF,0x45,0x45,0x45,0xFF,0x3F,0x3F ,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35,0x35,0x35,0xFF,0x2F,0x2F,0x2F,0xFF,0x2A ,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x0B,0x0B ,0x0B,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAD,0x00,0x00,0x00 ,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFE ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x46,0x88,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0xAA,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x7C,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00 ,0xF3,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x35,0xFF,0xFF,0xFF,0x00 ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x02,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xF9,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x2C,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x39,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x13,0x87,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xC5,0x81,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x02,0x88,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xCA,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x05,0x05,0x05,0xFF,0x19,0x19,0x19,0xFF,0x81,0x1F,0x1F,0x1F,0xFF,0x09,0x25 ,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF,0x35,0x35,0x35,0xFF ,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45,0xFF,0x4A,0x4A,0x4A ,0xFF,0x50,0x50,0x50,0xFF,0x31,0x31,0x31,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF5,0x00,0x00,0x00,0x03,0xDC,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x8A,0x81,0x00,0x00,0x00,0xFF,0x0A,0x0C,0x0C,0x0C,0xFF,0x53,0x53 ,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF,0x3D ,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D,0xFF ,0x28,0x28,0x28,0xFF,0x23,0x23,0x23,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x00,0x0E ,0x0E,0x0E,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xCE,0x00,0x00 ,0x00,0x0A,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00 ,0xE4,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0x88,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x1D,0x8A,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x40,0x83,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xEE,0x00 ,0x00,0x00,0x02,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 ,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x73,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xC5,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0x88,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xF4,0x81,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x74,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x19,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x0B,0x10,0x10,0x10,0xFF ,0x1E,0x1E,0x1E,0xFF,0x23,0x23,0x23,0xFF,0x28,0x28,0x28,0xFF,0x2E,0x2E,0x2E ,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF,0x3E,0x3E,0x3E,0xFF,0x43,0x43 ,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E,0xFF,0x40,0x40,0x40,0xFF,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2A,0xDC,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xBC,0x81,0x00,0x00,0x00,0xFF,0x0D,0x1D,0x1D,0x1D,0xFF,0x51 ,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41,0x41,0x41,0xFF ,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF,0x2B,0x2B,0x2B ,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x1F,0x1F,0x1F,0xFF,0x1B,0x1B ,0x1B,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE7,0x00,0x00,0x00,0x1D,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA7 ,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDA,0x00,0x00,0x00,0x0A,0x88 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB6,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0xA0,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x87,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAC,0x81,0xFF,0xFF,0xFF,0x00,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x7A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC3,0x8B ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x41,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x1B,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x69,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00 ,0x00,0x32,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x27,0x00,0x00,0x00 ,0xCC,0x83,0x00,0x00,0x00,0xFF,0x0A,0x01,0x01,0x01,0xFF,0x0B,0x0B,0x0B,0xFF ,0x1A,0x1A,0x1A,0xFF,0x2A,0x2A,0x2A,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36 ,0xFF,0x3C,0x3C,0x3C,0xFF,0x41,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4B,0x4B ,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x5C,0xDC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xEE,0x81,0x00,0x00,0x00 ,0xFF,0x0C,0x2D,0x2D,0x2D,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF,0x44 ,0x44,0x44,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34,0xFF ,0x2F,0x2F,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF,0x1E,0x1E,0x1E ,0xFF,0x12,0x12,0x12,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x37,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x6D,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00 ,0x00,0x37,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3C,0x82,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x20,0x8A,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xDD,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x67,0x81,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x32 ,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x28,0x8B,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xBC,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA2 ,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB9,0x81,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x44,0x89,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xFB,0x85,0x00,0x00 ,0x00,0xFF,0x04,0x04,0x04,0x04,0xFF,0x0A,0x0A,0x0A,0xFF,0x0F,0x0F,0x0F,0xFF ,0x0B,0x0B,0x0B,0xFF,0x05,0x05,0x05,0xFF,0x84,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x8E,0xDB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x82,0x00 ,0x00,0x00,0xFF,0x0A,0x2E,0x2E,0x2E,0xFF,0x43,0x43,0x43,0xFF,0x44,0x44,0x44 ,0xFF,0x42,0x42,0x42,0xFF,0x3D,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32 ,0x32,0xFF,0x29,0x29,0x29,0xFF,0x1B,0x1B,0x1B,0xFF,0x0C,0x0C,0x0C,0xFF,0x01 ,0x01,0x01,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDB,0x00,0x00 ,0x00,0x38,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x87,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x88,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xCD,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x93,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x44 ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x1B,0x81 ,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD3,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x8D,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x37,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0x88,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xFA,0x00,0x00,0x00,0x5E,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x34,0x00,0x00,0x00,0xCD,0x8E,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0xC0,0xDB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x53,0x85,0x00,0x00,0x00 ,0xFF,0x03,0x04,0x04,0x04,0xFF,0x09,0x09,0x09,0xFF,0x06,0x06,0x06,0xFF,0x01 ,0x01,0x01,0xFF,0x86,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x97,0x00,0x00 ,0x00,0x0B,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00 ,0xA7,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0x05 ,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x81,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x18,0x8B,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xAA,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB4,0x82 ,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x07,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0xA1,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE8,0x00,0x00 ,0x00,0x13,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00 ,0xD1,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7C,0x8B,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xE0,0x8A ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0xC6,0xDB,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x85,0x8E,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xD1,0x00,0x00,0x00,0x48,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x12,0x00,0x00,0x00,0xC2,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0x96,0x00,0x00,0x00,0x03,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x35 ,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0x8B ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0xF9,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x11,0x00,0x00,0x00,0xF7,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x58,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00 ,0xE4,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xBC,0x82,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0x04,0x8B,0xFF,0xFF,0xFF,0x00,0x05 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x53,0x00,0x00,0x00 ,0x70,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xF7,0x82,0x00,0x00,0x00,0xFF,0x02 ,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0A,0xDD,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xD1,0x00,0x00,0x00,0xEB ,0x89,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x85,0x00 ,0x00,0x00,0x2B,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1D,0x00,0x00 ,0x00,0xD8,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x76,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0xDA ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0x01,0x8B ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x75,0x83,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x03,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC9,0x8C,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x81,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00 ,0x00,0xA2,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00 ,0x26,0x90,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD3,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x28,0xE2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x06,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x8B,0x82,0x00,0x00,0x00,0xFF,0x04 ,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x42,0x00,0x00,0x00 ,0x25,0x00,0x00,0x00,0x01,0x8C,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x0C ,0x00,0x00,0x00,0xCD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xF8,0x00,0x00,0x00 ,0x58,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xBE ,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x1E,0x8B ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xE6,0x83,0x00 ,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x83,0xFF,0xFF,0xFF,0x00,0x89,0x00 ,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x3D,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0x8C,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x99,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x5F,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x85,0x00,0x00 ,0x00,0xFA,0x00,0x00,0x00,0x44,0x91,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0xA4,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x63,0xE4,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xA0,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x1E,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCD ,0x00,0x00,0x00,0x3E,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9F,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x8C,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x7A,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00 ,0x00,0x00,0x20,0x83,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC9,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD5,0x00,0x00,0x00,0x02,0x8B,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xC9,0x82,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x42,0x8A,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x24,0x92,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x68 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0xE4,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xE1,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE2 ,0x93,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x7F,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D ,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xF0,0x83 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA4,0x84,0xFF,0xFF,0xFF,0x00,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x42,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x8C ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xDD,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x48,0x9D,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x2C,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xDA,0xE3,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0x9D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x01,0x00,0x00,0x00,0x8E,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xAC,0x00,0x00,0x00,0x02,0x8C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8D ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x21,0x84 ,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x85 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xBA,0x83,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x07,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x27,0x00,0x00,0x00,0xED,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xFB,0x00,0x00,0x00,0x5E,0x9C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x16 ,0xE2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x62,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x6B,0x9C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06 ,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC6,0x00 ,0x00,0x00,0x08,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00 ,0x00,0xF8,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0x85,0xFF,0xFF ,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x85,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0xFE,0x83,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x88,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x3D,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE ,0x00,0x00,0x00,0x77,0x9C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB4,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0xE2,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xA2,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2F,0x9B ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xC0,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD2,0x00,0x00,0x00,0x15,0x8C,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x17,0x85,0xFF,0xFF,0xFF,0x00 ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x86,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0xAA,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD ,0x00,0x00,0x00,0x3C,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x36,0x00 ,0x00,0x00,0xEB,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAC,0x00,0x00 ,0x00,0x13,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x77,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0xE2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0xE3,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00 ,0x02,0x9A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0xE8 ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x0F,0x8D ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x72,0x84,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x84,0x86,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x25,0x00 ,0x00,0x00,0xF7,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDE,0x00,0x00 ,0x00,0x0D,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x00,0x00 ,0xDF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x49 ,0x99,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3B,0x82,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0xCE,0xE1,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x23 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x99,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x99,0x84,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x07,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x2B,0x00,0x00,0x00,0xF8,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xE0,0x00,0x00,0x00,0x0D,0x86,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 ,0x6F,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x8E,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xCF,0x84,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x7C,0x98,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x07 ,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x31,0xE0 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x82,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x7C,0x99,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x93,0x83 ,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x8B,0x00,0x00 ,0x00,0x01,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00 ,0xCF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x3F ,0x87,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xBC,0x84 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5C,0x8E,0xFF,0xFF,0xFF,0x00,0x02 ,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0xFE,0x81,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x37,0x99,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xC2,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x98,0xDF,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xEA ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34,0x99,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xE7,0x81,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x46,0x8F,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x98,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0x88,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x88,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xEF,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x40,0x8F,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x80,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x68,0x82,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x0D,0xDE,0xFF,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x65,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xCF,0x9B,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x11,0x8F,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x79,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00 ,0x00,0x00,0x07,0x88,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5B,0x84,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x2A,0x8F,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x04 ,0x9A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF6,0x82 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x67,0xDD,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xD7,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x6A,0x9C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x34,0x90,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFE,0x83,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x2F,0x89,0xFF,0xFF,0xFF ,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8A,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0xA8,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xE0,0x00,0x00,0x00,0x18,0xAD,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA3 ,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0xDD,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x4B,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF5 ,0x00,0x00,0x00,0x0F,0xAD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x43,0x00 ,0x00,0x00,0xFA,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6C,0x8A,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8A,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xC7,0x84,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xCD,0x00,0x00,0x00,0x10,0xAC,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x00,0x40,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x37,0xDC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xBD,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x9F,0xAD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x3C,0x00,0x00,0x00,0xF2,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8A ,0x8B,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xD9,0x84 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD5,0x00,0x00,0x00,0x1F,0xAB,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xDC,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0xDB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x30,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3A,0xAC,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0xF7,0x84,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0x01,0x8B,0xFF,0xFF,0xFF,0x00 ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8C,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xE8,0x84,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x33,0xAB,0xFF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x00,0x7B,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00 ,0x00,0x14,0xDA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA3,0x82,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xD4,0xAC,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x6F,0x00,0x00,0x00,0xFD,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xBD,0x00,0x00,0x00,0x06,0x8C,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x33 ,0x00,0x00,0x00,0xF4,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00 ,0x00,0x00,0x4C,0xAA,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00 ,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0xD9,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x6F,0xAA,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x01,0x00,0x00,0x00,0x8D,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD0 ,0x00,0x00,0x00,0x0E,0x8D,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0x8E,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x3E,0x00 ,0x00,0x00,0xEF,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00 ,0x00,0x70,0xAA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0xD7,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x0A,0x00,0x00,0x00,0xD9,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xF7,0x00,0x00,0x00,0x12,0xA9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x17 ,0x00,0x00,0x00,0xB4,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC3,0x00 ,0x00,0x00,0x12,0x8E,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0x8F,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2A,0x00,0x00 ,0x00,0xE1,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xB8,0x00,0x00,0x00 ,0x1A,0xA8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xDE,0x00,0x00,0x00,0x0A,0xD6,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x96,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA4 ,0xA9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xEB,0x85 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x08,0x8F,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x90,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xCE,0x85,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x57,0xA7,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xDD,0x83,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x8B,0xD5,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4A ,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x23,0xA7 ,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA4,0x86,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x02,0x90,0xFF,0xFF ,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x91,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xB8,0x86,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0x10,0xA6,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x51,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC ,0x00,0x00,0x00,0x32,0xD3,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00 ,0x00,0x00,0xE7,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x82,0xA7,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xE3,0x85,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x73,0x92,0xFF,0xFF,0xFF ,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x92,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x93,0x85,0x00,0x00,0x00,0xFF ,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x23,0xA7,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xCE,0x00 ,0x00,0x00,0x04,0xD2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x09,0xA7,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xD8,0x84,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x4C,0x93,0xFF,0xFF,0xFF,0x00 ,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x94,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x68,0xA8,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2E,0x00 ,0x00,0x00,0xFC,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x76,0xD1,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x61,0x84,0x00,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00,0x4F,0xA9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x37,0x00,0x00 ,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAC,0x00,0x00,0x00 ,0x14,0x94,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 ,0x00,0x95,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA3 ,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0xAA,0xFF,0xFF,0xFF,0x00 ,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6 ,0x00,0x00,0x00,0x30,0xCF,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x27,0x00 ,0x00,0x00,0xF2,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB6,0xAB,0xFF ,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0xEF,0x00,0x00,0x00,0x5B,0x96,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x52 ,0x00,0x00,0x00,0xD9,0x00,0x00,0x00,0x1A,0xAA,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x15,0x00,0x00,0x00,0xF0,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 ,0x00,0xE5,0x00,0x00,0x00,0x1D,0xCD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x1E,0x00,0x00,0x00,0xE2,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8 ,0x00,0x00,0x00,0x24,0xAB,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x06,0x00 ,0x00,0x00,0x93,0x00,0x00,0x00,0x1B,0x97,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 ,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x02,0xAC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x72,0x84,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0x0E,0xCB,0xFF,0xFF,0xFF ,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xDA,0x84,0x00,0x00,0x00,0xFF ,0x00,0x00,0x00,0x00,0x83,0xC7,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 ,0x89,0x00,0x00,0x00,0x00,0xC6,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05 ,0x00,0x00,0x00,0xD9,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xBB,0x00 ,0x00,0x00,0x06,0xC9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00 ,0x00,0xD0,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE0,0x00,0x00,0x00 ,0x09,0xC7,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 ,0x00,0xC7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4C,0x85,0x00,0x00,0x00 ,0xFF,0x01,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x0B,0xC7,0xFF,0xFF,0xFF,0x00 ,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCC,0x85,0x00,0x00,0x00,0xFF,0x00 ,0x00,0x00,0x00,0x51,0xC8,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0xC8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB4,0x85 ,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x11,0xC5,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0xE2,0x85,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6,0xC9,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 ,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xC8,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x14,0x00,0x00,0x00,0xE2,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 ,0xD2,0x00,0x00,0x00,0x19,0xC3,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x4A ,0x00,0x00,0x00,0xF2,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD1,0x00 ,0x00,0x00,0x0A,0xC9,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0xC9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00 ,0x00,0xFA,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00 ,0x3A,0xC0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x77 ,0x00,0x00,0x00,0xFC,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00 ,0x00,0x00,0x22,0xCA,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0xCA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6F,0x86,0x00 ,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x78,0x00,0x00,0x00 ,0x01,0xBD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0xC5 ,0x86,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x48,0xCB ,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCB ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAB,0x87,0x00,0x00,0x00,0xFF,0x01 ,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x16,0xBA,0xFF,0xFF,0xFF,0x00,0x02,0x00 ,0x00,0x00,0x01,0x00,0x00,0x00,0x6D,0x00,0x00,0x00,0xF5,0x87,0x00,0x00,0x00 ,0xFF,0x00,0x00,0x00,0x00,0x76,0xCC,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0xCB,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 ,0x0E,0x00,0x00,0x00,0xCE,0x87,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xE9 ,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x03,0xB7,0xFF,0xFF,0xFF,0x00,0x01,0x00 ,0x00,0x00,0x2D,0x00,0x00,0x00,0xBF,0x88,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0x84,0xCD,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 ,0x00,0x00,0xCC,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00,0x00 ,0xD8,0x88,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0x47 ,0xB4,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xA5,0x00 ,0x00,0x00,0xFD,0x88,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8A,0xCE,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCD,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xE2,0x89,0x00,0x00 ,0x00,0xFF,0x01,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x31,0xB0,0xFF,0xFF,0xFF ,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xFA,0x89 ,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0xCF,0xFF,0xFF,0xFF,0x00,0x89 ,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCE,0xFF,0xFF,0xFF,0x00,0x01 ,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0xEA,0x8A,0x00,0x00,0x00,0xFF,0x02,0x00 ,0x00,0x00,0xC3,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x04,0xAA,0xFF,0xFF,0xFF ,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xA9,0x00 ,0x00,0x00,0xF9,0x8A,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0xD0,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCF,0xFF ,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xE7,0x8B,0x00,0x00 ,0x00,0xFF,0x02,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0x18 ,0xA6,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x80,0x00 ,0x00,0x00,0xE1,0x8B,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00 ,0x00,0x79,0xD1,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 ,0x00,0x00,0xD0,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00 ,0xD2,0x8C,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0xC8 ,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x02,0x9E,0xFF,0xFF ,0xFF,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x83 ,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0xFE,0x8C,0x00,0x00,0x00,0xFF,0x01,0x00 ,0x00,0x00,0xF1,0x00,0x00,0x00,0x4C,0xD2,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 ,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xD1,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 ,0x00,0x0D,0x00,0x00,0x00,0xB7,0x8F,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0x00 ,0xEB,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x38,0x00,0x00 ,0x00,0x0E,0x96,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x15,0x00,0x00,0x00 ,0x3B,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0xF5,0x8F,0x00 ,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDA,0x00,0x00,0x00,0x29,0xD3,0xFF,0xFF ,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xD2,0xFF,0xFF ,0xFF,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x96,0x93,0x00,0x00,0x00 ,0xFF,0x16,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x8F,0x00 ,0x00,0x00,0x67,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x35 ,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x09,0xFF,0xFF,0xFF ,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x16,0x00,0x00 ,0x00,0x21,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x42,0x00 ,0x00,0x00,0x5B,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0xCA ,0x00,0x00,0x00,0xEF,0x93,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xB8,0x00 ,0x00,0x00,0x11,0xD4,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0xD4,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x00 ,0x00,0xF1,0x9B,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00 ,0xFE,0x9C,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x63 ,0x00,0x00,0x00,0x01,0xD5,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1C,0x00 ,0x00,0x00,0xB8,0xB8,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xA9,0x00,0x00 ,0x00,0x17,0xD7,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 ,0x00,0x00,0xD7,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x00,0x00 ,0xF1,0xB4,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x4C ,0xD9,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 ,0xD8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xAB,0x00 ,0x00,0x00,0xFE,0xB0,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xE9,0x00,0x00 ,0x00,0x78,0x00,0x00,0x00,0x0C,0xDA,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 ,0x00,0x89,0x00,0x00,0x00,0x00,0xDA,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 ,0x2C,0x00,0x00,0x00,0xAA,0x00,0x00,0x00,0xFE,0xAC,0x00,0x00,0x00,0xFF,0x02 ,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x6D,0x00,0x00,0x00,0x09,0xDC,0xFF,0xFF ,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xDC,0xFF,0xFF ,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0xFD ,0xA8,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xD9,0x00,0x00,0x00,0x62,0x00 ,0x00,0x00,0x05,0xDE,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 ,0x00,0x00,0x00,0xDE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x26,0x00,0x00 ,0x00,0x81,0x00,0x00,0x00,0xD8,0xA3,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00 ,0xDE,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x01,0xE0,0xFF ,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xE1,0xFF ,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0x86,0x00,0x00,0x00 ,0xDD,0x9D,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xDB,0x00,0x00,0x00,0x87 ,0x00,0x00,0x00,0x33,0xE4,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 ,0x00,0x00,0x00,0x00,0xE4,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x33,0x00 ,0x00,0x00,0x70,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0xFC ,0x93,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0xB7,0x00 ,0x00,0x00,0x86,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x24,0xE7,0xFF,0xFF,0xFF ,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xE8,0xFF,0xFF,0xFF ,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x69,0x00 ,0x00,0x00,0x95,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xB6,0x00,0x00,0x00,0xC4 ,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0xF1,0x00,0x00,0x00 ,0xFD,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0xE1,0x00,0x00,0x00,0xD1,0x00,0x00 ,0x00,0xC0,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0x8E,0x00 ,0x00,0x00,0x78,0x00,0x00,0x00,0x4A,0x00,0x00,0x00,0x19,0xEC,0xFF,0xFF,0xFF ,0x00,0x89,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 ,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49,0x4F,0x4E,0x2D ,0x58,0x46,0x49,0x4C,0x45,0x2E,0x00}; /* end binary data. size = 22402 bytes */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/KeyHandler.cpp�������������������������������������������������������0000664�0000000�0000000�00000013301�12660066715�0021055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <stdio.h> #include "Common.hpp" #include "fatal.h" #include "KeyHandler.hpp" #include "event.h" #include "Renderer/BeatDetect.hpp" // EDIT BY SJ #include "PresetChooser.hpp" #include "Renderer/Renderer.hpp" // EDIT BY SJ #include "projectM.hpp" #include <iostream> #include "TimeKeeper.hpp" class Preset; interface_t current_interface = DEFAULT_INTERFACE; void selectRandom(const bool hardCut); void selectNext(const bool hardCut); void selectPrevious(const bool hardCut); void refreshConsole() { switch (current_interface) { case MENU_INTERFACE: // unimplemented break; case SHELL_INTERFACE: // unimplemented break; case EDITOR_INTERFACE: // unimplemented break; case DEFAULT_INTERFACE: break; case BROWSER_INTERFACE: // unimplemented break; default: break; } } void projectM::key_handler( projectMEvent event, projectMKeycode keycode, projectMModifier modifier ) { switch( event ) { case PROJECTM_KEYDOWN: //default_key_handler(); switch (current_interface) { case MENU_INTERFACE: // menu_key_handler(this, event, keycode); break; case SHELL_INTERFACE: //shell_key_handler(); break; case EDITOR_INTERFACE: // editor_key_handler(event,keycode); break; case BROWSER_INTERFACE: // browser_key_handler(event,keycode,modifier); break; case DEFAULT_INTERFACE: default_key_handler(event,keycode); break; default: default_key_handler(event,keycode); break; } break; default: break; } } void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode) { switch( event ) { case PROJECTM_KEYDOWN: switch( keycode ) { case PROJECTM_K_UP: beatDetect->beat_sensitivity += 0.25; if (beatDetect->beat_sensitivity > 5.0) beatDetect->beat_sensitivity = 5.0; break; case PROJECTM_K_DOWN: beatDetect->beat_sensitivity -= 0.25; if (beatDetect->beat_sensitivity < 0) beatDetect->beat_sensitivity = 0; break; case PROJECTM_K_h: renderer->showhelp = !renderer->showhelp; renderer->showstats= false; renderer->showfps=false; case PROJECTM_K_F1: renderer->showhelp = !renderer->showhelp; renderer->showstats=false; renderer->showfps=false; break; case PROJECTM_K_y: this->setShuffleEnabled(!this->isShuffleEnabled()); break; case PROJECTM_K_F5: if (!renderer->showhelp) renderer->showfps = !renderer->showfps; break; case PROJECTM_K_F4: if (!renderer->showhelp) renderer->showstats = !renderer->showstats; break; case PROJECTM_K_F3: { renderer->showpreset = !renderer->showpreset; break; } case PROJECTM_K_F2: renderer->showtitle = !renderer->showtitle; break; #ifndef MACOS case PROJECTM_K_F9: #else case PROJECTM_K_F8: #endif renderer->studio = !renderer->studio; break; case PROJECTM_K_ESCAPE: { // exit( 1 ); break; } case PROJECTM_K_f: break; case PROJECTM_K_a: renderer->correction = !renderer->correction; break; case PROJECTM_K_b: break; case PROJECTM_K_n: selectNext(true); break; case PROJECTM_K_N: selectNext(false); break; case PROJECTM_K_r: selectRandom(true); break; case PROJECTM_K_R: selectRandom(false); break; case PROJECTM_K_p: selectPrevious(true); break; case PROJECTM_K_P: selectPrevious(false); break; case PROJECTM_K_l: renderer->noSwitch=!renderer->noSwitch; break; case PROJECTM_K_s: renderer->studio = !renderer->studio; case PROJECTM_K_i: break; case PROJECTM_K_z: break; case PROJECTM_K_0: // nWaveMode=0; break; case PROJECTM_K_6: // nWaveMode=6; break; case PROJECTM_K_7: // nWaveMode=7; break; case PROJECTM_K_m: break; case PROJECTM_K_t: break; case PROJECTM_K_EQUALS: case PROJECTM_K_PLUS: unsigned int index; if (selectedPresetIndex(index)) { const int oldRating = getPresetRating(index, HARD_CUT_RATING_TYPE); if (oldRating >= 6) break; const int rating = oldRating + 1; changePresetRating(index, rating, HARD_CUT_RATING_TYPE); } break; case PROJECTM_K_MINUS: if (selectedPresetIndex(index)) { const int oldRating = getPresetRating(index, HARD_CUT_RATING_TYPE); if (oldRating <= 1) break; const int rating = oldRating - 1; changePresetRating(index, rating, HARD_CUT_RATING_TYPE); } break; default: break; } default: break; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/KeyHandler.hpp�������������������������������������������������������0000775�0000000�0000000�00000002726�12660066715�0021076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: console_interface.h,v 1.1.1.1 2005/12/23 18:05:03 psperl Exp $ * * $Log$ */ #ifndef _KEY_HANDLER_HPP #define _KEY_HANDLER_HPP #include "event.h" class projectM; void default_key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode); void refreshConsole(); #if defined(__CPLUSPLUS) && !defined(MACOS) extern "C" void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier ); #else extern void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier ); #endif #endif /** !_KEY_HANDLER_HPP */ ������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/�����������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0022621�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/BuiltinFuncs.cpp�������������������������������0000664�0000000�0000000�00000012300�12660066715�0025726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Implementation: BuiltinFuncs // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // /* Loads all builtin functions */ /* Loads a builtin function */ #include "BuiltinFuncs.hpp" #include <string> #include <iostream> #include "../fatal.h" std::map<std::string, Func*> BuiltinFuncs::builtin_func_tree; int BuiltinFuncs::load_builtin_func(const std::string & name, float (*func_ptr)(float*), int num_args) { Func * func; int retval; /* Create new function */ func = new Func(name, func_ptr, num_args); if (func == 0) return PROJECTM_OUTOFMEM_ERROR; retval = insert_func( func ); return retval; } Func * BuiltinFuncs::find_func(const std::string & name) { std::map<std::string, Func*>::iterator pos = builtin_func_tree.find(name); // Case: function not found, return null if (pos == builtin_func_tree.end()) return 0; // Case: function found, return a pointer to it return pos->second; } int BuiltinFuncs::load_all_builtin_func() { if (load_builtin_func("int", FuncWrappers::int_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("abs", FuncWrappers::abs_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("sin", FuncWrappers::sin_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("cos", FuncWrappers::cos_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("tan", FuncWrappers::tan_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("asin", FuncWrappers::asin_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("acos", FuncWrappers::acos_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("atan", FuncWrappers::atan_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("sqr", FuncWrappers::sqr_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("sqrt", FuncWrappers::sqrt_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("pow", FuncWrappers::pow_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("exp", FuncWrappers::exp_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("log", FuncWrappers::log_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("log10", FuncWrappers::log10_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("sign", FuncWrappers::sign_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("min", FuncWrappers::min_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("max", FuncWrappers::max_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("sigmoid", FuncWrappers::sigmoid_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("atan2", FuncWrappers::atan2_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("rand", FuncWrappers::rand_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("band", FuncWrappers::band_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("bor", FuncWrappers::bor_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("bnot", FuncWrappers::bnot_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("if", FuncWrappers::if_wrapper, 3) < 0) return PROJECTM_ERROR; if (load_builtin_func("equal", FuncWrappers::equal_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("above", FuncWrappers::above_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("below", FuncWrappers::below_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("nchoosek", FuncWrappers::nchoosek_wrapper, 2) < 0) return PROJECTM_ERROR; if (load_builtin_func("fact", FuncWrappers::fact_wrapper, 1) < 0) return PROJECTM_ERROR; if (load_builtin_func("print", FuncWrappers::print_wrapper, 1) < 0) return PROJECTM_ERROR; return PROJECTM_SUCCESS; } volatile bool BuiltinFuncs::initialized = false; /* Initialize the builtin function database. Should only be necessary once */ int BuiltinFuncs::init_builtin_func_db() { int retval; if (initialized) { return 0; } else initialized = true; retval = load_all_builtin_func(); return retval; } /* Destroy the builtin function database. Generally, do this on projectm exit */ int BuiltinFuncs::destroy_builtin_func_db() { traverse<TraverseFunctors::Delete<Func> >(builtin_func_tree); builtin_func_tree.clear(); initialized = false; return PROJECTM_SUCCESS; } /* Insert a function into the database */ int BuiltinFuncs::insert_func( Func *func ) { assert(func); if (func == 0) { std::cerr << "Received a null function object, ignoring...." << std::endl; return PROJECTM_ERROR; } // //std::cout << "inserting function " << func->getName() << std::endl; const std::pair<std::string, Func*> pair = std::make_pair(std::string(func->getName()), func); assert(pair.second); const std::pair<std::map<std::string, Func*>::iterator, bool> inserteePair = builtin_func_tree.insert(pair); if (!inserteePair.second) { std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl; abort(); } return PROJECTM_SUCCESS; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/BuiltinFuncs.hpp�������������������������������0000664�0000000�0000000�00000011213�12660066715�0025735�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Interface: BuiltinFuncs // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // #ifndef _BUILTIN_FUNCS_HPP #define _BUILTIN_FUNCS_HPP #include "../Common.hpp" #include "Func.hpp" #include <cmath> #include <cstdlib> #include <cassert> #include "../RandomNumberGenerators.hpp" /* Wrappers for all the builtin functions The arg_list pointer is a list of floats. Its size is equal to the number of arguments the parameter takes */ class FuncWrappers { /* Values to optimize the sigmoid function */ static const int R = 32767; static const int RR = 65534; public: static inline float int_wrapper(float * arg_list) { return floor(arg_list[0]); } static inline float sqr_wrapper(float * arg_list) { return pow(arg_list[0], 2); } static inline float sigmoid_wrapper(float * arg_list) { const double t = (1+exp(-arg_list[0]*arg_list[1])); return (fabs(t) > 0.00001) ? 1.0/t : 0; } static inline float sign_wrapper(float * arg_list) { return -arg_list[0]; } static inline float min_wrapper(float * arg_list) { if (arg_list[0] > arg_list[1]) return arg_list[1]; return arg_list[0]; } static inline float max_wrapper(float * arg_list) { if (arg_list[0] > arg_list[1]) return arg_list[0]; return arg_list[1]; } static inline float bor_wrapper(float * arg_list) { return (float)((int)arg_list[0] || (int)arg_list[1]); } static inline float band_wrapper(float * arg_list) { return (float)((int)arg_list[0] && (int)arg_list[1]); } static inline float bnot_wrapper(float * arg_list) { return (float)(!(int)arg_list[0]); } static inline float if_wrapper(float * arg_list) { if ((int)arg_list[0] == 0) return arg_list[2]; //std::cout <<"NOT ZERO: " << arg_list[0] << std::endl; return arg_list[1]; } static inline float rand_wrapper(float * arg_list) { float l=1; // printf("RAND ARG:(%d)\n", (int)arg_list[0]); if ((int)arg_list[0] > 0) l = (float) RandomNumberGenerators::uniformInteger((int)arg_list[0]); return l; } static inline float equal_wrapper(float * arg_list) { return (arg_list[0] == arg_list[1]); } static inline float above_wrapper(float * arg_list) { return (arg_list[0] > arg_list[1]); } static inline float below_wrapper(float * arg_list) { return (arg_list[0] < arg_list[1]); } static float sin_wrapper(float * arg_list) { const float d = sinf(*arg_list); return d; } static inline float cos_wrapper(float * arg_list) { return (cos (arg_list[0])); } static inline float tan_wrapper(float * arg_list) { return (tan(arg_list[0])); } static inline float asin_wrapper(float * arg_list) { return (asin (arg_list[0])); } static inline float acos_wrapper(float * arg_list) { return (acos (arg_list[0])); } static inline float atan_wrapper(float * arg_list) { return (atan (arg_list[0])); } static inline float atan2_wrapper(float * arg_list) { return (atan2 (arg_list[0], arg_list[1])); } static inline float pow_wrapper(float * arg_list) { return (pow (arg_list[0], arg_list[1])); } static inline float exp_wrapper(float * arg_list) { return (exp(arg_list[0])); } static inline float abs_wrapper(float * arg_list) { return (fabs(arg_list[0])); } static inline float log_wrapper(float* arg_list) { return (log (arg_list[0])); } static inline float log10_wrapper(float * arg_list) { return (log10 (arg_list[0])); } static inline float sqrt_wrapper(float * arg_list) { return (sqrt (arg_list[0])); } static inline float print_wrapper(float * arg_list) { int len = 1; for (int i = 0; i < len; i++) { std::cout << arg_list[i]; if (i != (len-1)) std::cout << " "; } if (len > 0) std::cout << std::endl; if (len > 0) return arg_list[0]; else return 0; } static inline float nchoosek_wrapper(float * arg_list) { unsigned long cnm = 1UL; int i, f; int n, m; n = (int)arg_list[0]; m = (int)arg_list[1]; if (m*2 >n) m = n-m; for (i=1 ; i <= m; n--, i++) { if ((f=n) % i == 0) f /= i; else cnm /= i; cnm *= f; } return (float)cnm; } static inline float fact_wrapper(float * arg_list) { int result = 1; int n = (int)arg_list[0]; while (n > 1) { result = result * n; n--; } return (float)result; } }; #include <map> class BuiltinFuncs { public: static int init_builtin_func_db(); static int destroy_builtin_func_db(); static int load_all_builtin_func(); static int load_builtin_func( const std::string & name, float (*func_ptr)(float*), int num_args ); static int insert_func( Func *func ); static int remove_func( Func *func ); static Func *find_func( const std::string & name ); private: static std::map<std::string, Func*> builtin_func_tree; static volatile bool initialized; }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/BuiltinParams.cpp������������������������������0000664�0000000�0000000�00000043723�12660066715�0026110�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #include "../fatal.h" #include "BuiltinParams.hpp" #include <cassert> #include <iostream> #include <algorithm> #include "InitCondUtils.hpp" #include <sstream> #include <stdio.h> #include "../Common.hpp" BuiltinParams::BuiltinParams() {} BuiltinParams::BuiltinParams(PresetInputs & presetInputs, PresetOutputs & presetOutputs) { presetInputs.Initialize(presetOutputs.gx, presetOutputs.gy); int ret; if ((ret = init_builtin_param_db(presetInputs, presetOutputs)) != PROJECTM_SUCCESS) { std::cout << "failed to allocate builtin parameter database with error " << ret << std::endl;; throw ret; } } BuiltinParams::~BuiltinParams() { destroy_builtin_param_db(); } /* Loads a float parameter into the builtin database */ int BuiltinParams::load_builtin_param_float(const std::string & name, void * engine_val, void * matrix, short int flags, float init_val, float upper_bound, float lower_bound, const std::string & alt_name) { Param * param = NULL; CValue iv, ub, lb; iv.float_val = init_val; ub.float_val = upper_bound; lb.float_val = lower_bound; /* Create new parameter of type float */ if (BUILTIN_PARAMS_DEBUG == 2) { printf("load_builtin_param_float: (name \"%s\") (alt_name = \"%s\") ", name.c_str(), alt_name.c_str()); fflush(stdout); } std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); if ((param = new Param(lowerName, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL) { return PROJECTM_OUTOFMEM_ERROR; } if (BUILTIN_PARAMS_DEBUG == 2) { printf("created..."); fflush(stdout); } /* Insert the paremeter into the database */ if (insert_builtin_param( param ) < 0) { delete param; return PROJECTM_ERROR; } if (BUILTIN_PARAMS_DEBUG == 2) { printf("inserted..."); fflush(stdout); } /* If this parameter has an alternate name, insert it into the database as link */ if (alt_name != "") { std::string alt_lower_name(alt_name); std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower); insert_param_alt_name(param,alt_lower_name); if (BUILTIN_PARAMS_DEBUG == 2) { printf("alt_name inserted..."); fflush(stdout); } } if (BUILTIN_PARAMS_DEBUG == 2) printf("finished\n"); /* Finished, return success */ return PROJECTM_SUCCESS; } /* Destroy the builtin parameter database. Generally, do this on projectm exit */ int BuiltinParams::destroy_builtin_param_db() { traverse<TraverseFunctors::Delete<Param> >(builtin_param_tree); return PROJECTM_SUCCESS; } /* Insert a parameter into the database with an alternate name */ int BuiltinParams::insert_param_alt_name(Param * param, const std::string & alt_name) { assert(param); aliasMap.insert(std::make_pair(alt_name, param->name)); return PROJECTM_SUCCESS; } Param * BuiltinParams::find_builtin_param(const std::string & name) { AliasMap::iterator pos = aliasMap.find(name); Param * param = 0; //std::cerr << "[BuiltinParams] find_builtin_param: name is " << name << std::endl; if (pos == aliasMap.end()) { std::map<std::string, Param*>::iterator builtinPos = builtin_param_tree.find(name); if (builtinPos != builtin_param_tree.end()) { // std::cerr << "[BuiltinParams] find_builtin_param: found it directly." << std::endl; param = builtinPos->second; } } else { std::map<std::string, Param*>::iterator builtinPos = builtin_param_tree.find(pos->second); if (builtinPos != builtin_param_tree.end()) { //std::cerr << "[BuiltinParams] find_builtin_param: found it indirectly." << std::endl; param = builtinPos->second; } } return param; } /* Loads a integer parameter into the builtin database */ int BuiltinParams::load_builtin_param_int(const std::string & name, void * engine_val, short int flags, int init_val, int upper_bound, int lower_bound, const std::string &alt_name) { Param * param; CValue iv, ub, lb; iv.int_val = init_val; ub.int_val = upper_bound; lb.int_val = lower_bound; // normalize to lower case as milkdrop scripts depend on this std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); param = new Param(lowerName, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb); if (param == NULL) { return PROJECTM_OUTOFMEM_ERROR; } if (insert_builtin_param( param ) < 0) { delete param; return PROJECTM_ERROR; } if (alt_name != "") { std::string alt_lower_name(alt_name); std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower); insert_param_alt_name(param,alt_lower_name); } return PROJECTM_SUCCESS; } int BuiltinParams::load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags) { /* Creates a new parameter of type string */ Param * param = Param::new_param_string(name.c_str(), flags, engine_val); if (insert_builtin_param( param ) < 0) { delete param; return PROJECTM_ERROR; } return PROJECTM_SUCCESS; } /* Loads a boolean parameter */ int BuiltinParams::load_builtin_param_bool(const std:: string & name, void * engine_val, short int flags, int init_val, const std::string &alt_name) { Param * param; CValue iv, ub, lb; iv.int_val = init_val; ub.int_val = TRUE; lb.int_val = false; std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); param = new Param(lowerName, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb); if (param == NULL) { return PROJECTM_OUTOFMEM_ERROR; } if (insert_builtin_param(param) < 0) { delete param; return PROJECTM_ERROR; } if (alt_name != "") { std::string alt_lower_name(alt_name); std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower); insert_param_alt_name(param,alt_lower_name); } return PROJECTM_SUCCESS; } /* Inserts a parameter into the builtin database */ int BuiltinParams::insert_builtin_param( Param *param ) { std::pair<std::map<std::string, Param*>::iterator, bool> inserteePos = builtin_param_tree.insert(std::make_pair(param->name, param)); return inserteePos.second; } /* Initialize the builtin parameter database. Should only be necessary once */ int BuiltinParams::init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs) { if (BUILTIN_PARAMS_DEBUG) { printf("init_builtin_param: loading database..."); fflush(stdout); } /* Loads all builtin parameters into the database */ if (load_all_builtin_param(presetInputs, presetOutputs) < 0) { if (BUILTIN_PARAMS_DEBUG) printf("failed loading builtin parameters (FATAL)\n"); return PROJECTM_ERROR; } if (BUILTIN_PARAMS_DEBUG) printf("success!\n"); /* Finished, no errors */ return PROJECTM_SUCCESS; } /* Loads all builtin parameters, limits are also defined here */ int BuiltinParams::load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs) { load_builtin_param_float("frating", (void*)&presetOutputs.fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, ""); load_builtin_param_float("fwavescale", (void*)&presetOutputs.wave.scale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); load_builtin_param_float("gamma", (void*)&presetOutputs.fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj"); load_builtin_param_float("echo_zoom", (void*)&presetOutputs.videoEcho.zoom, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoZoom"); load_builtin_param_float("echo_alpha", (void*)&presetOutputs.videoEcho.a, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fvideoechoalpha"); load_builtin_param_float("wave_a", (void*)&presetOutputs.wave.a, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fwavealpha"); load_builtin_param_float("fwavesmoothing", (void*)&presetOutputs.wave.smoothing, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("fmodwavealphastart", (void*)&presetOutputs.wave.modOpacityStart, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("fmodwavealphaend", (void*)&presetOutputs.wave.modOpacityEnd, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("fWarpAnimSpeed", (void*)&presetOutputs.fWarpAnimSpeed, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("fWarpScale", (void*)&presetOutputs.fWarpScale, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); // load_builtin_param_float("warp", (void*)&presetOutputs.warp, warp_mesh, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, ""); load_builtin_param_float("fshader", (void*)&presetOutputs.fShader, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("decay", (void*)&presetOutputs.screenDecay, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fdecay"); load_builtin_param_int("echo_orient", (void*)&presetOutputs.videoEcho.orientation, P_FLAG_NONE, 0, 3, 0, "nVideoEchoOrientation"); load_builtin_param_int("wave_mode", (void*)&presetOutputs.wave.mode, P_FLAG_NONE, 0, 7, 0, "nwavemode"); load_builtin_param_bool("wave_additive", (void*)&presetOutputs.wave.additive, P_FLAG_NONE, false, "bAdditiveWaves"); load_builtin_param_bool("bmodwavealphabyvolume", (void*)&presetOutputs.wave.modulateAlphaByVolume, P_FLAG_NONE, false, ""); load_builtin_param_bool("wave_brighten", (void*)&presetOutputs.wave.maximizeColors, P_FLAG_NONE, false, "bMaximizeWaveColor"); load_builtin_param_bool("wrap", (void*)&presetOutputs.textureWrap, P_FLAG_NONE, false, "btexwrap"); load_builtin_param_bool("darken_center", (void*)&presetOutputs.bDarkenCenter, P_FLAG_NONE, false, "bdarkencenter"); load_builtin_param_bool("bredbluestereo", (void*)&presetOutputs.bRedBlueStereo, P_FLAG_NONE, false, ""); load_builtin_param_bool("brighten", (void*)&presetOutputs.bBrighten, P_FLAG_NONE, false, "bbrighten"); load_builtin_param_bool("darken", (void*)&presetOutputs.bDarken, P_FLAG_NONE, false, "bdarken"); load_builtin_param_bool("solarize", (void*)&presetOutputs.bSolarize, P_FLAG_NONE, false, "bsolarize"); load_builtin_param_bool("invert", (void*)&presetOutputs.bInvert, P_FLAG_NONE, false, "binvert"); load_builtin_param_bool("bmotionvectorson", (void*)&presetOutputs.bMotionVectorsOn, P_FLAG_NONE, false, ""); load_builtin_param_bool("wave_dots", (void*)&presetOutputs.wave.dots, P_FLAG_NONE, false, "bwavedots"); load_builtin_param_bool("wave_thick", (void*)&presetOutputs.wave.thick, P_FLAG_NONE, false, "bwavethick"); load_builtin_param_float("warp", (void*)&presetOutputs.warp, presetOutputs.warp_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("zoom", (void*)&presetOutputs.zoom, presetOutputs.zoom_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("rot", (void*)&presetOutputs.rot, presetOutputs.rot_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); /// @note added huge bug fix here potentially by prevening zoomexp_mesh from being freed when presets dealloc load_builtin_param_float("zoomexp", (void*)&presetOutputs.zoomexp, presetOutputs.zoomexp_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE , 0.0, MAX_DOUBLE_SIZE, 0, "fzoomexponent"); load_builtin_param_float("cx", (void*)&presetOutputs.cx, presetOutputs.cx_mesh, P_FLAG_PER_PIXEL | P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("cy", (void*)&presetOutputs.cy, presetOutputs.cy_mesh, P_FLAG_PER_PIXEL | P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("dx", (void*)&presetOutputs.dx, presetOutputs.dx_mesh, P_FLAG_PER_PIXEL | P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("dy", (void*)&presetOutputs.dy, presetOutputs.dy_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("sx", (void*)&presetOutputs.sx, presetOutputs.sx_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("sy", (void*)&presetOutputs.sy, presetOutputs.sy_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); load_builtin_param_float("b1n", (void*)&presetOutputs.blur1n, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("b2n", (void*)&presetOutputs.blur2n, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("b3n", (void*)&presetOutputs.blur3n, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("b1x", (void*)&presetOutputs.blur1x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("b2x", (void*)&presetOutputs.blur2x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("b3x", (void*)&presetOutputs.blur3x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("b1ed", (void*)&presetOutputs.blur1ed, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("wave_r", (void*)&presetOutputs.wave.r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("wave_g", (void*)&presetOutputs.wave.g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("wave_b", (void*)&presetOutputs.wave.b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("wave_x", (void*)&presetOutputs.wave.x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("wave_y", (void*)&presetOutputs.wave.y, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("wave_mystery", (void*)&presetOutputs.wave.mystery, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, "fWaveParam"); load_builtin_param_float("ob_size", (void*)&presetOutputs.border.outer_size, NULL, P_FLAG_NONE, 0.0, 0.5, 0, ""); load_builtin_param_float("ob_r", (void*)&presetOutputs.border.outer_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ob_g", (void*)&presetOutputs.border.outer_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ob_b", (void*)&presetOutputs.border.outer_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ob_a", (void*)&presetOutputs.border.outer_a, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ib_size", (void*)&presetOutputs.border.inner_size, NULL,P_FLAG_NONE, 0.0, .5, 0.0, ""); load_builtin_param_float("ib_r", (void*)&presetOutputs.border.inner_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ib_g", (void*)&presetOutputs.border.inner_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ib_b", (void*)&presetOutputs.border.inner_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("ib_a", (void*)&presetOutputs.border.inner_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("mv_r", (void*)&presetOutputs.mv.r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("mv_g", (void*)&presetOutputs.mv.g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("mv_b", (void*)&presetOutputs.mv.b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("mv_x", (void*)&presetOutputs.mv.x_num, NULL,P_FLAG_NONE, 0.0, 64.0, 0.0, "nmotionvectorsx"); load_builtin_param_float("mv_y", (void*)&presetOutputs.mv.y_num, NULL,P_FLAG_NONE, 0.0, 48.0, 0.0, "nmotionvectorsy"); load_builtin_param_float("mv_l", (void*)&presetOutputs.mv.length, NULL,P_FLAG_NONE, 0.0, 5.0, 0.0, ""); load_builtin_param_float("mv_dy", (void*)&presetOutputs.mv.x_offset, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("mv_dx", (void*)&presetOutputs.mv.y_offset, NULL,P_FLAG_NONE, 0.0, 1.0, -1.0, ""); load_builtin_param_float("mv_a", (void*)&presetOutputs.mv.a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); load_builtin_param_float("time", (void*)&presetInputs.time, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, ""); load_builtin_param_float("bass", (void*)&presetInputs.bass, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, ""); load_builtin_param_float("mid", (void*)&presetInputs.mid, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); load_builtin_param_float("treb", (void*)&presetInputs.treb, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); load_builtin_param_float("bass_att", (void*)&presetInputs.bass_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); load_builtin_param_float("mid_att", (void*)&presetInputs.mid_att, NULL, P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); load_builtin_param_float("treb_att", (void*)&presetInputs.treb_att, NULL, P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); load_builtin_param_int("frame", (void*)&presetInputs.frame, P_FLAG_READONLY, 0, MAX_INT_SIZE, 0, ""); load_builtin_param_float("progress", (void*)&presetInputs.progress, NULL,P_FLAG_READONLY, 0.0, 1, 0, ""); load_builtin_param_int("fps", (void*)&presetInputs.fps, P_FLAG_READONLY, 15, MAX_INT_SIZE, 0, ""); load_builtin_param_float("x", (void*)&presetInputs.x_per_pixel, presetInputs.origx, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); load_builtin_param_float("y", (void*)&presetInputs.y_per_pixel, presetInputs.origy, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX |P_FLAG_READONLY | P_FLAG_NONE, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); load_builtin_param_float("ang", (void*)&presetInputs.ang_per_pixel, presetInputs.origtheta, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); load_builtin_param_float("rad", (void*)&presetInputs.rad_per_pixel, presetInputs.origrad, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); for (unsigned int i = 0; i < NUM_Q_VARIABLES;i++) { std::ostringstream os; os << "q" << i; load_builtin_param_float(os.str().c_str(), (void*)&presetOutputs.q[i], NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); } /* variables added in 1.04 */ load_builtin_param_int("meshx", (void*)&presetInputs.gx, P_FLAG_READONLY, 32, 96, 8, ""); load_builtin_param_int("meshy", (void*)&presetInputs.gy, P_FLAG_READONLY, 24, 72, 6, ""); return PROJECTM_SUCCESS; } ���������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/BuiltinParams.hpp������������������������������0000664�0000000�0000000�00000006330�12660066715�0026106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** BuiltinParams.hpp :: a class to encapsulate and centralize * all projectm builtin parameter methods and state. Used primarily * by preset class **/ #ifndef _BUILTIN_PARAMS_HPP #define _BUILTIN_PARAMS_HPP #include <string> #include "PresetFrameIO.hpp" #include "Param.hpp" #include <map> #include <cstdio> class BuiltinParams { public: typedef std::map<std::string, std::string> AliasMap; /** Default constructor leaves database in an uninitialized state. */ BuiltinParams(); /** Construct a new builtin parameter database with variables references given by * the preset input and output structures */ BuiltinParams(PresetInputs & presetInputs, PresetOutputs & presetOutputs); ~BuiltinParams(); /** Param database initializer / destructor functions */ int init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs); int load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs); int destroy_builtin_param_db(); int insert_param_alt_name( Param *param, const std::string& salt_name ); Param *find_builtin_param( const std::string & name ); int load_builtin_param_float( const std::string & name, void *engine_val, void *matrix, short int flags, float init_val, float upper_bound, float lower_bound, const std::string & alt_name ); int load_builtin_param_int( const std::string & name, void *engine_val, short int flags, int init_val, int upper_bound, int lower_bound, const std::string & alt_name ); int load_builtin_param_bool( const std::string & name, void *engine_val, short int flags, int init_val, const std::string & alt_name ); int load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags); int insert_builtin_param( Param *param ); template <class Fun> void apply(Fun & fun) { traverse(builtin_param_tree, fun); } private: static const bool BUILTIN_PARAMS_DEBUG = false; // Used to associate multiple string names to one parameter AliasMap aliasMap; // Internal datastructure to store the parameters std::map<std::string,Param*> builtin_param_tree; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/CValue.hpp�������������������������������������0000775�0000000�0000000�00000002075�12660066715�0024520�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Value * * $Log$ */ #ifndef _CVALUE_H #define _CVALUE_H typedef union CValue_t { bool bool_val; int int_val; float float_val; } CValue; #endif /** _CVALUE_H */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/CustomShape.cpp��������������������������������0000664�0000000�0000000�00000017573�12660066715�0025575�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed i 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <sstream> #include "../Common.hpp" #include "../fatal.h" #include "CustomShape.hpp" #include "Eval.hpp" #include "Expr.hpp" #include "InitCond.hpp" #include "Param.hpp" #include "PerFrameEqn.hpp" #include "../Preset.hpp" #include <map> #include "ParamUtils.hpp" #include "InitCondUtils.hpp" #include "../wipemalloc.h" CustomShape::CustomShape() : Shape() { CustomShape(0); }; CustomShape::CustomShape ( int id ) : Shape() { Param * param; this->id = id; this->per_frame_count = 0; /* Start: Load custom shape parameters */ param = Param::new_param_float ( "r", P_FLAG_NONE, &this->r, NULL, 1.0, 0.0, 0.5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "g", P_FLAG_NONE, &this->g, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "b", P_FLAG_NONE, &this->b, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "a", P_FLAG_NONE, &this->a, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "border_r", P_FLAG_NONE, &this->border_r, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "border_g", P_FLAG_NONE, &this->border_g, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "border_b", P_FLAG_NONE, &this->border_b, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "border_a", P_FLAG_NONE, &this->border_a, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "r2", P_FLAG_NONE, &this->r2, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "g2", P_FLAG_NONE, &this->g2, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "b2", P_FLAG_NONE, &this->b2, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "a2", P_FLAG_NONE, &this->a2, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "x", P_FLAG_NONE, &this->x, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "y", P_FLAG_NONE, &this->y, NULL, 1.0, 0.0, .5 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_bool ( "thickoutline", P_FLAG_NONE, &this->thickOutline, 1, 0, 0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_bool ( "enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_int ( "sides", P_FLAG_NONE, &this->sides, 100, 3, 3 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_bool ( "additive", P_FLAG_NONE, &this->additive, 1, 0, 0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_bool ( "textured", P_FLAG_NONE, &this->textured, 1, 0, 0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "rad", P_FLAG_NONE, &this->radius, NULL, MAX_DOUBLE_SIZE, 0, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "ang", P_FLAG_NONE, &this->ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "tex_zoom", P_FLAG_NONE, &this->tex_zoom, NULL, MAX_DOUBLE_SIZE, .00000000001, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "tex_ang", P_FLAG_NONE, &this->tex_ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t1", P_FLAG_TVAR, &this->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t2", P_FLAG_TVAR, &this->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t3", P_FLAG_TVAR, &this->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t4", P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t6", P_FLAG_TVAR, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t7", P_FLAG_TVAR, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } param = Param::new_param_float ( "t8", P_FLAG_TVAR, &this->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( !ParamUtils::insert( param, &this->param_tree ) ) { abort(); } for (unsigned int i = 1; i <= NUM_Q_VARIABLES;i++) { std::ostringstream os; os << "q" << i; param = Param::new_param_float ( os.str().c_str(), P_FLAG_QVAR, &this->q[i], NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) { abort(); } } param = Param::new_param_string ( "imageurl", P_FLAG_NONE, &this->imageUrl); if ( !ParamUtils::insert( param, &this->text_properties_tree ) ) { abort(); } } /* Frees a custom shape form object */ CustomShape::~CustomShape() { traverseVector<TraverseFunctors::Delete<PerFrameEqn> > ( per_frame_eqn_tree ); traverse<TraverseFunctors::Delete<InitCond> > ( init_cond_tree ); traverse<TraverseFunctors::Delete<Param> > ( param_tree ); traverse<TraverseFunctors::Delete<InitCond> > ( per_frame_init_eqn_tree ); traverse<TraverseFunctors::Delete<Param> > ( text_properties_tree ); } void CustomShape::loadUnspecInitConds() { InitCondUtils::LoadUnspecInitCond fun ( this->init_cond_tree, this->per_frame_init_eqn_tree ); traverse ( param_tree, fun ); } void CustomShape::evalInitConds() { // NOTE: This is verified to be same behavior as trunk for ( std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end();++pos ) pos->second->evaluate(); } �������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/CustomShape.hpp��������������������������������0000664�0000000�0000000�00000004441�12660066715�0025570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Encapsulation of a custom shape * * $Log$ */ #ifndef _CUSTOM_SHAPE_H #define _CUSTOM_SHAPE_H #define CUSTOM_SHAPE_DEBUG 0 #include <map> #include "Param.hpp" #include "PerFrameEqn.hpp" #include "InitCond.hpp" #include "../Renderer/Renderable.hpp" #include <vector> class Preset; class CustomShape : public Shape { public: /* Numerical id */ int id; int per_frame_count; /* Parameter tree associated with this custom shape */ std::map<std::string,Param*> param_tree; /* Engine variables */ bool enabled; /* stupid t variables */ float t1; float t2; float t3; float t4; float t5; float t6; float t7; float t8; /* stupider q variables */ float q[NUM_Q_VARIABLES]; // Data structure to hold per frame / per frame init equations std::map<std::string,InitCond*> init_cond_tree; std::vector<PerFrameEqn*> per_frame_eqn_tree; std::map<std::string,InitCond*> per_frame_init_eqn_tree; std::map<std::string, Param*> text_properties_tree; /// Allocate a new custom shape, including param associations, per point equations, and initial values. /// \param id an integer id to associate with this custom wave. Future line parsing uses this as a reference key. CustomShape( int id ); CustomShape(); ~CustomShape(); void loadUnspecInitConds(); void evalInitConds(); }; #endif /** !_CUSTOM_SHAPE_H */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/CustomWave.cpp���������������������������������0000664�0000000�0000000�00000031236�12660066715�0025427�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sstream> #include "../Common.hpp" #include "../fatal.h" #include "CustomWave.hpp" #include "Eval.hpp" #include "Expr.hpp" #include "InitCond.hpp" #include "Param.hpp" #include "PerFrameEqn.hpp" #include "PerPointEqn.hpp" #include "../Preset.hpp" #include <map> #include "ParamUtils.hpp" #include "InitCondUtils.hpp" #include "../wipemalloc.h" #define MAX_SAMPLE_SIZE 4096 CustomWave::CustomWave(int _id) : Waveform(512), id(_id), per_frame_count(0), r(0), g(0), b(0), a(0) { Param * param; /// @bug deprecate the use of wipemalloc this->r_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->g_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->b_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->a_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->x_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->y_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->value1 = (float*) wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->value2 = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); this->sample_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); /* Start: Load custom wave parameters */ if ((param = Param::new_param_float("r", P_FLAG_NONE | P_FLAG_PER_POINT, &this->r, this->r_mesh, 1.0, 0.0, .5)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, ¶m_tree) < 0) { /// @bug make exception abort(); } if ((param = Param::new_param_float("g", P_FLAG_NONE | P_FLAG_PER_POINT, &this->g, this->g_mesh, 1.0, 0.0, .5)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, ¶m_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_float("b", P_FLAG_NONE | P_FLAG_PER_POINT, &this->b, this->b_mesh, 1.0, 0.0, .5)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_float("a", P_FLAG_NONE | P_FLAG_PER_POINT, &this->a, this->a_mesh, 1.0, 0.0, .5)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_float("x", P_FLAG_NONE | P_FLAG_PER_POINT, &this->x, this->x_mesh, 1.0, 0.0, .5)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_float("y", P_FLAG_NONE | P_FLAG_PER_POINT, &this->y, this->y_mesh, 1.0, 0.0, .5)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_bool("enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_int("sep", P_FLAG_NONE, &this->sep, 100, -100, 0)) == NULL) { ; /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; /// @bug make exception abort(); } if ((param = Param::new_param_bool("bspectrum", P_FLAG_NONE, &this->spectrum, 1, 0, 0)) == NULL) { /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { /// @bug make exception abort(); } if ((param = Param::new_param_bool("bdrawthick", P_FLAG_NONE, &this->thick, 1, 0, 0)) == NULL) { /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { /// @bug make exception abort(); } if ((param = Param::new_param_bool("busedots", P_FLAG_NONE, &this->dots, 1, 0, 0)) == NULL) { /// @bug make exception abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_bool("badditive", P_FLAG_NONE, &this->additive, 1, 0, 0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_int("samples", P_FLAG_NONE, &this->samples, 2048, 1, 512)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_float("sample", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &this->sample, this->sample_mesh, 1.0, 0.0, 0.0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("value1", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &this->v1, this->value1, 1.0, -1.0, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("value2", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &this->v2, this->value2, 1.0, -1.0, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_float("smoothing", P_FLAG_NONE, &this->smoothing, NULL, 1.0, 0.0, 0.0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_float("scaling", P_FLAG_NONE, &this->scaling, NULL, MAX_DOUBLE_SIZE, 0.0, 1.0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_float("t1", P_FLAG_PER_POINT | P_FLAG_TVAR, &this->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_float("t2", P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("t3", P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("t4", P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("t6", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { abort(); } if ((param = Param::new_param_float("t7", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } if ((param = Param::new_param_float("t8", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { ; abort(); } if (ParamUtils::insert(param, &this->param_tree) < 0) { ; abort(); } for (unsigned int i = 1; i <= NUM_Q_VARIABLES;i++) { std::ostringstream os; os << "q" << i; param = Param::new_param_float ( os.str().c_str(), P_FLAG_QVAR, &this->q[i], NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) { abort(); } } /* End of parameter loading. Note that the read only parameters associated with custom waves (ie, sample) are variables stored in PresetFrameIO.hpp, and not specific to the custom wave datastructure. */ } CustomWave::~CustomWave() { for (std::vector<PerPointEqn*>::iterator pos = per_point_eqn_tree.begin(); pos != per_point_eqn_tree.end(); ++pos) delete(*pos); for (std::vector<PerFrameEqn*>::iterator pos = per_frame_eqn_tree.begin(); pos != per_frame_eqn_tree.end(); ++pos) delete(*pos); for (std::map<std::string, InitCond*>::iterator pos = init_cond_tree.begin(); pos != init_cond_tree.end(); ++pos) delete(pos->second); for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos) delete(pos->second); for (std::map<std::string, Param*>::iterator pos = param_tree.begin(); pos != param_tree.end(); ++pos) delete(pos->second); free(r_mesh); free(g_mesh); free(b_mesh); free(a_mesh); free(x_mesh); free(y_mesh); free(value1); free(value2); free(sample_mesh); } // Comments: index is not passed, so we assume monotonic increment by 1 is ok here int CustomWave::add_per_point_eqn(char * name, GenExpr * gen_expr) { PerPointEqn * per_point_eqn; int index; Param * param = NULL; /* Argument checks */ if (gen_expr == NULL) return PROJECTM_FAILURE; if (name == NULL) return PROJECTM_FAILURE; if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: per pixel equation (name = \"%s\")\n", name); /* Search for the parameter so we know what matrix the per pixel equation is referencing */ if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(name,¶m_tree)) == NULL) { if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: failed to allocate a new parameter!\n"); return PROJECTM_FAILURE; } /* Get largest index in the tree */ index = per_point_eqn_tree.size(); /* Create the per point equation given the index, parameter, and general expression */ if ((per_point_eqn = new PerPointEqn(index, param, gen_expr, samples)) == NULL) return PROJECTM_FAILURE; if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: created new equation (index = %d) (name = \"%s\")\n", per_point_eqn->index, per_point_eqn->param->name.c_str()); /* Insert the per pixel equation into the preset per pixel database */ per_point_eqn_tree.push_back(per_point_eqn); /* Done */ return PROJECTM_SUCCESS; } void CustomWave::evalInitConds() { for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos) { assert(pos->second); pos->second->evaluate(); } } ColoredPoint CustomWave::PerPoint(ColoredPoint p, const WaveformContext context) { r_mesh[context.sample_int] = r; g_mesh[context.sample_int] = g; b_mesh[context.sample_int] = b; a_mesh[context.sample_int] = a; x_mesh[context.sample_int] = x; y_mesh[context.sample_int] = y; sample = context.sample; sample_mesh[context.sample_int] = context.sample; v1 = context.left; v2 = context.right; for (std::vector<PerPointEqn*>::iterator pos = per_point_eqn_tree.begin(); pos != per_point_eqn_tree.end();++pos) (*pos)->evaluate(context.sample_int); p.a = a_mesh[context.sample_int]; p.r = r_mesh[context.sample_int]; p.g = g_mesh[context.sample_int]; p.b = b_mesh[context.sample_int]; p.x = x_mesh[context.sample_int]; p.y = y_mesh[context.sample_int]; return p; } void CustomWave::loadUnspecInitConds() { InitCondUtils::LoadUnspecInitCond fun(this->init_cond_tree, this->per_frame_init_eqn_tree); traverse(param_tree, fun); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/CustomWave.hpp���������������������������������0000664�0000000�0000000�00000006274�12660066715�0025440�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Encapsulation of a custom wave * * $Log$ */ #ifndef _CUSTOM_WAVE_H #define _CUSTOM_WAVE_H #define CUSTOM_WAVE_DEBUG 0 class CustomWave; class GenExpr; class PerPointEqn; class Preset; #include <vector> #include "../Common.hpp" #include "Param.hpp" #include "PerFrameEqn.hpp" #include "../Renderer/Waveform.hpp" #include <map> class CustomWave : public Waveform { public: /** Empty constructor leaves wave in undefined state **/ //CustomWave() {} /** Initializes a custom wave id given the integer id */ CustomWave(int id); /** Destructor is necessary so we can free the per point matrices **/ ~CustomWave(); ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context); /* Numerical id */ int id; int per_frame_count; /* Parameter tree associated with this custom wave */ std::map<std::string,Param*> param_tree; /* Engine variables */ float x; /* x position for per point equations */ float y; /* y position for per point equations */ float r; /* red color value */ float g; /* green color value */ float b; /* blue color value */ float a; /* alpha color value */ float * x_mesh; float * y_mesh; float * r_mesh; float * b_mesh; float * g_mesh; float * a_mesh; float * value1; float * value2; float * sample_mesh; bool enabled; /* if true then wave is visible, hidden otherwise */ float sample; /* stupid t variables */ float t1; float t2; float t3; float t4; float t5; float t6; float t7; float t8; /* stupider q variables */ float q[NUM_Q_VARIABLES]; float v1,v2; /* Data structures to hold per frame and per point equations */ std::map<std::string,InitCond*> init_cond_tree; std::vector<PerFrameEqn*> per_frame_eqn_tree; std::vector<PerPointEqn*> per_point_eqn_tree; std::map<std::string,InitCond*> per_frame_init_eqn_tree; /* Denotes the index of the last character for each string buffer */ int per_point_eqn_string_index; int per_frame_eqn_string_index; int per_frame_init_eqn_string_index; int add_per_point_eqn(char * name, GenExpr * gen_expr); void evalCustomWaveInitConditions(Preset *preset); void loadUnspecInitConds(); void evalInitConds(); }; #endif /** !_CUSTOM_WAVE_H */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Eval.cpp���������������������������������������0000664�0000000�0000000�00000005121�12660066715�0024213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /* Evaluation Code */ #include <cstdio> #include <cstdlib> #include "../Common.hpp" #include "../fatal.h" #include "Eval.hpp" #include "Expr.hpp" #include "Param.hpp" #include "Func.hpp" #include "../wipemalloc.h" #include "BuiltinFuncs.hpp" InfixOp *Eval::infix_add = NULL; InfixOp *Eval::infix_minus = NULL; InfixOp *Eval::infix_div = NULL; InfixOp *Eval::infix_mult = NULL; InfixOp *Eval::infix_or = NULL; InfixOp *Eval::infix_and = NULL; InfixOp *Eval::infix_mod = NULL; InfixOp *Eval::infix_negative = NULL; InfixOp *Eval::infix_positive = NULL; /* Initializes all infix operators */ int Eval::init_infix_ops() { Eval::infix_add = new InfixOp(INFIX_ADD, 4); Eval::infix_minus = new InfixOp(INFIX_MINUS, 3); Eval::infix_div = new InfixOp(INFIX_DIV, 2); Eval::infix_or = new InfixOp(INFIX_OR, 5); Eval::infix_and = new InfixOp(INFIX_AND,4); Eval::infix_mod = new InfixOp(INFIX_MOD, 1); Eval::infix_mult = new InfixOp(INFIX_MULT, 2); /* Prefix operators */ Eval::infix_positive = new InfixOp(INFIX_ADD, 0); Eval::infix_negative = new InfixOp(INFIX_MINUS, 0); return PROJECTM_SUCCESS; } /* Destroys the infix operator list. This should be done on program exit */ int Eval::destroy_infix_ops() { delete(Eval::infix_add); delete(Eval::infix_minus); delete(Eval::infix_div); delete(Eval::infix_or); delete(Eval::infix_and); delete(Eval::infix_mod); delete(Eval::infix_mult); delete(Eval::infix_positive); delete(Eval::infix_negative); Eval::infix_add = NULL; Eval::infix_minus = NULL; Eval::infix_div = NULL; Eval::infix_or = NULL; Eval::infix_and = NULL; Eval::infix_mod = NULL; Eval::infix_mult = NULL; Eval::infix_positive = NULL; Eval::infix_negative = NULL; return PROJECTM_SUCCESS; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Eval.hpp���������������������������������������0000664�0000000�0000000�00000005217�12660066715�0024226�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Expression evaluators * * $Log$ */ /* Eval.hpp: evaluation functions of expressions */ #ifndef __EVAL_H #define __EVAL_H #include "../fatal.h" //#include "projectM.hpp" #include "Func.hpp" #include "Param.hpp" #define EVAL_DEBUG 0 //#define EVAL_DEBUG_DOUBLE 2 #define VAL_T 1 #define PREFUN_T 3 #define TREE_T 4 #define NONE_T 0 #define CONSTANT_TERM_T 0 #define PARAM_TERM_T 1 #define INFIX_ADD 0 #define INFIX_MINUS 1 #define INFIX_MOD 2 #define INFIX_DIV 3 #define INFIX_MULT 4 #define INFIX_OR 5 #define INFIX_AND 6 class DLLEXPORT InfixOp; class Eval { public: static InfixOp *infix_add, *infix_minus, *infix_div, *infix_mult, *infix_or, *infix_and, *infix_mod, *infix_negative, *infix_positive; float eval_gen_expr(GenExpr * gen_expr); inline GenExpr * opt_gen_expr(GenExpr * gen_expr, int ** param_list); GenExpr * const_to_expr(float val); GenExpr * param_to_expr(Param * param); GenExpr * prefun_to_expr(float (*func_ptr)(), GenExpr ** expr_list, int num_args); static TreeExpr * new_tree_expr(InfixOp * infix_op, GenExpr * gen_expr, TreeExpr * left, TreeExpr * right); static GenExpr * new_gen_expr(int type, void * item); static ValExpr * new_val_expr(int type, Term *term); static InfixOp * new_infix_op(int type, int precedence); static int init_infix_ops(); static int destroy_infix_ops(); void reset_engine_vars(); GenExpr * clone_gen_expr(GenExpr * gen_expr); TreeExpr * clone_tree_expr(TreeExpr * tree_expr); ValExpr * clone_val_expr(ValExpr * val_expr); PrefunExpr * clone_prefun_expr(PrefunExpr * prefun_expr); }; #endif /** !_EVAL_H */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Expr.cpp���������������������������������������0000664�0000000�0000000�00000020305�12660066715�0024243�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include "../wipemalloc.h" #include "Expr.hpp" #include <cassert> #include <iostream> #include "Eval.hpp" float GenExpr::eval_gen_expr ( int mesh_i, int mesh_j ) { float l; if (item == 0) return EVAL_ERROR; switch ( this->type ) { case VAL_T: return ( ( ValExpr* ) item )->eval_val_expr ( mesh_i, mesh_j ); case PREFUN_T: l = ( ( PrefunExpr * ) item )->eval_prefun_expr ( mesh_i, mesh_j ); //if (EVAL_DEBUG) DWRITE( "eval_gen_expr: prefix function return value: %f\n", l); return l; case TREE_T: return ( ( TreeExpr* ) ( item ) )->eval_tree_expr ( mesh_i, mesh_j ); default: return EVAL_ERROR; } } /* Evaluates functions in prefix form */ float PrefunExpr::eval_prefun_expr ( int mesh_i, int mesh_j ) { assert ( func_ptr ); float * arg_list = new float[this->num_args]; assert(arg_list); //printf("numargs %d", num_args); /* Evaluate each argument before calling the function itself */ for ( int i = 0; i < num_args; i++ ) { arg_list[i] = expr_list[i]->eval_gen_expr ( mesh_i, mesh_j ); //printf("numargs %x", arg_list[i]); } /* Now we call the function, passing a list of floats as its argument */ const float value = ( func_ptr ) ( arg_list ); delete[](arg_list); return value; } /* Evaluates a value expression */ float ValExpr::eval_val_expr ( int mesh_i, int mesh_j ) { /* Value is a constant, return the float value */ if ( type == CONSTANT_TERM_T ) { return ( term.constant ); } /* Value is variable, dereference it */ if ( type == PARAM_TERM_T ) { switch ( term.param->type ) { case P_TYPE_BOOL: return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) ); case P_TYPE_INT: return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) ); case P_TYPE_DOUBLE: if ( term.param->matrix_flag | ( term.param->flags & P_FLAG_ALWAYS_MATRIX ) ) { /* Sanity check the matrix is there... */ assert ( term.param->matrix != NULL ); /// @slow boolean check could be expensive in this critical (and common) step of evaluation if ( mesh_i >= 0 ) { if ( mesh_j >= 0 ) { return ( ( ( float** ) term.param->matrix ) [mesh_i][mesh_j] ); } else { return ( ( ( float* ) term.param->matrix ) [mesh_i] ); } } //assert(mesh_i >=0); } //std::cout << term.param->name << ": " << (*((float*)term.param->engine_val)) << std::endl; return * ( ( float* ) ( term.param->engine_val ) ); default: return EVAL_ERROR; } } /* Unknown type, return failure */ return PROJECTM_FAILURE; } /* Evaluates an expression tree */ float TreeExpr::eval_tree_expr ( int mesh_i, int mesh_j ) { float left_arg, right_arg; /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */ if ( infix_op == NULL ) { if ( gen_expr == NULL ) return 0; else return gen_expr->eval_gen_expr ( mesh_i, mesh_j ); } /* Otherwise, this node is an infix operator. Evaluate accordingly */ assert(left); left_arg = left->eval_tree_expr ( mesh_i, mesh_j ); assert(right); right_arg = right->eval_tree_expr ( mesh_i, mesh_j ); switch ( infix_op->type ) { case INFIX_ADD: return ( left_arg + right_arg ); case INFIX_MINUS: return ( left_arg - right_arg ); case INFIX_MULT: return ( left_arg * right_arg ); case INFIX_MOD: if ( ( int ) right_arg == 0 ) { return PROJECTM_DIV_BY_ZERO; } return ( ( int ) left_arg % ( int ) right_arg ); case INFIX_OR: return ( ( int ) left_arg | ( int ) right_arg ); case INFIX_AND: return ( ( int ) left_arg & ( int ) right_arg ); case INFIX_DIV: if ( right_arg == 0 ) { return MAX_DOUBLE_SIZE; } return ( left_arg / right_arg ); default: return EVAL_ERROR; } return EVAL_ERROR; } /* Converts a float value to a general expression */ GenExpr * GenExpr::const_to_expr ( float val ) { GenExpr * gen_expr; ValExpr * val_expr; Term term; term.constant = val; if ( ( val_expr = new ValExpr ( CONSTANT_TERM_T, &term ) ) == NULL ) return NULL; gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr ); if ( gen_expr == NULL ) { delete val_expr; } return gen_expr; } /* Converts a regular parameter to an expression */ GenExpr * GenExpr::param_to_expr ( Param * param ) { GenExpr * gen_expr = NULL; ValExpr * val_expr = NULL; Term term; if ( param == NULL ) return NULL; /* This code is still a work in progress. We need to figure out if the initial condition is used for each per frame equation or not. I am guessing that it isn't, and it is thusly implemented this way */ /* Current guess of true behavior (08/01/03) note from carm First try to use the per_pixel_expr (with cloning) If it is null however, use the engine variable instead. */ /* 08/20/03 : Presets are now objects, as well as per pixel equations. This ends up making the parser handle the case where parameters are essentially per pixel equation substitutions */ term.param = param; if ( ( val_expr = new ValExpr ( PARAM_TERM_T, &term ) ) == NULL ) return NULL; if ( ( gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr ) ) == NULL ) { delete val_expr; return NULL; } return gen_expr; } /* Converts a prefix function to an expression */ GenExpr * GenExpr::prefun_to_expr ( float ( *func_ptr ) ( void * ), GenExpr ** expr_list, int num_args ) { GenExpr * gen_expr; PrefunExpr * prefun_expr; prefun_expr = new PrefunExpr(); if ( prefun_expr == NULL ) return NULL; prefun_expr->num_args = num_args; prefun_expr->func_ptr = ( float ( * ) ( void* ) ) func_ptr; prefun_expr->expr_list = expr_list; gen_expr = new GenExpr ( PREFUN_T, ( void* ) prefun_expr ); if ( gen_expr == NULL ) delete prefun_expr; return gen_expr; } /* Creates a new tree expression */ TreeExpr::TreeExpr ( InfixOp * _infix_op, GenExpr * _gen_expr, TreeExpr * _left, TreeExpr * _right ) : infix_op ( _infix_op ), gen_expr ( _gen_expr ), left ( _left ), right ( _right ) {} /* Creates a new value expression */ ValExpr::ValExpr ( int _type, Term * _term ) :type ( _type ) { //val_expr->type = _type; term.constant = _term->constant; term.param = _term->param; //return val_expr; } /* Creates a new general expression */ GenExpr::GenExpr ( int _type, void * _item ) :type ( _type ), item ( _item ) {} /* Frees a general expression */ GenExpr::~GenExpr() { switch ( type ) { case VAL_T: delete ( ( ValExpr* ) item ); break; case PREFUN_T: delete ( ( PrefunExpr* ) item ); break; case TREE_T: delete ( ( TreeExpr* ) item ); break; } } /* Frees a function in prefix notation */ PrefunExpr::~PrefunExpr() { int i; /* Free every element in expression list */ for ( i = 0 ; i < num_args; i++ ) { delete expr_list[i]; } free ( expr_list ); } /* Frees values of type VARIABLE and CONSTANT */ ValExpr::~ValExpr() {} /* Frees a tree expression */ TreeExpr::~TreeExpr() { /* free left tree */ if ( left != NULL ) { delete left; } /* free general expression object */ if ( gen_expr != NULL ) { delete gen_expr; } /* Note that infix operators are always stored in memory unless the program exits, so we don't remove them here */ /* free right tree */ if ( right != NULL ) { delete right; } } /* Initializes an infix operator */ InfixOp::InfixOp ( int type, int precedence ) { this->type = type; this->precedence = precedence; } PrefunExpr::PrefunExpr() {} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Expr.hpp���������������������������������������0000664�0000000�0000000�00000005131�12660066715�0024250�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Expression * * $Log$ */ #ifndef _EXPR_H #define _EXPR_H #include "../dlldefs.h" #include "CValue.hpp" class Param; #define CONST_STACK_ELEMENT 0 #define EXPR_STACK_ELEMENT 1 #define EVAL_ERROR -1 /* Infix Operator Function */ class InfixOp { public: int type; int precedence; InfixOp( int type, int precedence ); }; /** Term */ class Term { public: float constant; /* static variable */ Param *param; /* pointer to a changing variable */ Term() { this->constant = 0; this->param = 0; } }; /* General Expression Type */ class GenExpr { public: int type; void * item; ~GenExpr(); GenExpr( int type, void *item ); float eval_gen_expr(int mesh_i, int mesh_j); static GenExpr *const_to_expr( float val ); static GenExpr *param_to_expr( Param *param ); static GenExpr *prefun_to_expr( float (*func_ptr)(void *), GenExpr **expr_list, int num_args ); }; /* Value expression, contains a term union */ class ValExpr { public: int type; Term term; ~ValExpr(); ValExpr( int type, Term *term ); float eval_val_expr(int mesh_i, int mesh_j); }; /* A binary expression tree ordered by operator precedence */ class TreeExpr { public: InfixOp * infix_op; /* null if leaf */ GenExpr * gen_expr; TreeExpr *left, *right; ~TreeExpr(); TreeExpr( InfixOp *infix_op, GenExpr *gen_expr, TreeExpr *left, TreeExpr *right ); float eval_tree_expr(int mesh_i, int mesh_j); }; /* A function expression in prefix form */ class PrefunExpr { public: float (*func_ptr)(void*); int num_args; GenExpr **expr_list; PrefunExpr(); ~PrefunExpr(); /* Evaluates functions in prefix form */ float eval_prefun_expr(int mesh_i, int mesh_j); }; #endif /** _EXPR_H */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Func.cpp���������������������������������������0000664�0000000�0000000�00000002363�12660066715�0024224�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /* Function management */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include "../Common.hpp" #include "../fatal.h" #include "Func.hpp" #include <map> Func::Func (const std::string & _name, float (*_func_ptr)(float*), int _num_args): name(_name), func_ptr(_func_ptr), num_args(_num_args) {} /* Frees a function type, real complicated... */ Func::~Func() {} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Func.hpp���������������������������������������0000664�0000000�0000000�00000003220�12660066715�0024222�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Function * * $Log$ */ #ifndef _FUNC_H #define _FUNC_H #include "../Common.hpp" #include <string> /* Function Type */ class DLLEXPORT Func { public: /// Create a new function wrapper object /// \param name a name to uniquely identify the function. /// \param func_ptr a pointer to a function of floating point arguments /// \param num_args the number of floating point arguments this function requires Func(const std::string & name, float (*func_ptr)(float*), int num_args ); /* Public Prototypes */ ~Func(); inline const std::string & getName() const { return name; } inline int getNumArgs() const { return num_args; } float (*func_ptr)(float*); private: std::string name; int num_args; }; #endif /** !_FUNC_H */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/IdlePreset.cpp���������������������������������0000664�0000000�0000000�00000015406�12660066715�0025373�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "IdlePreset.hpp" #include <sstream> #include <string> #include "MilkdropPreset.hpp" const std::string IdlePresets::IDLE_PRESET_NAME ("Geiss & Sperl - Feedback (projectM idle HDR mix).milk"); std::string IdlePresets::presetText() { std::ostringstream out; out << "[preset00]\n" << "fRating=2.000000\n" << "fGammaAdj=1.700000\n" << "fDecay=0.940000\n" << "fVideoEchoZoom=1.000000\n" << "fVideoEchoAlpha=0.000000\n" << "nVideoEchoOrientation=0\n" << "nWaveMode=0\n" << "bAdditiveWaves=1\n" << "bWaveDots=0\n" << "bWaveThick=0\n" << "bModWaveAlphaByVolume=0\n" << "bMaximizeWaveColor=0\n" << "bTexWrap=1\n" << "bDarkenCenter=0\n" << "bRedBlueStereo=0\n" << "bBrighten=0\n" << "bDarken=0\n" << "bSolarize=0\n" << "bInvert=0\n" << "fWaveAlpha=0.001000\n" << "fWaveScale=0.010000\n" << "fWaveSmoothing=0.630000\n" << "fWaveParam=-1.000000\n" << "fModWaveAlphaStart=0.710000\n" << "fModWaveAlphaEnd=1.300000\n" << "fWarpAnimSpeed=1.000000\n" << "fWarpScale=1.331000\n" << "fZoomExponent=1.000000\n" << "fShader=0.000000\n" << "zoom=13.290894\n" << "rot=-0.020000\n" << "cx=0.500000\n" << "cy=0.500000\n" << "dx=-0.280000\n" << "dy=-0.320000\n" << "warp=0.010000\n" << "sx=1.000000\n" << "sy=1.000000\n" << "wave_r=0.650000\n" << "wave_g=0.650000\n" << "wave_b=0.650000\n" << "wave_x=0.500000\n" << "wave_y=0.500000\n" << "ob_size=0.000000\n" << "ob_r=0.010000\n" << "ob_g=0.000000\n" << "ob_b=0.000000\n" << "ob_a=1.000000\n" << "ib_size=0.000000\n" << "ib_r=0.950000\n" << "ib_g=0.850000\n" << "ib_b=0.650000\n" << "ib_a=1.000000\n" << "nMotionVectorsX=64.000000\n" << "nMotionVectorsY=0.000000\n" << "mv_dx=0.000000\n" << "mv_dy=0.000000\n" << "mv_l=0.900000\n" << "mv_r=1.000000\n" << "mv_g=1.000000\n" << "mv_b=1.000000\n" << "mv_a=0.000000\n" << "shapecode_3_enabled=1\n" << "shapecode_3_sides=20\n" << "shapecode_3_additive=0\n" << "shapecode_3_thickOutline=0\n" << "shapecode_3_textured=1\n" << "shapecode_3_ImageURL=M.tga\n" << "shapecode_3_x=0.68\n" << "shapecode_3_y=0.5\n" << "shapecode_3_rad=0.41222\n" << "shapecode_3_ang=0\n" << "shapecode_3_tex_ang=0\n" << "shapecode_3_tex_zoom=0.71\n" << "shapecode_3_r=1\n" << "shapecode_3_g=1\n" << "shapecode_3_b=1\n" << "shapecode_3_a=1\n" << "shapecode_3_r2=1\n" << "shapecode_3_g2=1\n" << "shapecode_3_b2=1\n" << "shapecode_3_a2=1\n" << "shapecode_3_border_r=0\n" << "shapecode_3_border_g=0\n" << "shapecode_3_border_b=0\n" << "shapecode_3_border_a=0\n" << "shape_3_per_frame1=x = x + q1;\n" << "shape_3_per_frame2=y = y + q2;\n" << "shape_3_per_frame3=r =0.5 + 0.5*sin(q8*0.613 + 1);\n" << "shape_3_per_frame4=g = 0.5 + 0.5*sin(q8*0.763 + 2);\n" << "shape_3_per_frame5=b = 0.5 + 0.5*sin(q8*0.771 + 5);\n" << "shape_3_per_frame6=r2 = 0.5 + 0.5*sin(q8*0.635 + 4);\n" << "shape_3_per_frame7=g2 = 0.5 + 0.5*sin(q8*0.616+ 1);\n" << "shape_3_per_frame8=b2 = 0.5 + 0.5*sin(q8*0.538 + 3);\n" << "shapecode_4_enabled=1\n" << "shapecode_4_sides=4\n" << "shapecode_4_additive=0\n" << "shapecode_4_thickOutline=0\n" << "shapecode_4_textured=1\n" << "shapecode_4_ImageURL=headphones.tga\n" << "shapecode_4_x=0.68\n" << "shapecode_4_y=0.58\n" << "shapecode_4_rad=0.6\n" << "shapecode_4_ang=0\n" << "shapecode_4_tex_ang=0\n" << "shapecode_4_tex_zoom=0.71\n" << "shapecode_4_r=1\n" << "shapecode_4_g=1\n" << "shapecode_4_b=1\n" << "shapecode_4_a=1\n" << "shapecode_4_r2=1\n" << "shapecode_4_g2=1\n" << "shapecode_4_b2=1\n" << "shapecode_4_a2=1\n" << "shapecode_4_border_r=0\n" << "shapecode_4_border_g=0\n" << "shapecode_4_border_b=0\n" << "shapecode_4_border_a=0\n" << "shape_4_per_frame1=x = x + q1;\n" << "shape_4_per_frame2=y = y + q2;\n" << "shape_4_per_frame3=rad = rad + bass * 0.1;\n" << "shape_4_per_frame4=a = q3;\n" << "shape_4_per_frame5=a2 = q3;\n" << "shapecode_6_enabled=1\n" << "shapecode_6_sides=4\n" << "shapecode_6_additive=0\n" << "shapecode_6_thickOutline=0\n" << "shapecode_6_textured=1\n" << "shapecode_6_ImageURL=project.tga\n" << "shapecode_6_x=0.38\n" << "shapecode_6_y=0.435\n" << "shapecode_6_rad=0.8\n" << "shapecode_6_ang=0\n" << "shapecode_6_tex_ang=0\n" << "shapecode_6_tex_zoom=0.71\n" << "shapecode_6_r=1\n" << "shapecode_6_g=1\n" << "shapecode_6_b=1\n" << "shapecode_6_a=1\n" << "shapecode_6_r2=1\n" << "shapecode_6_g2=1\n" << "shapecode_6_b2=1\n" << "shapecode_6_a2=1\n" << "shapecode_6_border_r=0\n" << "shapecode_6_border_g=0\n" << "shapecode_6_border_b=0\n" << "shapecode_6_border_a=0\n" << "shape_6_per_frame1=x = x + q1;\n" << "shape_6_per_frame2=y = y + q2;\n" << "shape_6_per_frame3=a = q3;\n" << "shape_6_per_frame4=a2 = q3;\n" << "per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324);\n" << "per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371);\n" << "per_frame_3=ob_b = 0.5+0.4*sin(2.332*time);\n" << "per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424);\n" << "per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871);\n" << "per_frame_6=ib_b = 1-ob_b;\n" << "per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att);\n" << "per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg);\n" << "per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp);\n" << "per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir));\n" << "per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n" << "per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n" << "per_frame_13=xpos = xpos + 0.001*xspeed;\n" << "per_frame_14=dx = xpos*0.05;\n" << "per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg);\n" << "per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp);\n" << "per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir));\n" << "per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n" << "per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n" << "per_frame_20=ypos = ypos + 0.001*yspeed;\n" << "per_frame_21=dy = ypos*0.05;\n" << "per_frame_22=wave_a = 0;\n" << "per_frame_23=q8 = oldq8 + 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n" << "per_frame_24=oldq8 = q8;\n" << "per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n" << "per_frame_26=rot = 0.4 + 1.5*sin(time*0.273) + 0.4*sin(time*0.379+3);\n" << "per_frame_27=q1 = 0.05*sin(time*1.14);\n" << "per_frame_28=q2 = 0.03*sin(time*0.93+2);\n" << "per_frame_29=q3 = if(above(frame,60),1, frame/60.0);\n" << "per_frame_30=oldq8 = if(above(oldq8,1000),0,oldq8);\n" << "per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1;\n"; return out.str(); } std::auto_ptr<Preset> IdlePresets::allocate(const std::string & name, PresetOutputs & presetOutputs) { if (name == IDLE_PRESET_NAME) { std::istringstream in(presetText()); return std::auto_ptr<Preset>(new MilkdropPreset(in, IDLE_PRESET_NAME, presetOutputs)); } else return std::auto_ptr<Preset>(0); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/IdlePreset.hpp���������������������������������0000664�0000000�0000000�00000001215�12660066715�0025371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef IDLE_PRESET_HPP #define IDLE_PRESET_HPP #include <memory> #include <string> class PresetOutputs; class Preset; /// A preset that does not depend on the file system to be loaded. This allows projectM to render /// something (ie. self indulgent project advertising) even when no valid preset directory is found. class IdlePresets { public: /// Allocate a new idle preset instance /// \returns a newly allocated auto pointer of an idle preset instance static std::auto_ptr<Preset> allocate(const std::string & path, PresetOutputs & outputs); private: static std::string presetText(); static const std::string IDLE_PRESET_NAME; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/InitCond.cpp�����������������������������������0000664�0000000�0000000�00000007422�12660066715�0025041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /* Library functions to manipulate initial condition values */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "../Common.hpp" #include "../fatal.h" #include "Expr.hpp" #include "InitCond.hpp" #include "Param.hpp" #include <map> #include "../wipemalloc.h" #include <cassert> #include <iostream> char InitCond::init_cond_string_buffer[STRING_BUFFER_SIZE]; int InitCond::init_cond_string_buffer_index = 0; /* Creates a new initial condition */ InitCond::InitCond( Param * _param, CValue _init_val ):param(_param), init_val(_init_val) { // std::cerr << "InitCond::InitCond: " << this->param->name << std::endl; assert(param); assert(param->engine_val); } /* Frees initial condition structure */ InitCond::~InitCond() {} void InitCond::evaluate() { evaluate(false); } /* Evaluate an initial conditon */ void InitCond::evaluate(bool evalUser) { assert(this); assert(param); if (param->flags & P_FLAG_USERDEF && !evalUser) return; /* Set matrix flag to zero. This ensures its constant value will be used rather than a matrix value */ param->matrix_flag = false; /* Parameter is of boolean type, either true/false */ if (param->type == P_TYPE_BOOL) { // printf( "init_cond: %s = %d (TYPE BOOL)\n", param->name.c_str(), init_val.bool_val); //std::cerr << "[InitCond] param is a boolean of with name " // << param->name << std::endl; assert(param->engine_val); *((bool*)param->engine_val) = init_val.bool_val; return; } /* Parameter is an integer type, just like C */ if ( param->type == P_TYPE_INT) { assert(param->engine_val); *((int*)param->engine_val) = init_val.int_val; return; } /* Parameter is of a float type, just like C */ if (param->type == P_TYPE_DOUBLE) { assert(param->engine_val); *((float*)param->engine_val) = init_val.float_val; return; } /* Unknown type of parameter */ return; } /* WIP */ void InitCond::init_cond_to_string() { int string_length; char string[MAX_TOKEN_SIZE]; /* Create a string "param_name=val" */ switch (param->type) { case P_TYPE_BOOL: sprintf(string, "%s=%d\n", param->name.c_str(), init_val.bool_val); break; case P_TYPE_INT: sprintf(string, "%s=%d\n", param->name.c_str(), init_val.int_val); break; case P_TYPE_DOUBLE: sprintf(string, "%s=%f\n", param->name.c_str(), init_val.float_val); break; default: return; } /* Compute the length of the string */ string_length = strlen(string); /* Buffer overflow check */ if ((init_cond_string_buffer_index + string_length + 1) > (STRING_BUFFER_SIZE - 1)) return; /* Copy the string into the initial condition string buffer */ strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length); /* Increment the string buffer, offset by one for the null terminator, which will be overwritten by the next call to this function */ init_cond_string_buffer_index+= string_length + 1; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/InitCond.hpp�����������������������������������0000775�0000000�0000000�00000002776�12660066715�0025060�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Initial condition * * $Log$ */ #ifndef _INIT_COND_HPP #define _INIT_COND_HPP //#define INIT_COND_DEBUG 2 #define INIT_COND_DEBUG 0 #include "Param.hpp" class InitCond; class Param; #include <map> class InitCond { public: Param *param; CValue init_val; static char init_cond_string_buffer[STRING_BUFFER_SIZE]; static int init_cond_string_buffer_index; InitCond( Param * param, CValue init_val); ~InitCond(); void evaluate(); //Wrapper around following declaration void evaluate(bool evalUser); void init_cond_to_string(); void write_init(); }; #endif /** !_INIT_COND_H */ ��silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/InitCondUtils.hpp������������������������������0000664�0000000�0000000�00000004567�12660066715�0026076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef _INIT_COND_UTILS_HPP #define _INIT_COND_UTILS_HPP #include <map> #include "InitCond.hpp" #include <iostream> #include <stdlib.h> namespace InitCondUtils { class LoadUnspecInitCond { public: LoadUnspecInitCond(std::map<std::string,InitCond*> & initCondTree, std::map<std::string,InitCond*> & perFrameInitEqnTree): m_initCondTree(initCondTree), m_perFrameInitEqnTree(perFrameInitEqnTree) {} void operator()(Param * param); private: std::map<std::string,InitCond*> & m_initCondTree; std::map<std::string,InitCond*> & m_perFrameInitEqnTree; }; inline void LoadUnspecInitCond::operator() (Param * param) { InitCond * init_cond = 0; CValue init_val; assert(param); assert(param->engine_val); /* Don't count these parameters as initial conditions */ if (param->flags & P_FLAG_READONLY) return; if (param->flags & P_FLAG_QVAR) return; // if (param->flags & P_FLAG_TVAR) // return; if (param->flags & P_FLAG_USERDEF) return; /* If initial condition was not defined by the preset file, force a default one with the following code */ if (m_initCondTree.find(param->name) == m_initCondTree.end()) { /* Make sure initial condition does not exist in the set of per frame initial equations */ if (m_perFrameInitEqnTree.find(param->name) != m_perFrameInitEqnTree.end()) return; // Set an initial vialue via correct union member if (param->type == P_TYPE_BOOL) init_val.bool_val = param->default_init_val.bool_val; else if (param->type == P_TYPE_INT) init_val.int_val = param->default_init_val.int_val; else if (param->type == P_TYPE_DOUBLE) { init_val.float_val = param->default_init_val.float_val; } //printf("%s\n", param->name); /* Create new initial condition */ //std::cerr << "[InitCondUtils] creating an unspecified initial condition of name " << param->name << std::endl; if ((init_cond = new InitCond(param, init_val)) == NULL) { abort(); } /* Insert the initial condition into this presets tree */ std::pair<std::map<std::string, InitCond*>::iterator, bool> inserteePair = m_initCondTree.insert(std::make_pair(init_cond->param->name, init_cond)); assert(inserteePair.second); assert(inserteePair.first->second); } else assert(m_initCondTree.find(param->name)->second); } } #endif �����������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/MilkdropPreset.cpp�����������������������������0000664�0000000�0000000�00000034443�12660066715�0026301�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <cstdio> #include <cstring> #include <cstdlib> #ifdef WIN32 #include <dirent-win32/dirent.h> #else #include <dirent.h> #endif /** WIN32 */ #include <time.h> #include "MilkdropPreset.hpp" #include "Parser.hpp" #include "ParamUtils.hpp" #include "InitCondUtils.hpp" #include "../fatal.h" #include <iostream> #include <fstream> #include "PresetFrameIO.hpp" MilkdropPreset::MilkdropPreset(std::istream & in, const std::string & presetName, PresetOutputs & presetOutputs): Preset(presetName), builtinParams(_presetInputs, presetOutputs), _presetOutputs(presetOutputs) { initialize(in); } MilkdropPreset::MilkdropPreset(const std::string & absoluteFilePath, const std::string & presetName, PresetOutputs & presetOutputs): Preset(presetName), builtinParams(_presetInputs, presetOutputs), _absoluteFilePath(absoluteFilePath), _presetOutputs(presetOutputs), _filename(parseFilename(absoluteFilePath)) { initialize(absoluteFilePath); } MilkdropPreset::~MilkdropPreset() { traverse<TraverseFunctors::Delete<InitCond> >(init_cond_tree); traverse<TraverseFunctors::Delete<InitCond> >(per_frame_init_eqn_tree); traverse<TraverseFunctors::Delete<PerPixelEqn> >(per_pixel_eqn_tree); traverseVector<TraverseFunctors::Delete<PerFrameEqn> >(per_frame_eqn_tree); traverse<TraverseFunctors::Delete<Param> >(user_param_tree); /// Testing deletion of render items by the preset. would be nice if it worked, /// and seems to be working if you use a mutex on the preset switching. for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos ) { // __android_log_print(ANDROID_LOG_ERROR, "projectM", "not freeing wave %x", *pos); delete(*pos); } for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos ) { //__android_log_print(ANDROID_LOG_ERROR, "projectM", "not freeing shape %x", *pos); delete(*pos); } customWaves.clear(); customShapes.clear(); presetOutputs().customWaves.clear(); presetOutputs().customShapes.clear(); presetOutputs().drawables.clear(); } /* Adds a per pixel equation according to its string name. This will be used only by the parser */ int MilkdropPreset::add_per_pixel_eqn(char * name, GenExpr * gen_expr) { PerPixelEqn * per_pixel_eqn = NULL; int index; Param * param = NULL; assert(gen_expr); assert(name); if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: per pixel equation (name = \"%s\")\n", name); /* Search for the parameter so we know what matrix the per pixel equation is referencing */ param = ParamUtils::find(name, &this->builtinParams, &this->user_param_tree); if ( !param ) { if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to allocate a new parameter!\n"); return PROJECTM_FAILURE; } index = per_pixel_eqn_tree.size(); /* Create the per pixel equation given the index, parameter, and general expression */ if ((per_pixel_eqn = new PerPixelEqn(index, param, gen_expr)) == NULL) { if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to create new per pixel equation!\n"); return PROJECTM_FAILURE; } /* Insert the per pixel equation into the preset per pixel database */ std::pair<std::map<int, PerPixelEqn*>::iterator, bool> inserteeOption = per_pixel_eqn_tree.insert (std::make_pair(per_pixel_eqn->index, per_pixel_eqn)); if (!inserteeOption.second) { printf("failed to add per pixel eqn!\n"); delete(per_pixel_eqn); return PROJECTM_FAILURE; } /* Done */ return PROJECTM_SUCCESS; } void MilkdropPreset::evalCustomShapeInitConditions() { for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) { assert(*pos); (*pos)->evalInitConds(); } } void MilkdropPreset::evalCustomWaveInitConditions() { for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) { assert(*pos); (*pos)->evalInitConds(); } } void MilkdropPreset::evalCustomWavePerFrameEquations() { for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) { std::map<std::string, InitCond*> & init_cond_tree = (*pos)->init_cond_tree; for (std::map<std::string, InitCond*>::iterator _pos = init_cond_tree.begin(); _pos != init_cond_tree.end(); ++_pos) { assert(_pos->second); _pos->second->evaluate(); } std::vector<PerFrameEqn*> & per_frame_eqn_tree = (*pos)->per_frame_eqn_tree; for (std::vector<PerFrameEqn*>::iterator _pos = per_frame_eqn_tree.begin(); _pos != per_frame_eqn_tree.end(); ++_pos) { (*_pos)->evaluate(); } } } void MilkdropPreset::evalCustomShapePerFrameEquations() { for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) { std::map<std::string, InitCond*> & init_cond_tree = (*pos)->init_cond_tree; for (std::map<std::string, InitCond*>::iterator _pos = init_cond_tree.begin(); _pos != init_cond_tree.end(); ++_pos) { assert(_pos->second); _pos->second->evaluate(); } std::vector<PerFrameEqn*> & per_frame_eqn_tree = (*pos)->per_frame_eqn_tree; for (std::vector<PerFrameEqn*>::iterator _pos = per_frame_eqn_tree.begin(); _pos != per_frame_eqn_tree.end(); ++_pos) { (*_pos)->evaluate(); } } } void MilkdropPreset::evalPerFrameInitEquations() { for (std::map<std::string, InitCond*>::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos) { assert(pos->second); pos->second->evaluate(); } } void MilkdropPreset::evalPerFrameEquations() { for (std::map<std::string, InitCond*>::iterator pos = init_cond_tree.begin(); pos != init_cond_tree.end(); ++pos) { assert(pos->second); pos->second->evaluate(); } for (std::vector<PerFrameEqn*>::iterator pos = per_frame_eqn_tree.begin(); pos != per_frame_eqn_tree.end(); ++pos) { (*pos)->evaluate(); } } void MilkdropPreset::preloadInitialize() { /// @note commented this out because it should be unnecessary // Clear equation trees //init_cond_tree.clear(); //user_param_tree.clear(); //per_frame_eqn_tree.clear(); //per_pixel_eqn_tree.clear(); //per_frame_init_eqn_tree.clear(); } void MilkdropPreset::postloadInitialize() { /* It's kind of ugly to reset these values here. Should definitely be placed in the parser somewhere */ this->per_frame_eqn_count = 0; this->per_frame_init_eqn_count = 0; this->loadBuiltinParamsUnspecInitConds(); this->loadCustomWaveUnspecInitConds(); this->loadCustomShapeUnspecInitConds(); /// @bug are you handling all the q variables conditions? in particular, the un-init case? //m_presetOutputs.q1 = 0; //m_presetOutputs.q2 = 0; //m_presetOutputs.q3 = 0; //m_presetOutputs.q4 = 0; //m_presetOutputs.q5 = 0; //m_presetOutputs.q6 = 0; //m_presetOutputs.q7 = 0; //m_presetOutputs.q8 = 0; } void MilkdropPreset::Render(const BeatDetect &music, const PipelineContext &context) { _presetInputs.update(music, context); evaluateFrame(); pipeline().Render(music, context); } void MilkdropPreset::initialize(const std::string & pathname) { int retval; preloadInitialize(); if (MILKDROP_PRESET_DEBUG) std::cerr << "[Preset] loading file \"" << pathname << "\"..." << std::endl; if ((retval = loadPresetFile(pathname)) < 0) { if (MILKDROP_PRESET_DEBUG) std::cerr << "[Preset] failed to load file \"" << pathname << "\"!" << std::endl; /// @bug how should we handle this problem? a well define exception? throw retval; } postloadInitialize(); } void MilkdropPreset::initialize(std::istream & in) { int retval; preloadInitialize(); if ((retval = readIn(in)) < 0) { if (MILKDROP_PRESET_DEBUG) std::cerr << "[Preset] failed to load from stream " << std::endl; /// @bug how should we handle this problem? a well define exception? throw retval; } postloadInitialize(); } void MilkdropPreset::loadBuiltinParamsUnspecInitConds() { InitCondUtils::LoadUnspecInitCond loadUnspecInitCond(this->init_cond_tree, this->per_frame_init_eqn_tree); this->builtinParams.apply(loadUnspecInitCond); traverse(user_param_tree, loadUnspecInitCond); } void MilkdropPreset::loadCustomWaveUnspecInitConds() { for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) { assert(*pos); (*pos)->loadUnspecInitConds(); } } void MilkdropPreset::loadCustomShapeUnspecInitConds() { for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) { assert(*pos); (*pos)->loadUnspecInitConds(); } } void MilkdropPreset::evaluateFrame() { // Evaluate all equation objects according to milkdrop flow diagram evalPerFrameInitEquations(); evalPerFrameEquations(); // Important step to ensure custom shapes and waves don't stamp on the q variable values // calculated by the per frame (init) and per pixel equations. transfer_q_variables(customWaves); transfer_q_variables(customShapes); initialize_PerPixelMeshes(); evalPerPixelEqns(); evalCustomWaveInitConditions(); evalCustomWavePerFrameEquations(); evalCustomShapeInitConditions(); evalCustomShapePerFrameEquations(); // Setup pointers of the custom waves and shapes to the preset outputs instance /// @slow an extra O(N) per frame, could do this during eval _presetOutputs.customWaves = PresetOutputs::cwave_container(customWaves); _presetOutputs.customShapes = PresetOutputs::cshape_container(customShapes); } void MilkdropPreset::initialize_PerPixelMeshes() { int x,y; for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.cx_mesh[x][y]=presetOutputs().cx; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.cy_mesh[x][y]=presetOutputs().cy; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.sx_mesh[x][y]=presetOutputs().sx; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.sy_mesh[x][y]=presetOutputs().sy; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.dx_mesh[x][y]=presetOutputs().dx; }} //std::cout<<presetOutputs().cx<<","<<presetOutputs().cy<<" "<<presetOutputs().dx<<","<<presetOutputs().dy<<std::endl; for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.dy_mesh[x][y]=presetOutputs().dy; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.zoom_mesh[x][y]=presetOutputs().zoom; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.zoomexp_mesh[x][y]=presetOutputs().zoomexp; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.rot_mesh[x][y]=presetOutputs().rot; }} for (x=0;x<presetInputs().gx;x++){ for(y=0;y<presetInputs().gy;y++){ _presetOutputs.warp_mesh[x][y]=presetOutputs().warp; }} } // Evaluates all per-pixel equations void MilkdropPreset::evalPerPixelEqns() { /* Evaluate all per pixel equations in the tree datastructure */ for (int mesh_x = 0; mesh_x < presetInputs().gx; mesh_x++) for (int mesh_y = 0; mesh_y < presetInputs().gy; mesh_y++) for (std::map<int, PerPixelEqn*>::iterator pos = per_pixel_eqn_tree.begin(); pos != per_pixel_eqn_tree.end(); ++pos) pos->second->evaluate(mesh_x, mesh_y); } int MilkdropPreset::readIn(std::istream & fs) { line_mode_t line_mode; presetOutputs().compositeShader.programSource.clear(); presetOutputs().warpShader.programSource.clear(); /* Parse any comments */ if (Parser::parse_top_comment(fs) < 0) { if (MILKDROP_PRESET_DEBUG) std::cerr << "[Preset::readIn] no left bracket found..." << std::endl; return PROJECTM_FAILURE; } /* Parse the preset name and a left bracket */ char tmp_name[MAX_TOKEN_SIZE]; if (Parser::parse_preset_name(fs, tmp_name) < 0) { std::cerr << "[Preset::readIn] loading of preset name failed" << std::endl; return PROJECTM_ERROR; } /// @note We ignore the preset name because [preset00] is just not so useful // Loop through each line in file, trying to successfully parse the file. // If a line does not parse correctly, keep trucking along to next line. int retval; while ((retval = Parser::parse_line(fs, this)) != EOF) { if (retval == PROJECTM_PARSE_ERROR) { line_mode = UNSET_LINE_MODE; // std::cerr << "[Preset::readIn()] parse error in file \"" << this->absoluteFilePath() << "\"" << std::endl; } } // std::cerr << "loadPresetFile: finished line parsing successfully" << std::endl; /* Now the preset has been loaded. Evaluation calls can be made at appropiate times in the frame loop */ return PROJECTM_SUCCESS; } /* loadPresetFile: private function that loads a specific preset denoted by the given pathname */ int MilkdropPreset::loadPresetFile(const std::string & pathname) { /* Open the file corresponding to pathname */ std::ifstream fs(pathname.c_str()); if (!fs || fs.eof()) { if (MILKDROP_PRESET_DEBUG) std::cerr << "loadPresetFile: loading of file \"" << pathname << "\" failed!\n"; return PROJECTM_ERROR; } return readIn(fs); } const std::string & MilkdropPreset::name() const { return filename(); //return name().empty() ? filename() : name(); // EDIT BY SJ - this would be a recursive call otherwise?! } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/MilkdropPreset.hpp�����������������������������0000664�0000000�0000000�00000015576�12660066715�0026314�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * MilkdropPreset * * $Log$ */ #ifndef _MilkdropPreset_HPP #define _MilkdropPreset_HPP #include "../Common.hpp" #include <string> #include <cassert> #include <map> #define MILKDROP_PRESET_DEBUG 0 /* 0 for no debugging, 1 for normal, 2 for insane */ #include "CustomShape.hpp" #include "CustomWave.hpp" #include "Expr.hpp" #include "PerPixelEqn.hpp" #include "PerFrameEqn.hpp" #include "BuiltinParams.hpp" #include "PresetFrameIO.hpp" #include "InitCond.hpp" #include "../Preset.hpp" class CustomWave; class CustomShape; class InitCond; class MilkdropPreset : public Preset { public: /// Load a MilkdropPreset by filename with input and output buffers specified. /// \param absoluteFilePath the absolute file path of a MilkdropPreset to load from the file system /// \param MilkdropPresetName a descriptive name for the MilkdropPreset. Usually just the file name /// \param MilkdropPresetInputs a reference to read only projectM engine variables /// \param MilkdropPresetOutputs initialized and filled with data parsed from a MilkdropPreset MilkdropPreset(const std::string & absoluteFilePath, const std::string & milkdropPresetName, PresetOutputs & presetOutputs); /// Load a MilkdropPreset from an input stream with input and output buffers specified. /// \param in an already initialized input stream to read the MilkdropPreset file from /// \param MilkdropPresetName a descriptive name for the MilkdropPreset. Usually just the file name /// \param MilkdropPresetInputs a reference to read only projectM engine variables /// \param MilkdropPresetOutputs initialized and filled with data parsed from a MilkdropPreset MilkdropPreset(std::istream & in, const std::string & milkdropPresetName, PresetOutputs & presetOutputs); ~MilkdropPreset(); /// All "builtin" parameters for this MilkdropPreset. Anything *but* user defined parameters and /// custom waves / shapes objects go here. /// @bug encapsulate BuiltinParams builtinParams; /// Used by parser to find/create custom waves and shapes. May be refactored template <class CustomObject> static CustomObject * find_custom_object(int id, std::vector<CustomObject*> & customObjects); int per_pixel_eqn_string_index; int per_frame_eqn_string_index; int per_frame_init_eqn_string_index; int per_frame_eqn_count, per_frame_init_eqn_count; /// Used by parser /// @bug refactor int add_per_pixel_eqn( char *name, GenExpr *gen_expr ); /// Accessor method to retrieve the absolute file path of the loaded MilkdropPreset /// \returns a file path string std::string absoluteFilePath() const { return _absoluteFilePath; } /// Accessor method for the MilkdropPreset outputs instance associated with this MilkdropPreset /// \returns A MilkdropPreset output instance with values computed from most recent evaluateFrame() PresetOutputs & presetOutputs() const { return _presetOutputs; } const PresetInputs & presetInputs() const { return _presetInputs; } // @bug encapsulate PresetOutputs::cwave_container customWaves; PresetOutputs::cshape_container customShapes; /// @bug encapsulate /* Data structures that contain equation and initial condition information */ std::vector<PerFrameEqn*> per_frame_eqn_tree; /* per frame equations */ std::map<int, PerPixelEqn*> per_pixel_eqn_tree; /* per pixel equation tree */ std::map<std::string,InitCond*> per_frame_init_eqn_tree; /* per frame initial equations */ std::map<std::string,InitCond*> init_cond_tree; /* initial conditions */ std::map<std::string,Param*> user_param_tree; /* user parameter splay tree */ PresetOutputs & pipeline() { return _presetOutputs; } void Render(const BeatDetect &music, const PipelineContext &context); const std::string & name() const; const std::string & filename() const { return _filename; } private: std::string _filename; PresetInputs _presetInputs; /// Evaluates the MilkdropPreset for a frame given the current values of MilkdropPreset inputs / outputs /// All calculated values are stored in the associated MilkdropPreset outputs instance void evaluateFrame(); // The absolute file path of the MilkdropPreset std::string _absoluteFilePath; // The absolute path of the MilkdropPreset std::string _absolutePath; void initialize(const std::string & pathname); void initialize(std::istream & in); int loadPresetFile(const std::string & pathname); void loadBuiltinParamsUnspecInitConds(); void loadCustomWaveUnspecInitConds(); void loadCustomShapeUnspecInitConds(); void evalCustomWavePerFrameEquations(); void evalCustomShapePerFrameEquations(); void evalPerFrameInitEquations(); void evalCustomWaveInitConditions(); void evalCustomShapeInitConditions(); void evalPerPixelEqns(); void evalPerFrameEquations(); void initialize_PerPixelMeshes(); int readIn(std::istream & fs); void preloadInitialize(); void postloadInitialize(); PresetOutputs & _presetOutputs; template <class CustomObject> void transfer_q_variables(std::vector<CustomObject*> & customObjects); }; template <class CustomObject> void MilkdropPreset::transfer_q_variables(std::vector<CustomObject*> & customObjects) { CustomObject * custom_object; for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) { custom_object = *pos; for (unsigned int i = 0; i < NUM_Q_VARIABLES; i++) custom_object->q[i] = _presetOutputs.q[i]; } } template <class CustomObject> CustomObject * MilkdropPreset::find_custom_object(int id, std::vector<CustomObject*> & customObjects) { CustomObject * custom_object = NULL; for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) { if ((*pos)->id == id) { custom_object = *pos; break; } } if (custom_object == NULL) { if ((custom_object = new CustomObject(id)) == NULL) { return NULL; } customObjects.push_back(custom_object); } assert(custom_object); return custom_object; } #endif /** !_MilkdropPreset_HPP */ ����������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/MilkdropPresetFactory.cpp����������������������0000664�0000000�0000000�00000014357�12660066715�0027633�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Implementation: MilkdropPresetFactory // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // // #include "MilkdropPresetFactory.hpp" #include "MilkdropPreset.hpp" #include "BuiltinFuncs.hpp" #include "Eval.hpp" #include "IdlePreset.hpp" #include "PresetFrameIO.hpp" MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy): _usePresetOutputs(false) { /* Initializes the builtin function database */ BuiltinFuncs::init_builtin_func_db(); /* Initializes all infix operators */ Eval::init_infix_ops(); _presetOutputs = createPresetOutputs(gx,gy); _presetOutputs2 = createPresetOutputs(gx, gy); } MilkdropPresetFactory::~MilkdropPresetFactory() { std::cerr << "[~MilkdropPresetFactory] destroy infix ops" << std::endl; Eval::destroy_infix_ops(); std::cerr << "[~MilkdropPresetFactory] destroy builtin func" << std::endl; BuiltinFuncs::destroy_builtin_func_db(); std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl; delete(_presetOutputs); delete(_presetOutputs2); std::cerr << "[~MilkdropPresetFactory] done" << std::endl; } /* Reinitializes the engine variables to a default (conservative and sane) value */ void resetPresetOutputs(PresetOutputs * presetOutputs) { presetOutputs->zoom=1.0; presetOutputs->zoomexp = 1.0; presetOutputs->rot= 0.0; presetOutputs->warp= 0.0; presetOutputs->sx= 1.0; presetOutputs->sy= 1.0; presetOutputs->dx= 0.0; presetOutputs->dy= 0.0; presetOutputs->cx= 0.5; presetOutputs->cy= 0.5; presetOutputs->screenDecay=.98; presetOutputs->wave.r= 1.0; presetOutputs->wave.g= 0.2; presetOutputs->wave.b= 0.0; presetOutputs->wave.x= 0.5; presetOutputs->wave.y= 0.5; presetOutputs->wave.mystery= 0.0; presetOutputs->border.outer_size= 0.0; presetOutputs->border.outer_r= 0.0; presetOutputs->border.outer_g= 0.0; presetOutputs->border.outer_b= 0.0; presetOutputs->border.outer_a= 0.0; presetOutputs->border.inner_size = 0.0; presetOutputs->border.inner_r = 0.0; presetOutputs->border.inner_g = 0.0; presetOutputs->border.inner_b = 0.0; presetOutputs->border.inner_a = 0.0; presetOutputs->mv.a = 0.0; presetOutputs->mv.r = 0.0; presetOutputs->mv.g = 0.0; presetOutputs->mv.b = 0.0; presetOutputs->mv.length = 1.0; presetOutputs->mv.x_num = 16.0; presetOutputs->mv.y_num = 12.0; presetOutputs->mv.x_offset = 0.02; presetOutputs->mv.y_offset = 0.02; /* PER_FRAME CONSTANTS END */ presetOutputs->fRating = 0; presetOutputs->fGammaAdj = 1.0; presetOutputs->videoEcho.zoom = 1.0; presetOutputs->videoEcho.a = 0; presetOutputs->videoEcho.orientation = Normal; presetOutputs->wave.additive = false; presetOutputs->wave.dots = false; presetOutputs->wave.thick = false; presetOutputs->wave.modulateAlphaByVolume = 0; presetOutputs->wave.maximizeColors = 0; presetOutputs->textureWrap = 0; presetOutputs->bDarkenCenter = 0; presetOutputs->bRedBlueStereo = 0; presetOutputs->bBrighten = 0; presetOutputs->bDarken = 0; presetOutputs->bSolarize = 0; presetOutputs->bInvert = 0; presetOutputs->bMotionVectorsOn = 1; presetOutputs->wave.a =1.0; presetOutputs->wave.scale = 1.0; presetOutputs->wave.smoothing = 0; presetOutputs->wave.mystery = 0; presetOutputs->wave.modOpacityEnd = 0; presetOutputs->wave.modOpacityStart = 0; presetOutputs->fWarpAnimSpeed = 0; presetOutputs->fWarpScale = 0; presetOutputs->fShader = 0; /* PER_PIXEL CONSTANT END */ /* Q VARIABLES START */ for (int i = 0;i< 32;i++) presetOutputs->q[i] = 0; // for ( std::vector<CustomWave*>::iterator pos = presetOutputs->customWaves.begin(); // pos != presetOutputs->customWaves.end(); ++pos ) // if ( *pos != 0 ) delete ( *pos ); // for ( std::vector<CustomShape*>::iterator pos = presetOutputs->customShapes.begin(); // pos != presetOutputs->customShapes.end(); ++pos ) // if ( *pos != 0 ) delete ( *pos ); presetOutputs->customWaves.clear(); presetOutputs->customShapes.clear(); /* Q VARIABLES END */ } /* Reinitializes the engine variables to a default (conservative and sane) value */ void MilkdropPresetFactory::reset() { resetPresetOutputs(_presetOutputs); resetPresetOutputs(_presetOutputs2); } PresetOutputs* MilkdropPresetFactory::createPresetOutputs(int gx, int gy) { PresetOutputs *presetOutputs = new PresetOutputs(); presetOutputs->Initialize(gx,gy); /* PER FRAME CONSTANTS BEGIN */ presetOutputs->zoom=1.0; presetOutputs->zoomexp = 1.0; presetOutputs->rot= 0.0; presetOutputs->warp= 0.0; presetOutputs->sx= 1.0; presetOutputs->sy= 1.0; presetOutputs->dx= 0.0; presetOutputs->dy= 0.0; presetOutputs->cx= 0.5; presetOutputs->cy= 0.5; presetOutputs->screenDecay=.98; //_presetInputs.meshx = 0; //_presetInputs.meshy = 0; /* PER_FRAME CONSTANTS END */ presetOutputs->fRating = 0; presetOutputs->fGammaAdj = 1.0; presetOutputs->videoEcho.zoom = 1.0; presetOutputs->videoEcho.a = 0; presetOutputs->videoEcho.orientation = Normal; presetOutputs->textureWrap = 0; presetOutputs->bDarkenCenter = 0; presetOutputs->bRedBlueStereo = 0; presetOutputs->bBrighten = 0; presetOutputs->bDarken = 0; presetOutputs->bSolarize = 0; presetOutputs->bInvert = 0; presetOutputs->bMotionVectorsOn = 1; presetOutputs->fWarpAnimSpeed = 0; presetOutputs->fWarpScale = 0; presetOutputs->fShader = 0; /* PER_PIXEL CONSTANTS BEGIN */ /* PER_PIXEL CONSTANT END */ /* Q AND T VARIABLES START */ for (int i = 0;i<NUM_Q_VARIABLES;i++) presetOutputs->q[i] = 0; /* Q AND T VARIABLES END */ return presetOutputs; } std::auto_ptr<Preset> MilkdropPresetFactory::allocate(const std::string & url, const std::string & name, const std::string & author) { PresetOutputs *presetOutputs = _usePresetOutputs ? _presetOutputs : _presetOutputs2; _usePresetOutputs = !_usePresetOutputs; resetPresetOutputs(presetOutputs); std::string path; if (PresetFactory::protocol(url, path) == PresetFactory::IDLE_PRESET_PROTOCOL) { return IdlePresets::allocate(path, *presetOutputs); } else return std::auto_ptr<Preset>(new MilkdropPreset(url, name, *presetOutputs)); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/MilkdropPresetFactory.hpp����������������������0000664�0000000�0000000�00000001722�12660066715�0027630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Interface: MilkdropPresetFactory // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef __MILKDROP_PRESET_FACTORY_HPP #define __MILKDROP_PRESET_FACTORY_HPP #include <memory> #include "../PresetFactory.hpp" class DLLEXPORT PresetOutputs; class DLLEXPORT PresetInputs; class MilkdropPresetFactory : public PresetFactory { public: MilkdropPresetFactory(int gx, int gy); virtual ~MilkdropPresetFactory(); std::auto_ptr<Preset> allocate(const std::string & url, const std::string & name = std::string(), const std::string & author = std::string()); std::string supportedExtensions() const { return "milk prjm"; } private: static PresetOutputs* createPresetOutputs(int gx, int gy); void reset(); PresetOutputs * _presetOutputs; PresetOutputs * _presetOutputs2; bool _usePresetOutputs; //PresetInputs _presetInputs; }; #endif ����������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Param.cpp��������������������������������������0000664�0000000�0000000�00000011777�12660066715�0024402�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /* Basic Parameter Functions */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "../fatal.h" #include "../Common.hpp" #include "CustomShape.hpp" #include "Eval.hpp" #include "Expr.hpp" #include "InitCond.hpp" #include "Param.hpp" #include "../Preset.hpp" #include <map> #include <iostream> #include <cassert> /** Constructor */ Param::Param( std::string _name, short int _type, short int _flags, void * _engine_val, void * _matrix, CValue _default_init_val, CValue _upper_bound, CValue _lower_bound): name(_name), type(_type), flags (_flags), matrix_flag (0), engine_val(_engine_val), matrix (_matrix), default_init_val (_default_init_val), upper_bound (_upper_bound), lower_bound (_lower_bound) { } /* Creates a user defined parameter */ Param::Param(std::string _name) : name(_name), type(P_TYPE_DOUBLE), flags(P_FLAG_USERDEF), matrix_flag(0), matrix(0) { engine_val = new float(); default_init_val.float_val = DEFAULT_DOUBLE_IV; upper_bound.float_val = DEFAULT_DOUBLE_UB; lower_bound.float_val = DEFAULT_DOUBLE_LB; /// @note may have fixed a recent bug. testing *((float*)engine_val) = default_init_val.float_val; } /* Free's a parameter type */ Param::~Param() { // I hate this, but will let it be for now if (flags & P_FLAG_USERDEF) { delete((double*)engine_val); } if (PARAM_DEBUG) printf("~Param: freeing \"%s\".\n", name.c_str()); } /* Returns nonzero if the string is valid parameter name */ bool Param::is_valid_param_string( const char * string ) { if (string == NULL) return false; /* This ensures the first character is non numeric */ if ( ((*string) >= 48) && ((*string) <= 57)) return false; /* These probably should never happen */ if (*string == '.') return false; if (*string == '+') return false; if (*string == '-') return false; /* Could also add checks for other symbols. May do later */ return true; } /* Loads a float parameter into the builtin database */ Param * Param::new_param_float(const char * name, short int flags, void * engine_val, void * matrix, float upper_bound, float lower_bound, float init_val) { Param * param; CValue iv, ub, lb; assert(engine_val); iv.float_val = init_val; ub.float_val = upper_bound; lb.float_val = lower_bound; if ((param = new Param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL) return NULL; /* Finished, return success */ return param; } /* Creates a new parameter of type int */ Param * Param::new_param_int(const char * name, short int flags, void * engine_val, int upper_bound, int lower_bound, int init_val) { Param * param; CValue iv, ub, lb; assert(engine_val); iv.int_val = init_val; ub.int_val = upper_bound; lb.int_val = lower_bound; if ((param = new Param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL) return NULL; /* Finished, return success */ return param; } /* Creates a new parameter of type bool */ Param * Param::new_param_bool(const char * name, short int flags, void * engine_val, bool upper_bound, bool lower_bound, bool init_val) { Param * param; CValue iv, ub, lb; assert(engine_val); iv.bool_val = init_val; ub.bool_val = upper_bound; lb.bool_val = lower_bound; if ((param = new Param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL) return NULL; /* Finished, return success */ return param; } /* Creates a new parameter of type string */ Param * Param::new_param_string(const char * name, short int flags, void * engine_val) { Param * param; CValue iv, ub, lb; assert(engine_val); iv.bool_val = 0; ub.bool_val = 0; lb.bool_val = 0; if ((param = new Param(name, P_TYPE_STRING, flags, engine_val, NULL, iv, ub, lb)) == NULL) return NULL; /* Finished, return success */ return param; } �silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Param.hpp��������������������������������������0000664�0000000�0000000�00000011143�12660066715�0024372�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Parameter used within a preset * * $Log$ */ #ifndef _PARAM_H #define _PARAM_H /* Debug level, zero for none */ #define PARAM_DEBUG 0 #define P_CREATE 1 #define P_NONE 0 #define P_TYPE_BOOL 0 #define P_TYPE_INT 1 #define P_TYPE_DOUBLE 2 #define P_TYPE_STRING 3 #define P_FLAG_NONE 0 #define P_FLAG_READONLY 1 #define P_FLAG_USERDEF (1 << 1) #define P_FLAG_QVAR (1 << 2) #define P_FLAG_TVAR (1 << 3) #define P_FLAG_ALWAYS_MATRIX (1 << 4) #define P_FLAG_PER_PIXEL (1 << 6) #define P_FLAG_PER_POINT (1 << 7) #include "Expr.hpp" #include "../Common.hpp" #include <cmath> #include <string> class InitCond; class Param; class Preset; //#include <map> /* Parameter Type */ class Param { public: std::string name; /* name of the parameter, not necessary but useful neverthless */ short int type; /* parameter number type (int, bool, or float) */ short int flags; /* read, write, user defined, etc */ short int matrix_flag; /* for optimization purposes */ void * engine_val; /* pointer to the engine variable */ void * matrix; /* per pixel / per point matrix for this variable */ CValue default_init_val; /* a default initial condition value */ CValue upper_bound; /* this parameter's upper bound */ CValue lower_bound; /* this parameter's lower bound */ /// Create a new parameter Param(std::string name, short int type, short int flags, void * eqn_val, void *matrix, CValue default_init_val, CValue upper_bound, CValue lower_bound); ~Param(); /// Create a user defined floating point parameter Param( std::string name ); static bool is_valid_param_string( const char *string ); void set_param( float val ); static Param *new_param_float( const char *name, short int flags, void *engine_val, void *matrix, float upper_bound, float lower_bound, float init_val ); static Param *new_param_double(const char *name, short int flags, void *engine_val, void *matrix, double upper_bound, double lower_bound, double init_val ); static Param * new_param_int(const char * name, short int flags, void * engine_val, int upper_bound, int lower_bound, int init_val ); static Param * new_param_bool(const char * name, short int flags, void * engine_val, bool upper_bound, bool lower_bound, bool init_val ); static Param * new_param_string(const char * name, short int flags, void * engine_val); }; /* Sets the parameter engine value to value val. clipping occurs if necessary */ inline void Param::set_param( float val) { switch (type) { case P_TYPE_BOOL: if (val < 0) *((bool*)engine_val) = false; else if (val > 0) *((bool*)engine_val) = true; else *((bool*)engine_val) = false; break; case P_TYPE_INT: /* Make sure value is an integer */ val = floor(val); if (val < lower_bound.int_val) *((int*)engine_val) = lower_bound.int_val; else if (val > upper_bound.int_val) *((int*)engine_val) = upper_bound.int_val; else *((int*)engine_val) = (int)val; break; case P_TYPE_DOUBLE: /* Make sure value is an integer */ if (val < lower_bound.float_val) *((float*)engine_val) = lower_bound.float_val; else if (val > upper_bound.float_val) *((float*)engine_val) = upper_bound.float_val; else *((float*)engine_val) = val; break; default: //abort(); break; } return; } #endif /** !_PARAM_TYPES_H */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/ParamUtils.hpp���������������������������������0000664�0000000�0000000�00000003767�12660066715�0025430�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** ParamUtils.hpp: * A collection of utility functions to make using parameter types easier. * In reality, this stuff belongs elsewhere, but one step at a time */ #ifndef _PARAM_UTILS_HPP #define _PARAM_UTILS_HPP #include "Param.hpp" #include <map> #include <cassert> #include "BuiltinParams.hpp" class ParamUtils { public: static bool insert(Param * param, std::map<std::string,Param*> * paramTree) { assert(param); assert(paramTree); return ((paramTree->insert(std::make_pair(param->name,param))).second); } static const int AUTO_CREATE = 1; static const int NO_CREATE = 0; template <int FLAGS> static Param * find(std::string name, std::map<std::string,Param*> * paramTree) { assert(paramTree); Param * param; /* First look in the suggested database */ std::map<std::string,Param*>::iterator pos = paramTree->find(name); if ((FLAGS == AUTO_CREATE) && ((pos == paramTree->end()))) { /* Check if string is valid */ if (!Param::is_valid_param_string(name.c_str())) return NULL; /* Now, create the user defined parameter given the passed name */ if ((param = new Param(name)) == NULL) return NULL; /* Finally, insert the new parameter into this preset's parameter tree */ std::pair<std::map<std::string,Param*>::iterator, bool> insertRetPair = paramTree->insert(std::make_pair(param->name, param)); assert(insertRetPair.second); } else if (pos != paramTree->end()) param = pos->second; else param = NULL; /* Return the found (or created) parameter. Note that this could be null */ return param; } static Param * find(const std::string & name, BuiltinParams * builtinParams, std::map<std::string,Param*> * insertionTree) { Param * param; // Check first db if ((param = builtinParams->find_builtin_param(name)) != 0) return param; // Check second db, create if necessary return find<AUTO_CREATE>(name, insertionTree); } }; #endif ���������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Parser.cpp�������������������������������������0000664�0000000�0000000�00000216240�12660066715�0024566�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /* parser.c */ #include <stdio.h> #include <string> #include <cstring> #include <iostream> #include <stdlib.h> #include "../Common.hpp" #include "../fatal.h" #include "CustomWave.hpp" #include "CustomShape.hpp" #include "Expr.hpp" #include "Eval.hpp" #include "Func.hpp" #include "InitCond.hpp" #include "Param.hpp" #include "Parser.hpp" #include "PerFrameEqn.hpp" #include "PerPixelEqn.hpp" #include <map> #include "ParamUtils.hpp" #include "../wipemalloc.h" #include <iostream> #include <sstream> #include "BuiltinFuncs.hpp" /* Grabs the next token from the file. The second argument points to the raw string */ line_mode_t Parser::line_mode; CustomWave *Parser::current_wave; CustomShape *Parser::current_shape; int Parser::string_line_buffer_index; char Parser::string_line_buffer[STRING_LINE_SIZE]; unsigned int Parser::line_count; int Parser::per_frame_eqn_count; int Parser::per_frame_init_eqn_count; int Parser::last_custom_wave_id; int Parser::last_custom_shape_id; char Parser::last_eqn_type[MAX_TOKEN_SIZE]; int Parser::last_token_size; std::string Parser::lastLinePrefix(""); bool Parser::tokenWrapAroundEnabled(false); sj_token_t Parser::parseToken(std::istream & fs, char * string) { int c; int i; if (string != NULL) memset(string, 0, MAX_TOKEN_SIZE); /* Loop until a delimiter is found, or the maximum string size is found */ for (i = 0; i < MAX_TOKEN_SIZE;i++) { //c = fgetc(fs); if (!fs || fs.eof()) c = EOF; else c = fs.get(); last_token_size++; /* If the string line buffer is full, quit */ if (string_line_buffer_index == (STRING_LINE_SIZE - 1)) return tStringBufferFilled; /* Otherwise add this character to the string line buffer */ string_line_buffer[string_line_buffer_index++] = tolower(c); /* Now interpret the character */ switch (c) { case '+': return tPlus; case '-': return tMinus; case '%': return tMod; case '/': /* check for line comment here */ if (!fs || fs.eof()) c = EOF; else c = fs.get(); if (c == '/') { while (true) { if (!fs || fs.eof()) c = EOF; else c = fs.get(); if (c == EOF) { line_mode = UNSET_LINE_MODE; return tEOF; } if (c == '\n') { line_mode = UNSET_LINE_MODE; return tEOL; } } } /* Otherwise, just a regular division operator */ fs.unget(); return tDiv; case '*': return tMult; case '|': return tOr; case '&': return tAnd; case '(': return tLPr; case ')': return tRPr; case '[': return tLBr; case ']': return tRBr; case '=': return tEq; case '\n': line_count++; /// @note important hack implemented here to handle "wrap around tokens" // In particular: "per_frame_1=x=t+1.\nper_frame_2=37 + 5;" implies // "per_frame_1=x=t+1.37 + 5;". Thus, we have a global flag to determine // if "token wrap mode" is enabled. If so, we consider a token *continuing* // to the next line, but only attaching to the token buffer anything following // the first equals sign on that line. // // We can safely assume the next line must be part of the token if we allow the // semi colon to be a guaranteed delimiter in the grammar for all equation-based lines. // This IS NO LONGER assumed here. Instead, we check if the next line prefix // matches with the previous line prefix. If it passes a simple comparison, we wrap around. if (tokenWrapAroundEnabled) { std::ostringstream buffer; if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl; while (c != '=') { if (!fs || fs.eof()) { line_count = 1; line_mode = UNSET_LINE_MODE; if (PARSE_DEBUG) std::cerr << "token wrap: end of file" << std::endl; return tEOF; } else { c = fs.get(); if ( c != '=') buffer << (char)c; } } if (PARSE_DEBUG) std::cerr << "parseToken: parsed away equal sign, line prefix is \"" << buffer.str() << "\"" << std::endl; --i; if (!wrapsToNextLine(buffer.str())) { tokenWrapAroundEnabled = false; int buf_size = (int)buffer.str().length(); // <= to also remove equal sign parsing from stream for (int k = 0; k <= buf_size; k++) { if (fs) fs.unget(); else abort(); } return tEOL; } break; } line_mode = UNSET_LINE_MODE; return tEOL; case ',': return tComma; case ';': tokenWrapAroundEnabled = false; if (PARSE_DEBUG) std::cerr << "token wrap around = false (LINE " << line_count << ")" << std::endl; return tSemiColon; case ' ': /* space, skip the character */ i--; break; case EOF: line_count = 1; line_mode = UNSET_LINE_MODE; return tEOF; case '\r': i--; break; default: if (c == EOF) std::cerr << "shouldn't happen: " << c << "(LINE " << line_count << ")" << std::endl; string[i] = tolower(c); //string[i+1] = 0; //std::cerr << "string is \n\"" << string << "\"" << std::endl; } } /* String reached maximum length, return special token error */ return tStringTooLong; } /* Parse input in the form of "exp, exp, exp, ...)" Returns a general expression list */ GenExpr **Parser::parse_prefix_args(std::istream & fs, int num_args, MilkdropPreset * preset) { int i, j; GenExpr ** expr_list; /* List of arguments to function */ GenExpr * gen_expr; /* Malloc the expression list */ expr_list = (GenExpr**)wipemalloc(sizeof(GenExpr*)*num_args); /* Malloc failed */ if (expr_list == NULL) return NULL; i = 0; while (i < num_args) { //if (PARSE_DEBUG) printf("parse_prefix_args: parsing argument %d...\n", i+1); /* Parse the ith expression in the list */ if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { //if (PARSE_DEBUG) printf("parse_prefix_args: failed to get parameter # %d for function (LINE %d)\n", i+1, line_count); for (j = 0; j < i; j++) delete expr_list[j]; free(expr_list); expr_list = NULL; return NULL; } /* Assign entry in expression list */ expr_list[i++] = gen_expr; } //if (PARSE_DEBUG) printf("parse_prefix_args: finished parsing %d arguments (LINE %d)\n", num_args, line_count); /* Finally, return the resulting expression list */ return expr_list; } /* Parses a comment at the top of the file. Stops when left bracket is found */ int Parser::parse_top_comment(std::istream & fs) { char string[MAX_TOKEN_SIZE]; sj_token_t token; /* Process tokens until left bracket is found */ while ((token = parseToken(fs, string)) != tLBr) { if (token == tEOF) return PROJECTM_PARSE_ERROR; } /* Done, return success */ return PROJECTM_SUCCESS; } /* Right Bracket is parsed by this function. puts a new string into name */ int Parser::parse_preset_name(std::istream & fs, char * name) { sj_token_t token; if (name == NULL) return PROJECTM_FAILURE; if ((token = parseToken(fs, name)) != tRBr) return PROJECTM_PARSE_ERROR; return PROJECTM_SUCCESS; } /* Parses per pixel equations */ int Parser::parse_per_pixel_eqn(std::istream & fs, MilkdropPreset * preset, char * init_string) { char string[MAX_TOKEN_SIZE]; GenExpr * gen_expr; if (init_string != 0) { strncpy(string, init_string, strlen(init_string)); } else { if (parseToken(fs, string) != tEq) { /* parse per pixel operator name */ return PROJECTM_PARSE_ERROR; } } /* Parse right side of equation as an expression */ if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { return PROJECTM_PARSE_ERROR; } /* Add the per pixel equation */ if (preset->add_per_pixel_eqn(string, gen_expr) < 0) { if (PARSE_DEBUG) { } delete gen_expr; return PROJECTM_PARSE_ERROR; } return PROJECTM_SUCCESS; } /* Parses an equation line, this function is way too big, should add some helper functions */ int Parser::parse_line(std::istream & fs, MilkdropPreset * preset) { char eqn_string[MAX_TOKEN_SIZE]; sj_token_t token; InitCond * init_cond; PerFrameEqn * per_frame_eqn; /* Clear the string line buffer */ memset(string_line_buffer, 0, STRING_LINE_SIZE); string_line_buffer_index = 0; tokenWrapAroundEnabled = false; token = parseToken( fs, eqn_string ); switch (token ) { /* Invalid Cases */ case tRBr: case tLPr: case tRPr: case tComma: case tLBr: case tPlus: case tMinus: case tMod: case tMult: case tOr: case tAnd: case tDiv: if (PARSE_DEBUG) std::cerr << "parse_line: invalid token found at start of line (LINE " << line_count << ")" << std::endl; /* Invalid token found, return a parse error */ return PROJECTM_PARSE_ERROR; case tEOL: /* Empty line */ line_mode = UNSET_LINE_MODE; return PROJECTM_SUCCESS; case tEOF: /* End of File */ line_mode = UNSET_LINE_MODE; line_count = 1; tokenWrapAroundEnabled = false; return EOF; case tSemiColon: /* Indicates end of expression */ tokenWrapAroundEnabled = false; return PROJECTM_SUCCESS; /* Valid Case, either an initial condition or equation should follow */ case tEq: lastLinePrefix = std::string(eqn_string); if (PARSE_DEBUG) std::cout << "last line prefix = \"" << eqn_string << "\"" << std::endl; // std::cerr << "parse_line: tEQ case, fs.peek()=\'" << fs.peek() << "\'" << std::endl; if (!fs) return PROJECTM_PARSE_ERROR; // char z = fs.get(); char tmpChar; if ((tmpChar = fs.get()) == '\n') { tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } else if (tmpChar == '\r') { tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } else fs.unget(); /* CASE: WARP CODE */ if (!strncmp(eqn_string, WARP_STRING, WARP_STRING_LENGTH)) { //std::cout << "parsing warp string block\n" << std::endl; parse_string_block(fs, &preset->presetOutputs().warpShader.programSource); return PROJECTM_SUCCESS; } /* CASE: COMPOSITE CODE */ if (!strncmp(eqn_string, COMPOSITE_STRING, COMPOSITE_STRING_LENGTH)) { //std::cout << "parsing composite string block\n" << std::endl; parse_string_block(fs, &preset->presetOutputs().compositeShader.programSource); return PROJECTM_SUCCESS; } /* CASE: PER FRAME INIT EQUATION */ if (!strncmp(eqn_string, PER_FRAME_INIT_STRING, PER_FRAME_INIT_STRING_LENGTH)) { tokenWrapAroundEnabled = true; //if (PARSE_DEBUG) printf("parse_line: per frame init equation found...(LINE %d)\n", line_count); /* Parse the per frame equation */ if ((init_cond = parse_per_frame_init_eqn(fs, preset, NULL)) == NULL) { //if (PARSE_DEBUG) printf("parse_line: per frame init equation parsing failed (LINE %d)\n", line_count); tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } /* Insert the equation in the per frame equation tree */ preset->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name, init_cond)); line_mode = PER_FRAME_INIT_LINE_MODE; return PROJECTM_SUCCESS; } /* Per frame equation case */ if (!strncmp(eqn_string, PER_FRAME_STRING, PER_FRAME_STRING_LENGTH)) { tokenWrapAroundEnabled = true; /* Sometimes per frame equations are implicitly defined without the per_frame_ prefix. This informs the parser that one could follow */ line_mode = PER_FRAME_LINE_MODE; //if (PARSE_DEBUG) printf("parse_line: per frame equation found...(LINE %d)\n", line_count); /* Parse the per frame equation */ if ((per_frame_eqn = parse_per_frame_eqn(fs, ++per_frame_eqn_count, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_line: per frame equation parsing failed (LINE %d)\n", line_count); tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } /* Insert the equation in the per frame equation tree */ preset->per_frame_eqn_tree.push_back(per_frame_eqn); return PROJECTM_SUCCESS; } /* Wavecode initial condition case */ if (!strncmp(eqn_string, WAVECODE_STRING, WAVECODE_STRING_LENGTH)) { line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE; return parse_wavecode(eqn_string, fs, preset); } /* Custom Wave Prefix */ if ((!strncmp(eqn_string, WAVE_STRING, WAVE_STRING_LENGTH)) && ((eqn_string[5] >= 48) && (eqn_string[5] <= 57))) { tokenWrapAroundEnabled = true; // if (PARSE_DEBUG) printf("parse_line wave prefix found: \"%s\"\n", eqn_string); return parse_wave(eqn_string, fs, preset); } /* Shapecode initial condition case */ if (!strncmp(eqn_string, SHAPECODE_STRING, SHAPECODE_STRING_LENGTH)) { line_mode = CUSTOM_SHAPE_SHAPECODE_LINE_MODE; if (PARSE_DEBUG) printf("parse_line: shapecode prefix found: \"%s\"\n", eqn_string); return parse_shapecode(eqn_string, fs, preset); } /* Custom Shape Prefix */ if ((!strncmp(eqn_string, SHAPE_STRING, SHAPE_STRING_LENGTH)) && ((eqn_string[6] >= 48) && (eqn_string[6] <= 57))) { tokenWrapAroundEnabled = true; if (PARSE_DEBUG) printf("parse_line shape prefix found: \"%s\"\n", eqn_string); return parse_shape(eqn_string, fs, preset); } /* Per pixel equation case */ if (!strncmp(eqn_string, PER_PIXEL_STRING, PER_PIXEL_STRING_LENGTH)) { tokenWrapAroundEnabled = true; line_mode = PER_PIXEL_LINE_MODE; if (parse_per_pixel_eqn(fs, preset, 0) < 0) { tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } if (PARSE_DEBUG) printf("parse_line: finished parsing per pixel equation (LINE %d)\n", line_count); return PROJECTM_SUCCESS; } /* Sometimes equations are written implicitly in milkdrop files, in the form per_frame_1 = p1 = eqn1; p2 = eqn2; p3 = eqn3;..; which is analagous to: per_frame_1 = p1 = eqn1; per_frame_2 = p2 = eqn2; per_frame_3 = p3 = eqn3; ...; The following line mode hack allows such implicit declaration of the prefix that specifies the equation type. An alternative method may be to associate each equation line as list of equations separated by semicolons (and a new line ends the list). Instead, however, a global variable called "line_mode" specifies the last type of equation found, and bases any implicitly typed input on this fact Note added by Carmelo Piccione (carmelo.piccione@gmail.com) 10/19/03 */ /* Per frame line mode previously, try to parse the equation implicitly */ if (line_mode == PER_FRAME_LINE_MODE) { tokenWrapAroundEnabled = true; if ((per_frame_eqn = parse_implicit_per_frame_eqn(fs, eqn_string, ++per_frame_eqn_count, preset)) == NULL) { tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } /* Insert the equation in the per frame equation tree */ preset->per_frame_eqn_tree.push_back(per_frame_eqn); return PROJECTM_SUCCESS; } else if (line_mode == PER_FRAME_INIT_LINE_MODE) { tokenWrapAroundEnabled = true; if (PARSE_DEBUG) printf("parse_line: parsing implicit per frame init eqn)\n"); if ((init_cond = parse_per_frame_init_eqn(fs, preset, NULL)) == NULL) { tokenWrapAroundEnabled = false; return PROJECTM_PARSE_ERROR; } ++per_frame_init_eqn_count; /* Insert the equation in the per frame equation tree */ preset->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name, init_cond)); return PROJECTM_SUCCESS; } else if (line_mode == PER_PIXEL_LINE_MODE) { tokenWrapAroundEnabled = true; if (PARSE_DEBUG) printf("parse_line: implicit per pixel eqn (LINE %d)\n", line_count); return parse_per_pixel_eqn(fs, preset, eqn_string); } else if (line_mode == CUSTOM_WAVE_PER_POINT_LINE_MODE) { tokenWrapAroundEnabled = true; if (PARSE_DEBUG) printf("parse_line: implicit cwave ppoint eqn found (LINE %d)\n", line_count); //int len = strlen(eqn_string); if (parse_wave_helper(fs, preset, last_custom_wave_id, last_eqn_type, eqn_string) < 0) { if (PARSE_DEBUG) printf("parse_line: failed to parse an implicit custom wave per point eqn\n"); return PROJECTM_FAILURE; } return PROJECTM_SUCCESS; } else if (line_mode == CUSTOM_WAVE_PER_FRAME_LINE_MODE) { tokenWrapAroundEnabled = true; //Added by PJS. I hope I did it right CustomWave * custom_wave; /* Retrieve custom shape associated with this id */ if ((custom_wave = MilkdropPreset::find_custom_object(last_custom_wave_id, preset->customWaves)) == NULL) return PROJECTM_FAILURE; return parse_wave_per_frame_eqn(fs, custom_wave, preset); } else if (line_mode == CUSTOM_WAVE_WAVECODE_LINE_MODE) { if (PARSE_DEBUG) printf("unsupported line mode: CUSTOM_WAVE_WAVECODE_LINE_MODE\n"); return PROJECTM_FAILURE; } else if (line_mode == CUSTOM_SHAPE_SHAPECODE_LINE_MODE) { if (PARSE_DEBUG) printf("unsupported line mode: CUSTOM_SHAPE_SHAPECODE_LINE_MODE\n"); return PROJECTM_FAILURE; } else if (line_mode == CUSTOM_SHAPE_PER_FRAME_LINE_MODE) { tokenWrapAroundEnabled = true; CustomShape * custom_shape; /* Retrieve custom shape associated with this id */ if ((custom_shape = MilkdropPreset::find_custom_object(last_custom_shape_id, preset->customShapes)) == NULL) return PROJECTM_FAILURE; return parse_shape_per_frame_eqn(fs, custom_shape, preset); } else if (line_mode == CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE) { tokenWrapAroundEnabled = true; CustomShape * custom_shape; /* Retrieve custom shape associated with this id */ if ((custom_shape = preset->find_custom_object(last_custom_shape_id, preset->customShapes)) == NULL) return PROJECTM_FAILURE; return parse_shape_per_frame_init_eqn(fs, custom_shape, preset); } if (PARSE_DEBUG) printf("parse_line: found initial condition: name = \"%s\" (LINE %d)\n", eqn_string, line_count); /* Evaluate the initial condition */ if ((init_cond = parse_init_cond(fs, eqn_string, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_line: failed to parse initial condition (LINE %d)\n", line_count); return PROJECTM_PARSE_ERROR; } /* Add equation to initial condition tree */ preset->init_cond_tree.insert(std::make_pair(init_cond->param->name, init_cond)); /* Finished with initial condition line */ // if (PARSE_DEBUG) printf("parse_line: initial condition parsed successfully\n"); return PROJECTM_SUCCESS; /* END INITIAL CONDITIONING PARSING */ default: /* an uncaught type or an error has occurred */ if (PARSE_DEBUG) printf("parse_line: uncaught case, token val = %d\n", token); return PROJECTM_PARSE_ERROR; } /* Because of the default in the case statement, control flow should never actually reach here */ return PROJECTM_PARSE_ERROR; } /* Parses a general expression, this function is the meat of the parser */ GenExpr * Parser::parse_gen_expr ( std::istream & fs, TreeExpr * tree_expr, MilkdropPreset * preset) { int i; char string[MAX_TOKEN_SIZE]; sj_token_t token; GenExpr * gen_expr; float val; Param * param = NULL; Func * func; GenExpr ** expr_list; switch (token = parseToken(fs,string)) { /* Left Parentice Case */ case tLPr: //std::cerr << "token before tLPr:" << string << std::endl; /* CASE 1 (Left Parentice): See if the previous string before this parentice is a function name */ if ((func = BuiltinFuncs::find_func(string)) != NULL) { if (PARSE_DEBUG) { std::cerr << "parse_gen_expr: found prefix function (name = \"" << func->getName() << "\") (LINE " << line_count << ")" << std::endl; } /* Parse the functions arguments */ if ((expr_list = parse_prefix_args(fs, func->getNumArgs(), preset)) == NULL) { if (PARSE_DEBUG) { std::cerr << "parse_prefix_args: failed to generate an expresion list! (LINE " << line_count << ")" << std::endl; } if ( tree_expr != NULL ) { delete tree_expr; } return NULL; } /* Convert function to expression */ if ((gen_expr = GenExpr::prefun_to_expr((float (*)(void *))func->func_ptr, expr_list, func->getNumArgs())) == NULL) { if (PARSE_DEBUG) printf("parse_prefix_args: failed to convert prefix function to general expression (LINE %d) \n", line_count); if (tree_expr) delete tree_expr; for (i = 0; i < func->getNumArgs();i++) delete expr_list[i]; free(expr_list); expr_list = NULL; return NULL; } token = parseToken(fs, string); if (*string != 0) { if (PARSE_DEBUG) printf("parse_prefix_args: empty string expected, but not found...(LINE %d)\n", line_count); /* continue anyway for now, could be implicit multiplication */ } return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); } /* Case 2: (Left Parentice), a string coupled with a left parentice. Either an error or implicit multiplication operator. For now treat it as an error */ if (*string != 0) { std::cerr << "token prefix is " << *string << std::endl; if (PARSE_DEBUG) printf("parse_gen_expr: implicit multiplication case unimplemented!\n"); if (tree_expr) delete tree_expr; return NULL; } /* CASE 3 (Left Parentice): the following is enclosed parentices to change order of operations. So we create a new expression tree */ if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_gen_expr: found left parentice, but failed to create new expression tree \n"); if (tree_expr) delete tree_expr; return NULL; } if (PARSE_DEBUG) printf("parse_gen_expr: finished enclosed expression tree...\n"); token = parseToken(fs, string); return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); /* Plus is a prefix operator check */ case tPlus: if (*string == 0) { if (PARSE_DEBUG) printf("parse_gen_expr: plus used as prefix (LINE %d)\n", line_count); /* Treat prefix plus as implict 0 preceding operator */ gen_expr = GenExpr::const_to_expr(0); return parse_infix_op(fs, tPositive, insert_gen_expr(gen_expr, &tree_expr), preset); } /* Minus is a prefix operator check */ case tMinus: if (*string == 0) { /* Use the negative infix operator, but first add an implicit zero to the operator tree */ gen_expr = GenExpr::const_to_expr(0); //return parse_gen_expr(fs, insert_gen_expr(gen_expr, &tree_expr), preset); return parse_infix_op(fs, tNegative, insert_gen_expr(gen_expr, &tree_expr), preset); } /* All the following cases are strings followed by an infix operator or terminal */ case tRPr: case tEOL: case tEOF: case tSemiColon: case tComma: /* CASE 1 (terminal): string is empty, but not null. Not sure if this will actually happen any more. */ if (*string == 0) { if (PARSE_DEBUG) printf("parse_gen_expr: empty string coupled with terminal (LINE %d) \n", line_count); return parse_infix_op(fs, token, tree_expr, preset); } default: /* CASE 0: Empty string, parse error */ if (*string == 0) { if (tree_expr) delete tree_expr; return NULL; } /* CASE 1: Check if string is a just a floating point number */ if (string_to_float(string, &val) != PROJECTM_PARSE_ERROR) { if ((gen_expr = GenExpr::const_to_expr(val)) == NULL) { if (tree_expr) delete tree_expr; return NULL; } /* Parse the rest of the line */ return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); } /* CASE 4: custom shape variable */ if (current_shape != NULL) { if ((param = ParamUtils::find<ParamUtils::NO_CREATE>(std::string(string), ¤t_shape->param_tree)) == NULL) { if ((param = preset->builtinParams.find_builtin_param(std::string(string))) == NULL) if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(std::string(string), ¤t_shape->param_tree)) == NULL) { if (tree_expr) delete tree_expr; return NULL; } } if (PARSE_DEBUG) { std::cerr << "parse_gen_expr: custom shape parameter (name = " << param->name << ")" << std::endl; } /* Convert parameter to an expression */ if ((gen_expr = GenExpr::param_to_expr(param)) == NULL) { delete tree_expr; return NULL; } //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); /* Parse the rest of the line */ return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); } /* CASE 5: custom wave variable */ if (current_wave != NULL) { if ((param = ParamUtils::find<ParamUtils::NO_CREATE>(std::string(string), ¤t_wave->param_tree)) == NULL) { if ((param = preset->builtinParams.find_builtin_param(std::string(string))) == NULL) if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(std::string(string), ¤t_wave->param_tree)) == NULL) { if (tree_expr) delete tree_expr; return NULL; } } assert(param); if (PARSE_DEBUG) { std::cerr << "parse_gen_expr: custom wave parameter (name = " << param->name << ")" << std::endl; } /* Convert parameter to an expression */ if ((gen_expr = GenExpr::param_to_expr(param)) == NULL) { delete tree_expr; return NULL; } //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); /* Parse the rest of the line */ return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); } /* CASE 6: regular parameter. Will be created if necessary and the string has no invalid characters */ if ((param = ParamUtils::find(string, &preset->builtinParams, &preset->user_param_tree)) != NULL) { if (PARSE_DEBUG) { std::cerr << "parse_gen_expr: parameter (name = \"" << param->name << "\")..." << std::endl; } /* Convert parameter to an expression */ if ((gen_expr = GenExpr::param_to_expr(param)) == NULL) { delete tree_expr; return NULL; } //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); /* Parse the rest of the line */ return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); } /* CASE 7: Bad string, give up */ if (PARSE_DEBUG) { printf( "parse_gen_expr: syntax error [string = \"%s\"] (LINE %d)\n", string, line_count); } if (tree_expr) delete tree_expr; return NULL; } } /* Inserts expressions into tree according to operator precedence. If root is null, a new tree is created, with infix_op as only element */ TreeExpr * Parser::insert_infix_op(InfixOp * infix_op, TreeExpr **root) { TreeExpr * new_root; /* Sanity check */ if (infix_op == NULL) return NULL; /* The root is null, so make this operator the new root */ if (*root == NULL) { new_root = new TreeExpr(infix_op, NULL, NULL, NULL); *root = new_root; return new_root; } /* The root node is not an infix function, so we make this infix operator the new root */ if ((*root)->infix_op == NULL) { new_root = new TreeExpr(infix_op, NULL, *root, NULL); (*root) = new_root; return new_root; } /* The root is an infix function. If the precedence of the item to be inserted is greater than the root's precedence, then make gen_expr the root */ if (infix_op->precedence >= (*root)->infix_op->precedence) { new_root = new TreeExpr(infix_op, NULL, *root, NULL); (*root) = new_root; return new_root; } /* If control flow reaches here, use a recursive helper with the knowledge that the root is higher precedence than the item to be inserted */ insert_infix_rec(infix_op, *root); return *root; } TreeExpr * Parser::insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root) { TreeExpr * new_root; /* If someone foolishly passes a null pointer to insert, return the original tree */ if (gen_expr == NULL) { return *root; } /* If the root is null, generate a new expression tree, using the passed expression as the root element */ if (*root == NULL) { new_root = new TreeExpr(NULL, gen_expr, NULL, NULL); *root = new_root; return new_root; } /* Otherwise. the new element definitely will not replace the current root. Use a recursive helper function to do insertion */ insert_gen_rec(gen_expr, *root); return *root; } /* A recursive helper function to insert general expression elements into the operator tree */ int Parser::insert_gen_rec(GenExpr * gen_expr, TreeExpr * root) { /* Trivial Case: root is null */ if (root == NULL) { //if (PARSE_DEBUG) printf("insert_gen_rec: root is null, returning failure\n"); return PROJECTM_FAILURE; } /* The current node's left pointer is null, and this current node is an infix operator, so insert the general expression at the left pointer */ if ((root->left == NULL) && (root->infix_op != NULL)) { root->left = new TreeExpr(NULL, gen_expr, NULL, NULL); return PROJECTM_SUCCESS; } /* The current node's right pointer is null, and this current node is an infix operator, so insert the general expression at the right pointer */ if ((root->right == NULL) && (root->infix_op != NULL)) { root->right = new TreeExpr(NULL, gen_expr, NULL, NULL); return PROJECTM_SUCCESS; } /* Otherwise recurse down to the left. If this succeeds then return. If it fails, try recursing down to the right */ if (insert_gen_rec(gen_expr, root->left) == PROJECTM_FAILURE) return insert_gen_rec(gen_expr, root->right); /* Impossible for control flow to reach here, but in the world of C programming, who knows... */ if (PARSE_DEBUG) printf("insert_gen_rec: should never reach here!\n"); return PROJECTM_FAILURE; } /* A recursive helper function to insert infix arguments by operator precedence */ int Parser::insert_infix_rec(InfixOp * infix_op, TreeExpr * root) { /* Shouldn't happen, implies a parse error */ if (root == NULL) return PROJECTM_FAILURE; /* Also shouldn't happen, also implies a (different) parse error */ if (root->infix_op == NULL) return PROJECTM_FAILURE; /* Left tree is empty, attach this operator to it. I don't think this will ever happen */ if (root->left == NULL) { root->left = new TreeExpr(infix_op, NULL, root->left, NULL); return PROJECTM_SUCCESS; } /* Right tree is empty, attach this operator to it */ if (root->right == NULL) { root->right = new TreeExpr(infix_op, NULL, root->right, NULL); return PROJECTM_SUCCESS; } /* The left element can now be ignored, since there is no way for this operator to use those expressions */ /* If the right element is not an infix operator, then insert the expression here, attaching the old right branch to the left of the new expression */ if (root->right->infix_op == NULL) { root->right = new TreeExpr(infix_op, NULL, root->right, NULL); return PROJECTM_SUCCESS; } /* Traverse deeper if the inserting operator precedence is less than the the root's right operator precedence */ if (infix_op->precedence < root->right->infix_op->precedence) return insert_infix_rec(infix_op, root->right); /* Otherwise, insert the operator here */ root->right = new TreeExpr(infix_op, NULL, root->right, NULL); return PROJECTM_SUCCESS; } /* Parses an infix operator */ GenExpr * Parser::parse_infix_op(std::istream & fs, sj_token_t token, TreeExpr * tree_expr, MilkdropPreset * preset) { GenExpr * gen_expr; switch (token) { /* All the infix operators */ case tPlus: if (PARSE_DEBUG) printf("parse_infix_op: found addition operator (LINE %d)\n", line_count); if (PARSE_DEBUG) std::cerr << "WRAP AROUND IS " << tokenWrapAroundEnabled << std::endl; return parse_gen_expr(fs, insert_infix_op(Eval::infix_add, &tree_expr), preset); case tMinus: if (PARSE_DEBUG) printf("parse_infix_op: found subtraction operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_minus, &tree_expr), preset); case tMult: if (PARSE_DEBUG) printf("parse_infix_op: found multiplication operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_mult, &tree_expr), preset); case tDiv: if (PARSE_DEBUG) printf("parse_infix_op: found division operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_div, &tree_expr), preset); case tMod: if (PARSE_DEBUG) printf("parse_infix_op: found modulo operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_mod, &tree_expr), preset); case tOr: if (PARSE_DEBUG) printf("parse_infix_op: found bitwise or operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_or, &tree_expr), preset); case tAnd: if (PARSE_DEBUG) printf("parse_infix_op: found bitwise and operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_and, &tree_expr), preset); case tPositive: if (PARSE_DEBUG) printf("parse_infix_op: found positive operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_positive, &tree_expr), preset); case tNegative: if (PARSE_DEBUG) printf("parse_infix_op: found negative operator (LINE %d)\n", line_count); return parse_gen_expr(fs, insert_infix_op(Eval::infix_negative, &tree_expr), preset); case tEOL: case tEOF: case tSemiColon: case tRPr: case tComma: if (PARSE_DEBUG) printf("parse_infix_op: terminal found (LINE %d)\n", line_count); gen_expr = new GenExpr(TREE_T, (void*)tree_expr); assert(gen_expr); return gen_expr; default: if (PARSE_DEBUG) printf("parse_infix_op: operator or terminal expected, but not found (LINE %d)\n", line_count); delete tree_expr; return NULL; } /* Will never happen */ return NULL; } /* Parses an integer, checks for +/- prefix */ int Parser::parse_int(std::istream & fs, int * int_ptr) { char string[MAX_TOKEN_SIZE]; sj_token_t token; int sign; char * end_ptr = (char*)" "; token = parseToken(fs, string); switch (token) { case tMinus: sign = -1; token = parseToken(fs, string); break; case tPlus: sign = 1; token = parseToken(fs, string); break; default: sign = 1; break; } if (string[0] == 0) return PROJECTM_PARSE_ERROR; /* Convert the string to an integer. *end_ptr should end up pointing to null terminator of 'string' if the conversion was successful. */ // printf("STRING: \"%s\"\n", string); (*int_ptr) = sign*strtol(string, &end_ptr, 10); /* If end pointer is a return character or null terminator, all is well */ if ((*end_ptr == '\r') || (*end_ptr == '\0')) return PROJECTM_SUCCESS; return PROJECTM_PARSE_ERROR; } /* Parses a floating point number */ int Parser::string_to_float(char * string, float * float_ptr) { char ** error_ptr; if (*string == 0) return PROJECTM_PARSE_ERROR; error_ptr = (char**)wipemalloc(sizeof(char**)); (*float_ptr) = strtod(string, error_ptr); /* These imply a succesful parse of the string */ if ((**error_ptr == '\0') || (**error_ptr == '\r')) { free(error_ptr); error_ptr = NULL; return PROJECTM_SUCCESS; } (*float_ptr) = 0; free(error_ptr); error_ptr = NULL; return PROJECTM_PARSE_ERROR; } /* Parses a floating point number */ int Parser::parse_float(std::istream & fs, float * float_ptr) { char string[MAX_TOKEN_SIZE]; char ** error_ptr; sj_token_t token; int sign; error_ptr =(char**) wipemalloc(sizeof(char**)); token = parseToken(fs, string); switch (token) { case tMinus: sign = -1; token = parseToken(fs, string); break; case tPlus: sign = 1; token = parseToken(fs, string); break; default: sign = 1; } if (string[0] == 0) { free(error_ptr); error_ptr = NULL; return PROJECTM_PARSE_ERROR; } (*float_ptr) = sign*strtod(string, error_ptr); /* No conversion was performed */ if ((**error_ptr == '\0') || (**error_ptr == '\r')) { free(error_ptr); error_ptr = NULL; return PROJECTM_SUCCESS; } if (PARSE_DEBUG) printf("parse_float: float conversion failed for string \"%s\"\n", string); (*float_ptr) = 0; free(error_ptr); error_ptr = NULL; return PROJECTM_PARSE_ERROR; } /* Parses a per frame equation. That is, interprets a stream of data as a per frame equation */ PerFrameEqn * Parser::parse_per_frame_eqn(std::istream & fs, int index, MilkdropPreset * preset) { char string[MAX_TOKEN_SIZE]; Param * param; PerFrameEqn * per_frame_eqn; GenExpr * gen_expr; if (parseToken(fs, string) != tEq) { if (PARSE_DEBUG) printf("parse_per_frame_eqn: no equal sign after string \"%s\" (LINE %d)\n", string, line_count); return NULL; } /* Find the parameter associated with the string, create one if necessary */ if ((param = ParamUtils::find(string, &preset->builtinParams, &preset->user_param_tree)) == NULL) { return NULL; } if (PARSE_DEBUG) std::cerr << "parse_per_frame_eqn: parameter \"" << param->name << "\" retrieved (LINE" << line_count << ")" << std::endl; /* Make sure parameter is writable */ if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) std::cerr << "parse_per_frame_eqn: parameter \"" << param->name << "\" %s is marked as read only (LINE " << line_count << ")" << std::endl; return NULL; } /* Parse right side of equation as an expression */ if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_per_frame_eqn: equation evaluated to null (LINE %d)\n", line_count); return NULL; } if (PARSE_DEBUG) printf("parse_per_frame_eqn: finished per frame equation evaluation (LINE %d)\n", line_count); /* Create a new per frame equation */ if ((per_frame_eqn = new PerFrameEqn(index, param, gen_expr)) == NULL) { if (PARSE_DEBUG) printf("parse_per_frame_eqn: failed to create a new per frame eqn, out of memory?\n"); delete gen_expr; return NULL; } if (PARSE_DEBUG) printf("parse_per_frame_eqn: per_frame eqn parsed succesfully\n"); return per_frame_eqn; } /* Parses an 'implicit' per frame equation. That is, interprets a stream of data as a per frame equation without a prefix */ PerFrameEqn * Parser::parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, MilkdropPreset * preset) { Param * param; PerFrameEqn * per_frame_eqn; GenExpr * gen_expr; // if (fs == NULL) // EDIT BY SJ // return NULL; if (param_string == NULL) return NULL; if (preset == NULL) return NULL; //rintf("param string: %s\n", param_string); /* Find the parameter associated with the string, create one if necessary */ if ((param = ParamUtils::find(param_string, &preset->builtinParams, &preset->user_param_tree)) == NULL) { return NULL; } //printf("parse_implicit_per_frame_eqn: param is %s\n", param->name); /* Make sure parameter is writable */ if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); return NULL; } /* Parse right side of equation as an expression */ if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: equation evaluated to null (LINE %d)\n", line_count); return NULL; } if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: finished per frame equation evaluation (LINE %d)\n", line_count); /* Create a new per frame equation */ if ((per_frame_eqn = new PerFrameEqn(index, param, gen_expr)) == NULL) { if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: failed to create a new per frame eqn, out of memory?\n"); delete gen_expr; return NULL; } if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: per_frame eqn parsed succesfully\n"); return per_frame_eqn; } /* Parses an initial condition */ InitCond * Parser::parse_init_cond(std::istream & fs, char * name, MilkdropPreset * preset) { Param * param; CValue init_val; InitCond * init_cond; if (name == NULL) return NULL; if (preset == NULL) return NULL; /* Search for the paramater in the database, creating it if necessary */ if ((param = ParamUtils::find(name, &preset->builtinParams, &preset->user_param_tree)) == NULL) { return NULL; } if (PARSE_DEBUG) printf("parse_init_cond: parameter = \"%s\" (LINE %d)\n", param->name.c_str(), line_count); if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) printf("parse_init_cond: builtin parameter \"%s\" marked as read only!\n", param->name.c_str()); return NULL; } /* At this point, a parameter has been created or was found in the database. */ if (PARSE_DEBUG) printf("parsed_init_cond: parsing initial condition value... (LINE %d)\n", line_count); /* integer value (boolean is an integer in C) */ if ( (param->type == P_TYPE_BOOL)) { int bool_test; if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_init_cond: error parsing integer!\n"); return NULL; } init_val.bool_val = bool_test; } else if ((param->type == P_TYPE_INT)) { if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_init_cond: error parsing integer!\n"); return NULL; } } /* float value */ else if (param->type == P_TYPE_DOUBLE) { if ((parse_float(fs, (float*)&init_val.float_val)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_init_cond: error parsing float!\n"); return NULL; } } /* Unknown value */ else { if (PARSE_DEBUG) printf("parse_init_cond: unknown parameter type!\n"); return NULL; } /* Create new initial condition */ if ((init_cond = new InitCond(param, init_val)) == NULL) { if (PARSE_DEBUG) printf("parse_init_cond: new_init_cond failed!\n"); return NULL; } /* Finished */ return init_cond; } void Parser::parse_string_block(std::istream & fs, std::string * out_string) { char name[MAX_TOKEN_SIZE]; sj_token_t token; std::set<char> skipList; skipList.insert('`'); readStringUntil(fs, out_string, false, skipList); //std::cout << "out_string:\n " << *out_string << "\n" << std::endl; } InitCond * Parser::parse_per_frame_init_eqn(std::istream & fs, MilkdropPreset * preset, std::map<std::string,Param*> * database) { char name[MAX_TOKEN_SIZE]; Param * param = NULL; CValue init_val; InitCond * init_cond; GenExpr * gen_expr; float val; sj_token_t token; if (preset == NULL) return NULL; // if (fs == NULL) // EDIT BY SJ // return NULL; if ((token = parseToken(fs, name)) != tEq) return NULL; /* If a database was specified,then use ParamUtils::find_db instead */ if ((database != NULL) && ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(name, database)) == NULL)) { return NULL; } /* Otherwise use the builtin parameter and user databases. This is confusing. Sorry. */ if ((param == NULL) && ((param = ParamUtils::find(name, &preset->builtinParams, &preset->user_param_tree)) == NULL)) { return NULL; } if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parameter = \"%s\" (LINE %d)\n", param->name.c_str(), line_count); if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) printf("pars_per_frame_init_eqn: builtin parameter \"%s\" marked as read only!\n", param->name.c_str()); return NULL; } /* At this point, a parameter has been created or was found in the database. */ if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parsing right hand side of per frame init equation.. (LINE %d)\n", line_count); if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: failed to parse general expresion!\n"); return NULL; } /* Compute initial condition value */ val = gen_expr->eval_gen_expr(-1,-1); /* Free the general expression now that we are done with it */ delete gen_expr; /* integer value (boolean is an integer in C) */ if (param->type == P_TYPE_BOOL) { init_val.bool_val = (bool)val; } else if ((param->type == P_TYPE_INT)) { init_val.int_val = (int)val; } /* float value */ else if (param->type == P_TYPE_DOUBLE) { init_val.float_val = val; } /* Unknown value */ else { if (PARSE_DEBUG) printf("pase_per_frame_init_eqn: unknown parameter type!\n"); return NULL; } /* Create new initial condition */ if ((init_cond = new InitCond(param, init_val)) == NULL) { if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: new_init_cond failed!\n"); return NULL; } init_cond->evaluate(true); /* Finished */ return init_cond; } bool Parser::scanForComment(std::istream & fs) { int c; c = fs.get(); if (c == '/') { while (true) { if (!fs || fs.eof()) return true; else c = fs.get(); if (c == EOF) return true; if (c == '\n') { return true; } } } else { fs.unget(); return false; } } void Parser::readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround, const std::set<char> & skipList) { int string_line_buffer_index = 0; int c; /* Loop until a delimiter is found, or the maximum string size is found */ while (true) { if (!fs || fs.eof()) c = EOF; else c = fs.get(); /* Now interpret the character */ switch (c) { case '/': { bool commentExisted = scanForComment(fs); if (!commentExisted) { out_buffer->push_back(c); break; } else { line_count++; return; } } case '\n': if (!out_buffer->empty() && ((*out_buffer)[out_buffer->length() -1] == '\n')) return; line_count++; if (wrapAround) { std::ostringstream buffer; // if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl; while (c != '=') { if (!fs || fs.eof()) { line_count = 1; line_mode = UNSET_LINE_MODE; // if (PARSE_DEBUG) std::cerr << "token wrap: end of file" << std::endl; return; } else { c = fs.get(); if ( c != '=') buffer << c; } } if (!wrapsToNextLine(buffer.str())) { wrapAround = false; int buf_size = (int)buffer.str().length(); // <= to also remove equal sign parsing from stream for (int k = 0; k <= buf_size; k++) { if (fs) fs.unget(); else abort(); } return; } break; } else out_buffer->push_back(c); return; case EOF: line_count = 1; return; default: if (out_buffer != NULL) { if (skipList.find(c) == skipList.end()) out_buffer->push_back(c); } } } } int Parser::parse_wavecode(char * token, std::istream & fs, MilkdropPreset * preset) { char * var_string; InitCond * init_cond; CustomWave * custom_wave; int id; CValue init_val; Param * param; assert(preset); assert(fs); assert(token); /* token should be in the form wavecode_N_var, such as wavecode_1_samples */ /* Get id and variable name from token string */ if (parse_wavecode_prefix(token, &id, &var_string) < 0) return PROJECTM_PARSE_ERROR; last_custom_wave_id = id; if (PARSE_DEBUG) printf("parse_wavecode: wavecode id = %d, parameter = \"%s\"\n", id, var_string); /* Retrieve custom wave information from preset, allocating new one if necessary */ if ((custom_wave = MilkdropPreset::find_custom_object(id, preset->customWaves)) == NULL) { std::cerr << "parse_wavecode: failed to load (or create) custom wave (id = " << id << ")!\n" << std::endl; return PROJECTM_FAILURE; } if (PARSE_DEBUG) printf("parse_wavecode: custom wave found (id = %d)\n", custom_wave->id); /* Retrieve parameter from this custom waves parameter db */ if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(var_string,&custom_wave->param_tree)) == NULL) return PROJECTM_FAILURE; if (PARSE_DEBUG) printf("parse_wavecode: custom wave parameter found (name = %s)\n", param->name.c_str()); /* integer value (boolean is an integer in C) */ if ((param->type == P_TYPE_BOOL)) { int bool_test; if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n"); return PROJECTM_PARSE_ERROR; } init_val.bool_val = bool_test; } else if ((param->type == P_TYPE_INT)) { if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n"); return PROJECTM_PARSE_ERROR; } } /* float value */ else if (param->type == P_TYPE_DOUBLE) { if ((parse_float(fs, (float*)&init_val.float_val)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_wavecode: error parsing float!\n"); return PROJECTM_PARSE_ERROR; } } /* Unknown value */ else { if (PARSE_DEBUG) printf("parse_wavecode: unknown parameter type!\n"); return PROJECTM_PARSE_ERROR; } /* Create new initial condition */ init_cond = new InitCond(param, init_val); if (init_cond == NULL) { if (PARSE_DEBUG) printf("parse_wavecode: new_init_cond failed!\n"); return PROJECTM_FAILURE; } std::pair<std::map<std::string, InitCond*>::iterator, bool> inserteePair = custom_wave->init_cond_tree.insert(std::make_pair(init_cond->param->name, init_cond)); // assert(inserteePair.second); line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE; if (PARSE_DEBUG) printf("parse_wavecode: [success]\n"); return PROJECTM_SUCCESS; } int Parser::parse_shapecode(char * token, std::istream & fs, MilkdropPreset * preset) { char * var_string; InitCond * init_cond; CustomShape * custom_shape; int id; CValue init_val; Param * param; /* Null argument checks */ if (preset == NULL) return PROJECTM_FAILURE; // if (fs == NULL) // EDIT BY SJ // return PROJECTM_FAILURE; if (token == NULL) return PROJECTM_FAILURE; /* token should be in the form shapecode_N_var, such as shapecode_1_samples */ /* Get id and variable name from token string */ if (parse_shapecode_prefix(token, &id, &var_string) < 0) return PROJECTM_PARSE_ERROR; last_custom_shape_id = id; if (PARSE_DEBUG) printf("parse_shapecode: shapecode id = %d, parameter = \"%s\"\n", id, var_string); /* Retrieve custom shape information from preset. The 3rd argument if true creates a custom shape if one does not exist */ if ((custom_shape = MilkdropPreset::find_custom_object(id, preset->customShapes)) == NULL) { if (PARSE_DEBUG) printf("parse_shapecode: failed to load (or create) custom shape (id = %d)!\n", id); return PROJECTM_FAILURE; } if (PARSE_DEBUG) printf("parse_shapecode: custom shape found (id = %d)\n", custom_shape->id); if ((param = ParamUtils::find<ParamUtils::NO_CREATE>(var_string, &custom_shape->text_properties_tree)) != NULL) { std::string text;//[MAX_TOKEN_SIZE]; //token_t token = parseToken(fs, text); fs >> text; *((std::string*)param->engine_val) = text; if (PARSE_DEBUG) std::cerr << "parse_shapecode: found image url, text is \"" << text << "\"" << std::endl; return PROJECTM_SUCCESS; } /* Retrieve parameter from this custom shapes parameter db */ if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(var_string, &custom_shape->param_tree)) == NULL) { if (PARSE_DEBUG) printf("parse_shapecode: failed to create parameter.\n"); return PROJECTM_FAILURE; } if (PARSE_DEBUG) printf("parse_shapecode: custom shape parameter found (name = %s)\n", param->name.c_str()); /* integer value (boolean is an integer in C) */ if ((param->type == P_TYPE_BOOL)) { int bool_test; if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_shapecode: error parsing integer!\n"); return PROJECTM_PARSE_ERROR; } init_val.bool_val = bool_test; } else if ((param->type == P_TYPE_INT)) { if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_shapecode: error parsing integer!\n"); return PROJECTM_PARSE_ERROR; } } /* float value */ else if (param->type == P_TYPE_DOUBLE) { if ((parse_float(fs, (float*)&init_val.float_val)) == PROJECTM_PARSE_ERROR) { if (PARSE_DEBUG) printf("parse_shapecode: error parsing float!\n"); return PROJECTM_PARSE_ERROR; } } /* Unknown value */ else { if (PARSE_DEBUG) printf("parse_shapecode: unknown parameter type!\n"); return PROJECTM_PARSE_ERROR; } /* Create new initial condition */ if ((init_cond = new InitCond(param, init_val)) == NULL) { if (PARSE_DEBUG) printf("parse_shapecode: new_init_cond failed!\n"); return PROJECTM_FAILURE; } custom_shape->init_cond_tree.insert(std::make_pair(param->name,init_cond)); line_mode = CUSTOM_SHAPE_SHAPECODE_LINE_MODE; if (PARSE_DEBUG) printf("parse_shapecode: [success]\n"); return PROJECTM_SUCCESS; } int Parser::parse_wavecode_prefix(char * token, int * id, char ** var_string) { int len, i, j; if (token == NULL) return PROJECTM_FAILURE; /* if (*var_string == NULL) return PROJECTM_FAILURE; */ if (id == NULL) return PROJECTM_FAILURE; len = strlen(token); /* Move pointer passed "wavecode_" prefix */ if (len <= WAVECODE_STRING_LENGTH) return PROJECTM_FAILURE; i = WAVECODE_STRING_LENGTH; j = 0; (*id) = 0; /* This loop grabs the integer id for this custom wave */ while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { if (j >= MAX_TOKEN_SIZE) return PROJECTM_FAILURE; (*id) = 10*(*id) + (token[i]-48); j++; i++; } if (i > (len - 2)) return PROJECTM_FAILURE; *var_string = token + i + 1; return PROJECTM_SUCCESS; } int Parser::parse_shapecode_prefix(char * token, int * id, char ** var_string) { int len, i, j; if (token == NULL) return PROJECTM_FAILURE; /* if (*var_string == NULL) return PROJECTM_FAILURE; */ if (id == NULL) return PROJECTM_FAILURE; len = strlen(token); /* Move pointer passed "shapecode_" prefix */ if (len <= SHAPECODE_STRING_LENGTH) return PROJECTM_FAILURE; i = SHAPECODE_STRING_LENGTH; j = 0; (*id) = 0; /* This loop grabs the integer id for this custom shape */ while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { if (j >= MAX_TOKEN_SIZE) return PROJECTM_FAILURE; (*id) = 10*(*id) + (token[i]-48); j++; i++; } if (i > (len - 2)) return PROJECTM_FAILURE; *var_string = token + i + 1; return PROJECTM_SUCCESS; } int Parser::parse_wave_prefix(char * token, int * id, char ** eqn_string) { int len, i, j; if (token == NULL) return PROJECTM_FAILURE; if (eqn_string == NULL) return PROJECTM_FAILURE; if (id == NULL) return PROJECTM_FAILURE; len = strlen(token); if (len <= WAVE_STRING_LENGTH) return PROJECTM_FAILURE; i = WAVE_STRING_LENGTH; j = 0; (*id) = 0; /* This loop grabs the integer id for this custom wave */ while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { if (j >= MAX_TOKEN_SIZE) return PROJECTM_FAILURE; (*id) = 10*(*id) + (token[i]-48); j++; i++; } if (i > (len - 2)) return PROJECTM_FAILURE; *eqn_string = token + i + 1; if (PARSE_DEBUG) printf("parse_wave_prefix: prefix = %s\n (LINE %d)", *eqn_string, line_count); return PROJECTM_SUCCESS; } int Parser::parse_shape_prefix(char * token, int * id, char ** eqn_string) { int len, i, j; if (token == NULL) return PROJECTM_FAILURE; if (eqn_string == NULL) return PROJECTM_FAILURE; if (id == NULL) return PROJECTM_FAILURE; len = strlen(token); if (len <= SHAPE_STRING_LENGTH) return PROJECTM_FAILURE; i = SHAPE_STRING_LENGTH; j = 0; (*id) = 0; /* This loop grabs the integer id for this custom wave */ while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { if (j >= MAX_TOKEN_SIZE) return PROJECTM_FAILURE; (*id) = 10*(*id) + (token[i]-48); j++; i++; } if (i > (len - 2)) return PROJECTM_FAILURE; *eqn_string = token + i + 1; return PROJECTM_SUCCESS; } /* Parses custom wave equations */ int Parser::parse_wave(char * token, std::istream & fs, MilkdropPreset * preset) { int id; char * eqn_type; if (PARSE_DEBUG) printf("parse_wave:begin\n"); if (token == NULL) return PROJECTM_FAILURE; // if (fs == NULL) // EDIT BY SJ // return PROJECTM_FAILURE; if (preset == NULL) return PROJECTM_FAILURE; /* Grab custom wave id and equation type (per frame or per point) from string token */ if (parse_wave_prefix(token, &id, &eqn_type) < 0) { if (PARSE_DEBUG) printf("parse_wave: syntax error in custom wave prefix!\n"); return PROJECTM_FAILURE; } strncpy(last_eqn_type, eqn_type, MAX_TOKEN_SIZE); return parse_wave_helper(fs, preset, id, eqn_type, 0); } int Parser::parse_wave_helper(std::istream & fs, MilkdropPreset * preset, int id, char * eqn_type, char * init_string) { Param * param; GenExpr * gen_expr; char string[MAX_TOKEN_SIZE]; PerFrameEqn * per_frame_eqn; CustomWave * custom_wave; InitCond * init_cond; /* Retrieve custom wave associated with this id */ if ((custom_wave = MilkdropPreset::find_custom_object(id, preset->customWaves)) == NULL) { if (PARSE_DEBUG) printf("parse_wave_helper: custom wave id %d not found!\n", id); return PROJECTM_FAILURE; } /* per frame init equation case */ if (!strncmp(eqn_type, WAVE_INIT_STRING, WAVE_INIT_STRING_LENGTH)) { if (PARSE_DEBUG) printf("parse_wave_helper (per frame init): [begin] (LINE %d)\n", line_count); /* Parse the per frame init equation */ if ((init_cond = parse_per_frame_init_eqn(fs, preset, &custom_wave->param_tree)) == NULL) { if (PARSE_DEBUG) printf("parse_wave_helper (per frame init): equation parsing failed (LINE %d)\n", line_count); return PROJECTM_PARSE_ERROR; } /* Insert the equation in the per frame equation tree */ custom_wave->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name,init_cond)); line_mode = CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE; init_cond->evaluate(true); return PROJECTM_SUCCESS; } /* per frame equation case */ if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH)) { if (PARSE_DEBUG) printf("parse_wave_helper (per_frame): [start] (custom wave id = %d)\n", custom_wave->id); if (parseToken(fs, string) != tEq) { if (PARSE_DEBUG) printf("parse_wave (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); return PROJECTM_PARSE_ERROR; } /* Find the parameter associated with the string in the custom wave database */ if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(string, &custom_wave->param_tree)) == NULL) { if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter \"%s\" not found or cannot be wipemalloc'ed!!\n", string); return PROJECTM_FAILURE; } /* Make sure parameter is writable */ if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); return PROJECTM_FAILURE; } /* Parse right side of equation as an expression */ current_wave = custom_wave; if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_wave (per_frame): equation evaluated to null (LINE %d)\n", line_count); current_wave = NULL; return PROJECTM_PARSE_ERROR; } current_wave = NULL; if (PARSE_DEBUG) printf("parse_wave (per_frame): [finished parsing equation] (LINE %d)\n", line_count); /* Create a new per frame equation */ if ((per_frame_eqn = new PerFrameEqn(custom_wave->per_frame_count++, param, gen_expr)) == NULL) { if (PARSE_DEBUG) printf("parse_wave (per_frame): failed to create a new per frame eqn, out of memory?\n"); delete gen_expr; return PROJECTM_FAILURE; } custom_wave->per_frame_eqn_tree.push_back(per_frame_eqn); if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n", per_frame_eqn->index, custom_wave->id); /* Need to add stuff to string buffer so the editor can read the equations. Why not make a nice little helper function for this? - here it is: */ line_mode = CUSTOM_WAVE_PER_FRAME_LINE_MODE; return PROJECTM_SUCCESS; } /* per point equation case */ if (!strncmp(eqn_type, PER_POINT_STRING, PER_POINT_STRING_LENGTH)) { if (PARSE_DEBUG) printf("parse_wave_helper (per_point): per_pixel equation parsing start...(LINE %d)\n", line_count); /// HACK the parse_line code already parsed the per_pixel variable name. This handles that case /// Parser needs reworked. Don't have time for it. So this is the result. if (init_string) strncpy(string, init_string, strlen(init_string)+1); else { if (parseToken(fs, string) != tEq) { /* parse per pixel operator name */ if (PARSE_DEBUG) printf("parse_wave_helper (per_point): equal operator missing after per pixel operator. Last token = \"%s\" (LINE %d)\n", string, line_count); return PROJECTM_PARSE_ERROR; } } /* Parse right side of equation as an expression, First tell parser we are parsing a custom wave */ current_wave = custom_wave; if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_wave_helper (per_point): equation evaluated to null? (LINE %d)\n", line_count); return PROJECTM_PARSE_ERROR; } /* Add the per point equation */ if (custom_wave->add_per_point_eqn(string, gen_expr) < 0) { delete gen_expr; return PROJECTM_PARSE_ERROR; } // This tells the parser we are no longer parsing a custom wave current_wave = NULL; line_mode = CUSTOM_WAVE_PER_POINT_LINE_MODE; if (PARSE_DEBUG) printf("parse_wave_helper (per_point): [finished] (custom wave id = %d)\n", custom_wave->id); return PROJECTM_SUCCESS; } return PROJECTM_FAILURE; } /* Parses custom shape equations */ int Parser::parse_shape(char * token, std::istream & fs, MilkdropPreset * preset) { int id; char * eqn_type; CustomShape * custom_shape; if (token == NULL) return PROJECTM_FAILURE; // if (fs == NULL) // EDIT BY SJ // return PROJECTM_FAILURE; if (preset == NULL) return PROJECTM_FAILURE; /* Grab custom shape id and equation type (per frame or per point) from string token */ if (parse_shape_prefix(token, &id, &eqn_type) < 0) { if (PARSE_DEBUG) printf("parse_shape: syntax error in custom shape prefix!\n"); return PROJECTM_PARSE_ERROR; } /* Retrieve custom shape associated with this id */ if ((custom_shape = MilkdropPreset::find_custom_object(id,preset->customShapes)) == NULL) return PROJECTM_FAILURE; /* per frame init equation case */ if (!strncmp(eqn_type, SHAPE_INIT_STRING, SHAPE_INIT_STRING_LENGTH)) { return parse_shape_per_frame_init_eqn(fs, custom_shape, preset); } /* per frame equation case */ if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH)) { return parse_shape_per_frame_eqn(fs, custom_shape, preset); } /* Syntax error, return parse error */ return PROJECTM_PARSE_ERROR; } /* Helper function to update the string buffers used by the editor */ /* Helper function: returns the length of the prefix portion in the line buffer (the passed string here). In other words, given the string 'per_frame_1 = x = ....', return the length of 'per_frame_1 = ' Returns -1 if syntax error */ int Parser::get_string_prefix_len(char * string) { int i = 0; /* Null argument check */ if (string == NULL) return PROJECTM_FAILURE; /* First find the equal sign */ while (string[i] != '=') { if (string[i] == 0) return PROJECTM_FAILURE; i++; } /* If the string already ends at the next char then give up */ if (string[i+1] == 0) return PROJECTM_FAILURE; /* Move past the equal sign */ i++; /* Now found the start of the LHS variable, ie skip the spaces */ while(string[i] == ' ') { i++; } /* If this is the end of the string then its a syntax error */ if (string[i] == 0) return PROJECTM_FAILURE; /* Finished successfully, return the length */ return i; } int Parser::parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset) { InitCond * init_cond; if (PARSE_DEBUG) printf("parse_shape (per frame init): [begin] (LINE %d)\n", line_count); /* Parse the per frame equation */ if ((init_cond = parse_per_frame_init_eqn(fs, preset, &custom_shape->param_tree)) == NULL) { if (PARSE_DEBUG) printf("parse_shape (per frame init): equation parsing failed (LINE %d)\n", line_count); return PROJECTM_PARSE_ERROR; } /// \idea possibly a good place to update a string buffer; line_mode = CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE; init_cond->evaluate(true); return PROJECTM_SUCCESS; } int Parser::parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset) { Param * param; GenExpr * gen_expr; PerFrameEqn * per_frame_eqn; char string[MAX_TOKEN_SIZE]; if (PARSE_DEBUG) printf("parse_shape (per_frame): [start] (custom shape id = %d)\n", custom_shape->id); if (parseToken(fs, string) != tEq) { if (PARSE_DEBUG) printf("parse_shape (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); return PROJECTM_PARSE_ERROR; } /* Find the parameter associated with the string in the custom shape database */ if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(string, &custom_shape->param_tree)) == NULL) { if (PARSE_DEBUG) printf("parse_shape (per_frame): parameter \"%s\" not found or cannot be wipemalloc'ed!!\n", string); return PROJECTM_FAILURE; } /* Make sure parameter is writable */ if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) printf("parse_shape (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); return PROJECTM_PARSE_ERROR; } /* Parse right side of equation as an expression */ current_shape = custom_shape; if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_shape (per_frame): equation evaluated to null (LINE %d)\n", line_count); current_shape = NULL; return PROJECTM_PARSE_ERROR; } current_shape = NULL; if (PARSE_DEBUG) printf("parse_shape (per_frame): [finished parsing equation] (LINE %d)\n", line_count); /* Create a new per frame equation */ if ((per_frame_eqn = new PerFrameEqn(custom_shape->per_frame_count++, param, gen_expr)) == NULL) { if (PARSE_DEBUG) printf("parse_shape (per_frame): failed to create a new per frame eqn, out of memory?\n"); delete gen_expr; return PROJECTM_FAILURE; } custom_shape->per_frame_eqn_tree.push_back(per_frame_eqn); /// \idea add string buffer update for easy >> and << line_mode = CUSTOM_SHAPE_PER_FRAME_LINE_MODE; return PROJECTM_SUCCESS; } int Parser::parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, MilkdropPreset * preset) { Param * param; GenExpr * gen_expr; PerFrameEqn * per_frame_eqn; char string[MAX_TOKEN_SIZE]; if (PARSE_DEBUG) printf("parse_wave (per_frame): [start] (custom shape id = %d)\n", custom_wave->id); if (parseToken(fs, string) != tEq) { if (PARSE_DEBUG) printf("parse_wave (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); return PROJECTM_PARSE_ERROR; } /* Find the parameter associated with the string in the custom shape database */ if ((param = ParamUtils::find<ParamUtils::AUTO_CREATE>(string, &custom_wave->param_tree)) == NULL) { if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter \"%s\" not found or cannot be wipemalloc'ed!!\n", string); return PROJECTM_FAILURE; } /* Make sure parameter is writable */ if (param->flags & P_FLAG_READONLY) { if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); return PROJECTM_FAILURE; } /* Parse right side of equation as an expression */ current_wave = custom_wave; if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { if (PARSE_DEBUG) printf("parse_wave (per_frame): equation evaluated to null (LINE %d)\n", line_count); current_wave = NULL; return PROJECTM_PARSE_ERROR; } current_wave = NULL; if (PARSE_DEBUG) printf("parse_wave (per_frame): [finished parsing equation] (LINE %d)\n", line_count); /* Create a new per frame equation */ if ((per_frame_eqn = new PerFrameEqn(custom_wave->per_frame_count++, param, gen_expr)) == NULL) { if (PARSE_DEBUG) printf("parse_wave (per_frame): failed to create a new per frame eqn, out of memory?\n"); delete gen_expr; return PROJECTM_FAILURE; } custom_wave->per_frame_eqn_tree.push_back(per_frame_eqn); if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n", per_frame_eqn->index, custom_wave->id); /* Need to add stuff to string buffer so the editor can read the equations. Why not make a nice little helper function for this? - here it is: */ line_mode = CUSTOM_WAVE_PER_FRAME_LINE_MODE; return PROJECTM_SUCCESS; } bool Parser::wrapsToNextLine(const std::string & str) { std::size_t lastLineEndIndex = lastLinePrefix.find_last_not_of("0123456789"); std::size_t thisLineEndIndex = str.find_last_not_of("0123456789"); std::size_t startIndex = 0; if ((str.compare(startIndex, lastLineEndIndex, lastLinePrefix.c_str(), thisLineEndIndex)) == 0) return true; else return false; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/Parser.hpp�������������������������������������0000775�0000000�0000000�00000016175�12660066715�0024603�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * MilkdropPreset parser * * $Log$ */ #ifndef _PARSER_H #define _PARSER_H //#define PARSE_DEBUG 2 #define PARSE_DEBUG 0 #include <stdio.h> #include "Expr.hpp" #include "PerFrameEqn.hpp" #include "InitCond.hpp" #include "MilkdropPreset.hpp" /* Strings that prefix (and denote the type of) equations */ #define PER_FRAME_STRING "per_frame_" #define PER_FRAME_STRING_LENGTH 10 #define PER_PIXEL_STRING "per_pixel_" #define PER_PIXEL_STRING_LENGTH 10 #define PER_FRAME_INIT_STRING "per_frame_init_" #define PER_FRAME_INIT_STRING_LENGTH 15 #define WAVECODE_STRING "wavecode_" #define WAVECODE_STRING_LENGTH 9 #define WAVE_STRING "wave_" #define WAVE_STRING_LENGTH 5 #define PER_POINT_STRING "per_point" #define PER_POINT_STRING_LENGTH 9 #define PER_FRAME_STRING_NO_UNDERSCORE "per_frame" #define PER_FRAME_STRING_NO_UNDERSCORE_LENGTH 9 #define SHAPECODE_STRING "shapecode_" #define SHAPECODE_STRING_LENGTH 10 #define WARP_STRING "warp_" #define WARP_STRING_LENGTH 5 #define COMPOSITE_STRING "comp_" #define COMPOSITE_STRING_LENGTH 5 #define SHAPE_STRING "shape_" #define SHAPE_STRING_LENGTH 6 #define SHAPE_INIT_STRING "init" #define SHAPE_INIT_STRING_LENGTH 4 #define WAVE_INIT_STRING "init" #define WAVE_INIT_STRING_LENGTH 4 #include <set> typedef enum { UNSET_LINE_MODE, PER_FRAME_LINE_MODE, PER_PIXEL_LINE_MODE, PER_FRAME_INIT_LINE_MODE, INIT_COND_LINE_MODE, CUSTOM_WAVE_PER_POINT_LINE_MODE, CUSTOM_WAVE_PER_FRAME_LINE_MODE, CUSTOM_WAVE_WAVECODE_LINE_MODE, CUSTOM_SHAPE_SHAPECODE_LINE_MODE, CUSTOM_SHAPE_PER_FRAME_LINE_MODE, CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE, CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE } line_mode_t; /** Token enumeration type */ typedef enum { tEOL, /* end of a line, usually a '/n' or '/r' */ tEOF, /* end of file */ tLPr, /* ( */ tRPr, /* ) */ tLBr, /* [ */ tRBr, /* ] */ tEq, /* = */ tPlus, /* + */ tMinus, /* - */ tMult, /* * */ tMod, /* % */ tDiv, /* / */ tOr, /* | */ tAnd, /* & */ tComma, /* , */ tPositive, /* + as a prefix operator */ tNegative, /* - as a prefix operator */ tSemiColon, /* ; */ tStringTooLong, /* special token to indicate an invalid string length */ tStringBufferFilled /* the string buffer for this line is maxed out */ } sj_token_t; class CustomShape; class CustomWave; class GenExpr; class InfixOp; class PerFrameEqn; class MilkdropPreset; class TreeExpr; class Parser { public: static std::string lastLinePrefix; static line_mode_t line_mode; static CustomWave *current_wave; static CustomShape *current_shape; static int string_line_buffer_index; static char string_line_buffer[STRING_LINE_SIZE]; static unsigned int line_count; static int per_frame_eqn_count; static int per_frame_init_eqn_count; static int last_custom_wave_id; static int last_custom_shape_id; static char last_eqn_type[MAX_TOKEN_SIZE]; static int last_token_size; static bool tokenWrapAroundEnabled; static PerFrameEqn *parse_per_frame_eqn( std::istream & fs, int index, MilkdropPreset * preset); static int parse_per_pixel_eqn( std::istream & fs, MilkdropPreset * preset, char * init_string); static InitCond *parse_init_cond( std::istream & fs, char * name, MilkdropPreset * preset ); static int parse_preset_name( std::istream & fs, char * name ); static int parse_top_comment( std::istream & fs ); static int parse_line( std::istream & fs, MilkdropPreset * preset ); static int get_string_prefix_len(char * string); static TreeExpr * insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root); static TreeExpr * insert_infix_op(InfixOp * infix_op, TreeExpr ** root); static sj_token_t parseToken(std::istream & fs, char * string); static GenExpr ** parse_prefix_args(std::istream & fs, int num_args, MilkdropPreset * preset); static GenExpr * parse_infix_op(std::istream & fs, sj_token_t token, TreeExpr * tree_expr, MilkdropPreset * preset); static GenExpr * parse_sign_arg(std::istream & fs); static int parse_float(std::istream & fs, float * float_ptr); static int parse_int(std::istream & fs, int * int_ptr); static int insert_gen_rec(GenExpr * gen_expr, TreeExpr * root); static int insert_infix_rec(InfixOp * infix_op, TreeExpr * root); static GenExpr * parse_gen_expr(std::istream & fs, TreeExpr * tree_expr, MilkdropPreset * preset); static PerFrameEqn * parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, MilkdropPreset * preset); static InitCond * parse_per_frame_init_eqn(std::istream & fs, MilkdropPreset * preset, std::map<std::string,Param*> * database); static int parse_wavecode_prefix(char * token, int * id, char ** var_string); static int parse_wavecode(char * token, std::istream & fs, MilkdropPreset * preset); static int parse_wave_prefix(char * token, int * id, char ** eqn_string); static int parse_wave_helper(std::istream & fs, MilkdropPreset * preset, int id, char * eqn_type, char * init_string); static int parse_shapecode(char * eqn_string, std::istream & fs, MilkdropPreset * preset); static int parse_shapecode_prefix(char * token, int * id, char ** var_string); static void parse_string_block(std::istream & fs, std::string * out_string); static bool scanForComment(std::istream & fs); static int parse_wave(char * eqn_string, std::istream & fs, MilkdropPreset * preset); static int parse_shape(char * eqn_string, std::istream & fs, MilkdropPreset * preset); static int parse_shape_prefix(char * token, int * id, char ** eqn_string); static void readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround = true, const std::set<char> & skipList = std::set<char>()) ; static int string_to_float(char * string, float * float_ptr); static int parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset); static int parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset); static int parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, MilkdropPreset * preset); static bool wrapsToNextLine(const std::string & str); }; #endif /** !_PARSER_H */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PerFrameEqn.cpp��������������������������������0000664�0000000�0000000�00000003660�12660066715�0025477�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "../fatal.h" #include "../Common.hpp" #include "Param.hpp" #include "PerFrameEqn.hpp" #include "Eval.hpp" #include "Expr.hpp" #include "../wipemalloc.h" #include <cassert> /* Evaluate an equation */ void PerFrameEqn::evaluate() { if (PER_FRAME_EQN_DEBUG) { printf("per_frame_%d=%s= ", index, param->name.c_str()); fflush(stdout); } //*((float*)per_frame_eqn->param->engine_val) = eval_gen_expr(per_frame_eqn->gen_expr); assert(gen_expr); assert(param); param->set_param(gen_expr->eval_gen_expr(-1,-1)); if (PER_FRAME_EQN_DEBUG) printf(" = %.4f\n", *((float*)param->engine_val)); } /* Frees perframe equation structure. Warning: assumes gen_expr pointer is not freed by anyone else! */ PerFrameEqn::~PerFrameEqn() { delete gen_expr; // param is freed in param_tree container of some other class } /* Create a new per frame equation */ PerFrameEqn::PerFrameEqn(int _index, Param * _param, GenExpr * _gen_expr) : index(_index), param(_param), gen_expr(_gen_expr) {} ��������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PerFrameEqn.hpp��������������������������������0000775�0000000�0000000�00000002746�12660066715�0025513�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Per-frame equation * * $Log$ */ #ifndef _PER_FRAME_EQN_H #define _PER_FRAME_EQN_H #define PER_FRAME_EQN_DEBUG 0 class GenExpr; class Param; class PerFrameEqn; class PerFrameEqn { public: int index; /* a unique id for each per frame eqn (generated by order in preset files) */ Param *param; /* parameter to be assigned a value */ GenExpr *gen_expr; /* expression that paremeter is equal to */ PerFrameEqn(int index, Param * param, GenExpr * gen_expr); ~PerFrameEqn(); /// Evaluate the per frame equation void evaluate(); }; #endif /** !_PER_FRAME_EQN_H */ ��������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PerPixelEqn.cpp��������������������������������0000664�0000000�0000000�00000004155�12660066715�0025526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include "../fatal.h" #include "../Common.hpp" #include "Expr.hpp" #include "Eval.hpp" #include "Param.hpp" #include "PerPixelEqn.hpp" #include <map> #include "../wipemalloc.h" #include <cassert> /* Evaluates a per pixel equation */ void PerPixelEqn::evaluate(int mesh_i, int mesh_j) { GenExpr * eqn_ptr = 0; eqn_ptr = this->gen_expr; float ** param_matrix = (float**)this->param->matrix; if (param_matrix == 0) { assert(param->engine_val); (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(mesh_i, mesh_j); } else { assert(!(eqn_ptr == NULL || param_matrix == NULL)); param_matrix[mesh_i][mesh_j] = eqn_ptr->eval_gen_expr(mesh_i, mesh_j); /* Now that this parameter has been referenced with a per pixel equation, we let the evaluator know by setting this flag */ /// @bug review and verify this behavior param->matrix_flag = true; param->flags |= P_FLAG_PER_PIXEL; } } PerPixelEqn::PerPixelEqn(int _index, Param * _param, GenExpr * _gen_expr):index(_index), param(_param), gen_expr(_gen_expr) { assert(index >= 0); assert(param != 0); assert(gen_expr != 0); } PerPixelEqn::~PerPixelEqn() { if (gen_expr) delete (gen_expr); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PerPixelEqn.hpp��������������������������������0000775�0000000�0000000�00000003366�12660066715�0025541�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Per-pixel equation * * $Log$ */ #ifndef _PER_PIXEL_EQN_H #define _PER_PIXEL_EQN_H #define PER_PIXEL_EQN_DEBUG 0 #define ZOOM_OP 0 #define ZOOMEXP_OP 1 #define ROT_OP 2 #define CX_OP 3 #define CY_OP 4 #define SX_OP 5 #define SY_OP 6 #define DX_OP 7 #define DY_OP 8 #define WARP_OP 9 #define NUM_OPS 10 /* obviously, this number is dependent on the number of existing per pixel operations */ class GenExpr; class Param; class PerPixelEqn; class Preset; class PerPixelEqn { public: int index; /* used for splay tree ordering. */ int flags; /* primarily to specify if this variable is user-defined */ Param *param; GenExpr *gen_expr; void evalPerPixelEqns( Preset *preset ); void evaluate(int mesh_i, int mesh_j); virtual ~PerPixelEqn(); PerPixelEqn(int index, Param * param, GenExpr * gen_expr); }; #endif /** !_PER_PIXEL_EQN_H */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PerPointEqn.cpp��������������������������������0000664�0000000�0000000�00000004304�12660066715�0025532�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <cassert> #include "../fatal.h" #include "../Common.hpp" #include "CustomWave.hpp" #include "Eval.hpp" #include "Expr.hpp" #include "Param.hpp" #include "PerPixelEqn.hpp" #include "PerPointEqn.hpp" #include <map> #include <iostream> #include "../wipemalloc.h" /* Evaluates a per point equation for the current custom wave given by interface_wave ptr */ void PerPointEqn::evaluate(int i) { float * param_matrix; GenExpr * eqn_ptr; // samples = CustomWave::interface_wave->samples; eqn_ptr = gen_expr; if (param->matrix == NULL) { assert(param->matrix_flag == false); (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(i,-1); return; } else { param_matrix = (float*)param->matrix; // -1 is because per points only use one dimension param_matrix[i] = eqn_ptr->eval_gen_expr(i, -1); /* Now that this parameter has been referenced with a per point equation, we let the evaluator know by setting this flag */ if (!param->matrix_flag) param->matrix_flag = true; } } PerPointEqn::PerPointEqn(int _index, Param * _param, GenExpr * _gen_expr, int _samples): index(_index), samples(_samples), param(_param), gen_expr(_gen_expr) {} PerPointEqn::~PerPointEqn() { delete gen_expr; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PerPointEqn.hpp��������������������������������0000775�0000000�0000000�00000002722�12660066715�0025544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Per-point equation * * $Log$ */ #ifndef _PER_POINT_EQN_H #define _PER_POINT_EQN_H class CustomWave; class GenExpr; class Param; class PerPointEqn; class PerPointEqn { public: int index; int samples; // the number of samples to iterate over Param *param; GenExpr * gen_expr; ~PerPointEqn(); void evaluate(int i); PerPointEqn( int index, Param *param, GenExpr *gen_expr, int samples); }; //inline void eval_per_point_eqn_helper( void *per_point_eqn ) { // ((PerPointEqn *)per_point_eqn)->evalPerPointEqn(); // } #endif /** !_PER_POINT_EQN_H */ ����������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PresetFrameIO.cpp������������������������������0000664�0000000�0000000�00000036323�12660066715�0026001�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "PresetFrameIO.hpp" #include "../wipemalloc.h" #include <math.h> #include <cassert> #include <iostream> #include <cmath> #include "../Renderer/BeatDetect.hpp" PresetInputs::PresetInputs() : PipelineContext() { } void PresetInputs::update(const BeatDetect & music, const PipelineContext & context) { // Reflect new values form the beat detection unit this->bass = music.bass; this->mid = music.mid; this->treb = music.treb; this->bass_att = music.bass_att; this->mid_att = music.mid_att; this->treb_att = music.treb_att; // Reflect new values from the pipeline context this->fps = context.fps; this->time = context.time; this->frame = context.frame; this->progress = context.progress; } void PresetInputs::Initialize ( int gx, int gy ) { int x, y; this->gx =gx; this->gy= gy; /// @bug no clue if this block belongs here // *** progress = 0; frame = 1; x_per_pixel = 0; y_per_pixel = 0; rad_per_pixel = 0; ang_per_pixel = 0; // *** this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x <gx; x++ ) { this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->theta_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x <gx; x++ ) { this->theta_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->origtheta= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->origtheta[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->origrad= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->origrad[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->origx= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->origx[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->origy= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->origy[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } for ( x=0;x<gx;x++ ) { for ( y=0;y<gy;y++ ) { this->origx[x][y]=x/ ( float ) ( gx-1 ); this->origy[x][y]=- ( ( y/ ( float ) ( gy-1 ) )-1 ); this->origrad[x][y]=hypot ( ( this->origx[x][y]-.5 ) *2, ( this->origy[x][y]-.5 ) *2 ) * .7071067; this->origtheta[x][y]=atan2 ( ( ( this->origy[x][y]-.5 ) *2 ), ( ( this->origx[x][y]-.5 ) *2 ) ); } } } PresetOutputs::PresetOutputs() : Pipeline() {} PresetOutputs::~PresetOutputs() { assert(this->gx > 0); for ( int x = 0; x < this->gx; x++ ) { free(this->sx_mesh[x]); free(this->sy_mesh[x]); free(this->dy_mesh[x]); free(this->dx_mesh[x]); free(this->cy_mesh[x]); free(this->cx_mesh[x]); free(this->warp_mesh[x]); free(this->zoom_mesh[x]); free(this->zoomexp_mesh[x]); free(this->rot_mesh[x]); free(this->orig_x[x]); free(this->orig_y[x]); free(this->rad_mesh[x]); } free(this->rad_mesh); free(this->sx_mesh); free(this->sy_mesh); free(this->dy_mesh); free(this->dx_mesh); free(this->cy_mesh); free(this->cx_mesh); free(this->warp_mesh); free(this->zoom_mesh); free(this->zoomexp_mesh); free(this->rot_mesh); free(this->orig_x); free(this->orig_y); } void PresetOutputs::Render(const BeatDetect &music, const PipelineContext &context) { PerPixelMath(context); drawables.clear(); drawables.push_back(&mv); for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) { if( (*pos)->enabled==1) drawables.push_back((*pos)); } for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) { if( (*pos)->enabled==1) drawables.push_back((*pos)); } drawables.push_back(&wave); if(bDarkenCenter==1) drawables.push_back(&darkenCenter); drawables.push_back(&border); compositeDrawables.clear(); compositeDrawables.push_back(&videoEcho); if (bBrighten==1) compositeDrawables.push_back(&brighten); if (bDarken==1) compositeDrawables.push_back(&darken); if (bSolarize==1) compositeDrawables.push_back(&solarize); if (bInvert==1) compositeDrawables.push_back(&invert); } void PresetOutputs::PerPixelMath(const PipelineContext &context) { int x, y; float fZoom2, fZoom2Inv; for (x = 0; x < gx; x++) { for (y = 0; y < gy; y++) { fZoom2 = std::pow(this->zoom_mesh[x][y], std::pow(this->zoomexp_mesh[x][y], rad_mesh[x][y] * 2.0f - 1.0f)); fZoom2Inv = 1.0f / fZoom2; this->x_mesh[x][y] = this->orig_x[x][y] * 0.5f * fZoom2Inv + 0.5f; this->y_mesh[x][y] = this->orig_y[x][y] * 0.5f * fZoom2Inv + 0.5f; } } for (x = 0; x < gx; x++) { for (y = 0; y < gy; y++) { this->x_mesh[x][y] = (this->x_mesh[x][y] - this->cx_mesh[x][y]) / this->sx_mesh[x][y] + this->cx_mesh[x][y]; } } for (x = 0; x < gx; x++) { for (y = 0; y < gy; y++) { this->y_mesh[x][y] = (this->y_mesh[x][y] - this->cy_mesh[x][y]) / this->sy_mesh[x][y] + this->cy_mesh[x][y]; } } float fWarpTime = context.time * this->fWarpAnimSpeed; float fWarpScaleInv = 1.0f / this->fWarpScale; float f[4]; f[0] = 11.68f + 4.0f * cosf(fWarpTime * 1.413f + 10); f[1] = 8.77f + 3.0f * cosf(fWarpTime * 1.113f + 7); f[2] = 10.54f + 3.0f * cosf(fWarpTime * 1.233f + 3); f[3] = 11.49f + 4.0f * cosf(fWarpTime * 0.933f + 5); for (x = 0; x < gx; x++) { for (y = 0; y < gy; y++) { this->x_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * sinf(fWarpTime * 0.333f + fWarpScaleInv * (this->orig_x[x][y] * f[0] - this->orig_y[x][y] * f[3])); this->y_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * cosf(fWarpTime * 0.375f - fWarpScaleInv * (this->orig_x[x][y] * f[2] + this->orig_y[x][y] * f[1])); this->x_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * cosf(fWarpTime * 0.753f - fWarpScaleInv * (this->orig_x[x][y] * f[1] - this->orig_y[x][y] * f[2])); this->y_mesh[x][y] += this->warp_mesh[x][y] * 0.0035f * sinf(fWarpTime * 0.825f + fWarpScaleInv * (this->orig_x[x][y] * f[0] + this->orig_y[x][y] * f[3])); } } for (x = 0; x < gx; x++) { for (y = 0; y < gy; y++) { float u2 = this->x_mesh[x][y] - this->cx_mesh[x][y]; float v2 = this->y_mesh[x][y] - this->cy_mesh[x][y]; float cos_rot = cosf(this->rot_mesh[x][y]); float sin_rot = sinf(this->rot_mesh[x][y]); this->x_mesh[x][y] = u2 * cos_rot - v2 * sin_rot + this->cx_mesh[x][y]; this->y_mesh[x][y] = u2 * sin_rot + v2 * cos_rot + this->cy_mesh[x][y]; } } for (x = 0; x < gx; x++) for (y = 0; y < gy; y++) this->x_mesh[x][y] -= this->dx_mesh[x][y]; for (x = 0; x < gx; x++) for (y = 0; y < gy; y++) this->y_mesh[x][y] -= this->dy_mesh[x][y]; } void PresetOutputs::Initialize ( int gx, int gy ) { assert(gx > 0); this->gx = gx; this->gy= gy; staticPerPixel = true; setStaticPerPixel(gx,gy); assert(this->gx > 0); int x; this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->sx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->sx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->sy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->sy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->dx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->dx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->dy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->dy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->cx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->cx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->cy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->cy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->zoom_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->zoom_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->zoomexp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->zoomexp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->rot_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->rot_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->warp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->warp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( x = 0; x < gx; x++ ) { this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->orig_x = (float **) wipemalloc(gx * sizeof(float *)); for (x = 0; x < gx; x++) { this->orig_x[x] = (float *) wipemalloc(gy * sizeof(float)); } this->orig_y = (float **) wipemalloc(gx * sizeof(float *)); for (x = 0; x < gx; x++) { this->orig_y[x] = (float *) wipemalloc(gy * sizeof(float)); } //initialize reference grid values for (x = 0; x < gx; x++) { for (int y = 0; y < gy; y++) { float origx = x / (float) (gx - 1); float origy = -((y / (float) (gy - 1)) - 1); rad_mesh[x][y]=hypot ( ( origx-.5 ) *2, ( origy-.5 ) *2 ) * .7071067; orig_x[x][y] = (origx - .5) * 2; orig_y[x][y] = (origy - .5) * 2; } } } PresetInputs::~PresetInputs() { for ( int x = 0; x < this->gx; x++ ) { free ( this->origtheta[x] ); free ( this->origrad[x] ); free ( this->origx[x] ); free ( this->origy[x] ); free ( this->x_mesh[x] ); free ( this->y_mesh[x] ); free ( this->rad_mesh[x] ); free ( this->theta_mesh[x] ); } free ( this->origx ); free ( this->origy ); free ( this->origrad ); free ( this->origtheta ); free ( this->x_mesh ); free ( this->y_mesh ); free ( this->rad_mesh ); free ( this->theta_mesh ); this->origx = NULL; this->origy = NULL; this->origtheta = NULL; this->origrad = NULL; this->x_mesh = NULL; this->y_mesh = NULL; this->rad_mesh = NULL; this->theta_mesh = NULL; } void PresetInputs::resetMesh() { int x,y; assert ( x_mesh ); assert ( y_mesh ); assert ( rad_mesh ); assert ( theta_mesh ); for ( x=0;x<this->gx;x++ ) { for ( y=0;y<this->gy;y++ ) { x_mesh[x][y]=this->origx[x][y]; y_mesh[x][y]=this->origy[x][y]; rad_mesh[x][y]=this->origrad[x][y]; theta_mesh[x][y]=this->origtheta[x][y]; } } } #ifdef USE_MERGE_PRESET_CODE void PresetMerger::MergePresets(PresetOutputs & A, PresetOutputs & B, double ratio, int gx, int gy) { double invratio = 1.0 - ratio; //Merge Simple Waveforms // // All the mess is because of Waveform 7, which is two lines. // //Merge Custom Shapes and Custom Waves for (PresetOutputs::cshape_container::iterator pos = A.customShapes.begin(); pos != A.customShapes.end(); ++pos) { (*pos)->a *= invratio; (*pos)->a2 *= invratio; (*pos)->border_a *= invratio; } for (PresetOutputs::cshape_container::iterator pos = B.customShapes.begin(); pos != B.customShapes.end(); ++pos) { (*pos)->a *= ratio; (*pos)->a2 *= ratio; (*pos)->border_a *= ratio; A.customShapes.push_back(*pos); } for (PresetOutputs::cwave_container::iterator pos = A.customWaves.begin(); pos != A.customWaves.end(); ++pos) { (*pos)->a *= invratio; for (int x=0; x < (*pos)->samples; x++) { (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*invratio; } } for (PresetOutputs::cwave_container::iterator pos = B.customWaves.begin(); pos != B.customWaves.end(); ++pos) { (*pos)->a *= ratio; for (int x=0; x < (*pos)->samples; x++) { (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*ratio; } A.customWaves.push_back(*pos); } //Interpolate Per-Pixel mesh for (int x=0;x<gx;x++) { for(int y=0;y<gy;y++) { A.x_mesh[x][y] = A.x_mesh[x][y]* invratio + B.x_mesh[x][y]*ratio; } } for (int x=0;x<gx;x++) { for(int y=0;y<gy;y++) { A.y_mesh[x][y] = A.y_mesh[x][y]* invratio + B.y_mesh[x][y]*ratio; } } //Interpolate PerFrame floats A.screenDecay = A.screenDecay * invratio + B.screenDecay * ratio; A.wave.r = A.wave.r* invratio + B.wave.r*ratio; A.wave.g = A.wave.g* invratio + B.wave.g*ratio; A.wave.b = A.wave.b* invratio + B.wave.b*ratio; A.wave.a = A.wave.a* invratio + B.wave.a*ratio; A.wave.x = A.wave.x* invratio + B.wave.x*ratio; A.wave.y = A.wave.y* invratio + B.wave.y*ratio; A.wave.mystery = A.wave.mystery* invratio + B.wave.mystery*ratio; A.border.outer_size = A.border.outer_size* invratio + B.border.outer_size*ratio; A.border.outer_r = A.border.outer_r* invratio + B.border.outer_r*ratio; A.border.outer_g = A.border.outer_g* invratio + B.border.outer_g*ratio; A.border.outer_b = A.border.outer_b* invratio + B.border.outer_b*ratio; A.border.outer_a = A.border.outer_a* invratio + B.border.outer_a*ratio; A.border.inner_size = A.border.inner_size* invratio + B.border.inner_size*ratio; A.border.inner_r = A.border.inner_r* invratio + B.border.inner_r*ratio; A.border.inner_g = A.border.inner_g* invratio + B.border.inner_g*ratio; A.border.inner_b = A.border.inner_b* invratio + B.border.inner_b*ratio; A.border.inner_a = A.border.inner_a* invratio + B.border.inner_a*ratio; A.mv.a = A.mv.a* invratio + B.mv.a*ratio; A.mv.r = A.mv.r* invratio + B.mv.r*ratio; A.mv.g = A.mv.g* invratio + B.mv.g*ratio; A.mv.b = A.mv.b* invratio + B.mv.b*ratio; A.mv.length = A.mv.length* invratio + B.mv.length*ratio; A.mv.x_num = A.mv.x_num* invratio + B.mv.x_num*ratio; A.mv.y_num = A.mv.y_num* invratio + B.mv.y_num*ratio; A.mv.y_offset = A.mv.y_offset* invratio + B.mv.y_offset*ratio; A.mv.x_offset = A.mv.x_offset* invratio + B.mv.x_offset*ratio; A.fRating = A.fRating* invratio + B.fRating*ratio; A.fGammaAdj = A.fGammaAdj* invratio + B.fGammaAdj*ratio; A.videoEcho.zoom = A.videoEcho.zoom* invratio + B.videoEcho.zoom*ratio; A.videoEcho.a = A.videoEcho.a* invratio + B.videoEcho.a*ratio; A.fWarpAnimSpeed = A.fWarpAnimSpeed* invratio + B.fWarpAnimSpeed*ratio; A.fWarpScale = A.fWarpScale* invratio + B.fWarpScale*ratio; A.fShader = A.fShader* invratio + B.fShader*ratio; //Switch bools and discrete values halfway. Maybe we should do some interesting stuff here. if (ratio > 0.5) { A.videoEcho.orientation = B.videoEcho.orientation; A.textureWrap = B.textureWrap; A.bDarkenCenter = B.bDarkenCenter; A.bRedBlueStereo = B.bRedBlueStereo; A.bBrighten = B.bBrighten; A.bDarken = B.bDarken; A.bSolarize = B.bSolarize; A.bInvert = B.bInvert; A.bMotionVectorsOn = B.bMotionVectorsOn; } return; } #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/MilkdropPresetFactory/PresetFrameIO.hpp������������������������������0000664�0000000�0000000�00000006346�12660066715�0026010�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef PRESET_FRAME_IO_HPP #define PRESET_FRAME_IO_HPP #include <vector> #include "../Renderer/MilkdropWaveform.hpp" #include "../Renderer/Pipeline.hpp" #include "../Renderer/Filters.hpp" #include "CustomShape.hpp" #include "CustomWave.hpp" #include "../Renderer/VideoEcho.hpp" /// Container for all *read only* engine variables a preset requires to /// evaluate milkdrop equations. Every preset object needs a reference to one of these. class PresetInputs : public PipelineContext { public: /* PER_PIXEL VARIBLES BEGIN */ float x_per_pixel; float y_per_pixel; float rad_per_pixel; float ang_per_pixel; /* PER_PIXEL VARIBLES END */ float bass; float mid; float treb; float bass_att; float mid_att; float treb_att; /* variables were added in milkdrop 1.04 */ int gx, gy; float **x_mesh; float **y_mesh; float **rad_mesh; float **theta_mesh; float **origtheta; //grid containing interpolated mesh reference values float **origrad; float **origx; //original mesh float **origy; void resetMesh(); ~PresetInputs(); PresetInputs(); /// Initializes this preset inputs given a mesh size. /// \param gx the width of the mesh /// \param gy the height of the mesh /// \note This must be called before reading values from this class void Initialize(int gx, int gy); /// Updates this preset inputs with the latest values from the /// the pipeline context and beat detection unit void update (const BeatDetect & music, const PipelineContext & context); private: }; /// Container class for all preset writeable engine variables. This is the important glue /// between the presets and renderer to facilitate smooth preset switching /// Every preset object needs a reference to one of these. class PresetOutputs : public Pipeline { public: typedef std::vector<CustomWave*> cwave_container; typedef std::vector<CustomShape*> cshape_container; cwave_container customWaves; cshape_container customShapes; void Initialize(int gx, int gy); PresetOutputs(); ~PresetOutputs(); virtual void Render(const BeatDetect &music, const PipelineContext &context); void PerPixelMath( const PipelineContext &context); /* PER FRAME VARIABLES BEGIN */ float zoom; float zoomexp; float rot; float warp; float sx; float sy; float dx; float dy; float cx; float cy; VideoEcho videoEcho; MilkdropWaveform wave; Border border; MotionVectors mv; DarkenCenter darkenCenter; Brighten brighten; Darken darken; Invert invert; Solarize solarize; int gy,gx; /* PER_FRAME VARIABLES END */ float fRating; float fGammaAdj; bool bDarkenCenter; bool bRedBlueStereo; bool bBrighten; bool bDarken; bool bSolarize; bool bInvert; bool bMotionVectorsOn; float fWarpAnimSpeed; float fWarpScale; float fShader; float **zoom_mesh; float **zoomexp_mesh; float **rot_mesh; float **sx_mesh; float **sy_mesh; float **dx_mesh; float **dy_mesh; float **cx_mesh; float **cy_mesh; float **warp_mesh; float **orig_x; //original mesh float **orig_y; float **rad_mesh; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PCM.cpp��������������������������������������������������������������0000664�0000000�0000000�00000020535�12660066715�0017455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: PCM.c,v 1.3 2006/03/13 20:35:26 psperl Exp $ * * Takes sound data from wherever and hands it back out. * Returns PCM Data or spectrum data, or the derivative of the PCM data */ #include <stdlib.h> #include <stdio.h> #include "Common.hpp" #include "wipemalloc.h" #include "fftsg.h" #include "PCM.hpp" #include <cassert> int PCM::maxsamples = 2048; //initPCM(int samples) // //Initializes the PCM buffer to // number of samples specified. #include <iostream> PCM::PCM() { initPCM( 2048 ); #ifdef DEBUG std::cerr << "[PCM] MAX SAMPLES:" << maxsamples << std::endl; #endif } void PCM::initPCM(int samples) { int i; waveSmoothing = 0; //Allocate memory for PCM data buffer assert(samples == 2048); PCMd = (float **)wipemalloc(2 * sizeof(float *)); PCMd[0] = (float *)wipemalloc(samples * sizeof(float)); PCMd[1] = (float *)wipemalloc(samples * sizeof(float)); //maxsamples=samples; newsamples=0; numsamples = maxsamples; //Initialize buffers to 0 for (i=0;i<samples;i++) { PCMd[0][i]=0; PCMd[1][i]=0; } start=0; //Allocate FFT workspace w= (double *)wipemalloc(maxsamples*sizeof(double)); ip= (int *)wipemalloc(maxsamples*sizeof(int)); ip[0]=0; /** PCM data */ // this->maxsamples = 2048; // this->numsamples = 0; // this->pcmdataL = NULL; // this->pcmdataR = NULL; /** Allocate PCM data structures */ pcmdataL=(float *)wipemalloc(this->maxsamples*sizeof(float)); pcmdataR=(float *)wipemalloc(this->maxsamples*sizeof(float)); } PCM::~PCM() { free(pcmdataL); free(pcmdataR); free(w); free(ip); free(PCMd[0]); free(PCMd[1]); free(PCMd); } #include <iostream> void PCM::addPCMfloat(const float *PCMdata, int samples) { int i,j; for(i=0;i<samples;i++) { j=i+start; if (PCMdata[i] != 0 ) { PCMd[0][j%maxsamples] = PCMdata[i]; PCMd[1][j%maxsamples] = PCMdata[i]; } else { PCMd[0][j % maxsamples] = 0; PCMd[1][j % maxsamples] = 0; } } start+=samples; start=start%maxsamples; newsamples+=samples; if (newsamples>maxsamples) newsamples=maxsamples; numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); getPCM(vdataL,512,0,1,0,0); getPCM(vdataR,512,1,1,0,0); } void PCM::addPCM16Data(const short* pcm_data, short samples) { int i, j; for (i = 0; i < samples; ++i) { j=i+start; PCMd[0][j % maxsamples]=(pcm_data[i * 2 + 0]/16384.0); PCMd[1][j % maxsamples]=(pcm_data[i * 2 + 1]/16384.0); } start = (start + samples) % maxsamples; newsamples+=samples; if (newsamples>maxsamples) newsamples=maxsamples; numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); getPCM(vdataL,512,0,1,0,0); getPCM(vdataR,512,1,1,0,0); } void PCM::addPCM16(short PCMdata[2][512]) { int i,j; int samples=512; for(i=0;i<samples;i++) { j=i+start; if ( PCMdata[0][i] != 0 && PCMdata[1][i] != 0 ) { PCMd[0][j%maxsamples]=(PCMdata[0][i]/16384.0); PCMd[1][j%maxsamples]=(PCMdata[1][i]/16384.0); } else { PCMd[0][j % maxsamples] = (float)0; PCMd[1][j % maxsamples] = (float)0; } } // printf("Added %d samples %d %d %f\n",samples,start,(start+samples)%maxsamples,PCM[0][start+10]); start+=samples; start=start%maxsamples; newsamples+=samples; if (newsamples>maxsamples) newsamples=maxsamples; numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); getPCM(vdataL,512,0,1,0,0); getPCM(vdataR,512,1,1,0,0); } void PCM::addPCM8( unsigned char PCMdata[2][1024]) { int i,j; int samples=1024; for(i=0;i<samples;i++) { j=i+start; if ( PCMdata[0][i] != 0 && PCMdata[1][i] != 0 ) { PCMd[0][j%maxsamples]=( (float)( PCMdata[0][i] - 128.0 ) / 64 ); PCMd[1][j%maxsamples]=( (float)( PCMdata[1][i] - 128.0 ) / 64 ); } else { PCMd[0][j % maxsamples] = 0; PCMd[1][j % maxsamples] = 0; } } // printf("Added %d samples %d %d %f\n",samples,start,(start+samples)%maxsamples,PCM[0][start+10]); start+=samples; start=start%maxsamples; newsamples+=samples; if (newsamples>maxsamples) newsamples=maxsamples; numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); getPCM(vdataL,512,0,1,0,0); getPCM(vdataR,512,1,1,0,0); } void PCM::addPCM8_512( const unsigned char PCMdata[2][512]) { int i,j; int samples=512; for(i=0;i<samples;i++) { j=i+start; if ( PCMdata[0][i] != 0 && PCMdata[1][i] != 0 ) { PCMd[0][j%maxsamples]=( (float)( PCMdata[0][i] - 128.0 ) / 64 ); PCMd[1][j%maxsamples]=( (float)( PCMdata[1][i] - 128.0 ) / 64 ); } else { PCMd[0][j % maxsamples] = 0; PCMd[1][j % maxsamples] = 0; } } // printf("Added %d samples %d %d %f\n",samples,start,(start+samples)%maxsamples,PCM[0][start+10]); start+=samples; start=start%maxsamples; newsamples+=samples; if (newsamples>maxsamples) newsamples=maxsamples; numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); getPCM(vdataL,512,0,1,0,0); getPCM(vdataR,512,1,1,0,0); } //puts sound data requested at provided pointer // //samples is number of PCM samples to return //freq = 0 gives PCM data //freq = 1 gives FFT data //smoothing is the smoothing coefficient //returned values are normalized from -1 to 1 void PCM::getPCM(float *PCMdata, int samples, int channel, int freq, float smoothing, int derive) { int i,index; index=start-1; if (index<0) index=maxsamples+index; PCMdata[0]=PCMd[channel][index]; for(i=1;i<samples;i++) { index=start-1-i; if (index<0) index=maxsamples+index; PCMdata[i]=(1-smoothing)*PCMd[channel][index]+smoothing*PCMdata[i-1]; } //return derivative of PCM data if(derive) { for(i=0;i<samples-1;i++) { PCMdata[i]=PCMdata[i]-PCMdata[i+1]; } PCMdata[samples-1]=0; } //return frequency data instead of PCM (perform FFT) if (freq) { double temppcm[1024]; for (int i=0;i<samples;i++) {temppcm[i]=(double)PCMdata[i];} rdft(samples, 1, temppcm, ip, w); for (int j=0;j<samples;j++) {PCMdata[j]=(float)temppcm[j];} } } //getPCMnew // //Like getPCM except it returns all new samples in the buffer //the actual return value is the number of samples, up to maxsamples. //the passed pointer, PCMData, must bee able to hold up to maxsamples int PCM::getPCMnew(float *PCMdata, int channel, int freq, float smoothing, int derive, int reset) { int i,index; index=start-1; if (index<0) index=maxsamples+index; PCMdata[0]=PCMd[channel][index]; for(i=1;i<newsamples;i++) { index=start-1-i; if (index<0) index=maxsamples+index; PCMdata[i]=(1-smoothing)*PCMd[channel][index]+smoothing*PCMdata[i-1]; } //return derivative of PCM data if(derive) { for(i=0;i<newsamples-1;i++) { PCMdata[i]=PCMdata[i]-PCMdata[i+1]; } PCMdata[newsamples-1]=0; } //return frequency data instead of PCM (perform FFT) // if (freq) rdft(samples, 1, PCMdata, ip, w); i=newsamples; if (reset) newsamples=0; return i; } //Free stuff void PCM::freePCM() { free(PCMd[0]); free(PCMd[1]); free(PCMd); free(ip); free(w); PCMd = NULL; ip = NULL; w = NULL; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PCM.hpp��������������������������������������������������������������0000775�0000000�0000000�00000004020�12660066715�0017454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Encapsulation of raw sound buffer. Used in beat detection * * $Log$ */ #ifndef _PCM_H #define _PCM_H #include "dlldefs.h" class #ifdef WIN32 DLLEXPORT #endif PCM { public: float **PCMd; int start; /** Use wave smoothing */ float waveSmoothing; int *ip; double *w; int newsamples; int numsamples; //size of new PCM info float *pcmdataL; //holder for most recent pcm data float *pcmdataR; //holder for most recent pcm data /** PCM data */ float vdataL[512]; //holders for FFT data (spectrum) float vdataR[512]; static int maxsamples; PCM(); ~PCM(); void initPCM(int maxsamples); void addPCMfloat(const float *PCMdata, int samples); void addPCM16(short [2][512]); void addPCM16Data(const short* pcm_data, short samples); void addPCM8( unsigned char [2][1024]); void addPCM8_512( const unsigned char [2][512]); void getPCM(float *data, int samples, int channel, int freq, float smoothing, int derive); void freePCM(); int getPCMnew(float *PCMdata, int channel, int freq, float smoothing, int derive,int reset); }; #endif /** !_PCM_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PipelineMerger.cpp���������������������������������������������������0000664�0000000�0000000�00000006363�12660066715�0021750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "PipelineMerger.hpp" #include "Renderer/RenderItemMatcher.hpp" #include "Renderer/RenderItemMergeFunction.hpp" const double PipelineMerger::e(2.71828182845904523536); const double PipelineMerger::s(0.5); void PipelineMerger::mergePipelines(const Pipeline & a, const Pipeline & b, Pipeline & out, RenderItemMatcher::MatchResults & results, RenderItemMergeFunction & mergeFunction, float ratio) { const double x = ( ratio - 0.5 ) * 20; const double sigmoid = 1.0 / ( 1.0 + e - s * x ); const double invratio = 1.0 - ratio; out.textureWrap = ( ratio < 0.5 ) ? a.textureWrap : b.textureWrap; out.screenDecay = lerp ( b.screenDecay, a.screenDecay, ratio ); out.drawables.clear(); out.compositeDrawables.clear(); for ( std::vector<RenderItem*>::const_iterator pos = a.drawables.begin(); pos != a.drawables.end(); ++pos ) { ( *pos )->masterAlpha = invratio; out.drawables.push_back ( *pos ); } for ( std::vector<RenderItem*>::const_iterator pos = b.drawables.begin(); pos != b.drawables.end();++pos ) { ( *pos )->masterAlpha = ratio; out.drawables.push_back ( *pos ); } if(ratio < 0.5) { const double local_ratio = (invratio - 0.5) * 2; for (std::vector<RenderItem*>::const_iterator pos = a.compositeDrawables.begin(); pos != a.compositeDrawables.end(); ++pos) { (*pos)->masterAlpha = local_ratio; out.compositeDrawables.push_back(*pos); } } else { const double local_ratio = (ratio - 0.5) * 2; for (std::vector<RenderItem*>::const_iterator pos = b.compositeDrawables.begin(); pos != b.compositeDrawables.end();++pos) { (*pos)->masterAlpha = local_ratio; out.compositeDrawables.push_back(*pos); } } /* for (RenderItemMatchList::iterator pos = results.matches.begin(); pos != results.matches.end(); ++pos) { RenderItem * itemA = pos->first; RenderItem * itemB = pos->second; RenderItem * itemC = mergeFunction(itemA, itemB, ratio); if (itemC == 0) { itemA->masterAlpha = ratio; out.drawables.push_back(itemA); itemB->masterAlpha = invratio; out.drawables.push_back(itemB); } else out.drawables.push_back(itemC); } for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedLeft.begin(); pos != results.unmatchedLeft.end(); ++pos) { (*pos)->masterAlpha = invratio; out.drawables.push_back(*pos); } for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedRight.begin(); pos != results.unmatchedRight.end(); ++pos) { (*pos)->masterAlpha = ratio; out.drawables.push_back(*pos); } */ if (a.staticPerPixel && b.staticPerPixel) { out.staticPerPixel = true; for (int x=0;x<a.gx;x++) { for(int y=0;y<a.gy;y++) { out.x_mesh[x][y] = a.x_mesh[x][y]* invratio + b.x_mesh[x][y]*ratio; } } for (int x=0;x<a.gx;x++) { for(int y=0;y<a.gy;y++) { out.y_mesh[x][y] = a.y_mesh[x][y]* invratio + b.y_mesh[x][y]*ratio; } } } if(ratio < 0.5) { out.compositeShader = a.compositeShader; out.warpShader = a.warpShader; } else { out.compositeShader = b.compositeShader; out.warpShader = b.warpShader; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PipelineMerger.hpp���������������������������������������������������0000664�0000000�0000000�00000001124�12660066715�0021743�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef PRESET_MERGE_HPP #define PRESET_MERGE_HPP #include "Preset.hpp" #include "Renderer/Pipeline.hpp" // EDIT BY SJ #include "Renderer/RenderItemMatcher.hpp" #include "Renderer/RenderItemMergeFunction.hpp" class PipelineMerger { template <class T> inline static T lerp(T a, T b, float ratio) { return a * ratio + b * (1 - ratio); } public: static void mergePipelines(const Pipeline &a, const Pipeline &b, Pipeline &out, RenderItemMatcher::MatchResults & matching, RenderItemMergeFunction & merger, float ratio); private : static const double s; static const double e; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Preset.cpp�����������������������������������������������������������0000775�0000000�0000000�00000001006�12660066715�0020273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Preset.cpp * * Created on: Aug 5, 2008 * Author: struktured */ #include "Preset.hpp" Preset::~Preset() {} Preset::Preset(const std::string & presetName, const std::string & presetAuthor): _name(presetName), _author(presetAuthor) {} void Preset::setName(const std::string & value) { _name = value; } const std::string & Preset::name() const { return _name; } void Preset::setAuthor(const std::string & value) { _author = value; } const std::string & Preset::author() const { return _author; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Preset.hpp�����������������������������������������������������������0000664�0000000�0000000�00000001347�12660066715�0020305�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Preset.hpp * * Created on: Aug 5, 2008 * Author: carm */ #ifndef PRESET_HPP_ #define PRESET_HPP_ #include <string> #include "Renderer/BeatDetect.hpp" #include "Renderer/Pipeline.hpp" #include "Renderer/PipelineContext.hpp" class Preset { public: Preset(const std::string & name=std::string(), const std::string & author = std::string()); virtual ~Preset(); void setName(const std::string & value); const std::string & name() const; void setAuthor(const std::string & value); const std::string & author() const; virtual Pipeline & pipeline() = 0; virtual void Render(const BeatDetect &music, const PipelineContext &context) = 0; private: std::string _name; std::string _author; }; #endif /* PRESET_HPP_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PresetChooser.hpp����������������������������������������������������0000664�0000000�0000000�00000015770�12660066715�0021635�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef PRESET_CHOOSER_HPP #define PRESET_CHOOSER_HPP #include "Preset.hpp" #include "PresetLoader.hpp" #include "RandomNumberGenerators.hpp" #include <cassert> #include <memory> #include <iostream> class PresetChooser; /// A simple iterator class to traverse back and forth a preset directory class PresetIterator { public: PresetIterator() {} /// Instantiate a preset iterator at the given starting position PresetIterator(std::size_t start); /// Move iterator forward void operator++(); /// Move iterator backword void operator--() ; /// Not equal comparator bool operator !=(const PresetIterator & presetPos) const ; /// Equality comparator bool operator ==(const PresetIterator & presetPos) const ; /// Returns an integer value representing the iterator position /// @bug might become internal /// \brief Returns the indexing value used by the current iterator. std::size_t operator*() const; /// Allocate a new preset given this iterator's associated preset name /// \param presetInputs the preset inputs to associate with the preset upon construction /// \param presetOutputs the preset outputs to associate with the preset upon construction /// \returns an autopointer of the newly allocated preset std::auto_ptr<Preset> allocate(); /// Set the chooser asocciated with this iterator void setChooser(const PresetChooser & chooser); private: std::size_t _currentIndex; const PresetChooser * _presetChooser; }; /// Provides functions and iterators to select presets. Requires a preset loader upon construction class PresetChooser { public: typedef PresetIterator iterator; /// Initializes a chooser with an established preset loader. /// \param presetLoader an initialized preset loader to choose presets from /// \note The preset loader is refreshed via events or otherwise outside this class's scope PresetChooser(const PresetLoader & presetLoader, bool softCutRatingsEnabled); inline void setSoftCutRatingsEnabled(bool enabled) { _softCutRatingsEnabled = enabled; } /// Choose a preset via the passed in index. Must be between 0 and num valid presets in directory /// \param index An index lying in the interval [0, this->getNumPresets()) /// \param presetInputs the preset inputs to associate with the preset upon construction /// \param presetOutputs the preset outputs to associate with the preset upon construction /// \returns an auto pointer of the newly allocated preset std::auto_ptr<Preset> directoryIndex(std::size_t index) const; /// Gets the number of presets last believed to exist in the preset loader's filename collection /// \returns the number of presets in the collection std::size_t size() const; /// An STL-esque iterator to begin traversing presets from a directory /// \param index the index to begin iterating at. Assumed valid between [0, num presets) /// \returns the position of the first preset in the collection PresetIterator begin(unsigned int index) const; /// An STL-esque iterator to begin traversing presets from a directory /// \returns the position of the first preset in the collection PresetIterator begin(); /// An STL-esque iterator to retrieve an end position from a directory /// \returns the end position of the collection PresetIterator end() const; /// Perform a weighted sample to select a preset (uses preset rating values) /// \returns an iterator to the randomly selected preset iterator weightedRandom(bool hardCut) const; /// True if no presets in directory bool empty() const; inline void nextPreset(PresetIterator & presetPos); inline void previousPreset(PresetIterator & presetPos); private: std::vector<float> sampleWeights; const PresetLoader * _presetLoader; bool _softCutRatingsEnabled; }; inline PresetChooser::PresetChooser(const PresetLoader & presetLoader, bool softCutRatingsEnabled):_presetLoader(&presetLoader), _softCutRatingsEnabled(softCutRatingsEnabled) { } inline std::size_t PresetChooser::size() const { return _presetLoader->size(); } inline void PresetIterator::setChooser(const PresetChooser & chooser) { _presetChooser = &chooser; } inline std::size_t PresetIterator::operator*() const { return _currentIndex; } inline PresetIterator::PresetIterator(std::size_t start):_currentIndex(start) {} inline void PresetIterator::operator++() { assert(_currentIndex < _presetChooser->size()); _currentIndex++; } inline void PresetIterator::operator--() { assert(_currentIndex > 0); _currentIndex--; } inline bool PresetIterator::operator !=(const PresetIterator & presetPos) const { return (*presetPos != **this); } inline bool PresetIterator::operator ==(const PresetIterator & presetPos) const { return (*presetPos == **this); } inline std::auto_ptr<Preset> PresetIterator::allocate() { return _presetChooser->directoryIndex(_currentIndex); } inline void PresetChooser::nextPreset(PresetIterator & presetPos) { if (this->empty()) { return; } // Case: idle preset currently running, selected first preset of chooser else if (presetPos == this->end()) presetPos = this->begin(); else ++(presetPos); // Case: already at last preset, loop to beginning if (((presetPos) == this->end())) { presetPos = this->begin(); } } inline void PresetChooser::previousPreset(PresetIterator & presetPos) { if (this->empty()) return; // Case: idle preset currently running, selected last preset of chooser else if (presetPos == this->end()) { --(presetPos); } else if (presetPos != this->begin()) { --(presetPos); } else { presetPos = this->end(); --(presetPos); } } inline PresetIterator PresetChooser::begin() { PresetIterator pos(0); pos.setChooser(*this); return pos; } inline PresetIterator PresetChooser::begin(unsigned int index) const{ PresetIterator pos(index); pos.setChooser(*this); return pos; } inline PresetIterator PresetChooser::end() const { PresetIterator pos(_presetLoader->size()); pos.setChooser(*this); return pos; } inline bool PresetChooser::empty() const { return _presetLoader->size() == 0; } inline std::auto_ptr<Preset> PresetChooser::directoryIndex(std::size_t index) const { return _presetLoader->loadPreset(index); } inline PresetChooser::iterator PresetChooser::weightedRandom(bool hardCut) const { // TODO make a sophisticated function object interface to determine why a certain rating // category is chosen, or weighted distribution thereover. const PresetRatingType ratingType = hardCut || (!_softCutRatingsEnabled) ? HARD_CUT_RATING_TYPE : SOFT_CUT_RATING_TYPE; const std::size_t ratingsTypeIndex = static_cast<std::size_t>(ratingType); const std::vector<int> & weights = _presetLoader->getPresetRatings()[ratingsTypeIndex]; const std::size_t index = RandomNumberGenerators::weightedRandom (weights, _presetLoader->getPresetRatingsSums()[ratingsTypeIndex]); return begin(index); } #endif ��������silverjuke-16.2.3/src/prjm/src/PresetFactory.cpp����������������������������������������������������0000664�0000000�0000000�00000001434�12660066715�0021625�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "PresetFactory.hpp" const std::string PresetFactory::IDLE_PRESET_PROTOCOL("idle"); std::string PresetFactory::protocol(const std::string & url, std::string & path) { #ifdef __APPLE__ // NOTE: Brian changed this from url.find_first_of to url.find, since presumably we want to find the first occurence of // :// and not the first occurence of any colon or forward slash. At least that fixed a bug in the Mac OS X build. std::size_t pos = url.find("://"); #else std::size_t pos = url.find_first_of("://"); #endif if (pos == std::string::npos) return std::string(); else { path = url.substr(pos + 3, url.length()); std::cout << "[PresetFactory] path is " << path << std::endl; std::cout << "[PresetFactory] url is " << url << std::endl; return url.substr(0, pos); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PresetFactory.hpp����������������������������������������������������0000664�0000000�0000000�00000002015�12660066715�0021626�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Interface: PresetFactory // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "Preset.hpp" #include <memory> #ifndef __PRESET_FACTORY_HPP #define __PRESET_FACTORY_HPP class PresetFactory { public: static const std::string IDLE_PRESET_PROTOCOL; static std::string protocol(const std::string & url, std::string & path); inline PresetFactory() {} inline virtual ~PresetFactory() {} /// Constructs a new preset given an url and optional meta data /// \param url a locational identifier referencing the preset /// \param name the preset name /// \param author the preset author /// \returns a valid preset object virtual std::auto_ptr<Preset> allocate(const std::string & url, const std::string & name=std::string(), const std::string & author=std::string()) = 0; /// Returns a space separated list of supported extensions virtual std::string supportedExtensions() const = 0; }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PresetFactoryManager.cpp���������������������������������������������0000664�0000000�0000000�00000004410�12660066715�0023115�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Implementation: PresetFactoryManager // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #include "PresetFactoryManager.hpp" #ifndef DISABLE_MILKDROP_PRESETS #include "MilkdropPresetFactory/MilkdropPresetFactory.hpp" #endif #ifndef DISABLE_NATIVE_PRESETS #include "NativePresetFactory/NativePresetFactory.hpp" #endif #include <sstream> PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {} PresetFactoryManager::~PresetFactoryManager() { for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin(); pos != _factoryList.end(); ++pos) { assert(*pos); delete(*pos); } initialized = false; } void PresetFactoryManager::initialize(int gx, int gy) { _gx = gx; _gy = gy; if (!initialized) { initialized = true; } else { std::cout << "already initialized " << std::endl; return; } PresetFactory * factory; #ifndef DISABLE_MILKDROP_PRESETS factory = new MilkdropPresetFactory(_gx, _gy); registerFactory(factory->supportedExtensions(), factory); #endif #ifndef DISABLE_NATIVE_PRESETS factory = new NativePresetFactory(); registerFactory(factory->supportedExtensions(), factory); #endif } // Current behavior if a conflict is occurs is to override the previous request void PresetFactoryManager::registerFactory(const std::string & extensions, PresetFactory * factory) { std::stringstream ss(extensions); std::string extension; _factoryList.push_back(factory); while (ss >> extension) { if (_factoryMap.count(extension)) { std::cerr << "[PresetFactoryManager] Warning: extension \"" << extension << "\" already has a factory. New factory handler ignored." << std::endl; } else { _factoryMap.insert(std::make_pair(extension, factory)); } } } PresetFactory & PresetFactoryManager::factory(const std::string & extension) { if (!_factoryMap.count(extension)) { std::ostringstream os; os << "No factory associated with \"" << extension << "\"." << std::endl; throw PresetFactoryException(os.str()); } return *_factoryMap[extension]; } bool PresetFactoryManager::extensionHandled(const std::string & extension) const { return _factoryMap.count(extension); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PresetFactoryManager.hpp���������������������������������������������0000664�0000000�0000000�00000003515�12660066715�0023127�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Implementation: PresetFactoryManager // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008 // // Copyright: See COPYING file that comes with this distribution // // #ifndef __PRESET_FACTORY_MANAGER_HPP #define __PRESET_FACTORY_MANAGER_HPP #include "PresetFactory.hpp" /// A simple exception class to strongly type all preset factory related issues class PresetFactoryException : public std::exception { public: inline PresetFactoryException(const std::string & message) : _message(message) {} virtual ~PresetFactoryException() throw() {} const std::string & message() const { return _message; } private: std::string _message; }; /// A manager of preset factories class PresetFactoryManager { public: PresetFactoryManager(); ~PresetFactoryManager(); /// Initializes the manager with mesh sizes specified /// \param gx the width of the mesh /// \param gy the height of the mesh /// \note This must be called once before any other methods void initialize(int gx, int gy); /// Requests a factory given a preset extension type /// \param extension a string denoting the preset suffix type /// \throws PresetFactoryException if the extension is unhandled /// \returns a valid preset factory associated with the extension PresetFactory & factory(const std::string & extension); /// Tests if an extension has been registered with a factory /// \param extension the file name extension to verify /// \returns true if a factory exists, false otherwise bool extensionHandled(const std::string & extension) const; private: int _gx, _gy; mutable std::map<std::string, PresetFactory *> _factoryMap; mutable std::vector<PresetFactory *> _factoryList; void registerFactory(const std::string & extension, PresetFactory * factory); volatile bool initialized; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PresetLoader.cpp�����������������������������������������������������0000664�0000000�0000000�00000015521�12660066715�0021426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // C++ Implementation: PresetLoader // // Description: // // // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2007 // // Copyright: See COPYING file that comes with this distribution // // #include "PresetLoader.hpp" #include "Preset.hpp" #include "PresetFactory.hpp" #include <iostream> #include <sstream> #include <set> #ifdef LINUX extern "C" { #include <errno.h> } #endif #ifdef MACOS extern "C" { #include <errno.h> } #endif #include <cassert> #include "fatal.h" #include "Common.hpp" PresetLoader::PresetLoader (int gx, int gy, std::string dirname = std::string()) :_dirname ( dirname ), _dir ( 0 ) { _presetFactoryManager.initialize(gx,gy); // Do one scan if ( _dirname != std::string() ) rescan(); else clear(); } PresetLoader::~PresetLoader() { if ( _dir ) closedir ( _dir ); } void PresetLoader::setScanDirectory ( std::string dirname ) { _dirname = dirname; } void PresetLoader::rescan() { // std::cerr << "Rescanning..." << std::endl; // Clear the directory entry collection clear(); // If directory already opened, close it first if ( _dir ) { closedir ( _dir ); _dir = 0; } // Allocate a new a stream given the current directory name if ( ( _dir = opendir ( _dirname.c_str() ) ) == NULL ) { handleDirectoryError(); return; // no files loaded. _entries is empty } struct dirent * dir_entry; std::set<std::string> alphaSortedFileSet; std::set<std::string> alphaSortedPresetNameSet; while ( ( dir_entry = readdir ( _dir ) ) != NULL ) { if (dir_entry->d_name == 0) continue; std::ostringstream out; // Convert char * to friendly string std::string filename ( dir_entry->d_name ); // Verify extension is projectm or milkdrop if (!_presetFactoryManager.extensionHandled(parseExtension(filename))) continue; if ( filename.length() > 0 && filename[0] == '.' ) continue; // Create full path name out << _dirname << PATH_SEPARATOR << filename; // Add to our directory entry collection alphaSortedFileSet.insert ( out.str() ); alphaSortedPresetNameSet.insert ( filename ); // the directory entry struct is freed elsewhere } // Push all entries in order from the file set to the file entries member (which is an indexed vector) for ( std::set<std::string>::iterator pos = alphaSortedFileSet.begin(); pos != alphaSortedFileSet.end();++pos ) _entries.push_back ( *pos ); // Push all preset names in similar fashion for ( std::set<std::string>::iterator pos = alphaSortedPresetNameSet.begin(); pos != alphaSortedPresetNameSet.end();++pos ) _presetNames.push_back ( *pos ); // Give all presets equal rating of 3 - why 3? I don't know _ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList( _presetNames.size(), 3 )); _ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 3 * _presetNames.size()); assert ( _entries.size() == _presetNames.size() ); } std::auto_ptr<Preset> PresetLoader::loadPreset ( unsigned int index ) const { // Check that index isn't insane assert ( index >= 0 ); assert ( index < _entries.size() ); // Return a new autopointer to a preset const std::string extension = parseExtension ( _entries[index] ); return _presetFactoryManager.factory(extension).allocate ( _entries[index], _presetNames[index] ); } std::auto_ptr<Preset> PresetLoader::loadPreset ( const std::string & url ) const { // Return a new autopointer to a preset const std::string extension = parseExtension ( url ); /// @bug probably should not use url for preset name return _presetFactoryManager.factory(extension).allocate (url, url); } void PresetLoader::handleDirectoryError() { #ifdef WIN32 std::cerr << "[PresetLoader] warning: errno unsupported on win32 platforms. fix me" << std::endl; #else switch ( errno ) { case ENOENT: std::cerr << "[PresetLoader] ENOENT error. The path \"" << this->_dirname << "\" probably does not exist. \"man open\" for more info." << std::endl; break; case ENOMEM: std::cerr << "[PresetLoader] out of memory! Are you running Windows?" << std::endl; abort(); case ENOTDIR: std::cerr << "[PresetLoader] directory specified is not a preset directory! Trying to continue..." << std::endl; break; case ENFILE: std::cerr << "[PresetLoader] Your system has reached its open file limit. Trying to continue..." << std::endl; break; case EMFILE: std::cerr << "[PresetLoader] too many files in use by projectM! Bailing!" << std::endl; break; case EACCES: std::cerr << "[PresetLoader] permissions issue reading the specified preset directory." << std::endl; break; default: break; } #endif } void PresetLoader::setRating(unsigned int index, int rating, const PresetRatingType ratingType) { assert ( index >=0 ); const unsigned int ratingTypeIndex = static_cast<unsigned int>(ratingType); assert (index < _ratings[ratingTypeIndex].size()); _ratingsSums[ratingTypeIndex] -= _ratings[ratingTypeIndex][index]; _ratings[ratingTypeIndex][index] = rating; _ratingsSums[ratingType] += rating; } unsigned int PresetLoader::addPresetURL ( const std::string & url, const std::string & presetName, const std::vector<int> & ratings) { _entries.push_back(url); _presetNames.push_back ( presetName ); assert(ratings.size() == TOTAL_RATING_TYPES); assert(ratings.size() == _ratings.size()); for (int i = 0; i < _ratings.size(); i++) _ratings[i].push_back(ratings[i]); for (int i = 0; i < ratings.size(); i++) _ratingsSums[i] += ratings[i]; return _entries.size()-1; } void PresetLoader::removePreset ( unsigned int index ) { _entries.erase ( _entries.begin() + index ); _presetNames.erase ( _presetNames.begin() + index ); for (int i = 0; i < _ratingsSums.size(); i++) { _ratingsSums[i] -= _ratings[i][index]; _ratings[i].erase ( _ratings[i].begin() + index ); } } const std::string & PresetLoader::getPresetURL ( unsigned int index ) const { return _entries[index]; } const std::string & PresetLoader::getPresetName ( unsigned int index ) const { return _presetNames[index]; } int PresetLoader::getPresetRating ( unsigned int index, const PresetRatingType ratingType ) const { return _ratings[ratingType][index]; } const std::vector<RatingList> & PresetLoader::getPresetRatings () const { return _ratings; } const std::vector<int> & PresetLoader::getPresetRatingsSums() const { return _ratingsSums; } void PresetLoader::setPresetName(unsigned int index, std::string name) { _presetNames[index] = name; } void PresetLoader::insertPresetURL ( unsigned int index, const std::string & url, const std::string & presetName, const RatingList & ratings) { _entries.insert ( _entries.begin() + index, url ); _presetNames.insert ( _presetNames.begin() + index, presetName ); for (int i = 0; i < _ratingsSums.size();i++) { _ratingsSums[i] += _ratings[i][index]; _ratings[i].insert ( _ratings[i].begin() + index, ratings[i] ); } assert ( _entries.size() == _presetNames.size() ); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/PresetLoader.hpp�����������������������������������������������������0000664�0000000�0000000�00000007102�12660066715�0021427�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __PRESET_LOADER_HPP #define __PRESET_LOADER_HPP #include <string> // used for path / filename stuff #include <memory> // for auto pointers #include <sys/types.h> #ifdef WIN32 #include <dirent-win32/dirent.h> #endif #ifdef LINUX #include <dirent.h> #endif #ifdef MACOS #include <dirent.h> #endif #include <vector> #include <map> #include "PresetFactoryManager.hpp" class Preset; class PresetFactory; class PresetLoader { public: /// Initializes the preset loader with the target directory specified PresetLoader(int gx, int gy, std::string dirname); ~PresetLoader(); /// Load a preset by specifying it's unique identifier given when the preset url /// was added to this loader std::auto_ptr<Preset> loadPreset(unsigned int index) const; std::auto_ptr<Preset> loadPreset ( const std::string & url ) const; /// Add a preset to the loader's collection. /// \param url an url referencing the preset /// \param presetName a name for the preset /// \param rating an integer representing the goodness of the preset /// \returns The unique index assigned to the preset in the collection. Used with loadPreset unsigned int addPresetURL ( const std::string & url, const std::string & presetName, const RatingList & ratings); /// Add a preset to the loader's collection. /// \param index insertion index /// \param url an url referencing the preset /// \param presetName a name for the preset /// \param rating an integer representing the goodness of the preset void insertPresetURL (unsigned int index, const std::string & url, const std::string & presetName, const RatingList & ratings); /// Clears all presets from the collection inline void clear() { _entries.clear(); _presetNames.clear(); _ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList()); clearRatingsSum(); } inline void clearRatingsSum() { _ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 0); } const std::vector<RatingList> & getPresetRatings() const; const std::vector<int> & getPresetRatingsSums() const; /// Removes a preset from the loader /// \param index the unique identifier of the preset url to be removed void removePreset(unsigned int index); /// Sets the rating of a preset to a new value void setRating(unsigned int index, int rating, const PresetRatingType ratingType); /// Get a preset rating given an index int getPresetRating ( unsigned int index, const PresetRatingType ratingType) const; /// Get a preset url given an index const std::string & getPresetURL ( unsigned int index) const; /// Get a preset name given an index const std::string & getPresetName ( unsigned int index) const; /// Returns the number of presets in the active directory inline std::size_t size() const { return _entries.size(); } /// Sets the directory where the loader will search for files void setScanDirectory(std::string pathname); /// Returns the directory path associated with this preset chooser inline const std::string & directoryName() const { return _dirname; } /// Rescans the active preset directory void rescan(); void setPresetName(unsigned int index, std::string name); private: void handleDirectoryError(); std::string _dirname; DIR * _dir; std::vector<int> _ratingsSums; mutable PresetFactoryManager _presetFactoryManager; // vector chosen for speed, but not great for reverse index lookups std::vector<std::string> _entries; std::vector<std::string> _presetNames; // Indexed by ratingType, preset position. std::vector<RatingList> _ratings; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/RandomNumberGenerators.hpp�������������������������������������������0000664�0000000�0000000�00000005426�12660066715�0023470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef RANDOM_NUMBER_GENERATORS_HPP #define RANDOM_NUMBER_GENERATORS_HPP #include <cmath> #include <vector> #include <cassert> #include <iostream> #define WEIGHTED_RANDOM_DEBUG 0 namespace RandomNumberGenerators { inline float uniform() /* Uniform random number generator x(n+1)= a*x(n) mod c with a = pow(7,5) and c = pow(2,31)-1. Copyright (c) Tao Pang 1997. */ { const int ia=16807,ic=2147483647,iq=127773,ir=2836; int il,ih,it; float rc; static int iseed = rand(); ih = iseed/iq; il = iseed%iq; it = ia*il-ir*ih; if (it > 0) { iseed = it; } else { iseed = ic+it; } rc = ic; return iseed/rc; } inline float gaussian(float mean, float sigma) { float x1, x2, w, y1 /*, y2 */; // EDIT BY SJ do { x1 = 2.0 * uniform() - 1.0; x2 = 2.0 * uniform() - 1.0; w = x1 * x1 + x2 * x2; } while ( w >= 1.0 ); w = sqrt( (-2.0 * log( w ) ) / w ); y1 = x1 * w; //y2 = x2 * w; float ret = y1*sigma + mean; return ret; } inline std::size_t uniformInteger(std::size_t upperBound=1) { /// @bug there was a man entry about how this leads to a lousy uniform /// @bug distribution in practice. should probably review assert(upperBound > 0); return ((rand()) % ((int)upperBound)); } /// Randomizes from probabilistically weighted distribution. Thus, /// sum of passed in weights should be 1.0 inline std::size_t weightedRandomNormalized(std::vector<float> weights) { // Choose a random bounded mass between 0 and 1 float cutoff = ((float)(rand())) / (float)RAND_MAX; //std::cout << "cutoff : " << cutoff << std::endl; // Sum up mass, stopping when cutoff is reached. This is the typical // weighted sampling algorithm. float mass = 0; for (std::size_t i = 0; i< weights.size() ; i++) { mass += weights[i]; //std::cout << "mass: " << mass << std::endl; if (mass >= cutoff) return i; } // Just in case something slips through the cracks return weights.size()-1; } inline std::size_t weightedRandom(const std::vector<int> & weights, unsigned int weightTotalHint = 0) { if (weightTotalHint == 0) { for (std::size_t i = 0; i < weights.size();i++) weightTotalHint += weights[i]; } const int sampledSum = uniformInteger(weightTotalHint); int sum = 0; if (WEIGHTED_RANDOM_DEBUG) std::cout << "[RNG::weightedRandom()] weightTotal = " << weightTotalHint << std::endl; for (std::size_t i = 0; i < weights.size();i++) { if (WEIGHTED_RANDOM_DEBUG) std::cout << "[RNG::weightedRandom()] weight[" << i << "] = " << weights[i] << std::endl; sum += weights[i]; if (sampledSum <= sum) { if (WEIGHTED_RANDOM_DEBUG) std::cout << "[RNG::weightedRandom()] sampled index " << i << "(" << "running sum = " << sum << ", sampled sum = " << sampledSum << std::endl; return i; } } return weights.size()-1; } } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0020073�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/BeatDetect.cpp����������������������������������������������0000664�0000000�0000000�00000010230�12660066715�0022577�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * Takes sound data from wherever and returns beat detection values * Uses statistical Energy-Based methods. Very simple * * Some stuff was taken from Frederic Patin's beat-detection article, * you'll find it online */ #include <stdlib.h> #include <stdio.h> #include "../wipemalloc.h" #include "../Common.hpp" #include "../PCM.hpp" #include <cmath> #include "BeatDetect.hpp" BeatDetect::BeatDetect(PCM *pcm) { int x,y; this->pcm=pcm; this->vol_instant=0; this->vol_history=0; for (y=0;y<80;y++) { this->vol_buffer[y]=0; } this->beat_buffer_pos=0; for (x=0;x<32;x++) { this->beat_instant[x]=0; this->beat_history[x]=0; this->beat_val[x]=1.0; this->beat_att[x]=1.0; this->beat_variance[x]=0; for (y=0;y<80;y++) { this->beat_buffer[x][y]=0; } } this->treb = 0; this->mid = 0; this->bass = 0; this->vol_old = 0; this->beat_sensitivity = 10.00; this->treb_att = 0; this->mid_att = 0; this->bass_att = 0; this->vol = 0; } BeatDetect::~BeatDetect() { } void BeatDetect::reset() { this->treb = 0; this->mid = 0; this->bass = 0; this->treb_att = 0; this->mid_att = 0; this->bass_att = 0; } void BeatDetect::detectFromSamples() { vol_old = vol; bass=0;mid=0;treb=0; getBeatVals(pcm->pcmdataL,pcm->pcmdataR); } void BeatDetect::getBeatVals( float *vdataL,float *vdataR ) { int linear=0; int x,y; float temp2=0; vol_instant=0; for ( x=0;x<16;x++) { beat_instant[x]=0; for ( y=linear*2;y<(linear+8+x)*2;y++) { beat_instant[x]+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/(8+x)); // printf( "beat_instant[%d]: %f %f %f\n", x, beat_instant[x], vdataL[y], vdataR[y] ); vol_instant+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/512.0); } //printf("1"); linear=y/2; beat_history[x]-=(beat_buffer[x][beat_buffer_pos])*.0125; beat_buffer[x][beat_buffer_pos]=beat_instant[x]; beat_history[x]+=(beat_instant[x])*.0125; beat_val[x]=(beat_instant[x])/(beat_history[x]); beat_att[x]+=(beat_instant[x])/(beat_history[x]); //printf("2\n"); } //printf("b\n"); vol_history-=(vol_buffer[beat_buffer_pos])*.0125; vol_buffer[beat_buffer_pos]=vol_instant; vol_history+=(vol_instant)*.0125; mid=0; for(x=1;x<10;x++) { mid+=(beat_instant[x]); temp2+=(beat_history[x]); } mid=mid/(1.5*temp2); temp2=0; treb=0; for(x=10;x<16;x++) { treb+=(beat_instant[x]); temp2+=(beat_history[x]); } //printf("c\n"); treb=treb/(1.5*temp2); // *vol=vol_instant/(1.5*vol_history); vol=vol_instant/(1.5*vol_history); bass=(beat_instant[0])/(1.5*beat_history[0]); if ( projectM_isnan( treb ) ) { treb = 0.0; } if ( projectM_isnan( mid ) ) { mid = 0.0; } if ( projectM_isnan( bass ) ) { bass = 0.0; } treb_att=.6 * treb_att + .4 * treb; mid_att=.6 * mid_att + .4 * mid; bass_att=.6 * bass_att + .4 * bass; if(bass_att>100)bass_att=100; if(bass >100)bass=100; if(mid_att>100)mid_att=100; if(mid >100)mid=100; if(treb_att>100)treb_att=100; if(treb >100)treb=100; if(vol>100)vol=100; // *vol=(beat_instant[3])/(beat_history[3]); beat_buffer_pos++; if( beat_buffer_pos>79)beat_buffer_pos=0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/BeatDetect.hpp����������������������������������������������0000775�0000000�0000000�00000003347�12660066715�0022622�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * Beat detection class. Takes decompressed sound buffers and returns * various characteristics * * $Log$ * */ #ifndef _BEAT_DETECT_H #define _BEAT_DETECT_H #include "../PCM.hpp" #include "../dlldefs.h" class DLLEXPORT BeatDetect { public: float treb ; float mid ; float bass ; float vol_old ; float beat_sensitivity; float treb_att ; float mid_att ; float bass_att ; float vol; PCM *pcm; /** Methods */ BeatDetect(PCM *pcm); ~BeatDetect(); void initBeatDetect(); void reset(); void detectFromSamples(); void getBeatVals ( float *vdataL, float *vdataR ); private: /** Vars */ float beat_buffer[32][80], beat_instant[32], beat_history[32]; float beat_val[32], beat_att[32], beat_variance[32]; int beat_buffer_pos; float vol_buffer[80], vol_instant, vol_history; }; #endif /** !_BEAT_DETECT_H */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/FBO.cpp�����������������������������������������������������0000664�0000000�0000000�00000021651�12660066715�0021212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: FBO.c,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ * * Render this methods */ #include <stdio.h> //#include <GL/gl.h> #include <iostream> #include "../Common.hpp" #include "FBO.hpp" RenderTarget::~RenderTarget() { glDeleteTextures( 1, &this->textureID[0]); #ifdef USE_FBO if (useFBO) { glDeleteTextures( 1, &this->textureID[1] ); glDeleteRenderbuffersEXT(1, &this->depthb[0]); glDeleteFramebuffersEXT(1, &this->fbuffer[0]); if(renderToTexture) { glDeleteTextures( 1, &this->textureID[2] ); glDeleteRenderbuffersEXT(1, &this->depthb[1]); glDeleteFramebuffersEXT(1, &this->fbuffer[1]); } } #endif } GLuint RenderTarget::initRenderToTexture() { #ifdef USE_FBO if (this->useFBO==1) { this->renderToTexture=1; GLuint fb2, depth_rb2; glGenFramebuffersEXT(1, &fb2); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb2 ); glGenRenderbuffersEXT(1, &depth_rb2); glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb2 ); glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb2 ); this->fbuffer[1] = fb2; this->depthb[1]= depth_rb2; glGenTextures(1, &this->textureID[2]); glBindTexture(GL_TEXTURE_2D, this->textureID[2]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this->textureID[2], 0 ); return this->textureID[2]; } #endif return -1; } /** Creates new pbuffers */ RenderTarget::RenderTarget(int texsize, int width, int height) : useFBO(false) { int mindim = 0; int origtexsize = 0; this->renderToTexture = 0; this->texsize = texsize; #ifdef USE_FBO glewInit(); // Forceably disable FBO if user requested it but the video card / driver lacks // the appropraite frame buffer extension. if (useFBO = glewIsSupported("GL_EXT_framebuffer_object")) { GLuint fb, depth_rb, rgba_tex, other_tex; glGenFramebuffersEXT(1, &fb); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb ); glGenRenderbuffersEXT(1, &depth_rb); glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb ); glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb ); this->fbuffer[0] = fb; this->depthb[0]= depth_rb; glGenTextures(1, &other_tex); glBindTexture(GL_TEXTURE_2D,other_tex); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glGenTextures(1, &rgba_tex); glBindTexture(GL_TEXTURE_2D, rgba_tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0 ); this->textureID[0] = rgba_tex; this->textureID[1] = other_tex; GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { return; } std::cerr << "[projecM] warning: FBO support not detected. Using fallback." << std::endl; } #endif // Can reach here via two code paths: // (1) useFBO was set to false externally by cmake / system setting / etc. // (2) useFBO was true but forced to false as it failed to pass all the GLU extension checks. /** Fallback pbuffer creation via teximage hack */ /** Check the texture size against the viewport size */ /** If the viewport is smaller, then we'll need to scale the texture size down */ /** If the viewport is larger, scale it up */ mindim = width < height ? width : height; origtexsize = this->texsize; this->texsize = nearestPower2( mindim, SCALE_MINIFY ); glGenTextures(1, &this->textureID[0] ); glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->texsize, this->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); return; } void RenderTarget::fallbackRescale(int width, int height) { int mindim = width < height ? width : height; int origtexsize = this->texsize; this->texsize = nearestPower2( mindim, SCALE_MINIFY ); if (origtexsize == texsize) return; /* Create the texture that will be bound to the render this */ /* if ( this->texsize != origtexsize ) { glDeleteTextures( 1, &this->textureID[0] ); } */ glGenTextures(1, &this->textureID[0] ); glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->texsize, this->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); } /** Destroys the pbuffer */ /** Locks the pbuffer */ void RenderTarget::lock() { #ifdef USE_FBO if(this->useFBO) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->fbuffer[0]); } #endif } /** Unlocks the pbuffer */ void RenderTarget::unlock() { #ifdef USE_FBO if(this->useFBO) { glBindTexture( GL_TEXTURE_2D, this->textureID[1] ); glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, this->texsize, this->texsize ); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); return; } #endif /** Fallback texture path */ glBindTexture( GL_TEXTURE_2D, this->textureID[0] ); glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, this->texsize, this->texsize ); } /** * Calculates the nearest power of two to the given number using the * appropriate rule */ int RenderTarget::nearestPower2( int value, TextureScale scaleRule ) { int x = value; int power = 0; while ( ( x & 0x01 ) != 1 ) { x >>= 1; } if ( x == 1 ) { return value; } else { x = value; while ( x != 0 ) { x >>= 1; power++; } switch ( scaleRule ) { case SCALE_NEAREST: if ( ( ( 1 << power ) - value ) <= ( value - ( 1 << ( power - 1 ) ) ) ) { return 1 << power; } else { return 1 << ( power - 1 ); } case SCALE_MAGNIFY: return 1 << power; case SCALE_MINIFY: return 1 << ( power - 1 ); default: break; } } return 0; } ���������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/FBO.hpp�����������������������������������������������������0000664�0000000�0000000�00000004260�12660066715�0021214�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: FBO.hpp,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ * * Opaque render target * */ #ifndef _RENDERTARGET_H #define _RENDERTARGET_H #ifdef __APPLE__ #include <OpenGL/gl.h> #else #include <GL/gl.h> #endif #ifdef USE_FBO #ifdef USE_NATIVE_GLEW #include <prjm/glew/glew.h> #else #include <GL/glew.h> #endif #endif #ifdef MACOS #include <OpenGL/gl.h> #include <AGL/agl.h> #endif /** MACOS */ #ifdef WIN32 #include <windows.h> #endif /** WIN32 */ #ifdef LINUX #ifdef USE_GLES1 #include <GLES/gl.h> #else #include <GL/gl.h> #include <GL/glx.h> #endif #endif typedef enum { SCALE_NEAREST, SCALE_MAGNIFY, SCALE_MINIFY } TextureScale; class RenderTarget { public: /** Texture size */ int texsize; int useFBO; int renderToTexture; ~RenderTarget(); RenderTarget( int texsize, int width, int height ); void lock(); void unlock(); GLuint initRenderToTexture(); int nearestPower2( int value, TextureScale scaleRule ); void fallbackRescale(int width, int height); /** Opaque pbuffer context and pbuffer */ /* #ifdef MACOS void *origContext; void *pbufferContext; void *pbuffer; #endif */ /** Render target texture ID for non-pbuffer systems */ GLuint textureID[3]; #ifdef USE_FBO GLuint fbuffer[2]; GLuint depthb[2]; #endif }; #endif /** !_RENDERTARGET_H */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Filters.cpp�������������������������������������������������0000664�0000000�0000000�00000004432�12660066715�0022212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Filters.cpp * * Created on: Jun 18, 2008 * Author: pete */ #include "../Common.hpp" #ifdef USE_GLES1 #include <GLES/gl.h> #else #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #else #include <GL/gl.h> //#include <GL/glu.h> // EDIT BY SJ #endif #endif #include "Filters.hpp" void Brighten::Draw(RenderContext &context) { float points[4][2] = {{-0.5, -0.5}, {-0.5, 0.5}, { 0.5, 0.5}, { 0.5, -0.5}}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2,GL_FLOAT,0,points); glColor4f(1.0, 1.0, 1.0, 1.0); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_ZERO, GL_DST_COLOR); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_VERTEX_ARRAY); } void Darken::Draw(RenderContext &context) { float points[4][2] = {{-0.5, -0.5}, {-0.5, 0.5}, { 0.5, 0.5}, { 0.5, -0.5}}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2,GL_FLOAT,0,points); glColor4f(1.0, 1.0, 1.0, 1.0); glBlendFunc(GL_ZERO, GL_DST_COLOR); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_VERTEX_ARRAY); } void Invert::Draw(RenderContext &context) { float points[4][2] = {{-0.5, -0.5}, {-0.5, 0.5}, { 0.5, 0.5}, { 0.5, -0.5}}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2,GL_FLOAT,0,points); glColor4f(1.0, 1.0, 1.0, 1.0); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_VERTEX_ARRAY); } void Solarize::Draw(RenderContext &context) { float points[4][2] = {{-0.5, -0.5}, {-0.5, 0.5}, { 0.5, 0.5}, { 0.5, -0.5}}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2,GL_FLOAT,0,points); glColor4f(1.0, 1.0, 1.0, 1.0); glBlendFunc(GL_ZERO, GL_ONE_MINUS_DST_COLOR); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_DST_COLOR, GL_ONE); glDrawArrays(GL_TRIANGLE_FAN,0,4); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_VERTEX_ARRAY); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Filters.hpp�������������������������������������������������0000664�0000000�0000000�00000001060�12660066715�0022211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Filters.hpp * * Created on: Jun 18, 2008 * Author: pete */ #ifndef FILTERS_HPP_ #define FILTERS_HPP_ #include "Renderable.hpp" class Brighten : public RenderItem { public: Brighten(){} void Draw(RenderContext &context); }; class Darken : public RenderItem { public: Darken(){} void Draw(RenderContext &context); }; class Invert : public RenderItem { public: Invert(){} void Draw(RenderContext &context); }; class Solarize : public RenderItem { public: Solarize(){} void Draw(RenderContext &context); }; #endif /* FILTERS_HPP_ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/MilkdropWaveform.cpp����������������������������������������0000664�0000000�0000000�00000021045�12660066715�0024071�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * MilkdropWaveform.cpp * * Created on: Jun 25, 2008 * Author: pete */ #include <iostream> #ifdef LINUX #include <GL/gl.h> #endif #ifdef WIN32 #include <GL/gl.h> // EDIT BY SJ "glew.h" #endif #ifdef __APPLE__ #include <OpenGL/gl.h> #endif #include <cmath> #include "MilkdropWaveform.hpp" #include "math.h" #include "BeatDetect.hpp" MilkdropWaveform::MilkdropWaveform(): RenderItem(), x(0.5), y(0.5), r(1), g(0), b(0), a(1), mystery(0), mode(Line), scale(10), smoothing(0), rot(0), samples(0),modOpacityStart(0),modOpacityEnd(1), modulateAlphaByVolume(false), maximizeColors(false), additive(false), dots(false), thick(false), loop(false) {} void MilkdropWaveform::Draw(RenderContext &context) { WaveformMath(context); glMatrixMode( GL_MODELVIEW ); glPushMatrix(); glLoadIdentity(); if(modulateAlphaByVolume) ModulateOpacityByVolume(context); else temp_a = a; MaximizeColors(context); #ifndef USE_GLES1 if(dots==1) glEnable(GL_LINE_STIPPLE); #endif //Thick wave drawing if (thick==1) glLineWidth( (context.texsize < 512 ) ? 2 : 2*context.texsize/512); else glLineWidth( (context.texsize < 512 ) ? 1 : context.texsize/512); //Additive wave drawing (vice overwrite) if (additive==1)glBlendFunc(GL_SRC_ALPHA, GL_ONE); else glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTranslatef(.5, .5, 0); glRotatef(rot, 0, 0, 1); glScalef(aspectScale, 1.0, 1.0); glTranslatef(-.5, -.5, 0); glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glVertexPointer(2,GL_FLOAT,0,wavearray); if (loop) glDrawArrays(GL_LINE_LOOP,0,samples); else glDrawArrays(GL_LINE_STRIP,0,samples); if (two_waves) { glVertexPointer(2,GL_FLOAT,0,wavearray2); if (loop) glDrawArrays(GL_LINE_LOOP,0,samples); else glDrawArrays(GL_LINE_STRIP,0,samples); } #ifndef USE_GLES1 if(dots==1) glDisable(GL_LINE_STIPPLE); #endif glPopMatrix(); } void MilkdropWaveform::ModulateOpacityByVolume(RenderContext &context) { //modulate volume by opacity // //set an upper and lower bound and linearly //calculate the opacity from 0=lower to 1=upper //based on current volume if (context.beatDetect->vol<= modOpacityStart) temp_a=0.0; else if (context.beatDetect->vol>=modOpacityEnd) temp_a=a; else temp_a=a*((context.beatDetect->vol-modOpacityStart)/(modOpacityEnd-modOpacityStart)); } void MilkdropWaveform::MaximizeColors(RenderContext &context) { float wave_r_switch=0, wave_g_switch=0, wave_b_switch=0; //wave color brightening // //forces max color value to 1.0 and scales // the rest accordingly if(mode==Blob2 || mode==Blob5) switch(context.texsize) { case 256: temp_a *= 0.07f; break; case 512: temp_a *= 0.09f; break; case 1024: temp_a *= 0.11f; break; case 2048: temp_a *= 0.13f; break; } else if(mode==Blob3) { switch(context.texsize) { case 256: temp_a *= 0.075f; break; case 512: temp_a *= 0.15f; break; case 1024: temp_a *= 0.22f; break; case 2048: temp_a *= 0.33f; break; } temp_a*=1.3f; temp_a*=std::pow(context.beatDetect->treb , 2.0f); } if (maximizeColors==true) { if(r>=g && r>=b) //red brightest { wave_b_switch=b*(1/r); wave_g_switch=g*(1/r); wave_r_switch=1.0; } else if (b>=g && b>=r) //blue brightest { wave_r_switch=r*(1/b); wave_g_switch=g*(1/b); wave_b_switch=1.0; } else if (g>=b && g>=r) //green brightest { wave_b_switch=b*(1/g); wave_r_switch=r*(1/g); wave_g_switch=1.0; } glColor4f(wave_r_switch, wave_g_switch, wave_b_switch, temp_a * masterAlpha); } else { glColor4f(r, g, b, temp_a * masterAlpha); } } void MilkdropWaveform::WaveformMath(RenderContext &context) { //int i; float r, theta; float offset; float wave_x_temp=0; float wave_y_temp=0; float cos_rot; float sin_rot; offset=x-.5; float temp_y; two_waves = false; loop = false; switch(mode) { case Circle: { loop = true; rot = 0; aspectScale=1.0; temp_y=-1*(y-1.0); samples = 0? 512-32 : context.beatDetect->pcm->numsamples; float inv_nverts_minus_one = 1.0f/(float)(samples); float last_value = context.beatDetect->pcm->pcmdataR[samples-1]+context.beatDetect->pcm->pcmdataL[samples-1]; float first_value = context.beatDetect->pcm->pcmdataR[0]+context.beatDetect->pcm->pcmdataL[0]; float offset = first_value-last_value; for ( int i=0;i<samples;i++) { float value = context.beatDetect->pcm->pcmdataR[i]+context.beatDetect->pcm->pcmdataL[i]; value += offset * (i/(float)samples); r=(0.5 + 0.4f*.12*value*scale + mystery)*.5; theta=i*inv_nverts_minus_one*6.28f + context.time*0.2f; wavearray[i][0]=(r*cos(theta)*(context.aspectCorrect? context.aspectRatio : 1.0)+x); wavearray[i][1]=(r*sin(theta)+temp_y); } } break; case RadialBlob://circularly moving waveform rot = 0; aspectScale = context.aspectRatio; temp_y=-1*(y-1.0); samples = 512-32; for ( int i=0;i<512-32;i++) { theta=context.beatDetect->pcm->pcmdataL[i+32]*0.06*scale * 1.57 + context.time*2.3; r=(0.53 + 0.43*context.beatDetect->pcm->pcmdataR[i]*0.12*scale+ mystery)*.5; wavearray[i][0]=(r*cos(theta)*(context.aspectCorrect ? context.aspectRatio : 1.0)+x); wavearray[i][1]=(r*sin(theta)+temp_y); } break; case Blob2://EXPERIMENTAL temp_y=-1*(y-1.0); rot = 0; aspectScale =1.0; samples = 512-32; for ( int i=0;i<512-32;i++) { wavearray[i][0]=(context.beatDetect->pcm->pcmdataR[i]*scale*0.5*(context.aspectCorrect ? context.aspectRatio : 1.0) + x); wavearray[i][1]=(context.beatDetect->pcm->pcmdataL[i+32]*scale*0.5 + temp_y); } break; case Blob3://EXPERIMENTAL temp_y=-1*(y-1.0); rot = 0; aspectScale =1.0; samples = 512-32; for ( int i=0;i<512-32;i++) { wavearray[i][0]=(context.beatDetect->pcm->pcmdataR[i] * scale*0.5 + x); wavearray[i][1]=( (context.beatDetect->pcm->pcmdataL[i+32]*scale*0.5 + temp_y)); } break; case DerivativeLine://single x-axis derivative waveform { rot =-mystery*90; aspectScale=1.0; temp_y=-1*(y-1.0); float w1 = 0.45f + 0.5f*(mystery*0.5f + 0.5f); float w2 = 1.0f - w1; float xx[512], yy[512]; samples = 512-32; for (int i=0; i<512-32; i++) { xx[i] = -1.0f + 2.0f*(i/(512.0-32.0)) + x; yy[i] =0.4* context.beatDetect->pcm->pcmdataL[i]*0.47f*scale + temp_y; xx[i] += 0.4*context.beatDetect->pcm->pcmdataR[i]*0.44f*scale; if (i>1) { xx[i] = xx[i]*w2 + w1*(xx[i-1]*2.0f - xx[i-2]); yy[i] = yy[i]*w2 + w1*(yy[i-1]*2.0f - yy[i-2]); } wavearray[i][0]=xx[i]; wavearray[i][1]=yy[i]; } } break; case Blob5://EXPERIMENTAL rot = 0; aspectScale =1.0; temp_y=-1*(y-1.0); cos_rot = cosf(context.time*0.3f); sin_rot = sinf(context.time*0.3f); samples = 512-32; for ( int i=0;i<512-32;i++) { float x0 = (context.beatDetect->pcm->pcmdataR[i]*context.beatDetect->pcm->pcmdataL[i+32] + context.beatDetect->pcm->pcmdataL[i+32]*context.beatDetect->pcm->pcmdataR[i]); float y0 = (context.beatDetect->pcm->pcmdataR[i]*context.beatDetect->pcm->pcmdataR[i] - context.beatDetect->pcm->pcmdataL[i+32]*context.beatDetect->pcm->pcmdataL[i+32]); wavearray[i][0]=((x0*cos_rot - y0*sin_rot)*scale*0.5*(context.aspectCorrect ? context.aspectRatio : 1.0) + x); wavearray[i][1]=( (x0*sin_rot + y0*cos_rot)*scale*0.5 + temp_y); } break; case Line://single waveform wave_x_temp=-2*0.4142*(fabs(fabs(mystery)-.5)-.5); rot = -mystery*90; aspectScale =1.0+wave_x_temp; wave_x_temp=-1*(x-1.0); samples = 0 ? 512-32 : context.beatDetect->pcm->numsamples; for ( int i=0;i< samples;i++) { wavearray[i][0]=i/(float) samples; wavearray[i][1]=context.beatDetect->pcm->pcmdataR[i]*.04*scale+wave_x_temp; } // printf("%f %f\n",renderTarget->texsize*wave_y_temp,wave_y_temp); break; case DoubleLine://dual waveforms wave_x_temp=-2*0.4142*(fabs(fabs(mystery)-.5)-.5); rot = -mystery*90; aspectScale =1.0+wave_x_temp; samples = 0 ? 512-32 : context.beatDetect->pcm->numsamples; two_waves = true; double y_adj = y*y*.5; wave_y_temp=-1*(x-1); for ( int i=0;i<samples;i++) { wavearray[i][0]=i/((float) samples); wavearray[i][1]= context.beatDetect->pcm->pcmdataL[i]*.04*scale+(wave_y_temp+y_adj); } for ( int i=0;i<samples;i++) { wavearray2[i][0]=i/((float) samples); wavearray2[i][1]=context.beatDetect->pcm->pcmdataR[i]*.04*scale+(wave_y_temp-y_adj); } break; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/MilkdropWaveform.hpp����������������������������������������0000664�0000000�0000000�00000001776�12660066715�0024107�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * MilkdropWaveform.hpp * * Created on: Jun 25, 2008 * Author: pete */ #ifndef MILKDROPWAVEFORM_HPP_ #define MILKDROPWAVEFORM_HPP_ #include "Renderable.hpp" enum MilkdropWaveformMode { Circle=0, RadialBlob, Blob2, Blob3, DerivativeLine, Blob5, Line, DoubleLine }; class MilkdropWaveform : public RenderItem { public: float x; float y; float r; float g; float b; float a; float mystery; MilkdropWaveformMode mode; bool additive; bool dots; bool thick; bool modulateAlphaByVolume; bool maximizeColors; float scale; float smoothing; MilkdropWaveform(); void Draw(RenderContext &context); float modOpacityStart; float modOpacityEnd; private: float temp_a; float rot; float aspectScale; int samples; bool two_waves; bool loop; float wavearray[2048][2]; float wavearray2[2048][2]; void MaximizeColors(RenderContext &context); void ModulateOpacityByVolume(RenderContext &context); void WaveformMath(RenderContext &context); }; #endif /* MILKDROPWAVEFORM_HPP_ */ ��silverjuke-16.2.3/src/prjm/src/Renderer/PerPixelMesh.cpp��������������������������������������������0000664�0000000�0000000�00000002470�12660066715�0023147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <math.h> #include <algorithm> #include "PerPixelMesh.hpp" #include "../omptl/omptl" #include "../omptl/omptl_algorithm" PerPixelMesh::PerPixelMesh(int width, int height) : width(width), height(height), size (width * height), p(width * height, PixelPoint(0,0)), p_original(width * height, PixelPoint(0,0)), identity(width * height, PerPixelContext(0,0,0,0,0,0)) { for (int j=0;j<height;j++) for(int i=0;i<width;i++) { int index = j * width + i; float xval=i/(float)(width-1); float yval=-((j/(float)(height-1))-1); p[index].x = xval; p[index].y = yval; p_original[index].x = xval; p_original[index].y = yval; identity[index].x= xval; identity[index].y= yval; //identity[index].x= (xval-.5)*2; //identity[index].y= (yval-.5)*2; identity[index].i= i; identity[index].j= j; identity[index].rad=hypot ( ( xval-.5 ) *2, ( yval-.5 ) *2 ) * .7071067; identity[index].theta=atan2 ( ( yval-.5 ) *2 , ( xval-.5 ) *2 ); } } void PerPixelMesh::Reset() { omptl::copy(p_original.begin(), p_original.end(), p.begin()); } PixelPoint::PixelPoint(float x, float y) : x(x), y(y) {} PerPixelContext::PerPixelContext(float x, float y, float rad, float theta, int i, int j) : x(x), y(y), rad(rad), theta(theta), i(i), j(j) {} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/PerPixelMesh.hpp��������������������������������������������0000664�0000000�0000000�00000001050�12660066715�0023145�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef PerPixelMesh_HPP #define PerPixelMesh_HPP #include <vector> struct PixelPoint { float x; float y; PixelPoint(float x, float y); }; struct PerPixelContext { float x; float y; float rad; float theta; int i; int j; PerPixelContext(float x, float y, float rad, float theta, int i, int j); }; class PerPixelMesh { public: int width; int height; int size; std::vector<PixelPoint> p; std::vector<PixelPoint> p_original; std::vector<PerPixelContext> identity; PerPixelMesh(int width, int height); void Reset(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/PerlinNoise.cpp���������������������������������������������0000664�0000000�0000000�00000002361�12660066715�0023030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PerlinNoise.cpp * * Created on: Jul 11, 2008 * Author: pete */ #include "PerlinNoise.hpp" #include <iostream> #include <stdlib.h> PerlinNoise::PerlinNoise() { for (int x = 0; x < 256;x++) for (int y = 0; y < 256;y++) noise_lq[x][y] = noise(x , y); for (int x = 0; x < 32;x++) for (int y = 0; y < 32;y++) noise_lq_lite[x][y] = noise(4*x,16*y); for (int x = 0; x < 256;x++) for (int y = 0; y < 256;y++) noise_mq[x][y] = InterpolatedNoise((float)x/(float)2.0,(float)y/(float)2.0); for (int x = 0; x < 256;x++) for (int y = 0; y < 256;y++) noise_hq[x][y] = InterpolatedNoise((float)x/(float)3.0,(float)y/(float)3.0); for (int x = 0; x < 32;x++) for (int y = 0; y < 32;y++) for (int z = 0; z < 32;z++) noise_lq_vol[x][y][z] = noise(x,y,z); for (int x = 0; x < 32;x++) for (int y = 0; y < 32;y++) for (int z = 0; z < 32;z++) noise_hq_vol[x][y][z] = noise(x,y,z);//perlin_noise_3d(x,y,z,6121,7,seed3,0.5,64); int seed = rand()%1000; int size = 512; int octaves = sqrt((double)size); for (int x = 0; x < size;x++) for (int y = 0; y < size;y++) noise_perlin[x][y] = perlin_noise_2d(x,y,6321,octaves,seed,0.5,size/4); } PerlinNoise::~PerlinNoise() { // TODO Auto-generated destructor stub } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/PerlinNoise.hpp���������������������������������������������0000664�0000000�0000000�00000017730�12660066715�0023043�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PerlinNoise.hpp * * Created on: Jul 11, 2008 * Author: pete */ #ifndef PERLINNOISE_HPP_ #define PERLINNOISE_HPP_ #include <math.h> class PerlinNoise { public: float noise_lq[256][256]; float noise_lq_lite[32][32]; float noise_mq[256][256]; float noise_hq[256][256]; float noise_perlin[512][512]; float noise_lq_vol[32][32][32]; float noise_hq_vol[32][32][32]; PerlinNoise(); virtual ~PerlinNoise(); private: static inline float noise( int x) { x = (x<<13)^x; return (((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 2147483648.0); } static inline float noise(int x, int y) { int n = x + y * 57; return noise(n); } static inline float noise(int x, int y, int z) { int n = x + y * 57 + z * 141; return noise(n); } static inline float cos_interp(float a, float b, float x) { float ft = x * 3.1415927; float f = (1 - cos(ft)) * .5; return a*(1-f) + b*f; } static inline float cubic_interp(float v0, float v1, float v2, float v3, float x) { float P = (v3 - v2) - (v0 - v1); float Q = (v0 - v1) - P; float R = v2 - v0; return P*pow(x,3) + Q * pow(x,2) + R*x + v1; } static inline float InterpolatedNoise(float x, float y) { int integer_X = int(x); float fractional_X = x - integer_X; int integer_Y = int(y); float fractional_Y = y - integer_Y; float a0 = noise(integer_X - 1, integer_Y - 1); float a1 = noise(integer_X, integer_Y - 1); float a2 = noise(integer_X + 1, integer_Y - 1); float a3 = noise(integer_X + 2, integer_Y - 1); float x0 = noise(integer_X - 1, integer_Y); float x1 = noise(integer_X, integer_Y); float x2 = noise(integer_X + 1, integer_Y); float x3 = noise(integer_X + 2, integer_Y); float y0 = noise(integer_X + 0, integer_Y + 1); float y1 = noise(integer_X, integer_Y + 1); float y2 = noise(integer_X + 1, integer_Y + 1); float y3 = noise(integer_X + 2, integer_Y + 1); float b0 = noise(integer_X - 1, integer_Y + 2); float b1 = noise(integer_X, integer_Y + 2); float b2 = noise(integer_X + 1, integer_Y + 2); float b3 = noise(integer_X + 2, integer_Y + 2); float i0 = cubic_interp(a0 , a1, a2, a3, fractional_X); float i1 = cubic_interp(x0 , x1, x2, x3, fractional_X); float i2 = cubic_interp(y0 , y1, y2, y3, fractional_X); float i3 = cubic_interp(b0 , b1, b2, b3, fractional_X); return cubic_interp(i0, i1 , i2 , i3, fractional_Y); } static inline float perlin_octave_2d(float x,float y, int width, int seed, float period) { float freq=1/(float)(period); int num=(int)(width*freq); int step_x=(int)(x*freq); int step_y=(int)(y*freq); float zone_x=x*freq-step_x; float zone_y=y*freq-step_y; int box=step_x+step_y*num; int noisedata=(box+seed); float u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x); float a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x); float b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x); float v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x); float value=cubic_interp(u,a,b,v,zone_y); return value; } static inline float perlin_octave_2d_cos(float x,float y, int width, int seed, float period) { float freq=1/(float)(period); int num=(int)(width*freq); int step_x=(int)(x*freq); int step_y=(int)(y*freq); float zone_x=x*freq-step_x; float zone_y=y*freq-step_y; int box=step_x+step_y*num; int noisedata=(box+seed); float a=cos_interp(noise(noisedata),noise(noisedata+1),zone_x); float b=cos_interp(noise(noisedata+num),noise(noisedata+1+num),zone_x); float value=cos_interp(a,b,zone_y); return value; } static inline float perlin_octave_3d(float x,float y, float z,int width, int seed, float period) { float freq=1/(float)(period); int num=(int)(width*freq); int step_x=(int)(x*freq); int step_y=(int)(y*freq); int step_z=(int)(z*freq); float zone_x=x*freq-step_x; float zone_y=y*freq-step_y; float zone_z=z*freq-step_z; int boxB=step_x+step_y+step_z*num; int boxC=step_x+step_y+step_z*(num+1); int boxD=step_x+step_y+step_z*(num+2); int boxA=step_x+step_y+step_z*(num-1); float u,a,b,v,noisedata,box; box = boxA; noisedata=(box+seed); u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x); a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x); b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x); v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x); float A=cubic_interp(u,a,b,v,zone_y); box = boxB; noisedata=(box+seed); u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x); a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x); b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x); v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x); float B=cubic_interp(u,a,b,v,zone_y); box = boxC; noisedata=(box+seed); u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x); a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x); b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x); v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x); float C=cubic_interp(u,a,b,v,zone_y); box = boxD; noisedata=(box+seed); u=cubic_interp(noise(noisedata-num-1),noise(noisedata-num),noise(noisedata-num+1),noise(noisedata-num+2),zone_x); a=cubic_interp(noise(noisedata-1),noise(noisedata),noise(noisedata+1),noise(noisedata+2),zone_x); b=cubic_interp(noise(noisedata+num -1),noise(noisedata+num),noise(noisedata+1+num),noise(noisedata+2+num),zone_x); v=cubic_interp(noise(noisedata+2*num -1),noise(noisedata+2*num),noise(noisedata+1+2*num),noise(noisedata+2+2*num),zone_x); float D=cubic_interp(u,a,b,v,zone_y); float value =cubic_interp(A,B,C,D,zone_z); return value; } static inline float perlin_noise_2d(int x, int y, int width, int octaves, int seed, float persistance, float basePeriod) { float p = persistance; float val = 0.0; for (int i = 0; i<octaves;i++) { val += perlin_octave_2d_cos(x,y,width,seed,basePeriod) * p; basePeriod *= 0.5; p *= persistance; } return val; } static inline float perlin_noise_3d(int x, int y, int z, int width, int octaves, int seed, float persistance, float basePeriod) { float p = persistance; float val = 0.0; for (int i = 0; i<octaves;i++) { val += perlin_octave_3d(x,y,z,width,seed,basePeriod) * p; basePeriod *= 0.5; p *= persistance; } return val; } }; #endif /* PERLINNOISE_HPP_ */ ����������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Pipeline.cpp������������������������������������������������0000664�0000000�0000000�00000002077�12660066715�0022352�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Pipeline.cpp * * Created on: Jun 17, 2008 * Author: pete */ #include "Pipeline.hpp" #include "../wipemalloc.h" Pipeline::Pipeline() : staticPerPixel(false),gx(0),gy(0),blur1n(1), blur2n(1), blur3n(1), blur1x(1), blur2x(1), blur3x(1), blur1ed(1){} void Pipeline::setStaticPerPixel(int gx, int gy) { staticPerPixel = true; this->gx = gx; this->gy = gy; this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( int x = 0; x < gx; x++ ) { this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); for ( int x = 0; x < gx; x++ ) { this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); } } Pipeline::~Pipeline() { if (staticPerPixel) { for ( int x = 0; x < this->gx; x++ ) { free(this->x_mesh[x]); free(this->y_mesh[x]); } free(x_mesh); free(y_mesh); } } //void Pipeline::Render(const BeatDetect &music, const PipelineContext &context){} PixelPoint Pipeline::PerPixel(PixelPoint p, const PerPixelContext context) {return p;} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Pipeline.hpp������������������������������������������������0000664�0000000�0000000�00000002306�12660066715�0022352�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef Pipeline_HPP #define Pipeline_HPP #include <vector> #include "PerPixelMesh.hpp" #include "Renderable.hpp" #include "Filters.hpp" #include "PipelineContext.hpp" #include "Shader.hpp" #include "../Common.hpp" //This class is the input to projectM's renderer // //Most implemenatations should implement PerPixel in order to get multi-threaded //dynamic PerPixel equations. If you MUST (ie Milkdrop compatability), you can use the //setStaticPerPixel function and fill in x_mesh and y_mesh yourself. class Pipeline { public: //static per pixel stuff bool staticPerPixel; int gx; int gy; float** x_mesh; float** y_mesh; //end static per pixel bool textureWrap; float screenDecay; //variables passed to pixel shaders float q[NUM_Q_VARIABLES]; //blur settings n=bias x=scale float blur1n; float blur2n; float blur3n; float blur1x; float blur2x; float blur3x; float blur1ed; Shader warpShader; Shader compositeShader; std::vector<RenderItem*> drawables; std::vector<RenderItem*> compositeDrawables; Pipeline(); void setStaticPerPixel(int gx, int gy); virtual ~Pipeline(); virtual PixelPoint PerPixel(PixelPoint p, const PerPixelContext context); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/PipelineContext.cpp�����������������������������������������0000664�0000000�0000000�00000000301�12660066715�0023703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PipelineContext.cpp * * Created on: Jun 22, 2008 * Author: pete */ #include "PipelineContext.hpp" PipelineContext::PipelineContext() {} PipelineContext::~PipelineContext() {} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/PipelineContext.hpp�����������������������������������������0000664�0000000�0000000�00000000501�12660066715�0023712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PipelineContext.hpp * * Created on: Jun 22, 2008 * Author: pete */ #ifndef PIPELINECONTEXT_HPP_ #define PIPELINECONTEXT_HPP_ class PipelineContext { public: int fps; float time; int frame; float progress; PipelineContext(); virtual ~PipelineContext(); }; #endif /* PIPELINECONTEXT_HPP_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/RenderItemDistanceMetric.cpp��������������������������������0000664�0000000�0000000�00000000506�12660066715�0025455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * RenderItemDistanceMetric.cpp * * Created on: Feb 18, 2009 * Author: struktured */ #include "RenderItemDistanceMetric.hpp" // Assumes [0, 1] distance space because it's easy to manage with overflow // Underflow is obviously possible though. const double RenderItemDistanceMetric::NOT_COMPARABLE_VALUE (1.0); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/RenderItemDistanceMetric.hpp��������������������������������0000664�0000000�0000000�00000010331�12660066715�0025457�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * RenderItemDistanceMetric.h * * Created on: Feb 16, 2009 * Author: struktured */ #ifndef RenderItemDISTANCEMETRIC_H_ #define RenderItemDISTANCEMETRIC_H_ #include "../Common.hpp" #include "Renderable.hpp" #include <limits> #include <functional> #include <map> /// Compares two render items and returns zero if they are virtually equivalent and large values /// when they are dissimilar. If two render items cannot be compared, NOT_COMPARABLE_VALUE is returned. class RenderItemDistanceMetric : public std::binary_function<const RenderItem*, const RenderItem*, double> { public: const static double NOT_COMPARABLE_VALUE; virtual double operator()(const RenderItem * r1, const RenderItem * r2) const = 0; virtual TypeIdPair typeIdPair() const = 0; }; // A base class to construct render item distance metrics. Just specify your two concrete // render item types as template parameters and override the computeDistance() function. template <class R1, class R2> class RenderItemDistance : public RenderItemDistanceMetric { protected: // Override to create your own distance fmetric for your specified custom types. virtual double computeDistance(const R1 * r1, const R2 * r2) const = 0; public: inline virtual double operator()(const RenderItem * r1, const RenderItem * r2) const { if (supported(r1, r2)) return computeDistance(dynamic_cast<const R1*>(r1), dynamic_cast<const R2*>(r2)); else if (supported(r2,r1)) return computeDistance(dynamic_cast<const R1*>(r2), dynamic_cast<const R2*>(r1)); else return NOT_COMPARABLE_VALUE; } // Returns true if and only if r1 and r2 are the same type as or derived from R1, R2 respectively inline bool supported(const RenderItem * r1, const RenderItem * r2) const { return dynamic_cast<const R1*>(r1) && dynamic_cast<const R2*>(r2); //return typeid(r1) == typeid(const R1 *) && typeid(r2) == typeid(const R2 *); } inline TypeIdPair typeIdPair() const { return TypeIdPair(typeid(const R1*).name(), typeid(const R2*).name()); } }; class RTIRenderItemDistance : public RenderItemDistance<RenderItem, RenderItem> { public: RTIRenderItemDistance() {} virtual ~RTIRenderItemDistance() {} protected: virtual inline double computeDistance(const RenderItem * lhs, const RenderItem * rhs) const { if (typeid(*lhs) == typeid(*rhs)) { //std::cerr << typeid(*lhs).name() << " and " << typeid(*rhs).name() << "are comparable" << std::endl; return 0.0; } else { //std::cerr << typeid(*lhs).name() << " and " << typeid(*rhs).name() << "not comparable" << std::endl; return NOT_COMPARABLE_VALUE; } } }; class ShapeXYDistance : public RenderItemDistance<Shape, Shape> { public: ShapeXYDistance() {} virtual ~ShapeXYDistance() {} protected: virtual inline double computeDistance(const Shape * lhs, const Shape * rhs) const { return (meanSquaredError(lhs->x, rhs->x) + meanSquaredError(lhs->y, rhs->y)) / 2; } }; class MasterRenderItemDistance : public RenderItemDistance<RenderItem, RenderItem> { typedef std::map<TypeIdPair, RenderItemDistanceMetric*> DistanceMetricMap; public: MasterRenderItemDistance() {} virtual ~MasterRenderItemDistance() {} inline void addMetric(RenderItemDistanceMetric * fun) { _distanceMetricMap[fun->typeIdPair()] = fun; } protected: virtual inline double computeDistance(const RenderItem * lhs, const RenderItem * rhs) const { RenderItemDistanceMetric * metric; TypeIdPair pair(typeid(lhs), typeid(rhs)); // If specialized metric exists, use it to get higher granularity // of correctness if (_distanceMetricMap.count(pair)) { metric = _distanceMetricMap[pair]; } else if (_distanceMetricMap.count(pair = TypeIdPair(typeid(rhs), typeid(lhs)))) { metric = _distanceMetricMap[pair]; } else { // Failing that, use rtti && shape distance if its a shape type const double rttiError = _rttiDistance(lhs,rhs); /// @bug This is a non elegant approach to supporting shape distance if (rttiError == 0 && _shapeXYDistance.supported(lhs,rhs)) return _shapeXYDistance(lhs, rhs); else return rttiError; } return (*metric)(lhs, rhs); } private: mutable RTIRenderItemDistance _rttiDistance; mutable ShapeXYDistance _shapeXYDistance; mutable DistanceMetricMap _distanceMetricMap; }; #endif /* RenderItemDISTANCEMETRIC_H_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/RenderItemMatcher.cpp���������������������������������������0000664�0000000�0000000�00000002015�12660066715�0024137�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "RenderItemMatcher.hpp" double RenderItemMatcher::computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const { for (int i = 0; i < lhs.size();i++) { int j; for (j = 0; j < rhs.size();j++) _weights[i][j] = _distanceFunction(lhs[i], rhs[j]); for (; j < lhs.size();j++) _weights[i][j] = RenderItemDistanceMetric::NOT_COMPARABLE_VALUE; } const double error = _hungarianMethod(_weights, lhs.size()); //std::cout << "[computeMatching] total error is " << error << std::endl; return error; } void RenderItemMatcher::setMatches (const RenderItemList & lhs_src, const RenderItemList & rhs_src) const { for (int i = 0; i < lhs_src.size();i++) { const int j = _hungarianMethod.matching(i); // hack if (true || _weights[i][j] == RenderItemDistanceMetric::NOT_COMPARABLE_VALUE) { _results.unmatchedLeft.push_back(lhs_src[i]); _results.unmatchedRight.push_back(rhs_src[i]); } else { _results.matches.push_back(std::make_pair(lhs_src[i], rhs_src[j])); } } }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/RenderItemMatcher.hpp���������������������������������������0000664�0000000�0000000�00000004112�12660066715�0024144�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * RenderItemMatcher.hpp * * Created on: Feb 16, 2009 * Author: struktured */ #ifndef RenderItemMatcher_HPP #define RenderItemMatcher_HPP #include "RenderItemDistanceMetric.hpp" #include <vector> #include <map> #include <iostream> #include "../HungarianMethod.hpp" typedef std::vector<std::pair<RenderItem*, RenderItem*> > RenderItemMatchList; class MatchResults; class RenderItemMatcher : public std::binary_function<RenderItemList, RenderItemList, MatchResults> { public: struct MatchResults { RenderItemMatchList matches; std::vector<RenderItem*> unmatchedLeft; std::vector<RenderItem*> unmatchedRight; double error; }; static const std::size_t MAXIMUM_SET_SIZE = 1000; /// Computes an optimal matching between two renderable item sets. /// @param lhs the "left-hand side" list of render items. /// @param rhs the "right-hand side" list of render items. /// @returns a list of match pairs, possibly self referencing, and an error estimate of the matching. inline virtual void operator()(const RenderItemList & lhs, const RenderItemList & rhs) const { // Ensure the first argument is greater than next to aid the helper function's logic. if (lhs.size() >= rhs.size()) { _results.error = computeMatching(lhs, rhs); setMatches(lhs, rhs); } else { _results.error = computeMatching(rhs, lhs); setMatches(rhs, lhs); } } RenderItemMatcher() {} virtual ~RenderItemMatcher() {} inline MatchResults & matchResults() { return _results; } inline double weight(int i, int j) const { return _weights[i][j]; } MasterRenderItemDistance & distanceFunction() { return _distanceFunction; } private: mutable HungarianMethod<MAXIMUM_SET_SIZE> _hungarianMethod; mutable double _weights[MAXIMUM_SET_SIZE][MAXIMUM_SET_SIZE]; mutable MatchResults _results; /// @idea interface this entirely allow overriding of its type. mutable MasterRenderItemDistance _distanceFunction; double computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const; void setMatches(const RenderItemList & lhs_src, const RenderItemList & rhs_src) const; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/RenderItemMergeFunction.hpp���������������������������������0000664�0000000�0000000�00000017237�12660066715�0025342�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * RenderItemMergeFunction.hpp * * Created on: Feb 16, 2009 * Author: struktured */ #ifndef RenderItemMergeFunction_HPP_ #define RenderItemMergeFunction_HPP_ #include "../Common.hpp" #include "Renderable.hpp" #include "Waveform.hpp" #include <limits> #include <functional> #include <map> template <class T> inline T interpolate(T a, T b, float ratio) { return (ratio*a + (1-ratio)*b) * 0.5; } template <> inline int interpolate(int a, int b, float ratio) { return (int)(ratio*(float)a + (1-ratio)*(float)b) * 0.5; } template <> inline bool interpolate(bool a, bool b, float ratio) { return (ratio >= 0.5) ? a : b; } /// Merges two render items and returns zero if they are virtually equivalent and large values /// when they are dissimilar. If two render items cannot be compared, NOT_COMPARABLE_VALUE is returned. class RenderItemMergeFunction { public: virtual RenderItem * operator()(const RenderItem * r1, const RenderItem * r2, double ratio) const = 0; virtual TypeIdPair typeIdPair() const = 0; }; /// A base class to construct render item distance mergeFunctions. Just specify your two concrete /// render item types as template parameters and override the computeMerge() function. template <class R1, class R2=R1, class R3=R2> class RenderItemMerge : public RenderItemMergeFunction { protected: /// Override to create your own distance mergeFunction for your specified custom types. virtual R3 * computeMerge(const R1 * r1, const R2 * r2, double ratio) const = 0; public: inline virtual R3 * operator()(const RenderItem * r1, const RenderItem * r2, double ratio) const { if (supported(r1, r2)) return computeMerge(dynamic_cast<const R1*>(r1), dynamic_cast<const R2*>(r2), ratio); else if (supported(r2,r1)) return computeMerge(dynamic_cast<const R1*>(r2), dynamic_cast<const R2*>(r1), ratio); else return 0; } /// Returns true if and only if r1 and r2 are of type R1 and R2 respectively. inline bool supported(const RenderItem * r1, const RenderItem * r2) const { return typeid(r1) == typeid(const R1 *) && typeid(r2) == typeid(const R2 *); } inline TypeIdPair typeIdPair() const { return TypeIdPair(typeid(const R1*).name(), typeid(const R2*).name()); } }; class ShapeMerge : public RenderItemMerge<Shape> { public: ShapeMerge() {} virtual ~ShapeMerge() {} protected: virtual inline Shape * computeMerge(const Shape * lhs, const Shape * rhs, double ratio) const { Shape * ret = new Shape(); Shape & target = *ret; target.x = interpolate(lhs->x, rhs->x, ratio); target.y = interpolate(lhs->y, rhs->y, ratio); target.a = interpolate(lhs->a, rhs->a, ratio); target.a2 = interpolate(lhs->a2, rhs->a2, ratio); target.r = interpolate(lhs->r, rhs->r, ratio); target.r2 = interpolate(lhs->r2, rhs->r2, ratio); target.g = interpolate(lhs->g, rhs->g, ratio); target.g2 = interpolate(lhs->g2, rhs->g2, ratio); target.b = interpolate(lhs->b, rhs->b, ratio); target.b2 = interpolate(lhs->b2, rhs->b2, ratio); target.ang = interpolate(lhs->ang, rhs->ang, ratio); target.radius = interpolate(lhs->radius, rhs->radius, ratio); target.tex_ang = interpolate(lhs->tex_ang, rhs->tex_ang, ratio); target.tex_zoom = interpolate(lhs->tex_zoom, rhs->tex_zoom, ratio); target.border_a = interpolate(lhs->border_a, rhs->border_a, ratio); target.border_r = interpolate(lhs->border_r, rhs->border_r, ratio); target.border_g = interpolate(lhs->border_g, rhs->border_g, ratio); target.border_b = interpolate(lhs->border_b, rhs->border_b, ratio); target.sides = interpolate(lhs->sides, rhs->sides, ratio); target.additive = interpolate(lhs->additive, rhs->additive, ratio); target.textured = interpolate(lhs->textured, rhs->textured, ratio); target.thickOutline = interpolate(lhs->thickOutline, rhs->thickOutline, ratio); target.enabled = interpolate(lhs->enabled, rhs->enabled, ratio); target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio); target.imageUrl = (ratio > 0.5) ? lhs->imageUrl : rhs->imageUrl /*, ratio*/; // EDIT BY SJ return ret; } }; class BorderMerge : public RenderItemMerge<Border> { public: BorderMerge() {} virtual ~BorderMerge() {} protected: virtual inline Border * computeMerge(const Border * lhs, const Border * rhs, double ratio) const { Border * ret = new Border(); Border & target = *ret; target.inner_a = interpolate(lhs->inner_a, rhs->inner_a, ratio); target.inner_r = interpolate(lhs->inner_r, rhs->inner_r, ratio); target.inner_g = interpolate(lhs->inner_g, rhs->inner_g, ratio); target.inner_b = interpolate(lhs->inner_b, rhs->inner_b, ratio); target.inner_size = interpolate(lhs->inner_size, rhs->inner_size, ratio); target.outer_a = interpolate(lhs->outer_a, rhs->outer_a, ratio); target.outer_r = interpolate(lhs->outer_r, rhs->outer_r, ratio); target.outer_g = interpolate(lhs->outer_g, rhs->outer_g, ratio); target.outer_b = interpolate(lhs->outer_b, rhs->outer_b, ratio); target.outer_size = interpolate(lhs->outer_size, rhs->outer_size, ratio); target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio); return ret; } }; class WaveformMerge : public RenderItemMerge<Waveform> { public: WaveformMerge() {} virtual ~WaveformMerge() {} protected: /// @BUG unimplemented virtual inline Waveform * computeMerge(const Waveform * lhs, const Waveform * rhs, double ratio) const { return 0; /* Waveform * ret = new Waveform(); Waveform & target = *ret; target.additive = interpolate(lhs->additive, rhs->additive, ratio); target.dots = interpolate(lhs->dots, rhs->dots, ratio); target.samples = (rhs->samples > lhs-> samples) ? lhs->samples : rhs->samples; target.scaling = interpolate(lhs->scaling, rhs->scaling, ratio); target.sep = interpolate(lhs->sep, rhs->sep, ratio); target.smoothing = interpolate(lhs->smoothing, rhs->smoothing, ratio); target.spectrum = interpolate(lhs->spectrum, rhs->spectrum, ratio); target.thick = interpolate(lhs->thick, rhs->thick, ratio); target.masterAlpha = interpolate(lhs->masterAlpha, rhs->masterAlpha, ratio); return ret; */ } }; /// Use as the top level merge function. It stores a map of all other /// merge functions, using the function that fits best with the /// incoming type parameters. class MasterRenderItemMerge : public RenderItemMerge<RenderItem> { typedef std::map<TypeIdPair, RenderItemMergeFunction*> MergeFunctionMap; public: MasterRenderItemMerge() {} virtual ~MasterRenderItemMerge() {} inline void add(RenderItemMergeFunction * fun) { _mergeFunctionMap[fun->typeIdPair()] = fun; } protected: virtual inline RenderItem * computeMerge(const RenderItem * lhs, const RenderItem * rhs, double ratio) const { RenderItemMergeFunction * mergeFunction; TypeIdPair pair(typeid(lhs), typeid(rhs)); if (_mergeFunctionMap.count(pair)) { mergeFunction = _mergeFunctionMap[pair]; } else if (_mergeFunctionMap.count(pair = TypeIdPair(typeid(rhs), typeid(lhs)))) { mergeFunction = _mergeFunctionMap[pair]; } else { mergeFunction = 0; } // If specialized mergeFunction exists, use it to get higher granularity // of correctness if (mergeFunction) return (*mergeFunction)(lhs, rhs, ratio); else return 0; } private: mutable MergeFunctionMap _mergeFunctionMap; }; #endif /* RenderItemMergeFunction_HPP_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Renderable.cpp����������������������������������������������0000664�0000000�0000000�00000021625�12660066715�0022650�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #include "../Common.hpp" #ifdef USE_GLES1 #include <GLES/gl.h> #else #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #else #include <GL/gl.h> //#include <GL/glu.h> // EDIT BY SJ #endif #endif #include "Renderable.hpp" #include <math.h> typedef float floatPair[2]; typedef float floatTriple[3]; typedef float floatQuad[4]; RenderContext::RenderContext() : time(0),texsize(512), aspectRatio(1), aspectCorrect(false){}; RenderItem::RenderItem():masterAlpha(1){} DarkenCenter::DarkenCenter():RenderItem(){} MotionVectors::MotionVectors():RenderItem(){} Border::Border():RenderItem(){} void DarkenCenter::Draw(RenderContext &context) { //float unit=0.05f; glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); float colors[6][4] = {{0, 0, 0, (3.0f/32.0f) * masterAlpha}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}; float points[6][2] = {{ 0.5, 0.5}, { 0.45, 0.5}, { 0.5, 0.45}, { 0.55, 0.5}, { 0.5, 0.55}, { 0.45, 0.5}}; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2,GL_FLOAT,0,points); glColorPointer(4,GL_FLOAT,0,colors); glDrawArrays(GL_TRIANGLE_FAN,0,6); } Shape::Shape():RenderItem() { std::string imageUrl = ""; sides = 4; thickOutline = false; enabled = true; additive = false; textured = false; tex_zoom = 1.0; tex_ang = 0.0; x = 0.5; y = 0.5; radius = 1.0; ang = 0.0; r = 0.0; /* red color value */ g = 0.0; /* green color value */ b = 0.0; /* blue color value */ a = 0.0; /* alpha color value */ r2 = 0.0; /* red color value */ g2 = 0.0; /* green color value */ b2 = 0.0; /* blue color value */ a2 = 0.0; /* alpha color value */ border_r = 0.0; /* red color value */ border_g = 0.0; /* green color value */ border_b = 0.0; /* blue color value */ border_a = 0.0; /* alpha color value */ } void Shape::Draw(RenderContext &context) { float xval, yval; float t; // printf("drawing shape %f\n", ang); float temp_radius= radius*(.707*.707*.707*1.04); //Additive Drawing or Overwrite if ( additive==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); else glBlendFunc(GL_SRC_ALPHA, GL_ONE); xval= x; yval= -(y-1); if ( textured) { if (imageUrl !="") { GLuint tex= context.textureManager->getTexture(imageUrl); if (tex != 0) { glBindTexture(GL_TEXTURE_2D, tex); context.aspectRatio=1.0; } } glMatrixMode(GL_TEXTURE); glPushMatrix(); glLoadIdentity(); glEnable(GL_TEXTURE_2D); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); floatQuad *colors = new float[sides+2][4]; floatPair *tex = new float[sides+2][2]; floatPair *points = new float[sides+2][2]; //Define the center point of the shape colors[0][0] = r; colors[0][1] = g; colors[0][2] = b; colors[0][3] = a * masterAlpha; tex[0][0] = 0.5; tex[0][1] = 0.5; points[0][0] = xval; points[0][1] = yval; for ( int i=1;i< sides+2;i++) { colors[i][0]= r2; colors[i][1]=g2; colors[i][2]=b2; colors[i][3]=a2 * masterAlpha; t = (i-1)/(float) sides; tex[i][0] =0.5f + 0.5f*cosf(t*3.1415927f*2 + tex_ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)/ tex_zoom; tex[i][1] = 0.5f + 0.5f*sinf(t*3.1415927f*2 + tex_ang + 3.1415927f*0.25f)/ tex_zoom; points[i][0]=temp_radius*cosf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval; points[i][1]=temp_radius*sinf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)+yval; } glVertexPointer(2,GL_FLOAT,0,points); glColorPointer(4,GL_FLOAT,0,colors); glTexCoordPointer(2,GL_FLOAT,0,tex); glDrawArrays(GL_TRIANGLE_FAN,0,sides+2); glDisable(GL_TEXTURE_2D); glPopMatrix(); glMatrixMode(GL_MODELVIEW); //Reset Texture state since we might have changed it /* if(this->renderTarget->useFBO) { glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] ); } else { glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] ); } */ delete[] colors; delete[] tex; delete[] points; } else {//Untextured (use color values) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); floatQuad *colors = new float[sides+2][4]; floatPair *points = new float[sides+2][2]; //Define the center point of the shape colors[0][0]=r; colors[0][1]=g; colors[0][2]=b; colors[0][3]=a * masterAlpha; points[0][0]=xval; points[0][1]=yval; for ( int i=1;i< sides+2;i++) { colors[i][0]=r2; colors[i][1]=g2; colors[i][2]=b2; colors[i][3]=a2 * masterAlpha; t = (i-1)/(float) sides; points[i][0]=temp_radius*cosf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval; points[i][1]=temp_radius*sinf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)+yval; } glVertexPointer(2,GL_FLOAT,0,points); glColorPointer(4,GL_FLOAT,0,colors); glDrawArrays(GL_TRIANGLE_FAN,0,sides+2); //draw first n-1 triangular pieces delete[] colors; delete[] points; } if (thickOutline==1) glLineWidth(context.texsize < 512 ? 1 : 2*context.texsize/512); glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); floatPair *points = new float[sides+1][2]; glColor4f( border_r, border_g, border_b, border_a * masterAlpha); for ( int i=0;i< sides;i++) { t = (i-1)/(float) sides; points[i][0]= temp_radius*cosf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval; points[i][1]= temp_radius*sinf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)+yval; } glVertexPointer(2,GL_FLOAT,0,points); glDrawArrays(GL_LINE_LOOP,0,sides); if (thickOutline==1) glLineWidth(context.texsize < 512 ? 1 : context.texsize/512); delete[] points; } void MotionVectors::Draw(RenderContext &context) { glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); float intervalx=1.0/x_num; float intervaly=1.0/y_num; glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPointSize(length); glColor4f(r, g, b, a * masterAlpha); if (x_num + y_num < 600) { int size = x_num * y_num ; floatPair *points = new float[size][2]; for (int x=0;x<(int)x_num;x++) { for(int y=0;y<(int)y_num;y++) { float lx, ly /*, lz */; // EDIT BY SJ lx = x_offset+x*intervalx; ly = y_offset+y*intervaly; points[(x * (int)y_num) + y][0] = lx; points[(x * (int)y_num) + y][1] = ly; } } glVertexPointer(2,GL_FLOAT,0,points); glDrawArrays(GL_POINTS,0,size); delete[] points; } } void Border::Draw(RenderContext &context) { glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); //Draw Borders float of=outer_size*.5; float iff=inner_size*.5; float texof=1.0-of; //no additive drawing for borders glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(outer_r, outer_g, outer_b, outer_a * masterAlpha); float pointsA[4][2] = {{0,0},{0,1},{of,0},{of,1}}; glVertexPointer(2,GL_FLOAT,0,pointsA); glDrawArrays(GL_TRIANGLE_STRIP,0,4); float pointsB[4][2] = {{of,0},{of,of},{texof,0},{texof,of}}; glVertexPointer(2,GL_FLOAT,0,pointsB); glDrawArrays(GL_TRIANGLE_STRIP,0,4); float pointsC[4][2] = {{texof,0},{texof,1},{1,0},{1,1}}; glVertexPointer(2,GL_FLOAT,0,pointsC); glDrawArrays(GL_TRIANGLE_STRIP,0,4); float pointsD[4][2] = {{of,1},{of,texof},{texof,1},{texof,texof}}; glVertexPointer(2,GL_FLOAT,0,pointsD); glDrawArrays(GL_TRIANGLE_STRIP,0,4); glColor4f(inner_r, inner_g, inner_b, inner_a * masterAlpha); glRectd(of, of, of+iff, texof); glRectd(of+iff, of, texof-iff, of+iff); glRectd(texof-iff, of, texof, texof); glRectd(of+iff, texof, texof-iff, texof-iff); float pointsE[4][2] = {{of,of},{of,texof},{of+iff,of},{of+iff,texof}}; glVertexPointer(2,GL_FLOAT,0,pointsE); glDrawArrays(GL_TRIANGLE_STRIP,0,4); float pointsF[4][2] = {{of+iff,of},{of+iff,of+iff},{texof-iff,of},{texof-iff,of+iff}}; glVertexPointer(2,GL_FLOAT,0,pointsF); glDrawArrays(GL_TRIANGLE_STRIP,0,4); float pointsG[4][2] = {{texof-iff,of},{texof-iff,texof},{texof,of},{texof,texof}}; glVertexPointer(2,GL_FLOAT,0,pointsG); glDrawArrays(GL_TRIANGLE_STRIP,0,4); float pointsH[4][2] = {{of+iff,texof},{of+iff,texof-iff},{texof-iff,texof},{texof-iff,texof-iff}}; glVertexPointer(2,GL_FLOAT,0,pointsH); glDrawArrays(GL_TRIANGLE_STRIP,0,4); } �����������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Renderable.hpp����������������������������������������������0000664�0000000�0000000�00000005103�12660066715�0022646�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef Renderable_HPP #define Renderable_HPP #include <vector> #include <typeinfo> #include "TextureManager.hpp" class BeatDetect; class RenderContext { public: float time; int texsize; float aspectRatio; bool aspectCorrect; BeatDetect *beatDetect; TextureManager *textureManager; RenderContext(); }; class RenderItem { public: float masterAlpha; virtual void Draw(RenderContext &context) = 0; RenderItem(); }; typedef std::vector<RenderItem*> RenderItemList; class DarkenCenter : public RenderItem { public: DarkenCenter(); void Draw(RenderContext &context); }; class Shape : public RenderItem { public: std::string imageUrl; int sides; bool thickOutline; bool enabled; bool additive; bool textured; float tex_zoom; float tex_ang; float x; /* x position */ float y; /* y position */ float radius; float ang; float r; /* red color value */ float g; /* green color value */ float b; /* blue color value */ float a; /* alpha color value */ float r2; /* red color value */ float g2; /* green color value */ float b2; /* blue color value */ float a2; /* alpha color value */ float border_r; /* red color value */ float border_g; /* green color value */ float border_b; /* blue color value */ float border_a; /* alpha color value */ Shape(); virtual void Draw(RenderContext &context); }; class Text : RenderItem { }; class MotionVectors : public RenderItem { public: float r; float g; float b; float a; float length; float x_num; float y_num; float x_offset; float y_offset; void Draw(RenderContext &context); MotionVectors(); }; class Border : public RenderItem { public: float outer_size; float outer_r; float outer_g; float outer_b; float outer_a; float inner_size; float inner_r; float inner_g; float inner_b; float inner_a; void Draw(RenderContext &context); Border(); }; struct TypeIdPair { TypeIdPair(const std::type_info & info1, const std::type_info & info2): id1(info1.name()), id2(info2.name()) {} TypeIdPair(const std::string & id1, const std::string & id2): id1(id1), id2(id2) {} std::string id1; std::string id2; inline bool operator<(const TypeIdPair & rhs) const { return this->id1 < rhs.id1 || (this->id1 == rhs.id1 && this->id2 < rhs.id2); } inline bool operator>(const TypeIdPair & rhs) const { return !operator<(rhs) && !operator==(rhs); } inline bool operator==(const TypeIdPair & rhs) const { return this->id1 == rhs.id1 && this->id2 == rhs.id2; } }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Renderer.cpp������������������������������������������������0000664�0000000�0000000�00000044644�12660066715�0022361�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "Renderer.hpp" #include "../wipemalloc.h" #include "math.h" #include "../Common.hpp" #include "../KeyHandler.hpp" #include "TextureManager.hpp" #include <iostream> #include <algorithm> #include <sys/stat.h> #include <cassert> #include "../omptl/omptl" #include "../omptl/omptl_algorithm" #include "UserTexture.hpp" class Preset; Renderer::Renderer(int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string _presetURL, std::string _titlefontURL, std::string _menufontURL) : title_fontURL(_titlefontURL), menu_fontURL(_menufontURL), presetURL(_presetURL), m_presetName("None"), vw(width), vh(height), texsize(texsize), mesh(gx, gy) { //int x; //int y; this->totalframes = 1; this->noSwitch = false; this->showfps = false; this->showtitle = false; this->showpreset = false; this->showhelp = false; this->showstats = false; this->studio = false; this->realfps = 0; this->drawtitle = 0; //this->title = "Unknown"; /** Other stuff... */ this->correction = true; this->aspect = (float) height / (float) width;; /// @bug put these on member init list this->renderTarget = new RenderTarget(texsize, width, height); this->textureManager = new TextureManager(presetURL); this->beatDetect = beatDetect; #ifdef USE_FTGL /** Load the standard fonts if they do exist */ struct stat buffer; if (stat( title_fontURL.c_str(), &buffer )) { std::cout << "Could not open font file: " << title_fontURL << std::endl; exit(1); } if (stat( menu_fontURL.c_str(), &buffer )) { std::cout << "Could not open font file: " << menu_fontURL << std::endl; exit(1); } title_font = new FTGLPixmapFont(title_fontURL.c_str()); other_font = new FTGLPixmapFont(menu_fontURL.c_str()); poly_font = new FTGLExtrdFont(title_fontURL.c_str()); if(title_font->Error()) { fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str()); } else { title_font->UseDisplayList(true); } other_font->UseDisplayList(true); if(poly_font->Error()) { fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str()); } else { poly_font->UseDisplayList(true); poly_font->Depth(20); poly_font->FaceSize(72); } #endif /** USE_FTGL */ int size = (mesh.height - 1) *mesh.width * 5 * 2; p = ( float * ) wipemalloc ( size * sizeof ( float ) ); for (int j = 0; j < mesh.height - 1; j++) { int base = j * mesh.width * 2 * 5; for (int i = 0; i < mesh.width; i++) { int index = j * mesh.width + i; int index2 = (j + 1) * mesh.width + i; int strip = base + i * 10; p[strip + 2] = mesh.identity[index].x; p[strip + 3] = mesh.identity[index].y; p[strip + 4] = 0; p[strip + 7] = mesh.identity[index2].x; p[strip + 8] = mesh.identity[index2].y; p[strip + 9] = 0; } } #ifdef USE_CG shaderEngine.setParams(renderTarget->texsize, renderTarget->textureID[1], aspect, beatDetect, textureManager); #endif } void Renderer::SetPipeline(Pipeline &pipeline) { currentPipe = &pipeline; #ifdef USE_CG shaderEngine.reset(); shaderEngine.loadShader(pipeline.warpShader); shaderEngine.loadShader(pipeline.compositeShader); #endif } void Renderer::ResetTextures() { textureManager->Clear(); delete (renderTarget); renderTarget = new RenderTarget(texsize, vw, vh); reset(vw, vh); textureManager->Preload(); } void Renderer::SetupPass1(const Pipeline &pipeline, const PipelineContext &pipelineContext) { //glMatrixMode(GL_PROJECTION); //glPushMatrix(); //glMatrixMode(GL_MODELVIEW); //glPushMatrix(); totalframes++; renderTarget->lock(); glViewport(0, 0, renderTarget->texsize, renderTarget->texsize); glEnable(GL_TEXTURE_2D); //If using FBO, switch to FBO texture glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); #ifdef USE_GLES1 glOrthof(0.0, 1, 0.0, 1, -40, 40); #else glOrtho(0.0, 1, 0.0, 1, -40, 40); #endif glMatrixMode(GL_MODELVIEW); glLoadIdentity(); #ifdef USE_CG shaderEngine.RenderBlurTextures(pipeline, pipelineContext, renderTarget->texsize); #endif } void Renderer::RenderItems(const Pipeline &pipeline, const PipelineContext &pipelineContext) { renderContext.time = pipelineContext.time; renderContext.texsize = texsize; renderContext.aspectCorrect = correction; renderContext.aspectRatio = aspect; renderContext.textureManager = textureManager; renderContext.beatDetect = beatDetect; for (std::vector<RenderItem*>::const_iterator pos = pipeline.drawables.begin(); pos != pipeline.drawables.end(); ++pos) { if (*pos != NULL) { (*pos)->Draw(renderContext); } } } void Renderer::FinishPass1() { draw_title_to_texture(); /** Restore original view state */ //glMatrixMode(GL_MODELVIEW); //glPopMatrix(); //glMatrixMode(GL_PROJECTION); //glPopMatrix(); renderTarget->unlock(); } void Renderer::Pass2(const Pipeline &pipeline, const PipelineContext &pipelineContext) { //BEGIN PASS 2 // //end of texture rendering //now we copy the texture from the FBO or framebuffer to //video texture memory and render fullscreen. /** Reset the viewport size */ #ifdef USE_FBO if (renderTarget->renderToTexture) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->renderTarget->fbuffer[1]); glViewport(0, 0, this->renderTarget->texsize, this->renderTarget->texsize); } else #endif glViewport(0, 0, this->vw, this->vh); glBindTexture(GL_TEXTURE_2D, this->renderTarget->textureID[0]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); #ifdef USE_GLES1 glOrthof(-0.5, 0.5, -0.5, 0.5, -40, 40); #else glOrtho(-0.5, 0.5, -0.5, 0.5, -40, 40); #endif glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize / 512.0); CompositeOutput(pipeline, pipelineContext); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(-0.5, -0.5, 0); // When console refreshes, there is a chance the preset has been changed by the user refreshConsole(); draw_title_to_screen(false); if (this->showhelp % 2) draw_help(); if (this->showtitle % 2) draw_title(); if (this->showfps % 2) draw_fps(this->realfps); if (this->showpreset % 2) draw_preset(); if (this->showstats % 2) draw_stats(); glTranslatef(0.5, 0.5, 0); #ifdef USE_FBO if (renderTarget->renderToTexture) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); #endif } void Renderer::RenderFrame(const Pipeline &pipeline, const PipelineContext &pipelineContext) { #ifdef USE_FBO // when not 'renderToTexture', the user may use its own couple FBO/texture // so retrieve this external FBO if it exists, (0 means no FBO) and unbind it GLint externalFBO = 0; if (!renderTarget->renderToTexture) { glGetIntegerv(GL_FRAMEBUFFER_BINDING, &externalFBO); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } #endif SetupPass1(pipeline, pipelineContext); #ifdef USE_CG shaderEngine.enableShader(currentPipe->warpShader, pipeline, pipelineContext); #endif Interpolation(pipeline); #ifdef USE_CG shaderEngine.disableShader(); #endif RenderItems(pipeline, pipelineContext); FinishPass1(); #ifdef USE_FBO // when not 'renderToTexture', the user may use its own couple FBO/texture // if it exists (0 means no external FBO) // then rebind it just before calling the final pass: Pass2 if (!renderTarget->renderToTexture && externalFBO != 0) glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, externalFBO); #endif Pass2(pipeline, pipelineContext); } void Renderer::Interpolation(const Pipeline &pipeline) { if (this->renderTarget->useFBO) glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[1]); else glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[0]); //Texture wrapping( clamp vs. wrap) if (pipeline.textureWrap == 0) { #ifdef USE_GLES1 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #else glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); #endif } else { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } glMatrixMode(GL_TEXTURE); glLoadIdentity(); glBlendFunc(GL_SRC_ALPHA, GL_ZERO); glColor4f(1.0, 1.0, 1.0, pipeline.screenDecay); glEnable(GL_TEXTURE_2D); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); //glVertexPointer(2, GL_FLOAT, 0, p); //glTexCoordPointer(2, GL_FLOAT, 0, t); glInterleavedArrays(GL_T2F_V3F,0,p); if (pipeline.staticPerPixel) { for (int j = 0; j < mesh.height - 1; j++) { int base = j * mesh.width * 2 * 5; for (int i = 0; i < mesh.width; i++) { int strip = base + i * 10; p[strip] = pipeline.x_mesh[i][j]; p[strip + 1] = pipeline.y_mesh[i][j]; p[strip + 5] = pipeline.x_mesh[i][j+1]; p[strip + 6] = pipeline.y_mesh[i][j+1]; } } } else { mesh.Reset(); omptl::transform(mesh.p.begin(), mesh.p.end(), mesh.identity.begin(), mesh.p.begin(), &Renderer::PerPixel); for (int j = 0; j < mesh.height - 1; j++) { int base = j * mesh.width * 2 * 5; for (int i = 0; i < mesh.width; i++) { int strip = base + i * 10; int index = j * mesh.width + i; int index2 = (j + 1) * mesh.width + i; p[strip] = mesh.p[index].x; p[strip + 1] = mesh.p[index].y; p[strip + 5] = mesh.p[index2].x; p[strip + 6] = mesh.p[index2].y; } } } for (int j = 0; j < mesh.height - 1; j++) glDrawArrays(GL_TRIANGLE_STRIP,j* mesh.width* 2,mesh.width*2); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } Pipeline* Renderer::currentPipe; Renderer::~Renderer() { //int x; // EDIT BY SJ if (renderTarget) delete (renderTarget); if (textureManager) delete (textureManager); //std::cerr << "grid assign end" << std::endl; free(p); #ifdef USE_FTGL // std::cerr << "freeing title fonts" << std::endl; if (title_font) delete title_font; if (poly_font) delete poly_font; if (other_font) delete other_font; // std::cerr << "freeing title fonts finished" << std::endl; #endif // std::cerr << "exiting destructor" << std::endl; } void Renderer::reset(int w, int h) { aspect = (float) h / (float) w; this -> vw = w; this -> vh = h; #if USE_CG shaderEngine.setAspect(aspect); #endif glShadeModel(GL_SMOOTH); glCullFace(GL_BACK); //glFrontFace( GL_CCW ); glClearColor(0, 0, 0, 0); glViewport(0, 0, w, h); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); #ifndef USE_GLES1 glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); #endif glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH); glClear(GL_COLOR_BUFFER_BIT); #ifndef USE_GLES1 glLineStipple(2, 0xAAAA); #endif glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); if (!this->renderTarget->useFBO) { this->renderTarget->fallbackRescale(w, h); } } GLuint Renderer::initRenderToTexture() { return renderTarget->initRenderToTexture(); } void Renderer::draw_title_to_texture() { #ifdef USE_FTGL if (this->drawtitle > 100) { draw_title_to_screen(true); this->drawtitle = 0; } #endif /** USE_FTGL */ } float title_y; void Renderer::draw_title_to_screen(bool flip) { #ifdef USE_FTGL if (this->drawtitle > 0) { //setUpLighting(); //glEnable(GL_POLYGON_SMOOTH); //glEnable( GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); int draw; if (drawtitle >= 80) draw = 80; else draw = drawtitle; float easein = ((80 - draw) * .0125); float easein2 = easein * easein; if (drawtitle == 1) { title_y = (float) rand() / RAND_MAX; title_y *= 2; title_y -= 1; title_y *= .6; } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE); glColor4f(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glFrustum(-1, 1, -1 * (float) vh / (float) vw, 1 * (float) vh / (float) vw, 1, 1000); if (flip) glScalef(1, -1, 1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslatef(-850, title_y * 850 * vh / vw, easein2 * 900 - 900); glRotatef(easein2 * 360, 1, 0, 0); poly_font->Render(this->title.c_str()); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); this->drawtitle++; glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glDisable(GL_POLYGON_SMOOTH); } #endif /** USE_FTGL */ } void Renderer::draw_title() { #ifdef USE_FTGL //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0); // glPushMatrix(); // glTranslatef(this->vw*.001,this->vh*.03, -1); // glScalef(this->vw*.015,this->vh*.025,0); glRasterPos2f(0.01, 0.05); title_font->FaceSize((unsigned) (20 * (this->vh / 512.0))); title_font->Render(this->title.c_str()); // glPopMatrix(); //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); #endif /** USE_FTGL */ } void Renderer::draw_preset() { #ifdef USE_FTGL //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0); // glPushMatrix(); //glTranslatef(this->vw*.001,this->vh*-.01, -1); //glScalef(this->vw*.003,this->vh*.004,0); glRasterPos2f(0.01, 0.01); title_font->FaceSize((unsigned) (12 * (this->vh / 512.0))); if (this->noSwitch) title_font->Render("[LOCKED] "); title_font->FaceSize((unsigned) (20 * (this->vh / 512.0))); title_font->Render(this->presetName().c_str()); //glPopMatrix(); // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); #endif /** USE_FTGL */ } void Renderer::draw_help() { #ifdef USE_FTGL //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(0, 1, 0); //glScalef(this->vw*.02,this->vh*.02 ,0); title_font->FaceSize((unsigned) (18 * (this->vh / 512.0))); glRasterPos2f(0.01, -0.05); title_font->Render("Help"); glRasterPos2f(0.01, -0.09); title_font->Render("----------------------------"); glRasterPos2f(0.01, -0.13); title_font->Render("F1: This help menu"); glRasterPos2f(0.01, -0.17); title_font->Render("F2: Show song title"); glRasterPos2f(0.01, -0.21); title_font->Render("F3: Show preset name"); glRasterPos2f(0.01, -0.25); title_font->Render("F4: Show Rendering Settings"); glRasterPos2f(0.01, -0.29); title_font->Render("F5: Show FPS"); glRasterPos2f(0.01, -0.35); title_font->Render("F: Fullscreen"); glRasterPos2f(0.01, -0.39); title_font->Render("L: Lock/Unlock Preset"); glRasterPos2f(0.01, -0.43); title_font->Render("M: Show Menu"); glRasterPos2f(0.01, -0.49); title_font->Render("R: Random preset"); glRasterPos2f(0.01, -0.53); title_font->Render("N: Next preset"); glRasterPos2f(0.01, -0.57); title_font->Render("P: Previous preset"); glPopMatrix(); // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); #endif /** USE_FTGL */ } void Renderer::draw_stats() { #ifdef USE_FTGL char buffer[128]; float offset = (this->showfps % 2 ? -0.05 : 0.0); // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(0.01, 1, 0); glRasterPos2f(0, -.05 + offset); other_font->Render(this->correction ? " aspect: corrected" : " aspect: stretched"); sprintf(buffer, " (%f)", this->aspect); other_font->Render(buffer); glRasterPos2f(0, -.09 + offset); other_font->FaceSize((unsigned) (18 * (vh / 512.0))); sprintf(buffer, " texsize: %d", renderTarget->texsize); other_font->Render(buffer); glRasterPos2f(0, -.13 + offset); sprintf(buffer, " viewport: %d x %d", vw, vh); other_font->Render(buffer); glRasterPos2f(0, -.17 + offset); other_font->Render((renderTarget->useFBO ? " FBO: on" : " FBO: off")); glRasterPos2f(0, -.21 + offset); sprintf(buffer, " mesh: %d x %d", mesh.width, mesh.height); other_font->Render(buffer); glRasterPos2f(0, -.25 + offset); sprintf(buffer, " textures: %.1fkB", textureManager->getTextureMemorySize() / 1000.0f); other_font->Render(buffer); #ifdef USE_CG glRasterPos2f(0, -.29 + offset); sprintf(buffer, "shader profile: %s", shaderEngine.profileName.c_str()); other_font->Render(buffer); glRasterPos2f(0, -.33 + offset); sprintf(buffer, " warp shader: %s", currentPipe->warpShader.enabled ? "on" : "off"); other_font->Render(buffer); glRasterPos2f(0, -.37 + offset); sprintf(buffer, " comp shader: %s", currentPipe->compositeShader.enabled ? "on" : "off"); other_font->Render(buffer); #endif glPopMatrix(); // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); #endif /** USE_FTGL */ } void Renderer::draw_fps(float realfps) { #ifdef USE_FTGL char bufferfps[20]; sprintf(bufferfps, "%.1f fps", realfps); // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(0.01, 1, 0); glRasterPos2f(0, -0.05); title_font->FaceSize((unsigned) (20 * (this->vh / 512.0))); title_font->Render(bufferfps); glPopMatrix(); // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); #endif /** USE_FTGL */ } void Renderer::CompositeOutput(const Pipeline &pipeline, const PipelineContext &pipelineContext) { glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //Overwrite anything on the screen glBlendFunc(GL_ONE, GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0f); glEnable(GL_TEXTURE_2D); #ifdef USE_CG shaderEngine.enableShader(currentPipe->compositeShader, pipeline, pipelineContext); #endif float tex[4][2] = { { 0, 1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }; float points[4][2] = { { -0.5, -0.5 }, { -0.5, 0.5 }, { 0.5, 0.5 }, { 0.5, -0.5 } }; glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2, GL_FLOAT, 0, points); glTexCoordPointer(2, GL_FLOAT, 0, tex); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_TEXTURE_COORD_ARRAY); #ifdef USE_CG shaderEngine.disableShader(); #endif for (std::vector<RenderItem*>::const_iterator pos = pipeline.compositeDrawables.begin(); pos != pipeline.compositeDrawables.end(); ++pos) (*pos)->Draw(renderContext); } ��������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Renderer.hpp������������������������������������������������0000664�0000000�0000000�00000005416�12660066715�0022360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef Renderer_HPP #define Renderer_HPP #include "FBO.hpp" #include "BeatDetect.hpp" #include "../Common.hpp" // EDIT BY SJ #include <string> #include <set> #ifdef USE_GLES1 #include <GLES/gl.h> #else #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #else #include <GL/gl.h> //#include <GL/glu.h> // EDIT BY SJ #endif #endif #ifdef USE_FTGL #ifdef WIN32 #include <ftgl.h> #include <FTGLPixmapFont.h> #include <FTGLExtrdFont.h> #else #include <FTGL/ftgl.h> #endif #endif /** USE_FTGL */ #include "Pipeline.hpp" #include "PerPixelMesh.hpp" #include "Transformation.hpp" #include "ShaderEngine.hpp" class UserTexture; class BeatDetect; class TextureManager; class Renderer { public: bool showfps; bool showtitle; bool showpreset; bool showhelp; bool showstats; bool studio; bool correction; bool noSwitch; int totalframes; float realfps; std::string title; int drawtitle; int texsize; Renderer( int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string presetURL, std::string title_fontURL, std::string menu_fontURL); ~Renderer(); void RenderFrame(const Pipeline &pipeline, const PipelineContext &pipelineContext); void ResetTextures(); void reset(int w, int h); GLuint initRenderToTexture(); void SetPipeline(Pipeline &pipeline); void setPresetName(const std::string& theValue) { m_presetName = theValue; } std::string presetName() const { return m_presetName; } private: PerPixelMesh mesh; RenderTarget *renderTarget; BeatDetect *beatDetect; TextureManager *textureManager; static Pipeline* currentPipe; RenderContext renderContext; //per pixel equation variables #ifdef USE_CG ShaderEngine shaderEngine; #endif std::string m_presetName; float* p; int vw; int vh; float aspect; std::string title_fontURL; std::string menu_fontURL; std::string presetURL; #ifdef USE_FTGL FTGLPixmapFont *title_font; FTGLPixmapFont *other_font; FTGLExtrdFont *poly_font; #endif /** USE_FTGL */ void SetupPass1(const Pipeline &pipeline, const PipelineContext &pipelineContext); void Interpolation(const Pipeline &pipeline); void RenderItems(const Pipeline &pipeline, const PipelineContext &pipelineContext); void FinishPass1(); void Pass2 (const Pipeline &pipeline, const PipelineContext &pipelineContext); void CompositeOutput(const Pipeline &pipeline, const PipelineContext &pipelineContext); inline static PixelPoint PerPixel(PixelPoint p, PerPixelContext &context) { return currentPipe->PerPixel(p,context); } void rescale_per_pixel_matrices(); void draw_fps( float realfps ); void draw_stats(); void draw_help(); void draw_preset(); void draw_title(); void draw_title_to_screen(bool flip); void draw_title_to_texture(); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/�������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0020641�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/SOIL.c�������������������������������������������������0000664�0000000�0000000�00000157307�12660066715�0021570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Jonathan Dummer 2007-07-26-10.36 Simple OpenGL Image Library Public Domain using Sean Barret's stb_image as a base Thanks to: * Sean Barret - for the awesome stb_image * Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts * everybody at gamedev.net */ #define SOIL_CHECK_FOR_GL_ERRORS 0 #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <wingdi.h> #include <GL/gl.h> #elif defined(__APPLE__) || defined(__APPLE_CC__) /* I can't test this Apple stuff! */ #include <OpenGL/gl.h> #include <Carbon/Carbon.h> #define APIENTRY #else #include <GL/gl.h> #include <GL/glx.h> #define APIENTRY #endif #include "SOIL.h" #include "stb_image_aug.h" #include "image_helper.h" #include "image_DXT.h" #include <stdlib.h> #include <string.h> /* error reporting */ const char *result_string_pointer = "SOIL initialized"; /* for loading cube maps */ enum{ SOIL_CAPABILITY_UNKNOWN = -1, SOIL_CAPABILITY_NONE = 0, SOIL_CAPABILITY_PRESENT = 1 }; static int has_cubemap_capability = SOIL_CAPABILITY_UNKNOWN; int query_cubemap_capability( void ); #define SOIL_TEXTURE_WRAP_R 0x8072 #define SOIL_CLAMP_TO_EDGE 0x812F #define SOIL_NORMAL_MAP 0x8511 #define SOIL_REFLECTION_MAP 0x8512 #define SOIL_TEXTURE_CUBE_MAP 0x8513 #define SOIL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define SOIL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define SOIL_PROXY_TEXTURE_CUBE_MAP 0x851B #define SOIL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C /* for non-power-of-two texture */ static int has_NPOT_capability = SOIL_CAPABILITY_UNKNOWN; int query_NPOT_capability( void ); /* for texture rectangles */ static int has_tex_rectangle_capability = SOIL_CAPABILITY_UNKNOWN; int query_tex_rectangle_capability( void ); #define SOIL_TEXTURE_RECTANGLE_ARB 0x84F5 #define SOIL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 /* for using DXT compression */ static int has_DXT_capability = SOIL_CAPABILITY_UNKNOWN; int query_DXT_capability( void ); #define SOIL_RGB_S3TC_DXT1 0x83F0 #define SOIL_RGBA_S3TC_DXT1 0x83F1 #define SOIL_RGBA_S3TC_DXT3 0x83F2 #define SOIL_RGBA_S3TC_DXT5 0x83F3 typedef void (APIENTRY * P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC soilGlCompressedTexImage2D = NULL; unsigned int SOIL_direct_load_DDS( const char *filename, unsigned int reuse_texture_ID, int flags, int loading_as_cubemap ); unsigned int SOIL_direct_load_DDS_from_memory( const unsigned char *const buffer, int buffer_length, unsigned int reuse_texture_ID, int flags, int loading_as_cubemap ); /* other functions */ unsigned int SOIL_internal_create_OGL_texture ( const unsigned char *const data, int width, int height, int channels, unsigned int reuse_texture_ID, unsigned int flags, unsigned int opengl_texture_type, unsigned int opengl_texture_target, unsigned int texture_check_size_enum ); /* and the code magic begins here [8^) */ unsigned int SOIL_load_OGL_texture ( const char *filename, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { int width, height; return SOIL_load_OGL_texture_size(filename,force_channels,reuse_texture_ID,flags,&width, &height); } unsigned int SOIL_load_OGL_texture_size ( const char *filename, int force_channels, unsigned int reuse_texture_ID, unsigned int flags, int *width, int *height ) { /* variables */ unsigned char* img; int channels; unsigned int tex_id; /* does the user want direct uploading of the image as a DDS file? */ if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) { /* 1st try direct loading of the image as a DDS file note: direct uploading will only load what is in the DDS file, no MIPmaps will be generated, the image will not be flipped, etc. */ tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 0 ); if( tex_id ) { /* hey, it worked!! */ return tex_id; } } /* try to load the image */ img = SOIL_load_image( filename, width, height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* OK, make it a texture! */ tex_id = SOIL_internal_create_OGL_texture( img, *width, *height, channels, reuse_texture_ID, flags, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_MAX_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); /* and return the handle, such as it is */ return tex_id; } unsigned int SOIL_load_OGL_HDR_texture ( const char *filename, int fake_HDR_format, int rescale_to_max, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels; unsigned int tex_id; /* no direct uploading of the image as a DDS file */ /* error check */ if( (fake_HDR_format != SOIL_HDR_RGBE) && (fake_HDR_format != SOIL_HDR_RGBdivA) && (fake_HDR_format != SOIL_HDR_RGBdivA2) ) { result_string_pointer = "Invalid fake HDR format specified"; return 0; } /* try to load the image (only the HDR type) */ img = stbi_hdr_load_rgbe( filename, &width, &height, &channels, 4 ); /* channels holds the original number of channels, which may have been forced */ if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* the load worked, do I need to convert it? */ if( fake_HDR_format == SOIL_HDR_RGBdivA ) { RGBE_to_RGBdivA( img, width, height, rescale_to_max ); } else if( fake_HDR_format == SOIL_HDR_RGBdivA2 ) { RGBE_to_RGBdivA2( img, width, height, rescale_to_max ); } /* OK, make it a texture! */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, reuse_texture_ID, flags, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_MAX_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); /* and return the handle, such as it is */ return tex_id; } unsigned int SOIL_load_OGL_texture_from_memory ( const unsigned char *const buffer, int buffer_length, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels; unsigned int tex_id; /* does the user want direct uploading of the image as a DDS file? */ if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) { /* 1st try direct loading of the image as a DDS file note: direct uploading will only load what is in the DDS file, no MIPmaps will be generated, the image will not be flipped, etc. */ tex_id = SOIL_direct_load_DDS_from_memory( buffer, buffer_length, reuse_texture_ID, flags, 0 ); if( tex_id ) { /* hey, it worked!! */ return tex_id; } } /* try to load the image */ img = SOIL_load_image_from_memory( buffer, buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* OK, make it a texture! */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, reuse_texture_ID, flags, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_MAX_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); /* and return the handle, such as it is */ return tex_id; } unsigned int SOIL_load_OGL_cubemap ( const char *x_pos_file, const char *x_neg_file, const char *y_pos_file, const char *y_neg_file, const char *z_pos_file, const char *z_neg_file, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels; unsigned int tex_id; /* error checking */ if( (x_pos_file == NULL) || (x_neg_file == NULL) || (y_pos_file == NULL) || (y_neg_file == NULL) || (z_pos_file == NULL) || (z_neg_file == NULL) ) { result_string_pointer = "Invalid cube map files list"; return 0; } /* capability checking */ if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT ) { result_string_pointer = "No cube map capability present"; return 0; } /* 1st face: try to load the image */ img = SOIL_load_image( x_pos_file, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, and create a texture ID if necessary */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, reuse_texture_ID, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image( x_neg_file, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image( y_pos_file, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image( y_neg_file, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image( z_pos_file, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image( z_neg_file, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* and return the handle, such as it is */ return tex_id; } unsigned int SOIL_load_OGL_cubemap_from_memory ( const unsigned char *const x_pos_buffer, int x_pos_buffer_length, const unsigned char *const x_neg_buffer, int x_neg_buffer_length, const unsigned char *const y_pos_buffer, int y_pos_buffer_length, const unsigned char *const y_neg_buffer, int y_neg_buffer_length, const unsigned char *const z_pos_buffer, int z_pos_buffer_length, const unsigned char *const z_neg_buffer, int z_neg_buffer_length, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels; unsigned int tex_id; /* error checking */ if( (x_pos_buffer == NULL) || (x_neg_buffer == NULL) || (y_pos_buffer == NULL) || (y_neg_buffer == NULL) || (z_pos_buffer == NULL) || (z_neg_buffer == NULL) ) { result_string_pointer = "Invalid cube map buffers list"; return 0; } /* capability checking */ if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT ) { result_string_pointer = "No cube map capability present"; return 0; } /* 1st face: try to load the image */ img = SOIL_load_image_from_memory( x_pos_buffer, x_pos_buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, and create a texture ID if necessary */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, reuse_texture_ID, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image_from_memory( x_neg_buffer, x_neg_buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image_from_memory( y_pos_buffer, y_pos_buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image_from_memory( y_neg_buffer, y_neg_buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image_from_memory( z_pos_buffer, z_pos_buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* continue? */ if( tex_id != 0 ) { /* 1st face: try to load the image */ img = SOIL_load_image_from_memory( z_neg_buffer, z_neg_buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* upload the texture, but reuse the assigned texture ID */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); } /* and return the handle, such as it is */ return tex_id; } unsigned int SOIL_load_OGL_single_cubemap ( const char *filename, const char face_order[6], int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels, i; unsigned int tex_id = 0; /* error checking */ if( filename == NULL ) { result_string_pointer = "Invalid single cube map file name"; return 0; } /* does the user want direct uploading of the image as a DDS file? */ if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) { /* 1st try direct loading of the image as a DDS file note: direct uploading will only load what is in the DDS file, no MIPmaps will be generated, the image will not be flipped, etc. */ tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 1 ); if( tex_id ) { /* hey, it worked!! */ return tex_id; } } /* face order checking */ for( i = 0; i < 6; ++i ) { if( (face_order[i] != 'N') && (face_order[i] != 'S') && (face_order[i] != 'W') && (face_order[i] != 'E') && (face_order[i] != 'U') && (face_order[i] != 'D') ) { result_string_pointer = "Invalid single cube map face order"; return 0; }; } /* capability checking */ if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT ) { result_string_pointer = "No cube map capability present"; return 0; } /* 1st off, try to load the full image */ img = SOIL_load_image( filename, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* now, does this image have the right dimensions? */ if( (width != 6*height) && (6*width != height) ) { SOIL_free_image_data( img ); result_string_pointer = "Single cubemap image must have a 6:1 ratio"; return 0; } /* try the image split and create */ tex_id = SOIL_create_OGL_single_cubemap( img, width, height, channels, face_order, reuse_texture_ID, flags ); /* nuke the temporary image data and return the texture handle */ SOIL_free_image_data( img ); return tex_id; } unsigned int SOIL_load_OGL_single_cubemap_from_memory ( const unsigned char *const buffer, int buffer_length, const char face_order[6], int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels, i; unsigned int tex_id = 0; /* error checking */ if( buffer == NULL ) { result_string_pointer = "Invalid single cube map buffer"; return 0; } /* does the user want direct uploading of the image as a DDS file? */ if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) { /* 1st try direct loading of the image as a DDS file note: direct uploading will only load what is in the DDS file, no MIPmaps will be generated, the image will not be flipped, etc. */ tex_id = SOIL_direct_load_DDS_from_memory( buffer, buffer_length, reuse_texture_ID, flags, 1 ); if( tex_id ) { /* hey, it worked!! */ return tex_id; } } /* face order checking */ for( i = 0; i < 6; ++i ) { if( (face_order[i] != 'N') && (face_order[i] != 'S') && (face_order[i] != 'W') && (face_order[i] != 'E') && (face_order[i] != 'U') && (face_order[i] != 'D') ) { result_string_pointer = "Invalid single cube map face order"; return 0; }; } /* capability checking */ if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT ) { result_string_pointer = "No cube map capability present"; return 0; } /* 1st off, try to load the full image */ img = SOIL_load_image_from_memory( buffer, buffer_length, &width, &height, &channels, force_channels ); /* channels holds the original number of channels, which may have been forced */ if( (force_channels >= 1) && (force_channels <= 4) ) { channels = force_channels; } if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* now, does this image have the right dimensions? */ if( (width != 6*height) && (6*width != height) ) { SOIL_free_image_data( img ); result_string_pointer = "Single cubemap image must have a 6:1 ratio"; return 0; } /* try the image split and create */ tex_id = SOIL_create_OGL_single_cubemap( img, width, height, channels, face_order, reuse_texture_ID, flags ); /* nuke the temporary image data and return the texture handle */ SOIL_free_image_data( img ); return tex_id; } unsigned int SOIL_create_OGL_single_cubemap ( const unsigned char *const data, int width, int height, int channels, const char face_order[6], unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* sub_img; int dw, dh, sz, i; unsigned int tex_id; /* error checking */ if( data == NULL ) { result_string_pointer = "Invalid single cube map image data"; return 0; } /* face order checking */ for( i = 0; i < 6; ++i ) { if( (face_order[i] != 'N') && (face_order[i] != 'S') && (face_order[i] != 'W') && (face_order[i] != 'E') && (face_order[i] != 'U') && (face_order[i] != 'D') ) { result_string_pointer = "Invalid single cube map face order"; return 0; }; } /* capability checking */ if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT ) { result_string_pointer = "No cube map capability present"; return 0; } /* now, does this image have the right dimensions? */ if( (width != 6*height) && (6*width != height) ) { result_string_pointer = "Single cubemap image must have a 6:1 ratio"; return 0; } /* which way am I stepping? */ if( width > height ) { dw = height; dh = 0; } else { dw = 0; dh = width; } sz = dw+dh; sub_img = (unsigned char *)malloc( sz*sz*channels ); /* do the splitting and uploading */ tex_id = reuse_texture_ID; for( i = 0; i < 6; ++i ) { int x, y, idx = 0; unsigned int cubemap_target = 0; /* copy in the sub-image */ for( y = i*dh; y < i*dh+sz; ++y ) { for( x = i*dw*channels; x < (i*dw+sz)*channels; ++x ) { sub_img[idx++] = data[y*width*channels+x]; } } /* what is my texture target? remember, this coordinate system is LHS if viewed from inside the cube! */ switch( face_order[i] ) { case 'N': cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z; break; case 'S': cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z; break; case 'W': cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X; break; case 'E': cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X; break; case 'U': cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y; break; case 'D': cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y; break; } /* upload it as a texture */ tex_id = SOIL_internal_create_OGL_texture( sub_img, sz, sz, channels, tex_id, flags, SOIL_TEXTURE_CUBE_MAP, cubemap_target, SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); } /* and nuke the image and sub-image data */ SOIL_free_image_data( sub_img ); /* and return the handle, such as it is */ return tex_id; } unsigned int SOIL_create_OGL_texture ( const unsigned char *const data, int width, int height, int channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* wrapper function for 2D textures */ return SOIL_internal_create_OGL_texture( data, width, height, channels, reuse_texture_ID, flags, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_MAX_TEXTURE_SIZE ); } #if SOIL_CHECK_FOR_GL_ERRORS void check_for_GL_errors( const char *calling_location ) { /* check for errors */ GLenum err_code = glGetError(); while( GL_NO_ERROR != err_code ) { printf( "OpenGL Error @ %s: %i", calling_location, err_code ); err_code = glGetError(); } } #else void check_for_GL_errors( const char *calling_location ) { /* no check for errors */ } #endif unsigned int SOIL_internal_create_OGL_texture ( const unsigned char *const data, int width, int height, int channels, unsigned int reuse_texture_ID, unsigned int flags, unsigned int opengl_texture_type, unsigned int opengl_texture_target, unsigned int texture_check_size_enum ) { /* variables */ unsigned char* img; unsigned int tex_id; unsigned int internal_texture_format = 0, original_texture_format = 0; int DXT_mode = SOIL_CAPABILITY_UNKNOWN; int max_supported_size; /* If the user wants to use the texture rectangle I kill a few flags */ if( flags & SOIL_FLAG_TEXTURE_RECTANGLE ) { /* well, the user asked for it, can we do that? */ if( query_tex_rectangle_capability() == SOIL_CAPABILITY_PRESENT ) { /* only allow this if the user in _NOT_ trying to do a cubemap! */ if( opengl_texture_type == GL_TEXTURE_2D ) { /* clean out the flags that cannot be used with texture rectangles */ flags &= ~( SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS ); /* and change my target */ opengl_texture_target = SOIL_TEXTURE_RECTANGLE_ARB; opengl_texture_type = SOIL_TEXTURE_RECTANGLE_ARB; } else { /* not allowed for any other uses (yes, I'm looking at you, cubemaps!) */ flags &= ~SOIL_FLAG_TEXTURE_RECTANGLE; } } else { /* can't do it, and that is a breakable offense (uv coords use pixels instead of [0,1]!) */ result_string_pointer = "Texture Rectangle extension unsupported"; return 0; } } /* create a copy the image data */ img = (unsigned char*)malloc( width*height*channels ); memcpy( img, data, width*height*channels ); /* does the user want me to invert the image? */ if( flags & SOIL_FLAG_INVERT_Y ) { int i, j; for( j = 0; j*2 < height; ++j ) { int index1 = j * width * channels; int index2 = (height - 1 - j) * width * channels; for( i = width * channels; i > 0; --i ) { unsigned char temp = img[index1]; img[index1] = img[index2]; img[index2] = temp; ++index1; ++index2; } } } /* does the user want me to scale the colors into the NTSC safe RGB range? */ if( flags & SOIL_FLAG_NTSC_SAFE_RGB ) { scale_image_RGB_to_NTSC_safe( img, width, height, channels ); } /* does the user want me to convert from straight to pre-multiplied alpha? (and do we even _have_ alpha?) */ if( flags & SOIL_FLAG_MULTIPLY_ALPHA ) { int i; switch( channels ) { case 2: for( i = 0; i < 2*width*height; i += 2 ) { img[i] = (img[i] * img[i+1] + 128) >> 8; } break; case 4: for( i = 0; i < 4*width*height; i += 4 ) { img[i+0] = (img[i+0] * img[i+3] + 128) >> 8; img[i+1] = (img[i+1] * img[i+3] + 128) >> 8; img[i+2] = (img[i+2] * img[i+3] + 128) >> 8; } break; default: /* no other number of channels contains alpha data */ break; } } /* if the user can't support NPOT textures, make sure we force the POT option */ if( (query_NPOT_capability() == SOIL_CAPABILITY_NONE) && !(flags & SOIL_FLAG_TEXTURE_RECTANGLE) ) { /* add in the POT flag */ flags |= SOIL_FLAG_POWER_OF_TWO; } /* how large of a texture can this OpenGL implementation handle? */ /* texture_check_size_enum will be GL_MAX_TEXTURE_SIZE or SOIL_MAX_CUBE_MAP_TEXTURE_SIZE */ glGetIntegerv( texture_check_size_enum, &max_supported_size ); /* do I need to make it a power of 2? */ if( (flags & SOIL_FLAG_POWER_OF_TWO) || /* user asked for it */ (flags & SOIL_FLAG_MIPMAPS) || /* need it for the MIP-maps */ (width > max_supported_size) || /* it's too big, (make sure it's */ (height > max_supported_size) ) /* 2^n for later down-sampling) */ { int new_width = 1; int new_height = 1; while( new_width < width ) { new_width *= 2; } while( new_height < height ) { new_height *= 2; } /* still? */ if( (new_width != width) || (new_height != height) ) { /* yep, resize */ unsigned char *resampled = (unsigned char*)malloc( channels*new_width*new_height ); up_scale_image( img, width, height, channels, resampled, new_width, new_height ); /* OJO this is for debug only! */ /* SOIL_save_image( "\\showme.bmp", SOIL_SAVE_TYPE_BMP, new_width, new_height, channels, resampled ); */ /* nuke the old guy, then point it at the new guy */ SOIL_free_image_data( img ); img = resampled; width = new_width; height = new_height; } } /* now, if it is too large... */ if( (width > max_supported_size) || (height > max_supported_size) ) { /* I've already made it a power of two, so simply use the MIPmapping code to reduce its size to the allowable maximum. */ unsigned char *resampled; int reduce_block_x = 1, reduce_block_y = 1; int new_width, new_height; if( width > max_supported_size ) { reduce_block_x = width / max_supported_size; } if( height > max_supported_size ) { reduce_block_y = height / max_supported_size; } new_width = width / reduce_block_x; new_height = height / reduce_block_y; resampled = (unsigned char*)malloc( channels*new_width*new_height ); /* perform the actual reduction */ mipmap_image( img, width, height, channels, resampled, reduce_block_x, reduce_block_y ); /* nuke the old guy, then point it at the new guy */ SOIL_free_image_data( img ); img = resampled; width = new_width; height = new_height; } /* does the user want us to use YCoCg color space? */ if( flags & SOIL_FLAG_CoCg_Y ) { /* this will only work with RGB and RGBA images */ convert_RGB_to_YCoCg( img, width, height, channels ); /* save_image_as_DDS( "CoCg_Y.dds", width, height, channels, img ); */ } /* create the OpenGL texture ID handle (note: allowing a forced texture ID lets me reload a texture) */ tex_id = reuse_texture_ID; if( tex_id == 0 ) { glGenTextures( 1, &tex_id ); } check_for_GL_errors( "glGenTextures" ); /* Note: sometimes glGenTextures fails (usually no OpenGL context) */ if( tex_id ) { /* and what type am I using as the internal texture format? */ switch( channels ) { case 1: original_texture_format = GL_LUMINANCE; break; case 2: original_texture_format = GL_LUMINANCE_ALPHA; break; case 3: original_texture_format = GL_RGB; break; case 4: original_texture_format = GL_RGBA; break; } internal_texture_format = original_texture_format; /* does the user want me to, and can I, save as DXT? */ if( flags & SOIL_FLAG_COMPRESS_TO_DXT ) { DXT_mode = query_DXT_capability(); if( DXT_mode == SOIL_CAPABILITY_PRESENT ) { /* I can use DXT, whether I compress it or OpenGL does */ if( (channels & 1) == 1 ) { /* 1 or 3 channels = DXT1 */ internal_texture_format = SOIL_RGB_S3TC_DXT1; } else { /* 2 or 4 channels = DXT5 */ internal_texture_format = SOIL_RGBA_S3TC_DXT5; } } } /* bind an OpenGL texture ID */ glBindTexture( opengl_texture_type, tex_id ); check_for_GL_errors( "glBindTexture" ); /* upload the main image */ if( DXT_mode == SOIL_CAPABILITY_PRESENT ) { /* user wants me to do the DXT conversion! */ int DDS_size; unsigned char *DDS_data = NULL; if( (channels & 1) == 1 ) { /* RGB, use DXT1 */ DDS_data = convert_image_to_DXT1( img, width, height, channels, &DDS_size ); } else { /* RGBA, use DXT5 */ DDS_data = convert_image_to_DXT5( img, width, height, channels, &DDS_size ); } if( DDS_data ) { soilGlCompressedTexImage2D( opengl_texture_target, 0, internal_texture_format, width, height, 0, DDS_size, DDS_data ); check_for_GL_errors( "glCompressedTexImage2D" ); SOIL_free_image_data( DDS_data ); /* printf( "Internal DXT compressor\n" ); */ } else { /* my compression failed, try the OpenGL driver's version */ glTexImage2D( opengl_texture_target, 0, internal_texture_format, width, height, 0, original_texture_format, GL_UNSIGNED_BYTE, img ); check_for_GL_errors( "glTexImage2D" ); /* printf( "OpenGL DXT compressor\n" ); */ } } else { /* user want OpenGL to do all the work! */ glTexImage2D( opengl_texture_target, 0, internal_texture_format, width, height, 0, original_texture_format, GL_UNSIGNED_BYTE, img ); check_for_GL_errors( "glTexImage2D" ); /*printf( "OpenGL DXT compressor\n" ); */ } /* are any MIPmaps desired? */ if( flags & SOIL_FLAG_MIPMAPS ) { int MIPlevel = 1; int MIPwidth = (width+1) / 2; int MIPheight = (height+1) / 2; unsigned char *resampled = (unsigned char*)malloc( channels*MIPwidth*MIPheight ); while( ((1<<MIPlevel) <= width) || ((1<<MIPlevel) <= height) ) { /* do this MIPmap level */ mipmap_image( img, width, height, channels, resampled, (1 << MIPlevel), (1 << MIPlevel) ); /* upload the MIPmaps */ if( DXT_mode == SOIL_CAPABILITY_PRESENT ) { /* user wants me to do the DXT conversion! */ int DDS_size; unsigned char *DDS_data = NULL; if( (channels & 1) == 1 ) { /* RGB, use DXT1 */ DDS_data = convert_image_to_DXT1( resampled, MIPwidth, MIPheight, channels, &DDS_size ); } else { /* RGBA, use DXT5 */ DDS_data = convert_image_to_DXT5( resampled, MIPwidth, MIPheight, channels, &DDS_size ); } if( DDS_data ) { soilGlCompressedTexImage2D( opengl_texture_target, MIPlevel, internal_texture_format, MIPwidth, MIPheight, 0, DDS_size, DDS_data ); check_for_GL_errors( "glCompressedTexImage2D" ); SOIL_free_image_data( DDS_data ); } else { /* my compression failed, try the OpenGL driver's version */ glTexImage2D( opengl_texture_target, MIPlevel, internal_texture_format, MIPwidth, MIPheight, 0, original_texture_format, GL_UNSIGNED_BYTE, resampled ); check_for_GL_errors( "glTexImage2D" ); } } else { /* user want OpenGL to do all the work! */ glTexImage2D( opengl_texture_target, MIPlevel, internal_texture_format, MIPwidth, MIPheight, 0, original_texture_format, GL_UNSIGNED_BYTE, resampled ); check_for_GL_errors( "glTexImage2D" ); } /* prep for the next level */ ++MIPlevel; MIPwidth = (MIPwidth + 1) / 2; MIPheight = (MIPheight + 1) / 2; } SOIL_free_image_data( resampled ); /* instruct OpenGL to use the MIPmaps */ glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); check_for_GL_errors( "GL_TEXTURE_MIN/MAG_FILTER" ); } else { /* instruct OpenGL _NOT_ to use the MIPmaps */ glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); check_for_GL_errors( "GL_TEXTURE_MIN/MAG_FILTER" ); } /* does the user want clamping, or wrapping? */ if( flags & SOIL_FLAG_TEXTURE_REPEATS ) { glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT ); if( opengl_texture_type == SOIL_TEXTURE_CUBE_MAP ) { /* SOIL_TEXTURE_WRAP_R is invalid if cubemaps aren't supported */ glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT ); } check_for_GL_errors( "GL_TEXTURE_WRAP_*" ); } else { /* unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE; */ unsigned int clamp_mode = GL_CLAMP; glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode ); glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode ); if( opengl_texture_type == SOIL_TEXTURE_CUBE_MAP ) { /* SOIL_TEXTURE_WRAP_R is invalid if cubemaps aren't supported */ glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode ); } check_for_GL_errors( "GL_TEXTURE_WRAP_*" ); } /* done */ result_string_pointer = "Image loaded as an OpenGL texture"; } else { /* failed */ result_string_pointer = "Failed to generate an OpenGL texture name; missing OpenGL context?"; } SOIL_free_image_data( img ); return tex_id; } int SOIL_save_screenshot ( const char *filename, int image_type, int x, int y, int width, int height ) { unsigned char *pixel_data; int i, j; int save_result; /* error checks */ if( (width < 1) || (height < 1) ) { result_string_pointer = "Invalid screenshot dimensions"; return 0; } if( (x < 0) || (y < 0) ) { result_string_pointer = "Invalid screenshot location"; return 0; } if( filename == NULL ) { result_string_pointer = "Invalid screenshot filename"; return 0; } /* Get the data from OpenGL */ pixel_data = (unsigned char*)malloc( 3*width*height ); glReadPixels (x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixel_data); /* invert the image */ for( j = 0; j*2 < height; ++j ) { int index1 = j * width * 3; int index2 = (height - 1 - j) * width * 3; for( i = width * 3; i > 0; --i ) { unsigned char temp = pixel_data[index1]; pixel_data[index1] = pixel_data[index2]; pixel_data[index2] = temp; ++index1; ++index2; } } /* save the image */ save_result = SOIL_save_image( filename, image_type, width, height, 3, pixel_data); /* And free the memory */ SOIL_free_image_data( pixel_data ); return save_result; } unsigned char* SOIL_load_image ( const char *filename, int *width, int *height, int *channels, int force_channels ) { unsigned char *result = stbi_load( filename, width, height, channels, force_channels ); if( result == NULL ) { result_string_pointer = stbi_failure_reason(); } else { result_string_pointer = "Image loaded"; } return result; } unsigned char* SOIL_load_image_from_memory ( const unsigned char *const buffer, int buffer_length, int *width, int *height, int *channels, int force_channels ) { unsigned char *result = stbi_load_from_memory( buffer, buffer_length, width, height, channels, force_channels ); if( result == NULL ) { result_string_pointer = stbi_failure_reason(); } else { result_string_pointer = "Image loaded from memory"; } return result; } int SOIL_save_image ( const char *filename, int image_type, int width, int height, int channels, const unsigned char *const data ) { int save_result; /* error check */ if( (width < 1) || (height < 1) || (channels < 1) || (channels > 4) || (data == NULL) || (filename == NULL) ) { return 0; } if( image_type == SOIL_SAVE_TYPE_BMP ) { save_result = stbi_write_bmp( filename, width, height, channels, (void*)data ); } else if( image_type == SOIL_SAVE_TYPE_TGA ) { save_result = stbi_write_tga( filename, width, height, channels, (void*)data ); } else if( image_type == SOIL_SAVE_TYPE_DDS ) { save_result = save_image_as_DDS( filename, width, height, channels, (const unsigned char *const)data ); } else { save_result = 0; } if( save_result == 0 ) { result_string_pointer = "Saving the image failed"; } else { result_string_pointer = "Image saved"; } return save_result; } void SOIL_free_image_data ( unsigned char *img_data ) { free( (void*)img_data ); } const char* SOIL_last_result ( void ) { return result_string_pointer; } unsigned int SOIL_direct_load_DDS_from_memory( const unsigned char *const buffer, int buffer_length, unsigned int reuse_texture_ID, int flags, int loading_as_cubemap ) { /* variables */ DDS_header header; unsigned int buffer_index = 0; unsigned int tex_ID = 0; /* file reading variables */ unsigned int S3TC_type = 0; unsigned char *DDS_data; unsigned int DDS_main_size; unsigned int DDS_full_size; unsigned int width, height; int mipmaps, cubemap, uncompressed, block_size = 16; unsigned int flag; unsigned int cf_target, ogl_target_start, ogl_target_end; unsigned int opengl_texture_type; int i; /* 1st off, does the filename even exist? */ if( NULL == buffer ) { /* we can't do it! */ result_string_pointer = "NULL buffer"; return 0; } if( buffer_length < sizeof( DDS_header ) ) { /* we can't do it! */ result_string_pointer = "DDS file was too small to contain the DDS header"; return 0; } /* try reading in the header */ memcpy ( (void*)(&header), (const void *)buffer, sizeof( DDS_header ) ); buffer_index = sizeof( DDS_header ); /* guilty until proven innocent */ result_string_pointer = "Failed to read a known DDS header"; /* validate the header (warning, "goto"'s ahead, shield your eyes!!) */ flag = ('D'<<0)|('D'<<8)|('S'<<16)|(' '<<24); if( header.dwMagic != flag ) {goto quick_exit;} if( header.dwSize != 124 ) {goto quick_exit;} /* I need all of these */ flag = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; if( (header.dwFlags & flag) != flag ) {goto quick_exit;} /* According to the MSDN spec, the dwFlags should contain DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if uncompressed. Some DDS writers do not conform to the spec, so I need to make my reader more tolerant */ /* I need one of these */ flag = DDPF_FOURCC | DDPF_RGB; if( (header.sPixelFormat.dwFlags & flag) == 0 ) {goto quick_exit;} if( header.sPixelFormat.dwSize != 32 ) {goto quick_exit;} if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) {goto quick_exit;} /* make sure it is a type we can upload */ if( (header.sPixelFormat.dwFlags & DDPF_FOURCC) && !( (header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24))) || (header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('3'<<24))) || (header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('5'<<24))) ) ) { goto quick_exit; } /* OK, validated the header, let's load the image data */ result_string_pointer = "DDS header loaded and validated"; width = header.dwWidth; height = header.dwHeight; uncompressed = 1 - (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC; cubemap = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP; if( uncompressed ) { S3TC_type = GL_RGB; block_size = 3; if( header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS ) { S3TC_type = GL_RGBA; block_size = 4; } DDS_main_size = width * height * block_size; } else { /* can we even handle direct uploading to OpenGL DXT compressed images? */ if( query_DXT_capability() != SOIL_CAPABILITY_PRESENT ) { /* we can't do it! */ result_string_pointer = "Direct upload of S3TC images not supported by the OpenGL driver"; return 0; } /* well, we know it is DXT1/3/5, because we checked above */ switch( (header.sPixelFormat.dwFourCC >> 24) - '0' ) { case 1: S3TC_type = SOIL_RGBA_S3TC_DXT1; block_size = 8; break; case 3: S3TC_type = SOIL_RGBA_S3TC_DXT3; block_size = 16; break; case 5: S3TC_type = SOIL_RGBA_S3TC_DXT5; block_size = 16; break; } DDS_main_size = ((width+3)>>2)*((height+3)>>2)*block_size; } if( cubemap ) { /* does the user want a cubemap? */ if( !loading_as_cubemap ) { /* we can't do it! */ result_string_pointer = "DDS image was a cubemap"; return 0; } /* can we even handle cubemaps with the OpenGL driver? */ if( query_cubemap_capability() != SOIL_CAPABILITY_PRESENT ) { /* we can't do it! */ result_string_pointer = "Direct upload of cubemap images not supported by the OpenGL driver"; return 0; } ogl_target_start = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X; ogl_target_end = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z; opengl_texture_type = SOIL_TEXTURE_CUBE_MAP; } else { /* does the user want a non-cubemap? */ if( loading_as_cubemap ) { /* we can't do it! */ result_string_pointer = "DDS image was not a cubemap"; return 0; } ogl_target_start = GL_TEXTURE_2D; ogl_target_end = GL_TEXTURE_2D; opengl_texture_type = GL_TEXTURE_2D; } if( (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1) ) { int shift_offset; mipmaps = header.dwMipMapCount - 1; DDS_full_size = DDS_main_size; if( uncompressed ) { /* uncompressed DDS, simple MIPmap size calculation */ shift_offset = 0; } else { /* compressed DDS, MIPmap size calculation is block based */ shift_offset = 2; } for( i = 1; i <= mipmaps; ++ i ) { int w, h; w = width >> (shift_offset + i); h = height >> (shift_offset + i); if( w < 1 ) { w = 1; } if( h < 1 ) { h = 1; } DDS_full_size += w*h*block_size; } } else { mipmaps = 0; DDS_full_size = DDS_main_size; } DDS_data = (unsigned char*)malloc( DDS_full_size ); /* got the image data RAM, create or use an existing OpenGL texture handle */ tex_ID = reuse_texture_ID; if( tex_ID == 0 ) { glGenTextures( 1, &tex_ID ); } /* bind an OpenGL texture ID */ glBindTexture( opengl_texture_type, tex_ID ); /* do this for each face of the cubemap! */ for( cf_target = ogl_target_start; cf_target <= ogl_target_end; ++cf_target ) { if( buffer_index + DDS_full_size <= buffer_length ) { unsigned int byte_offset = DDS_main_size; memcpy( (void*)DDS_data, (const void*)(&buffer[buffer_index]), DDS_full_size ); buffer_index += DDS_full_size; /* upload the main chunk */ if( uncompressed ) { /* and remember, DXT uncompressed uses BGR(A), so swap to RGB(A) for ALL MIPmap levels */ for( i = 0; i < DDS_full_size; i += block_size ) { unsigned char temp = DDS_data[i]; DDS_data[i] = DDS_data[i+2]; DDS_data[i+2] = temp; } glTexImage2D( cf_target, 0, S3TC_type, width, height, 0, S3TC_type, GL_UNSIGNED_BYTE, DDS_data ); } else { soilGlCompressedTexImage2D( cf_target, 0, S3TC_type, width, height, 0, DDS_main_size, DDS_data ); } /* upload the mipmaps, if we have them */ for( i = 1; i <= mipmaps; ++i ) { int w, h, mip_size; w = width >> i; h = height >> i; if( w < 1 ) { w = 1; } if( h < 1 ) { h = 1; } /* upload this mipmap */ if( uncompressed ) { mip_size = w*h*block_size; glTexImage2D( cf_target, i, S3TC_type, w, h, 0, S3TC_type, GL_UNSIGNED_BYTE, &DDS_data[byte_offset] ); } else { mip_size = ((w+3)/4)*((h+3)/4)*block_size; soilGlCompressedTexImage2D( cf_target, i, S3TC_type, w, h, 0, mip_size, &DDS_data[byte_offset] ); } /* and move to the next mipmap */ byte_offset += mip_size; } /* it worked! */ result_string_pointer = "DDS file loaded"; } else { glDeleteTextures( 1, & tex_ID ); tex_ID = 0; cf_target = ogl_target_end + 1; result_string_pointer = "DDS file was too small for expected image data"; } }/* end reading each face */ SOIL_free_image_data( DDS_data ); if( tex_ID ) { /* did I have MIPmaps? */ if( mipmaps > 0 ) { /* instruct OpenGL to use the MIPmaps */ glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); } else { /* instruct OpenGL _NOT_ to use the MIPmaps */ glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); } /* does the user want clamping, or wrapping? */ if( flags & SOIL_FLAG_TEXTURE_REPEATS ) { glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT ); } else { /* unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE; */ unsigned int clamp_mode = GL_CLAMP; glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode ); glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode ); glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode ); } } quick_exit: /* report success or failure */ return tex_ID; } unsigned int SOIL_direct_load_DDS( const char *filename, unsigned int reuse_texture_ID, int flags, int loading_as_cubemap ) { FILE *f; unsigned char *buffer; size_t buffer_length, bytes_read; unsigned int tex_ID = 0; /* error checks */ if( NULL == filename ) { result_string_pointer = "NULL filename"; return 0; } f = fopen( filename, "rb" ); if( NULL == f ) { /* the file doesn't seem to exist (or be open-able) */ result_string_pointer = "Can not find DDS file"; return 0; } fseek( f, 0, SEEK_END ); buffer_length = ftell( f ); fseek( f, 0, SEEK_SET ); buffer = (unsigned char *) malloc( buffer_length ); if( NULL == buffer ) { result_string_pointer = "malloc failed"; fclose( f ); return 0; } bytes_read = fread( (void*)buffer, 1, buffer_length, f ); fclose( f ); if( bytes_read < buffer_length ) { /* huh? */ buffer_length = bytes_read; } /* now try to do the loading */ tex_ID = SOIL_direct_load_DDS_from_memory( (const unsigned char *const)buffer, buffer_length, reuse_texture_ID, flags, loading_as_cubemap ); SOIL_free_image_data( buffer ); return tex_ID; } int query_NPOT_capability( void ) { /* check for the capability */ if( has_NPOT_capability == SOIL_CAPABILITY_UNKNOWN ) { /* we haven't yet checked for the capability, do so */ if( (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_ARB_texture_non_power_of_two" ) ) ) { /* not there, flag the failure */ has_NPOT_capability = SOIL_CAPABILITY_NONE; } else { /* it's there! */ has_NPOT_capability = SOIL_CAPABILITY_PRESENT; } } /* let the user know if we can do non-power-of-two textures or not */ return has_NPOT_capability; } int query_tex_rectangle_capability( void ) { /* check for the capability */ if( has_tex_rectangle_capability == SOIL_CAPABILITY_UNKNOWN ) { /* we haven't yet checked for the capability, do so */ if( (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_ARB_texture_rectangle" ) ) && (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_EXT_texture_rectangle" ) ) && (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_NV_texture_rectangle" ) ) ) { /* not there, flag the failure */ has_tex_rectangle_capability = SOIL_CAPABILITY_NONE; } else { /* it's there! */ has_tex_rectangle_capability = SOIL_CAPABILITY_PRESENT; } } /* let the user know if we can do texture rectangles or not */ return has_tex_rectangle_capability; } int query_cubemap_capability( void ) { /* check for the capability */ if( has_cubemap_capability == SOIL_CAPABILITY_UNKNOWN ) { /* we haven't yet checked for the capability, do so */ if( (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_ARB_texture_cube_map" ) ) && (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_EXT_texture_cube_map" ) ) ) { /* not there, flag the failure */ has_cubemap_capability = SOIL_CAPABILITY_NONE; } else { /* it's there! */ has_cubemap_capability = SOIL_CAPABILITY_PRESENT; } } /* let the user know if we can do cubemaps or not */ return has_cubemap_capability; } int query_DXT_capability( void ) { /* check for the capability */ if( has_DXT_capability == SOIL_CAPABILITY_UNKNOWN ) { /* we haven't yet checked for the capability, do so */ if( NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), "GL_EXT_texture_compression_s3tc" ) ) { /* not there, flag the failure */ has_DXT_capability = SOIL_CAPABILITY_NONE; } else { /* and find the address of the extension function */ P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC ext_addr = NULL; #ifdef WIN32 ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) wglGetProcAddress ( "glCompressedTexImage2DARB" ); #elif defined(__APPLE__) || defined(__APPLE_CC__) /* I can't test this Apple stuff! */ CFBundleRef bundle; CFURLRef bundleURL = CFURLCreateWithFileSystemPath( kCFAllocatorDefault, CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true ); CFStringRef extensionName = CFStringCreateWithCString( kCFAllocatorDefault, "glCompressedTexImage2DARB", kCFStringEncodingASCII ); bundle = CFBundleCreate( kCFAllocatorDefault, bundleURL ); assert( bundle != NULL ); ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) CFBundleGetFunctionPointerForName ( bundle, extensionName ); CFRelease( bundleURL ); CFRelease( extensionName ); CFRelease( bundle ); #else ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) glXGetProcAddressARB ( (const GLubyte *)"glCompressedTexImage2DARB" ); #endif /* Flag it so no checks needed later */ if( NULL == ext_addr ) { /* hmm, not good!! This should not happen, but does on my laptop's VIA chipset. The GL_EXT_texture_compression_s3tc spec requires that ARB_texture_compression be present too. this means I can upload and have the OpenGL drive do the conversion, but I can't use my own routines or load DDS files from disk and upload them directly [8^( */ has_DXT_capability = SOIL_CAPABILITY_NONE; } else { /* all's well! */ soilGlCompressedTexImage2D = ext_addr; has_DXT_capability = SOIL_CAPABILITY_PRESENT; } } } /* let the user know if we can do DXT or not */ return has_DXT_capability; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/SOIL.h�������������������������������������������������0000664�0000000�0000000�00000035672�12660066715�0021575�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** @mainpage SOIL Jonathan Dummer 2007-07-26-10.36 Simple OpenGL Image Library A tiny c library for uploading images as textures into OpenGL. Also saving and loading of images is supported. I'm using Sean's Tool Box image loader as a base: http://www.nothings.org/ I'm upgrading it to load TGA and DDS files, and a direct path for loading DDS files straight into OpenGL textures, when applicable. Image Formats: - BMP load & save - TGA load & save - DDS load & save - PNG load - JPG load OpenGL Texture Features: - resample to power-of-two sizes - MIPmap generation - compressed texture S3TC formats (if supported) - can pre-multiply alpha for you, for better compositing - can flip image about the y-axis (except pre-compressed DDS files) Thanks to: * Sean Barret - for the awesome stb_image * Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts * everybody at gamedev.net **/ #ifndef HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY #define HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY #ifdef __cplusplus extern "C" { #endif /** The format of images that may be loaded (force_channels). SOIL_LOAD_AUTO leaves the image in whatever format it was found. SOIL_LOAD_L forces the image to load as Luminous (greyscale) SOIL_LOAD_LA forces the image to load as Luminous with Alpha SOIL_LOAD_RGB forces the image to load as Red Green Blue SOIL_LOAD_RGBA forces the image to load as Red Green Blue Alpha **/ enum { SOIL_LOAD_AUTO = 0, SOIL_LOAD_L = 1, SOIL_LOAD_LA = 2, SOIL_LOAD_RGB = 3, SOIL_LOAD_RGBA = 4 }; /** Passed in as reuse_texture_ID, will cause SOIL to register a new texture ID using glGenTextures(). If the value passed into reuse_texture_ID > 0 then SOIL will just re-use that texture ID (great for reloading image assets in-game!) **/ enum { SOIL_CREATE_NEW_ID = 0 }; /** flags you can pass into SOIL_load_OGL_texture() and SOIL_create_OGL_texture(). (note that if SOIL_FLAG_DDS_LOAD_DIRECT is used the rest of the flags with the exception of SOIL_FLAG_TEXTURE_REPEATS will be ignored while loading already-compressed DDS files.) SOIL_FLAG_POWER_OF_TWO: force the image to be POT SOIL_FLAG_MIPMAPS: generate mipmaps for the texture SOIL_FLAG_TEXTURE_REPEATS: otherwise will clamp SOIL_FLAG_MULTIPLY_ALPHA: for using (GL_ONE,GL_ONE_MINUS_SRC_ALPHA) blending SOIL_FLAG_INVERT_Y: flip the image vertically SOIL_FLAG_COMPRESS_TO_DXT: if the card can display them, will convert RGB to DXT1, RGBA to DXT5 SOIL_FLAG_DDS_LOAD_DIRECT: will load DDS files directly without _ANY_ additional processing SOIL_FLAG_NTSC_SAFE_RGB: clamps RGB components to the range [16,235] SOIL_FLAG_CoCg_Y: Google YCoCg; RGB=>CoYCg, RGBA=>CoCgAY SOIL_FLAG_TEXTURE_RECTANGE: uses ARB_texture_rectangle ; pixel indexed & no repeat or MIPmaps or cubemaps **/ enum { SOIL_FLAG_POWER_OF_TWO = 1, SOIL_FLAG_MIPMAPS = 2, SOIL_FLAG_TEXTURE_REPEATS = 4, SOIL_FLAG_MULTIPLY_ALPHA = 8, SOIL_FLAG_INVERT_Y = 16, SOIL_FLAG_COMPRESS_TO_DXT = 32, SOIL_FLAG_DDS_LOAD_DIRECT = 64, SOIL_FLAG_NTSC_SAFE_RGB = 128, SOIL_FLAG_CoCg_Y = 256, SOIL_FLAG_TEXTURE_RECTANGLE = 512 }; /** The types of images that may be saved. (TGA supports uncompressed RGB / RGBA) (BMP supports uncompressed RGB) (DDS supports DXT1 and DXT5) **/ enum { SOIL_SAVE_TYPE_TGA = 0, SOIL_SAVE_TYPE_BMP = 1, SOIL_SAVE_TYPE_DDS = 2 }; /** Defines the order of faces in a DDS cubemap. I recommend that you use the same order in single image cubemap files, so they will be interchangeable with DDS cubemaps when using SOIL. **/ #define SOIL_DDS_CUBEMAP_FACE_ORDER "EWUDNS" /** The types of internal fake HDR representations SOIL_HDR_RGBE: RGB * pow( 2.0, A - 128.0 ) SOIL_HDR_RGBdivA: RGB / A SOIL_HDR_RGBdivA2: RGB / (A*A) **/ enum { SOIL_HDR_RGBE = 0, SOIL_HDR_RGBdivA = 1, SOIL_HDR_RGBdivA2 = 2 }; /** Loads an image from disk into an OpenGL texture. \param filename the name of the file to upload as a texture \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_texture ( const char *filename, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ); unsigned int SOIL_load_OGL_texture_size ( const char *filename, int force_channels, unsigned int reuse_texture_ID, unsigned int flags, int *width, int *height ); /** Loads 6 images from disk into an OpenGL cubemap texture. \param x_pos_file the name of the file to upload as the +x cube face \param x_neg_file the name of the file to upload as the -x cube face \param y_pos_file the name of the file to upload as the +y cube face \param y_neg_file the name of the file to upload as the -y cube face \param z_pos_file the name of the file to upload as the +z cube face \param z_neg_file the name of the file to upload as the -z cube face \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_cubemap ( const char *x_pos_file, const char *x_neg_file, const char *y_pos_file, const char *y_neg_file, const char *z_pos_file, const char *z_neg_file, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ); /** Loads 1 image from disk and splits it into an OpenGL cubemap texture. \param filename the name of the file to upload as a texture \param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc. \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_single_cubemap ( const char *filename, const char face_order[6], int force_channels, unsigned int reuse_texture_ID, unsigned int flags ); /** Loads an HDR image from disk into an OpenGL texture. \param filename the name of the file to upload as a texture \param fake_HDR_format SOIL_HDR_RGBE, SOIL_HDR_RGBdivA, SOIL_HDR_RGBdivA2 \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_HDR_texture ( const char *filename, int fake_HDR_format, int rescale_to_max, unsigned int reuse_texture_ID, unsigned int flags ); /** Loads an image from RAM into an OpenGL texture. \param buffer the image data in RAM just as if it were still in a file \param buffer_length the size of the buffer in bytes \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_texture_from_memory ( const unsigned char *const buffer, int buffer_length, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ); /** Loads 6 images from memory into an OpenGL cubemap texture. \param x_pos_buffer the image data in RAM to upload as the +x cube face \param x_pos_buffer_length the size of the above buffer \param x_neg_buffer the image data in RAM to upload as the +x cube face \param x_neg_buffer_length the size of the above buffer \param y_pos_buffer the image data in RAM to upload as the +x cube face \param y_pos_buffer_length the size of the above buffer \param y_neg_buffer the image data in RAM to upload as the +x cube face \param y_neg_buffer_length the size of the above buffer \param z_pos_buffer the image data in RAM to upload as the +x cube face \param z_pos_buffer_length the size of the above buffer \param z_neg_buffer the image data in RAM to upload as the +x cube face \param z_neg_buffer_length the size of the above buffer \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_cubemap_from_memory ( const unsigned char *const x_pos_buffer, int x_pos_buffer_length, const unsigned char *const x_neg_buffer, int x_neg_buffer_length, const unsigned char *const y_pos_buffer, int y_pos_buffer_length, const unsigned char *const y_neg_buffer, int y_neg_buffer_length, const unsigned char *const z_pos_buffer, int z_pos_buffer_length, const unsigned char *const z_neg_buffer, int z_neg_buffer_length, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ); /** Loads 1 image from RAM and splits it into an OpenGL cubemap texture. \param buffer the image data in RAM just as if it were still in a file \param buffer_length the size of the buffer in bytes \param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc. \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_load_OGL_single_cubemap_from_memory ( const unsigned char *const buffer, int buffer_length, const char face_order[6], int force_channels, unsigned int reuse_texture_ID, unsigned int flags ); /** Creates a 2D OpenGL texture from raw image data. Note that the raw data is _NOT_ freed after the upload (so the user can load various versions). \param data the raw data to be uploaded as an OpenGL texture \param width the width of the image in pixels \param height the height of the image in pixels \param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_create_OGL_texture ( const unsigned char *const data, int width, int height, int channels, unsigned int reuse_texture_ID, unsigned int flags ); /** Creates an OpenGL cubemap texture by splitting up 1 image into 6 parts. \param data the raw data to be uploaded as an OpenGL texture \param width the width of the image in pixels \param height the height of the image in pixels \param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA \param face_order the order of the faces in the file, and combination of NSWEUD, for North, South, Up, etc. \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT \return 0-failed, otherwise returns the OpenGL texture handle **/ unsigned int SOIL_create_OGL_single_cubemap ( const unsigned char *const data, int width, int height, int channels, const char face_order[6], unsigned int reuse_texture_ID, unsigned int flags ); /** Captures the OpenGL window (RGB) and saves it to disk \return 0 if it failed, otherwise returns 1 **/ int SOIL_save_screenshot ( const char *filename, int image_type, int x, int y, int width, int height ); /** Loads an image from disk into an array of unsigned chars. Note that *channels return the original channel count of the image. If force_channels was other than SOIL_LOAD_AUTO, the resulting image has force_channels, but *channels may be different (if the original image had a different channel count). \return 0 if failed, otherwise returns 1 **/ unsigned char* SOIL_load_image ( const char *filename, int *width, int *height, int *channels, int force_channels ); /** Loads an image from memory into an array of unsigned chars. Note that *channels return the original channel count of the image. If force_channels was other than SOIL_LOAD_AUTO, the resulting image has force_channels, but *channels may be different (if the original image had a different channel count). \return 0 if failed, otherwise returns 1 **/ unsigned char* SOIL_load_image_from_memory ( const unsigned char *const buffer, int buffer_length, int *width, int *height, int *channels, int force_channels ); /** Saves an image from an array of unsigned chars (RGBA) to disk \return 0 if failed, otherwise returns 1 **/ int SOIL_save_image ( const char *filename, int image_type, int width, int height, int channels, const unsigned char *const data ); /** Frees the image data (note, this is just C's "free()"...this function is present mostly so C++ programmers don't forget to use "free()" and call "delete []" instead [8^) **/ void SOIL_free_image_data ( unsigned char *img_data ); /** This function resturn a pointer to a string describing the last thing that happened inside SOIL. It can be used to determine why an image failed to load. **/ const char* SOIL_last_result ( void ); #ifdef __cplusplus } #endif #endif /* HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY */ ����������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/image_DXT.c��������������������������������������������0000664�0000000�0000000�00000040245�12660066715�0022613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Jonathan Dummer 2007-07-31-10.32 simple DXT compression / decompression code public domain */ #include "image_DXT.h" #include <math.h> #include <stdlib.h> #include <string.h> #include <stdio.h> /* set this =1 if you want to use the covarince matrix method... which is better than my method of using standard deviations overall, except on the infintesimal chance that the power method fails for finding the largest eigenvector */ #define USE_COV_MAT 1 /********* Function Prototypes *********/ /* Takes a 4x4 block of pixels and compresses it into 8 bytes in DXT1 format (color only, no alpha). Speed is valued over prettyness, at least for now. */ void compress_DDS_color_block( int channels, const unsigned char *const uncompressed, unsigned char compressed[8] ); /* Takes a 4x4 block of pixels and compresses the alpha component it into 8 bytes for use in DXT5 DDS files. Speed is valued over prettyness, at least for now. */ void compress_DDS_alpha_block( const unsigned char *const uncompressed, unsigned char compressed[8] ); /********* Actual Exposed Functions *********/ int save_image_as_DDS ( const char *filename, int width, int height, int channels, const unsigned char *const data ) { /* variables */ FILE *fout; unsigned char *DDS_data; DDS_header header; int DDS_size; /* error check */ if( (NULL == filename) || (width < 1) || (height < 1) || (channels < 1) || (channels > 4) || (data == NULL ) ) { return 0; } /* Convert the image */ if( (channels & 1) == 1 ) { /* no alpha, just use DXT1 */ DDS_data = convert_image_to_DXT1( data, width, height, channels, &DDS_size ); } else { /* has alpha, so use DXT5 */ DDS_data = convert_image_to_DXT5( data, width, height, channels, &DDS_size ); } /* save it */ memset( &header, 0, sizeof( DDS_header ) ); header.dwMagic = ('D' << 0) | ('D' << 8) | ('S' << 16) | (' ' << 24); header.dwSize = 124; header.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_LINEARSIZE; header.dwWidth = width; header.dwHeight = height; header.dwPitchOrLinearSize = DDS_size; header.sPixelFormat.dwSize = 32; header.sPixelFormat.dwFlags = DDPF_FOURCC; if( (channels & 1) == 1 ) { header.sPixelFormat.dwFourCC = ('D' << 0) | ('X' << 8) | ('T' << 16) | ('1' << 24); } else { header.sPixelFormat.dwFourCC = ('D' << 0) | ('X' << 8) | ('T' << 16) | ('5' << 24); } header.sCaps.dwCaps1 = DDSCAPS_TEXTURE; /* write it out */ fout = fopen( filename, "wb"); fwrite( &header, sizeof( DDS_header ), 1, fout ); fwrite( DDS_data, 1, DDS_size, fout ); fclose( fout ); /* done */ free( DDS_data ); return 1; } unsigned char* convert_image_to_DXT1( const unsigned char *const uncompressed, int width, int height, int channels, int *out_size ) { unsigned char *compressed; int i, j, x, y; unsigned char ublock[16*3]; unsigned char cblock[8]; int index = 0, chan_step = 1; int block_count = 0; /* error check */ *out_size = 0; if( (width < 1) || (height < 1) || (NULL == uncompressed) || (channels < 1) || (channels > 4) ) { return NULL; } /* for channels == 1 or 2, I do not step forward for R,G,B values */ if( channels < 3 ) { chan_step = 0; } /* get the RAM for the compressed image (8 bytes per 4x4 pixel block) */ *out_size = ((width+3) >> 2) * ((height+3) >> 2) * 8; compressed = (unsigned char*)malloc( *out_size ); /* go through each block */ for( j = 0; j < height; j += 4 ) { for( i = 0; i < width; i += 4 ) { /* copy this block into a new one */ int idx = 0; int mx = 4, my = 4; if( j+4 >= height ) { my = height - j; } if( i+4 >= width ) { mx = width - i; } for( y = 0; y < my; ++y ) { for( x = 0; x < mx; ++x ) { ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels]; ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step]; ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step+chan_step]; } for( x = mx; x < 4; ++x ) { ublock[idx++] = ublock[0]; ublock[idx++] = ublock[1]; ublock[idx++] = ublock[2]; } } for( y = my; y < 4; ++y ) { for( x = 0; x < 4; ++x ) { ublock[idx++] = ublock[0]; ublock[idx++] = ublock[1]; ublock[idx++] = ublock[2]; } } /* compress the block */ ++block_count; compress_DDS_color_block( 3, ublock, cblock ); /* copy the data from the block into the main block */ for( x = 0; x < 8; ++x ) { compressed[index++] = cblock[x]; } } } return compressed; } unsigned char* convert_image_to_DXT5( const unsigned char *const uncompressed, int width, int height, int channels, int *out_size ) { unsigned char *compressed; int i, j, x, y; unsigned char ublock[16*4]; unsigned char cblock[8]; int index = 0, chan_step = 1; int block_count = 0, has_alpha; /* error check */ *out_size = 0; if( (width < 1) || (height < 1) || (NULL == uncompressed) || (channels < 1) || ( channels > 4) ) { return NULL; } /* for channels == 1 or 2, I do not step forward for R,G,B vales */ if( channels < 3 ) { chan_step = 0; } /* # channels = 1 or 3 have no alpha, 2 & 4 do have alpha */ has_alpha = 1 - (channels & 1); /* get the RAM for the compressed image (16 bytes per 4x4 pixel block) */ *out_size = ((width+3) >> 2) * ((height+3) >> 2) * 16; compressed = (unsigned char*)malloc( *out_size ); /* go through each block */ for( j = 0; j < height; j += 4 ) { for( i = 0; i < width; i += 4 ) { /* local variables, and my block counter */ int idx = 0; int mx = 4, my = 4; if( j+4 >= height ) { my = height - j; } if( i+4 >= width ) { mx = width - i; } for( y = 0; y < my; ++y ) { for( x = 0; x < mx; ++x ) { ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels]; ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step]; ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step+chan_step]; ublock[idx++] = has_alpha * uncompressed[(j+y)*width*channels+(i+x)*channels+channels-1] + (1-has_alpha)*255; } for( x = mx; x < 4; ++x ) { ublock[idx++] = ublock[0]; ublock[idx++] = ublock[1]; ublock[idx++] = ublock[2]; ublock[idx++] = ublock[3]; } } for( y = my; y < 4; ++y ) { for( x = 0; x < 4; ++x ) { ublock[idx++] = ublock[0]; ublock[idx++] = ublock[1]; ublock[idx++] = ublock[2]; ublock[idx++] = ublock[3]; } } /* now compress the alpha block */ compress_DDS_alpha_block( ublock, cblock ); /* copy the data from the compressed alpha block into the main buffer */ for( x = 0; x < 8; ++x ) { compressed[index++] = cblock[x]; } /* then compress the color block */ ++block_count; compress_DDS_color_block( 4, ublock, cblock ); /* copy the data from the compressed color block into the main buffer */ for( x = 0; x < 8; ++x ) { compressed[index++] = cblock[x]; } } } return compressed; } /********* Helper Functions *********/ int convert_bit_range( int c, int from_bits, int to_bits ) { int b = (1 << (from_bits - 1)) + c * ((1 << to_bits) - 1); return (b + (b >> from_bits)) >> from_bits; } int rgb_to_565( int r, int g, int b ) { return (convert_bit_range( r, 8, 5 ) << 11) | (convert_bit_range( g, 8, 6 ) << 05) | (convert_bit_range( b, 8, 5 ) << 00); } void rgb_888_from_565( unsigned int c, int *r, int *g, int *b ) { *r = convert_bit_range( (c >> 11) & 31, 5, 8 ); *g = convert_bit_range( (c >> 05) & 63, 6, 8 ); *b = convert_bit_range( (c >> 00) & 31, 5, 8 ); } void compute_color_line_STDEV( const unsigned char *const uncompressed, int channels, float point[3], float direction[3] ) { const float inv_16 = 1.0f / 16.0f; int i; float sum_r = 0.0f, sum_g = 0.0f, sum_b = 0.0f; float sum_rr = 0.0f, sum_gg = 0.0f, sum_bb = 0.0f; float sum_rg = 0.0f, sum_rb = 0.0f, sum_gb = 0.0f; /* calculate all data needed for the covariance matrix ( to compare with _rygdxt code) */ for( i = 0; i < 16*channels; i += channels ) { sum_r += uncompressed[i+0]; sum_rr += uncompressed[i+0] * uncompressed[i+0]; sum_g += uncompressed[i+1]; sum_gg += uncompressed[i+1] * uncompressed[i+1]; sum_b += uncompressed[i+2]; sum_bb += uncompressed[i+2] * uncompressed[i+2]; sum_rg += uncompressed[i+0] * uncompressed[i+1]; sum_rb += uncompressed[i+0] * uncompressed[i+2]; sum_gb += uncompressed[i+1] * uncompressed[i+2]; } /* convert the sums to averages */ sum_r *= inv_16; sum_g *= inv_16; sum_b *= inv_16; /* and convert the squares to the squares of the value - avg_value */ sum_rr -= 16.0f * sum_r * sum_r; sum_gg -= 16.0f * sum_g * sum_g; sum_bb -= 16.0f * sum_b * sum_b; sum_rg -= 16.0f * sum_r * sum_g; sum_rb -= 16.0f * sum_r * sum_b; sum_gb -= 16.0f * sum_g * sum_b; /* the point on the color line is the average */ point[0] = sum_r; point[1] = sum_g; point[2] = sum_b; #if USE_COV_MAT /* The following idea was from ryg. (https://mollyrocket.com/forums/viewtopic.php?t=392) The method worked great (less RMSE than mine) most of the time, but had some issues handling some simple boundary cases, like full green next to full red, which would generate a covariance matrix like this: | 1 -1 0 | | -1 1 0 | | 0 0 0 | For a given starting vector, the power method can generate all zeros! So no starting with {1,1,1} as I was doing! This kind of error is still a slight posibillity, but will be very rare. */ /* use the covariance matrix directly (1st iteration, don't use all 1.0 values!) */ sum_r = 1.0f; sum_g = 2.718281828f; sum_b = 3.141592654f; direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; /* 2nd iteration, use results from the 1st guy */ sum_r = direction[0]; sum_g = direction[1]; sum_b = direction[2]; direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; /* 3rd iteration, use results from the 2nd guy */ sum_r = direction[0]; sum_g = direction[1]; sum_b = direction[2]; direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; #else /* use my standard deviation method (very robust, a tiny bit slower and less accurate) */ direction[0] = sqrt( sum_rr ); direction[1] = sqrt( sum_gg ); direction[2] = sqrt( sum_bb ); /* which has a greater component */ if( sum_gg > sum_rr ) { /* green has greater component, so base the other signs off of green */ if( sum_rg < 0.0f ) { direction[0] = -direction[0]; } if( sum_gb < 0.0f ) { direction[2] = -direction[2]; } } else { /* red has a greater component */ if( sum_rg < 0.0f ) { direction[1] = -direction[1]; } if( sum_rb < 0.0f ) { direction[2] = -direction[2]; } } #endif } void LSE_master_colors_max_min( int *cmax, int *cmin, int channels, const unsigned char *const uncompressed ) { int i, j; /* the master colors */ int c0[3], c1[3]; /* used for fitting the line */ float sum_x[] = { 0.0f, 0.0f, 0.0f }; float sum_x2[] = { 0.0f, 0.0f, 0.0f }; float dot_max = 1.0f, dot_min = -1.0f; float vec_len2 = 0.0f; float dot; /* error check */ if( (channels < 3) || (channels > 4) ) { return; } compute_color_line_STDEV( uncompressed, channels, sum_x, sum_x2 ); vec_len2 = 1.0f / ( 0.00001f + sum_x2[0]*sum_x2[0] + sum_x2[1]*sum_x2[1] + sum_x2[2]*sum_x2[2] ); /* finding the max and min vector values */ dot_max = ( sum_x2[0] * uncompressed[0] + sum_x2[1] * uncompressed[1] + sum_x2[2] * uncompressed[2] ); dot_min = dot_max; for( i = 1; i < 16; ++i ) { dot = ( sum_x2[0] * uncompressed[i*channels+0] + sum_x2[1] * uncompressed[i*channels+1] + sum_x2[2] * uncompressed[i*channels+2] ); if( dot < dot_min ) { dot_min = dot; } else if( dot > dot_max ) { dot_max = dot; } } /* and the offset (from the average location) */ dot = sum_x2[0]*sum_x[0] + sum_x2[1]*sum_x[1] + sum_x2[2]*sum_x[2]; dot_min -= dot; dot_max -= dot; /* post multiply by the scaling factor */ dot_min *= vec_len2; dot_max *= vec_len2; /* OK, build the master colors */ for( i = 0; i < 3; ++i ) { /* color 0 */ c0[i] = (int)(0.5f + sum_x[i] + dot_max * sum_x2[i]); if( c0[i] < 0 ) { c0[i] = 0; } else if( c0[i] > 255 ) { c0[i] = 255; } /* color 1 */ c1[i] = (int)(0.5f + sum_x[i] + dot_min * sum_x2[i]); if( c1[i] < 0 ) { c1[i] = 0; } else if( c1[i] > 255 ) { c1[i] = 255; } } /* down_sample (with rounding?) */ i = rgb_to_565( c0[0], c0[1], c0[2] ); j = rgb_to_565( c1[0], c1[1], c1[2] ); if( i > j ) { *cmax = i; *cmin = j; } else { *cmax = j; *cmin = i; } } void compress_DDS_color_block ( int channels, const unsigned char *const uncompressed, unsigned char compressed[8] ) { /* variables */ int i; int next_bit; int enc_c0, enc_c1; int c0[4], c1[4]; float color_line[] = { 0.0f, 0.0f, 0.0f, 0.0f }; float vec_len2 = 0.0f, dot_offset = 0.0f; /* stupid order */ int swizzle4[] = { 0, 2, 3, 1 }; /* get the master colors */ LSE_master_colors_max_min( &enc_c0, &enc_c1, channels, uncompressed ); /* store the 565 color 0 and color 1 */ compressed[0] = (enc_c0 >> 0) & 255; compressed[1] = (enc_c0 >> 8) & 255; compressed[2] = (enc_c1 >> 0) & 255; compressed[3] = (enc_c1 >> 8) & 255; /* zero out the compressed data */ compressed[4] = 0; compressed[5] = 0; compressed[6] = 0; compressed[7] = 0; /* reconstitute the master color vectors */ rgb_888_from_565( enc_c0, &c0[0], &c0[1], &c0[2] ); rgb_888_from_565( enc_c1, &c1[0], &c1[1], &c1[2] ); /* the new vector */ vec_len2 = 0.0f; for( i = 0; i < 3; ++i ) { color_line[i] = (float)(c1[i] - c0[i]); vec_len2 += color_line[i] * color_line[i]; } if( vec_len2 > 0.0f ) { vec_len2 = 1.0f / vec_len2; } /* pre-proform the scaling */ color_line[0] *= vec_len2; color_line[1] *= vec_len2; color_line[2] *= vec_len2; /* compute the offset (constant) portion of the dot product */ dot_offset = color_line[0]*c0[0] + color_line[1]*c0[1] + color_line[2]*c0[2]; /* store the rest of the bits */ next_bit = 8*4; for( i = 0; i < 16; ++i ) { /* find the dot product of this color, to place it on the line (should be [-1,1]) */ int next_value = 0; float dot_product = color_line[0] * uncompressed[i*channels+0] + color_line[1] * uncompressed[i*channels+1] + color_line[2] * uncompressed[i*channels+2] - dot_offset; /* map to [0,3] */ next_value = (int)( dot_product * 3.0f + 0.5f ); if( next_value > 3 ) { next_value = 3; } else if( next_value < 0 ) { next_value = 0; } /* OK, store this value */ compressed[next_bit >> 3] |= swizzle4[ next_value ] << (next_bit & 7); next_bit += 2; } /* done compressing to DXT1 */ } void compress_DDS_alpha_block ( const unsigned char *const uncompressed, unsigned char compressed[8] ) { /* variables */ int i; int next_bit; int a0, a1; float scale_me; /* stupid order */ int swizzle8[] = { 1, 7, 6, 5, 4, 3, 2, 0 }; /* get the alpha limits (a0 > a1) */ a0 = a1 = uncompressed[3]; for( i = 4+3; i < 16*4; i += 4 ) { if( uncompressed[i] > a0 ) { a0 = uncompressed[i]; } else if( uncompressed[i] < a1 ) { a1 = uncompressed[i]; } } /* store those limits, and zero the rest of the compressed dataset */ compressed[0] = a0; compressed[1] = a1; /* zero out the compressed data */ compressed[2] = 0; compressed[3] = 0; compressed[4] = 0; compressed[5] = 0; compressed[6] = 0; compressed[7] = 0; /* store the all of the alpha values */ next_bit = 8*2; scale_me = 7.9999f / (a0 - a1); for( i = 3; i < 16*4; i += 4 ) { /* convert this alpha value to a 3 bit number */ int svalue; int value = (int)((uncompressed[i] - a1) * scale_me); svalue = swizzle8[ value&7 ]; /* OK, store this value, start with the 1st byte */ compressed[next_bit >> 3] |= svalue << (next_bit & 7); if( (next_bit & 7) > 5 ) { /* spans 2 bytes, fill in the start of the 2nd byte */ compressed[1 + (next_bit >> 3)] |= svalue >> (8 - (next_bit & 7) ); } next_bit += 3; } /* done compressing to DXT1 */ } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/image_DXT.h��������������������������������������������0000664�0000000�0000000�00000006021�12660066715�0022612�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Jonathan Dummer 2007-07-31-10.32 simple DXT compression / decompression code public domain */ #ifndef HEADER_IMAGE_DXT #define HEADER_IMAGE_DXT /** Converts an image from an array of unsigned chars (RGB or RGBA) to DXT1 or DXT5, then saves the converted image to disk. \return 0 if failed, otherwise returns 1 **/ int save_image_as_DDS ( const char *filename, int width, int height, int channels, const unsigned char *const data ); /** take an image and convert it to DXT1 (no alpha) **/ unsigned char* convert_image_to_DXT1 ( const unsigned char *const uncompressed, int width, int height, int channels, int *out_size ); /** take an image and convert it to DXT5 (with alpha) **/ unsigned char* convert_image_to_DXT5 ( const unsigned char *const uncompressed, int width, int height, int channels, int *out_size ); /** A bunch of DirectDraw Surface structures and flags **/ typedef struct { unsigned int dwMagic; unsigned int dwSize; unsigned int dwFlags; unsigned int dwHeight; unsigned int dwWidth; unsigned int dwPitchOrLinearSize; unsigned int dwDepth; unsigned int dwMipMapCount; unsigned int dwReserved1[ 11 ]; /* DDPIXELFORMAT */ struct { unsigned int dwSize; unsigned int dwFlags; unsigned int dwFourCC; unsigned int dwRGBBitCount; unsigned int dwRBitMask; unsigned int dwGBitMask; unsigned int dwBBitMask; unsigned int dwAlphaBitMask; } sPixelFormat; /* DDCAPS2 */ struct { unsigned int dwCaps1; unsigned int dwCaps2; unsigned int dwDDSX; unsigned int dwReserved; } sCaps; unsigned int dwReserved2; } DDS_header ; /* the following constants were copied directly off the MSDN website */ /* The dwFlags member of the original DDSURFACEDESC2 structure can be set to one or more of the following values. */ #define DDSD_CAPS 0x00000001 #define DDSD_HEIGHT 0x00000002 #define DDSD_WIDTH 0x00000004 #define DDSD_PITCH 0x00000008 #define DDSD_PIXELFORMAT 0x00001000 #define DDSD_MIPMAPCOUNT 0x00020000 #define DDSD_LINEARSIZE 0x00080000 #define DDSD_DEPTH 0x00800000 /* DirectDraw Pixel Format */ #define DDPF_ALPHAPIXELS 0x00000001 #define DDPF_FOURCC 0x00000004 #define DDPF_RGB 0x00000040 /* The dwCaps1 member of the DDSCAPS2 structure can be set to one or more of the following values. */ #define DDSCAPS_COMPLEX 0x00000008 #define DDSCAPS_TEXTURE 0x00001000 #define DDSCAPS_MIPMAP 0x00400000 /* The dwCaps2 member of the DDSCAPS2 structure can be set to one or more of the following values. */ #define DDSCAPS2_CUBEMAP 0x00000200 #define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 #define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 #define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 #define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 #define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 #define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 #define DDSCAPS2_VOLUME 0x00200000 #endif /* HEADER_IMAGE_DXT */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/image_helper.c�����������������������������������������0000664�0000000�0000000�00000023534�12660066715�0023435�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Jonathan Dummer image helper functions MIT license */ #include "image_helper.h" #include <stdlib.h> #include <math.h> /* Upscaling the image uses simple bilinear interpolation */ int up_scale_image ( const unsigned char* const orig, int width, int height, int channels, unsigned char* resampled, int resampled_width, int resampled_height ) { float dx, dy; int x, y, c; /* error(s) check */ if ( (width < 1) || (height < 1) || (resampled_width < 2) || (resampled_height < 2) || (channels < 1) || (NULL == orig) || (NULL == resampled) ) { /* signify badness */ return 0; } /* for each given pixel in the new map, find the exact location from the original map which would contribute to this guy */ dx = (width - 1.0f) / (resampled_width - 1.0f); dy = (height - 1.0f) / (resampled_height - 1.0f); for ( y = 0; y < resampled_height; ++y ) { /* find the base y index and fractional offset from that */ float sampley = y * dy; int inty = (int)sampley; /* if( inty < 0 ) { inty = 0; } else */ if( inty > height - 2 ) { inty = height - 2; } sampley -= inty; for ( x = 0; x < resampled_width; ++x ) { float samplex = x * dx; int intx = (int)samplex; int base_index; /* find the base x index and fractional offset from that */ /* if( intx < 0 ) { intx = 0; } else */ if( intx > width - 2 ) { intx = width - 2; } samplex -= intx; /* base index into the original image */ base_index = (inty * width + intx) * channels; for ( c = 0; c < channels; ++c ) { /* do the sampling */ float value = 0.5f; value += orig[base_index] *(1.0f-samplex)*(1.0f-sampley); value += orig[base_index+channels] *(samplex)*(1.0f-sampley); value += orig[base_index+width*channels] *(1.0f-samplex)*(sampley); value += orig[base_index+width*channels+channels] *(samplex)*(sampley); /* move to the next channel */ ++base_index; /* save the new value */ resampled[y*resampled_width*channels+x*channels+c] = (unsigned char)(value); } } } /* done */ return 1; } int mipmap_image ( const unsigned char* const orig, int width, int height, int channels, unsigned char* resampled, int block_size_x, int block_size_y ) { int mip_width, mip_height; int i, j, c; /* error check */ if( (width < 1) || (height < 1) || (channels < 1) || (orig == NULL) || (resampled == NULL) || (block_size_x < 1) || (block_size_y < 1) ) { /* nothing to do */ return 0; } mip_width = width / block_size_x; mip_height = height / block_size_y; if( mip_width < 1 ) { mip_width = 1; } if( mip_height < 1 ) { mip_height = 1; } for( j = 0; j < mip_height; ++j ) { for( i = 0; i < mip_width; ++i ) { for( c = 0; c < channels; ++c ) { const int index = (j*block_size_y)*width*channels + (i*block_size_x)*channels + c; int sum_value; int u,v; int u_block = block_size_x; int v_block = block_size_y; int block_area; /* do a bit of checking so we don't over-run the boundaries (necessary for non-square textures!) */ if( block_size_x * (i+1) > width ) { u_block = width - i*block_size_y; } if( block_size_y * (j+1) > height ) { v_block = height - j*block_size_y; } block_area = u_block*v_block; /* for this pixel, see what the average of all the values in the block are. note: start the sum at the rounding value, not at 0 */ sum_value = block_area >> 1; for( v = 0; v < v_block; ++v ) for( u = 0; u < u_block; ++u ) { sum_value += orig[index + v*width*channels + u*channels]; } resampled[j*mip_width*channels + i*channels + c] = sum_value / block_area; } } } return 1; } int scale_image_RGB_to_NTSC_safe ( unsigned char* orig, int width, int height, int channels ) { const float scale_lo = 16.0f - 0.499f; const float scale_hi = 235.0f + 0.499f; int i, j; int nc = channels; unsigned char scale_LUT[256]; /* error check */ if( (width < 1) || (height < 1) || (channels < 1) || (orig == NULL) ) { /* nothing to do */ return 0; } /* set up the scaling Look Up Table */ for( i = 0; i < 256; ++i ) { scale_LUT[i] = (unsigned char)((scale_hi - scale_lo) * i / 255.0f + scale_lo); } /* for channels = 2 or 4, ignore the alpha component */ nc -= 1 - (channels & 1); /* OK, go through the image and scale any non-alpha components */ for( i = 0; i < width*height*channels; i += channels ) { for( j = 0; j < nc; ++j ) { orig[i+j] = scale_LUT[orig[i+j]]; } } return 1; } unsigned char clamp_byte( int x ) { return ( (x) < 0 ? (0) : ( (x) > 255 ? 255 : (x) ) ); } /* This function takes the RGB components of the image and converts them into YCoCg. 3 components will be re-ordered to CoYCg (for optimum DXT1 compression), while 4 components will be ordered CoCgAY (for DXT5 compression). */ int convert_RGB_to_YCoCg ( unsigned char* orig, int width, int height, int channels ) { int i; /* error check */ if( (width < 1) || (height < 1) || (channels < 3) || (channels > 4) || (orig == NULL) ) { /* nothing to do */ return -1; } /* do the conversion */ if( channels == 3 ) { for( i = 0; i < width*height*3; i += 3 ) { int r = orig[i+0]; int g = (orig[i+1] + 1) >> 1; int b = orig[i+2]; int tmp = (2 + r + b) >> 2; /* Co */ orig[i+0] = clamp_byte( 128 + ((r - b + 1) >> 1) ); /* Y */ orig[i+1] = clamp_byte( g + tmp ); /* Cg */ orig[i+2] = clamp_byte( 128 + g - tmp ); } } else { for( i = 0; i < width*height*4; i += 4 ) { int r = orig[i+0]; int g = (orig[i+1] + 1) >> 1; int b = orig[i+2]; unsigned char a = orig[i+3]; int tmp = (2 + r + b) >> 2; /* Co */ orig[i+0] = clamp_byte( 128 + ((r - b + 1) >> 1) ); /* Cg */ orig[i+1] = clamp_byte( 128 + g - tmp ); /* Alpha */ orig[i+2] = a; /* Y */ orig[i+3] = clamp_byte( g + tmp ); } } /* done */ return 0; } /* This function takes the YCoCg components of the image and converts them into RGB. See above. */ int convert_YCoCg_to_RGB ( unsigned char* orig, int width, int height, int channels ) { int i; /* error check */ if( (width < 1) || (height < 1) || (channels < 3) || (channels > 4) || (orig == NULL) ) { /* nothing to do */ return -1; } /* do the conversion */ if( channels == 3 ) { for( i = 0; i < width*height*3; i += 3 ) { int co = orig[i+0] - 128; int y = orig[i+1]; int cg = orig[i+2] - 128; /* R */ orig[i+0] = clamp_byte( y + co - cg ); /* G */ orig[i+1] = clamp_byte( y + cg ); /* B */ orig[i+2] = clamp_byte( y - co - cg ); } } else { for( i = 0; i < width*height*4; i += 4 ) { int co = orig[i+0] - 128; int cg = orig[i+1] - 128; unsigned char a = orig[i+2]; int y = orig[i+3]; /* R */ orig[i+0] = clamp_byte( y + co - cg ); /* G */ orig[i+1] = clamp_byte( y + cg ); /* B */ orig[i+2] = clamp_byte( y - co - cg ); /* A */ orig[i+3] = a; } } /* done */ return 0; } float find_max_RGBE ( unsigned char *image, int width, int height ) { float max_val = 0.0f; unsigned char *img = image; int i, j; for( i = width * height; i > 0; --i ) { /* float scale = powf( 2.0f, img[3] - 128.0f ) / 255.0f; */ float scale = ldexp( 1.0f / 255.0f, (int)(img[3]) - 128 ); for( j = 0; j < 3; ++j ) { if( img[j] * scale > max_val ) { max_val = img[j] * scale; } } /* next pixel */ img += 4; } return max_val; } int RGBE_to_RGBdivA ( unsigned char *image, int width, int height, int rescale_to_max ) { /* local variables */ int i, iv; unsigned char *img = image; float scale = 1.0f; /* error check */ if( (!image) || (width < 1) || (height < 1) ) { return 0; } /* convert (note: no negative numbers, but 0.0 is possible) */ if( rescale_to_max ) { scale = 255.0f / find_max_RGBE( image, width, height ); } for( i = width * height; i > 0; --i ) { /* decode this pixel, and find the max */ float r,g,b,e, m; /* e = scale * powf( 2.0f, img[3] - 128.0f ) / 255.0f; */ e = scale * ldexp( 1.0f / 255.0f, (int)(img[3]) - 128 ); r = e * img[0]; g = e * img[1]; b = e * img[2]; m = (r > g) ? r : g; m = (b > m) ? b : m; /* and encode it into RGBdivA */ iv = (m != 0.0f) ? (int)(255.0f / m) : 1.0f; iv = (iv < 1) ? 1 : iv; img[3] = (iv > 255) ? 255 : iv; iv = (int)(img[3] * r + 0.5f); img[0] = (iv > 255) ? 255 : iv; iv = (int)(img[3] * g + 0.5f); img[1] = (iv > 255) ? 255 : iv; iv = (int)(img[3] * b + 0.5f); img[2] = (iv > 255) ? 255 : iv; /* and on to the next pixel */ img += 4; } return 1; } int RGBE_to_RGBdivA2 ( unsigned char *image, int width, int height, int rescale_to_max ) { /* local variables */ int i, iv; unsigned char *img = image; float scale = 1.0f; /* error check */ if( (!image) || (width < 1) || (height < 1) ) { return 0; } /* convert (note: no negative numbers, but 0.0 is possible) */ if( rescale_to_max ) { scale = 255.0f * 255.0f / find_max_RGBE( image, width, height ); } for( i = width * height; i > 0; --i ) { /* decode this pixel, and find the max */ float r,g,b,e, m; /* e = scale * powf( 2.0f, img[3] - 128.0f ) / 255.0f; */ e = scale * ldexp( 1.0f / 255.0f, (int)(img[3]) - 128 ); r = e * img[0]; g = e * img[1]; b = e * img[2]; m = (r > g) ? r : g; m = (b > m) ? b : m; /* and encode it into RGBdivA */ iv = (m != 0.0f) ? (int)sqrtf( 255.0f * 255.0f / m ) : 1.0f; iv = (iv < 1) ? 1 : iv; img[3] = (iv > 255) ? 255 : iv; iv = (int)(img[3] * img[3] * r / 255.0f + 0.5f); img[0] = (iv > 255) ? 255 : iv; iv = (int)(img[3] * img[3] * g / 255.0f + 0.5f); img[1] = (iv > 255) ? 255 : iv; iv = (int)(img[3] * img[3] * b / 255.0f + 0.5f); img[2] = (iv > 255) ? 255 : iv; /* and on to the next pixel */ img += 4; } return 1; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/image_helper.h�����������������������������������������0000664�0000000�0000000�00000004174�12660066715�0023441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Jonathan Dummer Image helper functions MIT license */ #ifndef HEADER_IMAGE_HELPER #define HEADER_IMAGE_HELPER #ifdef __cplusplus extern "C" { #endif /** This function upscales an image. Not to be used to create MIPmaps, but to make it square, or to make it a power-of-two sized. **/ int up_scale_image ( const unsigned char* const orig, int width, int height, int channels, unsigned char* resampled, int resampled_width, int resampled_height ); /** This function downscales an image. Used for creating MIPmaps, the incoming image should be a power-of-two sized. **/ int mipmap_image ( const unsigned char* const orig, int width, int height, int channels, unsigned char* resampled, int block_size_x, int block_size_y ); /** This function takes the RGB components of the image and scales each channel from [0,255] to [16,235]. This makes the colors "Safe" for display on NTSC displays. Note that this is _NOT_ a good idea for loading images like normal- or height-maps! **/ int scale_image_RGB_to_NTSC_safe ( unsigned char* orig, int width, int height, int channels ); /** This function takes the RGB components of the image and converts them into YCoCg. 3 components will be re-ordered to CoYCg (for optimum DXT1 compression), while 4 components will be ordered CoCgAY (for DXT5 compression). **/ int convert_RGB_to_YCoCg ( unsigned char* orig, int width, int height, int channels ); /** This function takes the YCoCg components of the image and converts them into RGB. See above. **/ int convert_YCoCg_to_RGB ( unsigned char* orig, int width, int height, int channels ); /** Converts an HDR image from an array of unsigned chars (RGBE) to RGBdivA \return 0 if failed, otherwise returns 1 **/ int RGBE_to_RGBdivA ( unsigned char *image, int width, int height, int rescale_to_max ); /** Converts an HDR image from an array of unsigned chars (RGBE) to RGBdivA2 \return 0 if failed, otherwise returns 1 **/ int RGBE_to_RGBdivA2 ( unsigned char *image, int width, int height, int rescale_to_max ); #ifdef __cplusplus } #endif #endif /* HEADER_IMAGE_HELPER */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/stb_image_aug.c����������������������������������������0000664�0000000�0000000�00000336112�12660066715�0023601�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* stbi-1.16 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c when you control the images you're loading QUICK NOTES: Primarily of interest to game developers and other people who can avoid problematic images and only need the trivial interface JPEG baseline (no JPEG progressive, no oddball channel decimations) PNG non-interlaced BMP non-1bpp, non-RLE TGA (not sure what subset, if a subset) PSD (composited view only, no extra channels) HDR (radiance rgbE format) writes BMP,TGA (define STBI_NO_WRITE to remove code) decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code) supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) TODO: stbi_info_* history: 1.16 major bugfix - convert_format converted one too many pixels 1.15 initialize some fields for thread safety 1.14 fix threadsafe conversion bug; header-file-only version (#define STBI_HEADER_FILE_ONLY before including) 1.13 threadsafe 1.12 const qualifiers in the API 1.11 Support installable IDCT, colorspace conversion routines 1.10 Fixes for 64-bit (don't use "unsigned long") optimized upsampling by Fabian "ryg" Giesen 1.09 Fix format-conversion for PSD code (bad global variables!) 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz 1.07 attempt to fix C++ warning/errors again 1.06 attempt to fix C++ warning/errors again 1.05 fix TGA loading to return correct *comp and use good luminance calc 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR 1.02 support for (subset of) HDR files, float interface for preferred access to them 1.01 fix bug: possible bug in handling right-side up bmps... not sure fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all 1.00 interface to zlib that skips zlib header 0.99 correct handling of alpha in palette 0.98 TGA loader by lonesock; dynamically add loaders (untested) 0.97 jpeg errors on too large a file; also catch another malloc failure 0.96 fix detection of invalid v value - particleman@mollyrocket forum 0.95 during header scan, seek to markers in case of padding 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same 0.93 handle jpegtran output; verbose errors 0.92 read 4,8,16,24,32-bit BMP files of several formats 0.91 output 24-bit Windows 3.0 BMP files 0.90 fix a few more warnings; bump version number to approach 1.0 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd 0.60 fix compiling as c++ 0.59 fix warnings: merge Dave Moore's -Wall fixes 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available 0.56 fix bug: zlib uncompressed mode len vs. nlen 0.55 fix bug: restart_interval not initialized to 0 0.54 allow NULL for 'int *comp' 0.53 fix bug in png 3->4; speedup png decoding 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments 0.51 obey req_comp requests, 1-component jpegs return as 1-component, on 'test' only check type, not whether we support this variant */ #include "stb_image_aug.h" #ifndef STBI_NO_HDR #include <math.h> // ldexp #include <string.h> // strcmp #endif #ifndef STBI_NO_STDIO #include <stdio.h> #endif #include <stdlib.h> #include <memory.h> #include <assert.h> #include <stdarg.h> #ifndef _MSC_VER #ifdef __cplusplus #define __forceinline inline #else #define __forceinline #endif #endif // implementation: typedef unsigned char uint8; typedef unsigned short uint16; typedef signed short int16; typedef unsigned int uint32; typedef signed int int32; typedef unsigned int uint; // should produce compiler error if size is wrong typedef unsigned char validate_uint32[sizeof(uint32)==4]; #if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) #define STBI_NO_WRITE #endif #ifndef STBI_NO_DDS #include "stbi_DDS_aug.h" #endif // I (JLD) want full messages for SOIL #define STBI_FAILURE_USERMSG 1 ////////////////////////////////////////////////////////////////////////////// // // Generic API that works on all image types // // this is not threadsafe static char *failure_reason; char *stbi_failure_reason(void) { return failure_reason; } static int e(char *str) { failure_reason = str; return 0; } #ifdef STBI_NO_FAILURE_STRINGS #define e(x,y) 0 #elif defined(STBI_FAILURE_USERMSG) #define e(x,y) e(y) #else #define e(x,y) e(x) #endif #define epf(x,y) ((float *) (e(x,y)?NULL:NULL)) #define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL)) void stbi_image_free(void *retval_from_stbi_load) { free(retval_from_stbi_load); } #define MAX_LOADERS 32 stbi_loader *loaders[MAX_LOADERS]; static int max_loaders = 0; int stbi_register_loader(stbi_loader *loader) { int i; for (i=0; i < MAX_LOADERS; ++i) { // already present? if (loaders[i] == loader) return 1; // end of the list? if (loaders[i] == NULL) { loaders[i] = loader; max_loaders = i+1; return 1; } } // no room for it return 0; } #ifndef STBI_NO_HDR static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); #endif #ifndef STBI_NO_STDIO unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) { FILE *f = fopen(filename, "rb"); unsigned char *result; if (!f) return epuc("can't fopen", "Unable to open file"); result = stbi_load_from_file(f,x,y,comp,req_comp); fclose(f); return result; } unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { int i; if (stbi_jpeg_test_file(f)) return stbi_jpeg_load_from_file(f,x,y,comp,req_comp); if (stbi_png_test_file(f)) return stbi_png_load_from_file(f,x,y,comp,req_comp); if (stbi_bmp_test_file(f)) return stbi_bmp_load_from_file(f,x,y,comp,req_comp); if (stbi_psd_test_file(f)) return stbi_psd_load_from_file(f,x,y,comp,req_comp); #ifndef STBI_NO_DDS if (stbi_dds_test_file(f)) return stbi_dds_load_from_file(f,x,y,comp,req_comp); #endif #ifndef STBI_NO_HDR if (stbi_hdr_test_file(f)) { float *hdr = stbi_hdr_load_from_file(f, x,y,comp,req_comp); return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); } #endif for (i=0; i < max_loaders; ++i) if (loaders[i]->test_file(f)) return loaders[i]->load_from_file(f,x,y,comp,req_comp); // test tga last because it's a crappy test! if (stbi_tga_test_file(f)) return stbi_tga_load_from_file(f,x,y,comp,req_comp); return epuc("unknown image type", "Image not of any known type, or corrupt"); } #endif unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { int i; if (stbi_jpeg_test_memory(buffer,len)) return stbi_jpeg_load_from_memory(buffer,len,x,y,comp,req_comp); if (stbi_png_test_memory(buffer,len)) return stbi_png_load_from_memory(buffer,len,x,y,comp,req_comp); if (stbi_bmp_test_memory(buffer,len)) return stbi_bmp_load_from_memory(buffer,len,x,y,comp,req_comp); if (stbi_psd_test_memory(buffer,len)) return stbi_psd_load_from_memory(buffer,len,x,y,comp,req_comp); #ifndef STBI_NO_DDS if (stbi_dds_test_memory(buffer,len)) return stbi_dds_load_from_memory(buffer,len,x,y,comp,req_comp); #endif #ifndef STBI_NO_HDR if (stbi_hdr_test_memory(buffer, len)) { float *hdr = stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp); return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); } #endif for (i=0; i < max_loaders; ++i) if (loaders[i]->test_memory(buffer,len)) return loaders[i]->load_from_memory(buffer,len,x,y,comp,req_comp); // test tga last because it's a crappy test! if (stbi_tga_test_memory(buffer,len)) return stbi_tga_load_from_memory(buffer,len,x,y,comp,req_comp); return epuc("unknown image type", "Image not of any known type, or corrupt"); } #ifndef STBI_NO_HDR #ifndef STBI_NO_STDIO float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) { FILE *f = fopen(filename, "rb"); float *result; if (!f) return epf("can't fopen", "Unable to open file"); result = stbi_loadf_from_file(f,x,y,comp,req_comp); fclose(f); return result; } float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { unsigned char *data; #ifndef STBI_NO_HDR if (stbi_hdr_test_file(f)) return stbi_hdr_load_from_file(f,x,y,comp,req_comp); #endif data = stbi_load_from_file(f, x, y, comp, req_comp); if (data) return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return epf("unknown image type", "Image not of any known type, or corrupt"); } #endif float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi_uc *data; #ifndef STBI_NO_HDR if (stbi_hdr_test_memory(buffer, len)) return stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp); #endif data = stbi_load_from_memory(buffer, len, x, y, comp, req_comp); if (data) return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return epf("unknown image type", "Image not of any known type, or corrupt"); } #endif // these is-hdr-or-not is defined independent of whether STBI_NO_HDR is // defined, for API simplicity; if STBI_NO_HDR is defined, it always // reports false! int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) { #ifndef STBI_NO_HDR return stbi_hdr_test_memory(buffer, len); #else return 0; #endif } #ifndef STBI_NO_STDIO extern int stbi_is_hdr (char const *filename) { FILE *f = fopen(filename, "rb"); int result=0; if (f) { result = stbi_is_hdr_from_file(f); fclose(f); } return result; } extern int stbi_is_hdr_from_file(FILE *f) { #ifndef STBI_NO_HDR return stbi_hdr_test_file(f); #else return 0; #endif } #endif // @TODO: get image dimensions & components without fully decoding #ifndef STBI_NO_STDIO extern int stbi_info (char const *filename, int *x, int *y, int *comp); extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); #endif extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); #ifndef STBI_NO_HDR static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; static float l2h_gamma=2.2f, l2h_scale=1.0f; void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } #endif ////////////////////////////////////////////////////////////////////////////// // // Common code used by all image loaders // enum { SCAN_load=0, SCAN_type, SCAN_header, }; typedef struct { uint32 img_x, img_y; int img_n, img_out_n; #ifndef STBI_NO_STDIO FILE *img_file; #endif uint8 *img_buffer, *img_buffer_end; } stbi; #ifndef STBI_NO_STDIO static void start_file(stbi *s, FILE *f) { s->img_file = f; } #endif static void start_mem(stbi *s, uint8 const *buffer, int len) { #ifndef STBI_NO_STDIO s->img_file = NULL; #endif s->img_buffer = (uint8 *) buffer; s->img_buffer_end = (uint8 *) buffer+len; } __forceinline static int get8(stbi *s) { #ifndef STBI_NO_STDIO if (s->img_file) { int c = fgetc(s->img_file); return c == EOF ? 0 : c; } #endif if (s->img_buffer < s->img_buffer_end) return *s->img_buffer++; return 0; } __forceinline static int at_eof(stbi *s) { #ifndef STBI_NO_STDIO if (s->img_file) return feof(s->img_file); #endif return s->img_buffer >= s->img_buffer_end; } __forceinline static uint8 get8u(stbi *s) { return (uint8) get8(s); } static void skip(stbi *s, int n) { #ifndef STBI_NO_STDIO if (s->img_file) fseek(s->img_file, n, SEEK_CUR); else #endif s->img_buffer += n; } static int get16(stbi *s) { int z = get8(s); return (z << 8) + get8(s); } static uint32 get32(stbi *s) { uint32 z = get16(s); return (z << 16) + get16(s); } static int get16le(stbi *s) { int z = get8(s); return z + (get8(s) << 8); } static uint32 get32le(stbi *s) { uint32 z = get16le(s); return z + (get16le(s) << 16); } static void getn(stbi *s, stbi_uc *buffer, int n) { #ifndef STBI_NO_STDIO if (s->img_file) { fread(buffer, 1, n, s->img_file); return; } #endif memcpy(buffer, s->img_buffer, n); s->img_buffer += n; } ////////////////////////////////////////////////////////////////////////////// // // generic converter from built-in img_n to req_comp // individual types do this automatically as much as possible (e.g. jpeg // does all cases internally since it needs to colorspace convert anyway, // and it never has alpha, so very few cases ). png can automatically // interleave an alpha=255 channel, but falls back to this for other cases // // assume data buffer is malloced, so malloc a new one and free that one // only failure mode is malloc failing static uint8 compute_y(int r, int g, int b) { return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); } static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y) { int i,j; unsigned char *good; if (req_comp == img_n) return data; assert(req_comp >= 1 && req_comp <= 4); good = (unsigned char *) malloc(req_comp * x * y); if (good == NULL) { free(data); return epuc("outofmem", "Out of memory"); } for (j=0; j < (int) y; ++j) { unsigned char *src = data + j * x * img_n ; unsigned char *dest = good + j * x * req_comp; #define COMBO(a,b) ((a)*8+(b)) #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) // convert source image with img_n components to one with req_comp components; // avoid switch per pixel, so use switch per scanline and massive macros switch(COMBO(img_n, req_comp)) { CASE(1,2) dest[0]=src[0], dest[1]=255; break; CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; CASE(2,1) dest[0]=src[0]; break; CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; default: assert(0); } #undef CASE } free(data); return good; } #ifndef STBI_NO_HDR static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; float *output = (float *) malloc(x * y * comp * sizeof(float)); if (output == NULL) { free(data); return epf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { for (k=0; k < n; ++k) { output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale; } if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; } free(data); return output; } #define float2int(x) ((int) (x)) static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; stbi_uc *output = (stbi_uc *) malloc(x * y * comp); if (output == NULL) { free(data); return epuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { for (k=0; k < n; ++k) { float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; if (z < 0) z = 0; if (z > 255) z = 255; output[i*comp + k] = float2int(z); } if (k < comp) { float z = data[i*comp+k] * 255 + 0.5f; if (z < 0) z = 0; if (z > 255) z = 255; output[i*comp + k] = float2int(z); } } free(data); return output; } #endif ////////////////////////////////////////////////////////////////////////////// // // "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) // // simple implementation // - channel subsampling of at most 2 in each dimension // - doesn't support delayed output of y-dimension // - simple interface (only one output format: 8-bit interleaved RGB) // - doesn't try to recover corrupt jpegs // - doesn't allow partial loading, loading multiple at once // - still fast on x86 (copying globals into locals doesn't help x86) // - allocates lots of intermediate memory (full size of all components) // - non-interleaved case requires this anyway // - allows good upsampling (see next) // high-quality // - upsampled channels are bilinearly interpolated, even across blocks // - quality integer IDCT derived from IJG's 'slow' // performance // - fast huffman; reasonable integer IDCT // - uses a lot of intermediate memory, could cache poorly // - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 // stb_jpeg: 1.34 seconds (MSVC6, default release build) // stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) // IJL11.dll: 1.08 seconds (compiled by intel) // IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) // IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) // huffman decoding acceleration #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache typedef struct { uint8 fast[1 << FAST_BITS]; // weirdly, repacking this into AoS is a 10% speed loss, instead of a win uint16 code[256]; uint8 values[256]; uint8 size[257]; unsigned int maxcode[18]; int delta[17]; // old 'firstsymbol' - old 'firstcode' } huffman; typedef struct { #if STBI_SIMD unsigned short dequant2[4][64]; #endif stbi s; huffman huff_dc[4]; huffman huff_ac[4]; uint8 dequant[4][64]; // sizes for components, interleaved MCUs int img_h_max, img_v_max; int img_mcu_x, img_mcu_y; int img_mcu_w, img_mcu_h; // definition of jpeg image component struct { int id; int h,v; int tq; int hd,ha; int dc_pred; int x,y,w2,h2; uint8 *data; void *raw_data; uint8 *linebuf; } img_comp[4]; uint32 code_buffer; // jpeg entropy-coded buffer int code_bits; // number of valid bits unsigned char marker; // marker seen while filling entropy buffer int nomore; // flag if we saw a marker so must stop int scan_n, order[4]; int restart_interval, todo; } jpeg; static int build_huffman(huffman *h, int *count) { int i,j,k=0,code; // build size list for each symbol (from JPEG spec) for (i=0; i < 16; ++i) for (j=0; j < count[i]; ++j) h->size[k++] = (uint8) (i+1); h->size[k] = 0; // compute actual symbols (from jpeg spec) code = 0; k = 0; for(j=1; j <= 16; ++j) { // compute delta to add to code to compute symbol id h->delta[j] = k - code; if (h->size[k] == j) { while (h->size[k] == j) h->code[k++] = (uint16) (code++); if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG"); } // compute largest code + 1 for this size, preshifted as needed later h->maxcode[j] = code << (16-j); code <<= 1; } h->maxcode[j] = 0xffffffff; // build non-spec acceleration table; 255 is flag for not-accelerated memset(h->fast, 255, 1 << FAST_BITS); for (i=0; i < k; ++i) { int s = h->size[i]; if (s <= FAST_BITS) { int c = h->code[i] << (FAST_BITS-s); int m = 1 << (FAST_BITS-s); for (j=0; j < m; ++j) { h->fast[c+j] = (uint8) i; } } } return 1; } static void grow_buffer_unsafe(jpeg *j) { do { int b = j->nomore ? 0 : get8(&j->s); if (b == 0xff) { int c = get8(&j->s); if (c != 0) { j->marker = (unsigned char) c; j->nomore = 1; return; } } j->code_buffer = (j->code_buffer << 8) | b; j->code_bits += 8; } while (j->code_bits <= 24); } // (1 << n) - 1 static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; // decode a jpeg huffman value from the bitstream __forceinline static int decode(jpeg *j, huffman *h) { unsigned int temp; int c,k; if (j->code_bits < 16) grow_buffer_unsafe(j); // look at the top FAST_BITS and determine what symbol ID it is, // if the code is <= FAST_BITS c = (j->code_buffer >> (j->code_bits - FAST_BITS)) & ((1 << FAST_BITS)-1); k = h->fast[c]; if (k < 255) { if (h->size[k] > j->code_bits) return -1; j->code_bits -= h->size[k]; return h->values[k]; } // naive test is to shift the code_buffer down so k bits are // valid, then test against maxcode. To speed this up, we've // preshifted maxcode left so that it has (16-k) 0s at the // end; in other words, regardless of the number of bits, it // wants to be compared against something shifted to have 16; // that way we don't need to shift inside the loop. if (j->code_bits < 16) temp = (j->code_buffer << (16 - j->code_bits)) & 0xffff; else temp = (j->code_buffer >> (j->code_bits - 16)) & 0xffff; for (k=FAST_BITS+1 ; ; ++k) if (temp < h->maxcode[k]) break; if (k == 17) { // error! code not found j->code_bits -= 16; return -1; } if (k > j->code_bits) return -1; // convert the huffman code to the symbol id c = ((j->code_buffer >> (j->code_bits - k)) & bmask[k]) + h->delta[k]; assert((((j->code_buffer) >> (j->code_bits - h->size[c])) & bmask[h->size[c]]) == h->code[c]); // convert the id to a symbol j->code_bits -= k; return h->values[c]; } // combined JPEG 'receive' and JPEG 'extend', since baseline // always extends everything it receives. __forceinline static int extend_receive(jpeg *j, int n) { unsigned int m = 1 << (n-1); unsigned int k; if (j->code_bits < n) grow_buffer_unsafe(j); k = (j->code_buffer >> (j->code_bits - n)) & bmask[n]; j->code_bits -= n; // the following test is probably a random branch that won't // predict well. I tried to table accelerate it but failed. // maybe it's compiling as a conditional move? if (k < m) return (-1 << n) + k + 1; else return k; } // given a value that's at position X in the zigzag stream, // where does it appear in the 8x8 matrix coded as row-major? static uint8 dezigzag[64+15] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, // let corrupt input sample past end 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }; // decode one 64-entry block-- static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b) { int diff,dc,k; int t = decode(j, hdc); if (t < 0) return e("bad huffman code","Corrupt JPEG"); // 0 all the ac values now so we can do it 32-bits at a time memset(data,0,64*sizeof(data[0])); diff = t ? extend_receive(j, t) : 0; dc = j->img_comp[b].dc_pred + diff; j->img_comp[b].dc_pred = dc; data[0] = (short) dc; // decode AC components, see JPEG spec k = 1; do { int r,s; int rs = decode(j, hac); if (rs < 0) return e("bad huffman code","Corrupt JPEG"); s = rs & 15; r = rs >> 4; if (s == 0) { if (rs != 0xf0) break; // end block k += 16; } else { k += r; // decode into unzigzag'd location data[dezigzag[k++]] = (short) extend_receive(j,s); } } while (k < 64); return 1; } // take a -128..127 value and clamp it and convert to 0..255 __forceinline static uint8 clamp(int x) { x += 128; // trick to use a single test to catch both cases if ((unsigned int) x > 255) { if (x < 0) return 0; if (x > 255) return 255; } return (uint8) x; } #define f2f(x) (int) (((x) * 4096 + 0.5)) #define fsh(x) ((x) << 12) // derived from jidctint -- DCT_ISLOW #define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ p2 = s2; \ p3 = s6; \ p1 = (p2+p3) * f2f(0.5411961f); \ t2 = p1 + p3*f2f(-1.847759065f); \ t3 = p1 + p2*f2f( 0.765366865f); \ p2 = s0; \ p3 = s4; \ t0 = fsh(p2+p3); \ t1 = fsh(p2-p3); \ x0 = t0+t3; \ x3 = t0-t3; \ x1 = t1+t2; \ x2 = t1-t2; \ t0 = s7; \ t1 = s5; \ t2 = s3; \ t3 = s1; \ p3 = t0+t2; \ p4 = t1+t3; \ p1 = t0+t3; \ p2 = t1+t2; \ p5 = (p3+p4)*f2f( 1.175875602f); \ t0 = t0*f2f( 0.298631336f); \ t1 = t1*f2f( 2.053119869f); \ t2 = t2*f2f( 3.072711026f); \ t3 = t3*f2f( 1.501321110f); \ p1 = p5 + p1*f2f(-0.899976223f); \ p2 = p5 + p2*f2f(-2.562915447f); \ p3 = p3*f2f(-1.961570560f); \ p4 = p4*f2f(-0.390180644f); \ t3 += p1+p4; \ t2 += p2+p3; \ t1 += p2+p4; \ t0 += p1+p3; #if !STBI_SIMD // .344 seconds on 3*anemones.jpg static void idct_block(uint8 *out, int out_stride, short data[64], uint8 *dequantize) { int i,val[64],*v=val; uint8 *o,*dq = dequantize; short *d = data; // columns for (i=0; i < 8; ++i,++d,++dq, ++v) { // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 && d[40]==0 && d[48]==0 && d[56]==0) { // no shortcut 0 seconds // (1|2|3|4|5|6|7)==0 0 seconds // all separate -0.047 seconds // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds int dcterm = d[0] * dq[0] << 2; v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; } else { IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) // constants scaled things up by 1<<12; let's bring them back // down, but keep 2 extra bits of precision x0 += 512; x1 += 512; x2 += 512; x3 += 512; v[ 0] = (x0+t3) >> 10; v[56] = (x0-t3) >> 10; v[ 8] = (x1+t2) >> 10; v[48] = (x1-t2) >> 10; v[16] = (x2+t1) >> 10; v[40] = (x2-t1) >> 10; v[24] = (x3+t0) >> 10; v[32] = (x3-t0) >> 10; } } for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { // no fast case since the first 1D IDCT spread components out IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) // constants scaled things up by 1<<12, plus we had 1<<2 from first // loop, plus horizontal and vertical each scale by sqrt(8) so together // we've got an extra 1<<3, so 1<<17 total we need to remove. x0 += 65536; x1 += 65536; x2 += 65536; x3 += 65536; o[0] = clamp((x0+t3) >> 17); o[7] = clamp((x0-t3) >> 17); o[1] = clamp((x1+t2) >> 17); o[6] = clamp((x1-t2) >> 17); o[2] = clamp((x2+t1) >> 17); o[5] = clamp((x2-t1) >> 17); o[3] = clamp((x3+t0) >> 17); o[4] = clamp((x3-t0) >> 17); } } #else static void idct_block(uint8 *out, int out_stride, short data[64], unsigned short *dequantize) { int i,val[64],*v=val; uint8 *o; unsigned short *dq = dequantize; short *d = data; // columns for (i=0; i < 8; ++i,++d,++dq, ++v) { // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 && d[40]==0 && d[48]==0 && d[56]==0) { // no shortcut 0 seconds // (1|2|3|4|5|6|7)==0 0 seconds // all separate -0.047 seconds // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds int dcterm = d[0] * dq[0] << 2; v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; } else { IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) // constants scaled things up by 1<<12; let's bring them back // down, but keep 2 extra bits of precision x0 += 512; x1 += 512; x2 += 512; x3 += 512; v[ 0] = (x0+t3) >> 10; v[56] = (x0-t3) >> 10; v[ 8] = (x1+t2) >> 10; v[48] = (x1-t2) >> 10; v[16] = (x2+t1) >> 10; v[40] = (x2-t1) >> 10; v[24] = (x3+t0) >> 10; v[32] = (x3-t0) >> 10; } } for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { // no fast case since the first 1D IDCT spread components out IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) // constants scaled things up by 1<<12, plus we had 1<<2 from first // loop, plus horizontal and vertical each scale by sqrt(8) so together // we've got an extra 1<<3, so 1<<17 total we need to remove. x0 += 65536; x1 += 65536; x2 += 65536; x3 += 65536; o[0] = clamp((x0+t3) >> 17); o[7] = clamp((x0-t3) >> 17); o[1] = clamp((x1+t2) >> 17); o[6] = clamp((x1-t2) >> 17); o[2] = clamp((x2+t1) >> 17); o[5] = clamp((x2-t1) >> 17); o[3] = clamp((x3+t0) >> 17); o[4] = clamp((x3-t0) >> 17); } } static stbi_idct_8x8 stbi_idct_installed = idct_block; extern void stbi_install_idct(stbi_idct_8x8 func) { stbi_idct_installed = func; } #endif #define MARKER_none 0xff // if there's a pending marker from the entropy stream, return that // otherwise, fetch from the stream and get a marker. if there's no // marker, return 0xff, which is never a valid marker value static uint8 get_marker(jpeg *j) { uint8 x; if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; } x = get8u(&j->s); if (x != 0xff) return MARKER_none; while (x == 0xff) x = get8u(&j->s); return x; } // in each scan, we'll have scan_n components, and the order // of the components is specified by order[] #define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) // after a restart interval, reset the entropy decoder and // the dc prediction static void reset(jpeg *j) { j->code_bits = 0; j->code_buffer = 0; j->nomore = 0; j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; j->marker = MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, // since we don't even allow 1<<30 pixels } static int parse_entropy_coded_data(jpeg *z) { reset(z); if (z->scan_n == 1) { int i,j; #if STBI_SIMD __declspec(align(16)) #endif short data[64]; int n = z->order[0]; // non-interleaved data, we just need to process one block at a time, // in trivial scanline order // number of blocks to do just depends on how many actual "pixels" this // component has, independent of interleaved MCU blocking and such int w = (z->img_comp[n].x+7) >> 3; int h = (z->img_comp[n].y+7) >> 3; for (j=0; j < h; ++j) { for (i=0; i < w; ++i) { if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; #if STBI_SIMD stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); #else idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); #endif // every data block is an MCU, so countdown the restart interval if (--z->todo <= 0) { if (z->code_bits < 24) grow_buffer_unsafe(z); // if it's NOT a restart, then just bail, so we get corrupt data // rather than no data if (!RESTART(z->marker)) return 1; reset(z); } } } } else { // interleaved! int i,j,k,x,y; short data[64]; for (j=0; j < z->img_mcu_y; ++j) { for (i=0; i < z->img_mcu_x; ++i) { // scan an interleaved mcu... process scan_n components in order for (k=0; k < z->scan_n; ++k) { int n = z->order[k]; // scan out an mcu's worth of this component; that's just determined // by the basic H and V specified for the component for (y=0; y < z->img_comp[n].v; ++y) { for (x=0; x < z->img_comp[n].h; ++x) { int x2 = (i*z->img_comp[n].h + x)*8; int y2 = (j*z->img_comp[n].v + y)*8; if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; #if STBI_SIMD stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); #else idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); #endif } } } // after all interleaved components, that's an interleaved MCU, // so now count down the restart interval if (--z->todo <= 0) { if (z->code_bits < 24) grow_buffer_unsafe(z); // if it's NOT a restart, then just bail, so we get corrupt data // rather than no data if (!RESTART(z->marker)) return 1; reset(z); } } } } return 1; } static int process_marker(jpeg *z, int m) { int L; switch (m) { case MARKER_none: // no marker found return e("expected marker","Corrupt JPEG"); case 0xC2: // SOF - progressive return e("progressive jpeg","JPEG format not supported (progressive)"); case 0xDD: // DRI - specify restart interval if (get16(&z->s) != 4) return e("bad DRI len","Corrupt JPEG"); z->restart_interval = get16(&z->s); return 1; case 0xDB: // DQT - define quantization table L = get16(&z->s)-2; while (L > 0) { int q = get8(&z->s); int p = q >> 4; int t = q & 15,i; if (p != 0) return e("bad DQT type","Corrupt JPEG"); if (t > 3) return e("bad DQT table","Corrupt JPEG"); for (i=0; i < 64; ++i) z->dequant[t][dezigzag[i]] = get8u(&z->s); #if STBI_SIMD for (i=0; i < 64; ++i) z->dequant2[t][i] = dequant[t][i]; #endif L -= 65; } return L==0; case 0xC4: // DHT - define huffman table L = get16(&z->s)-2; while (L > 0) { uint8 *v; int sizes[16],i,m=0; int q = get8(&z->s); int tc = q >> 4; int th = q & 15; if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); for (i=0; i < 16; ++i) { sizes[i] = get8(&z->s); m += sizes[i]; } L -= 17; if (tc == 0) { if (!build_huffman(z->huff_dc+th, sizes)) return 0; v = z->huff_dc[th].values; } else { if (!build_huffman(z->huff_ac+th, sizes)) return 0; v = z->huff_ac[th].values; } for (i=0; i < m; ++i) v[i] = get8u(&z->s); L -= m; } return L==0; } // check for comment block or APP blocks if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { skip(&z->s, get16(&z->s)-2); return 1; } return 0; } // after we see SOS static int process_scan_header(jpeg *z) { int i; int Ls = get16(&z->s); z->scan_n = get8(&z->s); if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s.img_n) return e("bad SOS component count","Corrupt JPEG"); if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG"); for (i=0; i < z->scan_n; ++i) { int id = get8(&z->s), which; int q = get8(&z->s); for (which = 0; which < z->s.img_n; ++which) if (z->img_comp[which].id == id) break; if (which == z->s.img_n) return 0; z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); z->order[i] = which; } if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG"); get8(&z->s); // should be 63, but might be 0 if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG"); return 1; } static int process_frame_header(jpeg *z, int scan) { stbi *s = &z->s; int Lf,p,i,q, h_max=1,v_max=1,c; Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires c = get8(s); if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires s->img_n = c; for (i=0; i < c; ++i) { z->img_comp[i].data = NULL; z->img_comp[i].linebuf = NULL; } if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG"); for (i=0; i < s->img_n; ++i) { z->img_comp[i].id = get8(s); if (z->img_comp[i].id != i+1) // JFIF requires if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! return e("bad component ID","Corrupt JPEG"); q = get8(s); z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); } if (scan != SCAN_load) return 1; if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); for (i=0; i < s->img_n; ++i) { if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; } // compute interleaved mcu info z->img_h_max = h_max; z->img_v_max = v_max; z->img_mcu_w = h_max * 8; z->img_mcu_h = v_max * 8; z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; for (i=0; i < s->img_n; ++i) { // number of effective pixels (e.g. for non-interleaved MCU) z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; // to simplify generation, we'll allocate enough memory to decode // the bogus oversized data from using interleaved MCUs and their // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); if (z->img_comp[i].raw_data == NULL) { for(--i; i >= 0; --i) { free(z->img_comp[i].raw_data); z->img_comp[i].data = NULL; } return e("outofmem", "Out of memory"); } // align blocks for installable-idct using mmx/sse z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); z->img_comp[i].linebuf = NULL; } return 1; } // use comparisons since in some cases we handle more than one case (e.g. SOF) #define DNL(x) ((x) == 0xdc) #define SOI(x) ((x) == 0xd8) #define EOI(x) ((x) == 0xd9) #define SOF(x) ((x) == 0xc0 || (x) == 0xc1) #define SOS(x) ((x) == 0xda) static int decode_jpeg_header(jpeg *z, int scan) { int m; z->marker = MARKER_none; // initialize cached marker to empty m = get_marker(z); if (!SOI(m)) return e("no SOI","Corrupt JPEG"); if (scan == SCAN_type) return 1; m = get_marker(z); while (!SOF(m)) { if (!process_marker(z,m)) return 0; m = get_marker(z); while (m == MARKER_none) { // some files have extra padding after their blocks, so ok, we'll scan if (at_eof(&z->s)) return e("no SOF", "Corrupt JPEG"); m = get_marker(z); } } if (!process_frame_header(z, scan)) return 0; return 1; } static int decode_jpeg_image(jpeg *j) { int m; j->restart_interval = 0; if (!decode_jpeg_header(j, SCAN_load)) return 0; m = get_marker(j); while (!EOI(m)) { if (SOS(m)) { if (!process_scan_header(j)) return 0; if (!parse_entropy_coded_data(j)) return 0; } else { if (!process_marker(j, m)) return 0; } m = get_marker(j); } return 1; } // static jfif-centered resampling (across block boundaries) typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1, int w, int hs); #define div4(x) ((uint8) ((x) >> 2)) static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { return in_near; } static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // need to generate two samples vertically for every one in input int i; for (i=0; i < w; ++i) out[i] = div4(3*in_near[i] + in_far[i] + 2); return out; } static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // need to generate two samples horizontally for every one in input int i; uint8 *input = in_near; if (w == 1) { // if only one sample, can't do any interpolation out[0] = out[1] = input[0]; return out; } out[0] = input[0]; out[1] = div4(input[0]*3 + input[1] + 2); for (i=1; i < w-1; ++i) { int n = 3*input[i]+2; out[i*2+0] = div4(n+input[i-1]); out[i*2+1] = div4(n+input[i+1]); } out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2); out[i*2+1] = input[w-1]; return out; } #define div16(x) ((uint8) ((x) >> 4)) static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // need to generate 2x2 samples for every one in input int i,t0,t1; if (w == 1) { out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2); return out; } t1 = 3*in_near[0] + in_far[0]; out[0] = div4(t1+2); for (i=1; i < w; ++i) { t0 = t1; t1 = 3*in_near[i]+in_far[i]; out[i*2-1] = div16(3*t0 + t1 + 8); out[i*2 ] = div16(3*t1 + t0 + 8); } out[w*2-1] = div4(t1+2); return out; } static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) { // resample with nearest-neighbor int i,j; for (i=0; i < w; ++i) for (j=0; j < hs; ++j) out[i*hs+j] = in_near[i]; return out; } #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) // 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) // VC6 without processor=Pro is generating multiple LEAs per multiply! static void YCbCr_to_RGB_row(uint8 *out, uint8 *y, uint8 *pcb, uint8 *pcr, int count, int step) { int i; for (i=0; i < count; ++i) { int y_fixed = (y[i] << 16) + 32768; // rounding int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; r = y_fixed + cr*float2fixed(1.40200f); g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); b = y_fixed + cb*float2fixed(1.77200f); r >>= 16; g >>= 16; b >>= 16; if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } out[0] = (uint8)r; out[1] = (uint8)g; out[2] = (uint8)b; out[3] = 255; out += step; } } #if STBI_SIMD static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row; void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) { stbi_YCbCr_installed = func; } #endif // clean up the temporary component buffers static void cleanup_jpeg(jpeg *j) { int i; for (i=0; i < j->s.img_n; ++i) { if (j->img_comp[i].data) { free(j->img_comp[i].raw_data); j->img_comp[i].data = NULL; } if (j->img_comp[i].linebuf) { free(j->img_comp[i].linebuf); j->img_comp[i].linebuf = NULL; } } } typedef struct { resample_row_func resample; uint8 *line0,*line1; int hs,vs; // expansion factor in each axis int w_lores; // horizontal pixels pre-expansion int ystep; // how far through vertical expansion we are int ypos; // which pre-expansion row we're on } stbi_resample; static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) { int n, decode_n; // validate req_comp if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); z->s.img_n = 0; // load a jpeg image from whichever source if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; } // determine actual number of components to generate n = req_comp ? req_comp : z->s.img_n; if (z->s.img_n == 3 && n < 3) decode_n = 1; else decode_n = z->s.img_n; // resample and color-convert { int k; uint i,j; uint8 *output; uint8 *coutput[4]; stbi_resample res_comp[4]; for (k=0; k < decode_n; ++k) { stbi_resample *r = &res_comp[k]; // allocate line buffer big enough for upsampling off the edges // with upsample factor of 4 z->img_comp[k].linebuf = (uint8 *) malloc(z->s.img_x + 3); if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } r->hs = z->img_h_max / z->img_comp[k].h; r->vs = z->img_v_max / z->img_comp[k].v; r->ystep = r->vs >> 1; r->w_lores = (z->s.img_x + r->hs-1) / r->hs; r->ypos = 0; r->line0 = r->line1 = z->img_comp[k].data; if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2; else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2; else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2; else r->resample = resample_row_generic; } // can't error after this so, this is safe output = (uint8 *) malloc(n * z->s.img_x * z->s.img_y + 1); if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } // now go ahead and resample for (j=0; j < z->s.img_y; ++j) { uint8 *out = output + n * z->s.img_x * j; for (k=0; k < decode_n; ++k) { stbi_resample *r = &res_comp[k]; int y_bot = r->ystep >= (r->vs >> 1); coutput[k] = r->resample(z->img_comp[k].linebuf, y_bot ? r->line1 : r->line0, y_bot ? r->line0 : r->line1, r->w_lores, r->hs); if (++r->ystep >= r->vs) { r->ystep = 0; r->line0 = r->line1; if (++r->ypos < z->img_comp[k].y) r->line1 += z->img_comp[k].w2; } } if (n >= 3) { uint8 *y = coutput[0]; if (z->s.img_n == 3) { #if STBI_SIMD stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n); #else YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s.img_x, n); #endif } else for (i=0; i < z->s.img_x; ++i) { out[0] = out[1] = out[2] = y[i]; out[3] = 255; // not used if n==3 out += n; } } else { uint8 *y = coutput[0]; if (n == 1) for (i=0; i < z->s.img_x; ++i) out[i] = y[i]; else for (i=0; i < z->s.img_x; ++i) *out++ = y[i], *out++ = 255; } } cleanup_jpeg(z); *out_x = z->s.img_x; *out_y = z->s.img_y; if (comp) *comp = z->s.img_n; // report original components, not output return output; } } #ifndef STBI_NO_STDIO unsigned char *stbi_jpeg_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { jpeg j; start_file(&j.s, f); return load_jpeg_image(&j, x,y,comp,req_comp); } unsigned char *stbi_jpeg_load(char const *filename, int *x, int *y, int *comp, int req_comp) { unsigned char *data; FILE *f = fopen(filename, "rb"); if (!f) return NULL; data = stbi_jpeg_load_from_file(f,x,y,comp,req_comp); fclose(f); return data; } #endif unsigned char *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { jpeg j; start_mem(&j.s, buffer,len); return load_jpeg_image(&j, x,y,comp,req_comp); } #ifndef STBI_NO_STDIO int stbi_jpeg_test_file(FILE *f) { int n,r; jpeg j; n = ftell(f); start_file(&j.s, f); r = decode_jpeg_header(&j, SCAN_type); fseek(f,n,SEEK_SET); return r; } #endif int stbi_jpeg_test_memory(stbi_uc const *buffer, int len) { jpeg j; start_mem(&j.s, buffer,len); return decode_jpeg_header(&j, SCAN_type); } // @TODO: #ifndef STBI_NO_STDIO extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp); extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp); #endif extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); // public domain zlib decode v0.2 Sean Barrett 2006-11-18 // simple implementation // - all input must be provided in an upfront buffer // - all output is written to a single output buffer (can malloc/realloc) // performance // - fast huffman // fast-way is faster to check than jpeg huffman, but slow way is slower #define ZFAST_BITS 9 // accelerate all cases in default tables #define ZFAST_MASK ((1 << ZFAST_BITS) - 1) // zlib-style huffman encoding // (jpegs packs from left, zlib from right, so can't share code) typedef struct { uint16 fast[1 << ZFAST_BITS]; uint16 firstcode[16]; int maxcode[17]; uint16 firstsymbol[16]; uint8 size[288]; uint16 value[288]; } zhuffman; __forceinline static int bitreverse16(int n) { n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); return n; } __forceinline static int bit_reverse(int v, int bits) { assert(bits <= 16); // to bit reverse n bits, reverse 16 and shift // e.g. 11 bits, bit reverse and shift away 5 return bitreverse16(v) >> (16-bits); } static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num) { int i,k=0; int code, next_code[16], sizes[17]; // DEFLATE spec for generating codes memset(sizes, 0, sizeof(sizes)); memset(z->fast, 255, sizeof(z->fast)); for (i=0; i < num; ++i) ++sizes[sizelist[i]]; sizes[0] = 0; for (i=1; i < 16; ++i) assert(sizes[i] <= (1 << i)); code = 0; for (i=1; i < 16; ++i) { next_code[i] = code; z->firstcode[i] = (uint16) code; z->firstsymbol[i] = (uint16) k; code = (code + sizes[i]); if (sizes[i]) if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); z->maxcode[i] = code << (16-i); // preshift for inner loop code <<= 1; k += sizes[i]; } z->maxcode[16] = 0x10000; // sentinel for (i=0; i < num; ++i) { int s = sizelist[i]; if (s) { int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; z->size[c] = (uint8)s; z->value[c] = (uint16)i; if (s <= ZFAST_BITS) { int k = bit_reverse(next_code[s],s); while (k < (1 << ZFAST_BITS)) { z->fast[k] = (uint16) c; k += (1 << s); } } ++next_code[s]; } } return 1; } // zlib-from-memory implementation for PNG reading // because PNG allows splitting the zlib stream arbitrarily, // and it's annoying structurally to have PNG call ZLIB call PNG, // we require PNG read all the IDATs and combine them into a single // memory buffer typedef struct { uint8 *zbuffer, *zbuffer_end; int num_bits; uint32 code_buffer; char *zout; char *zout_start; char *zout_end; int z_expandable; zhuffman z_length, z_distance; } zbuf; __forceinline static int zget8(zbuf *z) { if (z->zbuffer >= z->zbuffer_end) return 0; return *z->zbuffer++; } static void fill_bits(zbuf *z) { do { assert(z->code_buffer < (1U << z->num_bits)); z->code_buffer |= zget8(z) << z->num_bits; z->num_bits += 8; } while (z->num_bits <= 24); } __forceinline static unsigned int zreceive(zbuf *z, int n) { unsigned int k; if (z->num_bits < n) fill_bits(z); k = z->code_buffer & ((1 << n) - 1); z->code_buffer >>= n; z->num_bits -= n; return k; } __forceinline static int zhuffman_decode(zbuf *a, zhuffman *z) { int b,s,k; if (a->num_bits < 16) fill_bits(a); b = z->fast[a->code_buffer & ZFAST_MASK]; if (b < 0xffff) { s = z->size[b]; a->code_buffer >>= s; a->num_bits -= s; return z->value[b]; } // not resolved by fast table, so compute it the slow way // use jpeg approach, which requires MSbits at top k = bit_reverse(a->code_buffer, 16); for (s=ZFAST_BITS+1; ; ++s) if (k < z->maxcode[s]) break; if (s == 16) return -1; // invalid code! // code size is s, so: b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; assert(z->size[b] == s); a->code_buffer >>= s; a->num_bits -= s; return z->value[b]; } static int expand(zbuf *z, int n) // need to make room for n bytes { char *q; int cur, limit; if (!z->z_expandable) return e("output buffer limit","Corrupt PNG"); cur = (int) (z->zout - z->zout_start); limit = (int) (z->zout_end - z->zout_start); while (cur + n > limit) limit *= 2; q = (char *) realloc(z->zout_start, limit); if (q == NULL) return e("outofmem", "Out of memory"); z->zout_start = q; z->zout = q + cur; z->zout_end = q + limit; return 1; } static int length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; static int length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; static int dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; static int parse_huffman_block(zbuf *a) { for(;;) { int z = zhuffman_decode(a, &a->z_length); if (z < 256) { if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0; *a->zout++ = (char) z; } else { uint8 *p; int len,dist; if (z == 256) return 1; z -= 257; len = length_base[z]; if (length_extra[z]) len += zreceive(a, length_extra[z]); z = zhuffman_decode(a, &a->z_distance); if (z < 0) return e("bad huffman code","Corrupt PNG"); dist = dist_base[z]; if (dist_extra[z]) dist += zreceive(a, dist_extra[z]); if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG"); if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; p = (uint8 *) (a->zout - dist); while (len--) *a->zout++ = *p++; } } } static int compute_huffman_codes(zbuf *a) { static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; static zhuffman z_codelength; // static just to save stack space uint8 lencodes[286+32+137];//padding for maximum single op uint8 codelength_sizes[19]; int i,n; int hlit = zreceive(a,5) + 257; int hdist = zreceive(a,5) + 1; int hclen = zreceive(a,4) + 4; memset(codelength_sizes, 0, sizeof(codelength_sizes)); for (i=0; i < hclen; ++i) { int s = zreceive(a,3); codelength_sizes[length_dezigzag[i]] = (uint8) s; } if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; n = 0; while (n < hlit + hdist) { int c = zhuffman_decode(a, &z_codelength); assert(c >= 0 && c < 19); if (c < 16) lencodes[n++] = (uint8) c; else if (c == 16) { c = zreceive(a,2)+3; memset(lencodes+n, lencodes[n-1], c); n += c; } else if (c == 17) { c = zreceive(a,3)+3; memset(lencodes+n, 0, c); n += c; } else { assert(c == 18); c = zreceive(a,7)+11; memset(lencodes+n, 0, c); n += c; } } if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; return 1; } static int parse_uncompressed_block(zbuf *a) { uint8 header[4]; int len,nlen,k; if (a->num_bits & 7) zreceive(a, a->num_bits & 7); // discard // drain the bit-packed data into header k = 0; while (a->num_bits > 0) { header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns? a->code_buffer >>= 8; a->num_bits -= 8; } assert(a->num_bits == 0); // now fill header the normal way while (k < 4) header[k++] = (uint8) zget8(a); len = header[1] * 256 + header[0]; nlen = header[3] * 256 + header[2]; if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG"); if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; memcpy(a->zout, a->zbuffer, len); a->zbuffer += len; a->zout += len; return 1; } static int parse_zlib_header(zbuf *a) { int cmf = zget8(a); int cm = cmf & 15; /* int cinfo = cmf >> 4; */ int flg = zget8(a); if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png // window = 1 << (8 + cinfo)... but who cares, we fully buffer output return 1; } // @TODO: should statically initialize these for optimal thread safety static uint8 default_length[288], default_distance[32]; static void init_defaults(void) { int i; // use <= to match clearly with spec for (i=0; i <= 143; ++i) default_length[i] = 8; for ( ; i <= 255; ++i) default_length[i] = 9; for ( ; i <= 279; ++i) default_length[i] = 7; for ( ; i <= 287; ++i) default_length[i] = 8; for (i=0; i <= 31; ++i) default_distance[i] = 5; } static int parse_zlib(zbuf *a, int parse_header) { int final, type; if (parse_header) if (!parse_zlib_header(a)) return 0; a->num_bits = 0; a->code_buffer = 0; do { final = zreceive(a,1); type = zreceive(a,2); if (type == 0) { if (!parse_uncompressed_block(a)) return 0; } else if (type == 3) { return 0; } else { if (type == 1) { // use fixed code lengths if (!default_distance[31]) init_defaults(); if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0; if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0; } else { if (!compute_huffman_codes(a)) return 0; } if (!parse_huffman_block(a)) return 0; } } while (!final); return 1; } static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header) { a->zout_start = obuf; a->zout = obuf; a->zout_end = obuf + olen; a->z_expandable = exp; return parse_zlib(a, parse_header); } char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) { zbuf a; char *p = (char *) malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (uint8 *) buffer; a.zbuffer_end = (uint8 *) buffer + len; if (do_zlib(&a, p, initial_size, 1, 1)) { if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { free(a.zout_start); return NULL; } } char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) { return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); } int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) { zbuf a; a.zbuffer = (uint8 *) ibuffer; a.zbuffer_end = (uint8 *) ibuffer + ilen; if (do_zlib(&a, obuffer, olen, 0, 1)) return (int) (a.zout - a.zout_start); else return -1; } char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) { zbuf a; char *p = (char *) malloc(16384); if (p == NULL) return NULL; a.zbuffer = (uint8 *) buffer; a.zbuffer_end = (uint8 *) buffer+len; if (do_zlib(&a, p, 16384, 1, 0)) { if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { free(a.zout_start); return NULL; } } int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) { zbuf a; a.zbuffer = (uint8 *) ibuffer; a.zbuffer_end = (uint8 *) ibuffer + ilen; if (do_zlib(&a, obuffer, olen, 0, 0)) return (int) (a.zout - a.zout_start); else return -1; } // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 // simple implementation // - only 8-bit samples // - no CRC checking // - allocates lots of intermediate memory // - avoids problem of streaming data between subsystems // - avoids explicit window management // performance // - uses stb_zlib, a PD zlib implementation with fast huffman decoding typedef struct { uint32 length; uint32 type; } chunk; #define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) static chunk get_chunk_header(stbi *s) { chunk c; c.length = get32(s); c.type = get32(s); return c; } static int check_png_header(stbi *s) { static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; int i; for (i=0; i < 8; ++i) if (get8(s) != png_sig[i]) return e("bad png sig","Not a PNG"); return 1; } typedef struct { stbi s; uint8 *idata, *expanded, *out; } png; enum { F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, F_avg_first, F_paeth_first, }; static uint8 first_row_filter[5] = { F_none, F_sub, F_none, F_avg_first, F_paeth_first }; static int paeth(int a, int b, int c) { int p = a + b - c; int pa = abs(p-a); int pb = abs(p-b); int pc = abs(p-c); if (pa <= pb && pa <= pc) return a; if (pb <= pc) return b; return c; } // create the png data from post-deflated data static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n) { stbi *s = &a->s; uint32 i,j,stride = s->img_x*out_n; int k; int img_n = s->img_n; // copy it into a local for later assert(out_n == s->img_n || out_n == s->img_n+1); a->out = (uint8 *) malloc(s->img_x * s->img_y * out_n); if (!a->out) return e("outofmem", "Out of memory"); if (raw_len != (img_n * s->img_x + 1) * s->img_y) return e("not enough pixels","Corrupt PNG"); for (j=0; j < s->img_y; ++j) { uint8 *cur = a->out + stride*j; uint8 *prior = cur - stride; int filter = *raw++; if (filter > 4) return e("invalid filter","Corrupt PNG"); // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; // handle first pixel explicitly for (k=0; k < img_n; ++k) { switch(filter) { case F_none : cur[k] = raw[k]; break; case F_sub : cur[k] = raw[k]; break; case F_up : cur[k] = raw[k] + prior[k]; break; case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; case F_avg_first : cur[k] = raw[k]; break; case F_paeth_first: cur[k] = raw[k]; break; } } if (img_n != out_n) cur[img_n] = 255; raw += img_n; cur += out_n; prior += out_n; // this is a little gross, so that we don't switch per-pixel or per-component if (img_n == out_n) { #define CASE(f) \ case f: \ for (i=s->img_x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ for (k=0; k < img_n; ++k) switch(filter) { CASE(F_none) cur[k] = raw[k]; break; CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; CASE(F_up) cur[k] = raw[k] + prior[k]; break; CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; } #undef CASE } else { assert(img_n+1 == out_n); #define CASE(f) \ case f: \ for (i=s->img_x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ for (k=0; k < img_n; ++k) switch(filter) { CASE(F_none) cur[k] = raw[k]; break; CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; CASE(F_up) cur[k] = raw[k] + prior[k]; break; CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; } #undef CASE } } return 1; } static int compute_transparency(png *z, uint8 tc[3], int out_n) { stbi *s = &z->s; uint32 i, pixel_count = s->img_x * s->img_y; uint8 *p = z->out; // compute color-based transparency, assuming we've // already got 255 as the alpha value in the output assert(out_n == 2 || out_n == 4); if (out_n == 2) { for (i=0; i < pixel_count; ++i) { p[1] = (p[0] == tc[0] ? 0 : 255); p += 2; } } else { for (i=0; i < pixel_count; ++i) { if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) p[3] = 0; p += 4; } } return 1; } static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n) { uint32 i, pixel_count = a->s.img_x * a->s.img_y; uint8 *p, *temp_out, *orig = a->out; p = (uint8 *) malloc(pixel_count * pal_img_n); if (p == NULL) return e("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak temp_out = p; if (pal_img_n == 3) { for (i=0; i < pixel_count; ++i) { int n = orig[i]*4; p[0] = palette[n ]; p[1] = palette[n+1]; p[2] = palette[n+2]; p += 3; } } else { for (i=0; i < pixel_count; ++i) { int n = orig[i]*4; p[0] = palette[n ]; p[1] = palette[n+1]; p[2] = palette[n+2]; p[3] = palette[n+3]; p += 4; } } free(a->out); a->out = temp_out; return 1; } static int parse_png_file(png *z, int scan, int req_comp) { uint8 palette[1024], pal_img_n=0; uint8 has_trans=0, tc[3]; uint32 ioff=0, idata_limit=0, i, pal_len=0; int first=1,k; stbi *s = &z->s; if (!check_png_header(s)) return 0; if (scan == SCAN_type) return 1; for(;;first=0) { chunk c = get_chunk_header(s); if (first && c.type != PNG_TYPE('I','H','D','R')) return e("first not IHDR","Corrupt PNG"); switch (c.type) { case PNG_TYPE('I','H','D','R'): { int depth,color,interlace,comp,filter; if (!first) return e("multiple IHDR","Corrupt PNG"); if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG"); filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG"); interlace = get8(s); if (interlace) return e("interlaced","PNG not supported: interlaced mode"); if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG"); if (!pal_img_n) { s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); if (scan == SCAN_header) return 1; } else { // if paletted, then pal_n is our final components, and // img_n is # components to decompress/filter. s->img_n = 1; if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG"); // if SCAN_header, have to scan to see if we have a tRNS } break; } case PNG_TYPE('P','L','T','E'): { if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); pal_len = c.length / 3; if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); for (i=0; i < pal_len; ++i) { palette[i*4+0] = get8u(s); palette[i*4+1] = get8u(s); palette[i*4+2] = get8u(s); palette[i*4+3] = 255; } break; } case PNG_TYPE('t','R','N','S'): { if (z->idata) return e("tRNS after IDAT","Corrupt PNG"); if (pal_img_n) { if (scan == SCAN_header) { s->img_n = 4; return 1; } if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); pal_img_n = 4; for (i=0; i < c.length; ++i) palette[i*4+3] = get8u(s); } else { if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG"); has_trans = 1; for (k=0; k < s->img_n; ++k) tc[k] = (uint8) get16(s); // non 8-bit images will be larger } break; } case PNG_TYPE('I','D','A','T'): { if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } if (ioff + c.length > idata_limit) { uint8 *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; while (ioff + c.length > idata_limit) idata_limit *= 2; p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); z->idata = p; } #ifndef STBI_NO_STDIO if (s->img_file) { if (fread(z->idata+ioff,1,c.length,s->img_file) != c.length) return e("outofdata","Corrupt PNG"); } else #endif { memcpy(z->idata+ioff, s->img_buffer, c.length); s->img_buffer += c.length; } ioff += c.length; break; } case PNG_TYPE('I','E','N','D'): { uint32 raw_len; if (scan != SCAN_load) return 1; if (z->idata == NULL) return e("no IDAT","Corrupt PNG"); z->expanded = (uint8 *) stbi_zlib_decode_malloc((char *) z->idata, ioff, (int *) &raw_len); if (z->expanded == NULL) return 0; // zlib should set error free(z->idata); z->idata = NULL; if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) s->img_out_n = s->img_n+1; else s->img_out_n = s->img_n; if (!create_png_image(z, z->expanded, raw_len, s->img_out_n)) return 0; if (has_trans) if (!compute_transparency(z, tc, s->img_out_n)) return 0; if (pal_img_n) { // pal_img_n == 3 or 4 s->img_n = pal_img_n; // record the actual colors we had s->img_out_n = pal_img_n; if (req_comp >= 3) s->img_out_n = req_comp; if (!expand_palette(z, palette, pal_len, s->img_out_n)) return 0; } free(z->expanded); z->expanded = NULL; return 1; } default: // if critical, fail if ((c.type & (1 << 29)) == 0) { #ifndef STBI_NO_FAILURE_STRINGS // not threadsafe static char invalid_chunk[] = "XXXX chunk not known"; invalid_chunk[0] = (uint8) (c.type >> 24); invalid_chunk[1] = (uint8) (c.type >> 16); invalid_chunk[2] = (uint8) (c.type >> 8); invalid_chunk[3] = (uint8) (c.type >> 0); #endif return e(invalid_chunk, "PNG not supported: unknown chunk type"); } skip(s, c.length); break; } // end of chunk, read and skip CRC get32(s); } } static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp) { unsigned char *result=NULL; p->expanded = NULL; p->idata = NULL; p->out = NULL; if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); if (parse_png_file(p, SCAN_load, req_comp)) { result = p->out; p->out = NULL; if (req_comp && req_comp != p->s.img_out_n) { result = convert_format(result, p->s.img_out_n, req_comp, p->s.img_x, p->s.img_y); p->s.img_out_n = req_comp; if (result == NULL) return result; } *x = p->s.img_x; *y = p->s.img_y; if (n) *n = p->s.img_n; } free(p->out); p->out = NULL; free(p->expanded); p->expanded = NULL; free(p->idata); p->idata = NULL; return result; } #ifndef STBI_NO_STDIO unsigned char *stbi_png_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { png p; start_file(&p.s, f); return do_png(&p, x,y,comp,req_comp); } unsigned char *stbi_png_load(char const *filename, int *x, int *y, int *comp, int req_comp) { unsigned char *data; FILE *f = fopen(filename, "rb"); if (!f) return NULL; data = stbi_png_load_from_file(f,x,y,comp,req_comp); fclose(f); return data; } #endif unsigned char *stbi_png_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { png p; start_mem(&p.s, buffer,len); return do_png(&p, x,y,comp,req_comp); } #ifndef STBI_NO_STDIO int stbi_png_test_file(FILE *f) { png p; int n,r; n = ftell(f); start_file(&p.s, f); r = parse_png_file(&p, SCAN_type,STBI_default); fseek(f,n,SEEK_SET); return r; } #endif int stbi_png_test_memory(stbi_uc const *buffer, int len) { png p; start_mem(&p.s, buffer, len); return parse_png_file(&p, SCAN_type,STBI_default); } // TODO: load header from png #ifndef STBI_NO_STDIO extern int stbi_png_info (char const *filename, int *x, int *y, int *comp); extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp); #endif extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp); // Microsoft/Windows BMP image static int bmp_test(stbi *s) { int sz; if (get8(s) != 'B') return 0; if (get8(s) != 'M') return 0; get32le(s); // discard filesize get16le(s); // discard reserved get16le(s); // discard reserved get32le(s); // discard data offset sz = get32le(s); if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; return 0; } #ifndef STBI_NO_STDIO int stbi_bmp_test_file (FILE *f) { stbi s; int r,n = ftell(f); start_file(&s,f); r = bmp_test(&s); fseek(f,n,SEEK_SET); return r; } #endif int stbi_bmp_test_memory (stbi_uc const *buffer, int len) { stbi s; start_mem(&s, buffer, len); return bmp_test(&s); } // returns 0..31 for the highest set bit static int high_bit(unsigned int z) { int n=0; if (z == 0) return -1; if (z >= 0x10000) n += 16, z >>= 16; if (z >= 0x00100) n += 8, z >>= 8; if (z >= 0x00010) n += 4, z >>= 4; if (z >= 0x00004) n += 2, z >>= 2; if (z >= 0x00002) n += 1, z >>= 1; return n; } static int bitcount(unsigned int a) { a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits a = (a + (a >> 8)); // max 16 per 8 bits a = (a + (a >> 16)); // max 32 per 8 bits return a & 0xff; } static int shiftsigned(int v, int shift, int bits) { int result; int z=0; if (shift < 0) v <<= -shift; else v >>= shift; result = v; z = bits; while (z < 8) { result += v >> z; z += bits; } return result; } static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp) { uint8 *out; unsigned int mr=0,mg=0,mb=0,ma=0; stbi_uc pal[256][4]; int psize=0,i,j,compress=0,width; int bpp, flip_vertically, pad, target, offset, hsz; if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP"); get32le(s); // discard filesize get16le(s); // discard reserved get16le(s); // discard reserved offset = get32le(s); hsz = get32le(s); if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); failure_reason = "bad BMP"; if (hsz == 12) { s->img_x = get16le(s); s->img_y = get16le(s); } else { s->img_x = get32le(s); s->img_y = get32le(s); } if (get16le(s) != 1) return 0; bpp = get16le(s); if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit"); flip_vertically = ((int) s->img_y) > 0; s->img_y = abs((int) s->img_y); if (hsz == 12) { if (bpp < 24) psize = (offset - 14 - 24) / 3; } else { compress = get32le(s); if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE"); get32le(s); // discard sizeof get32le(s); // discard hres get32le(s); // discard vres get32le(s); // discard colorsused get32le(s); // discard max important if (hsz == 40 || hsz == 56) { if (hsz == 56) { get32le(s); get32le(s); get32le(s); get32le(s); } if (bpp == 16 || bpp == 32) { mr = mg = mb = 0; if (compress == 0) { if (bpp == 32) { mr = 0xff << 16; mg = 0xff << 8; mb = 0xff << 0; } else { mr = 31 << 10; mg = 31 << 5; mb = 31 << 0; } } else if (compress == 3) { mr = get32le(s); mg = get32le(s); mb = get32le(s); // not documented, but generated by photoshop and handled by mspaint if (mr == mg && mg == mb) { // ?!?!? return NULL; } } else return NULL; } } else { assert(hsz == 108); mr = get32le(s); mg = get32le(s); mb = get32le(s); ma = get32le(s); get32le(s); // discard color space for (i=0; i < 12; ++i) get32le(s); // discard color space parameters } if (bpp < 16) psize = (offset - 14 - hsz) >> 2; } s->img_n = ma ? 4 : 3; if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 target = req_comp; else target = s->img_n; // if they want monochrome, we'll post-convert out = (stbi_uc *) malloc(target * s->img_x * s->img_y); if (!out) return epuc("outofmem", "Out of memory"); if (bpp < 16) { int z=0; if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); } for (i=0; i < psize; ++i) { pal[i][2] = get8(s); pal[i][1] = get8(s); pal[i][0] = get8(s); if (hsz != 12) get8(s); pal[i][3] = 255; } skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); if (bpp == 4) width = (s->img_x + 1) >> 1; else if (bpp == 8) width = s->img_x; else { free(out); return epuc("bad bpp", "Corrupt BMP"); } pad = (-width)&3; for (j=0; j < (int) s->img_y; ++j) { for (i=0; i < (int) s->img_x; i += 2) { int v=get8(s),v2=0; if (bpp == 4) { v2 = v & 15; v >>= 4; } out[z++] = pal[v][0]; out[z++] = pal[v][1]; out[z++] = pal[v][2]; if (target == 4) out[z++] = 255; if (i+1 == (int) s->img_x) break; v = (bpp == 8) ? get8(s) : v2; out[z++] = pal[v][0]; out[z++] = pal[v][1]; out[z++] = pal[v][2]; if (target == 4) out[z++] = 255; } skip(s, pad); } } else { int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; int z = 0; int easy=0; skip(s, offset - 14 - hsz); if (bpp == 24) width = 3 * s->img_x; else if (bpp == 16) width = 2*s->img_x; else /* bpp = 32 and pad = 0 */ width=0; pad = (-width) & 3; if (bpp == 24) { easy = 1; } else if (bpp == 32) { if (mb == 0xff && mg == 0xff00 && mr == 0xff000000 && ma == 0xff000000) easy = 2; } if (!easy) { if (!mr || !mg || !mb) return epuc("bad masks", "Corrupt BMP"); // right shift amt to put high bit in position #7 rshift = high_bit(mr)-7; rcount = bitcount(mr); gshift = high_bit(mg)-7; gcount = bitcount(mr); bshift = high_bit(mb)-7; bcount = bitcount(mr); ashift = high_bit(ma)-7; acount = bitcount(mr); } for (j=0; j < (int) s->img_y; ++j) { if (easy) { for (i=0; i < (int) s->img_x; ++i) { int a; out[z+2] = get8(s); out[z+1] = get8(s); out[z+0] = get8(s); z += 3; a = (easy == 2 ? get8(s) : 255); if (target == 4) out[z++] = a; } } else { for (i=0; i < (int) s->img_x; ++i) { uint32 v = (bpp == 16 ? get16le(s) : get32le(s)); int a; out[z++] = shiftsigned(v & mr, rshift, rcount); out[z++] = shiftsigned(v & mg, gshift, gcount); out[z++] = shiftsigned(v & mb, bshift, bcount); a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); if (target == 4) out[z++] = a; } } skip(s, pad); } } if (flip_vertically) { stbi_uc t; for (j=0; j < (int) s->img_y>>1; ++j) { stbi_uc *p1 = out + j *s->img_x*target; stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; for (i=0; i < (int) s->img_x*target; ++i) { t = p1[i], p1[i] = p2[i], p2[i] = t; } } } if (req_comp && req_comp != target) { out = convert_format(out, target, req_comp, s->img_x, s->img_y); if (out == NULL) return out; // convert_format frees input on failure } *x = s->img_x; *y = s->img_y; if (comp) *comp = target; return out; } #ifndef STBI_NO_STDIO stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp) { stbi_uc *data; FILE *f = fopen(filename, "rb"); if (!f) return NULL; data = stbi_bmp_load_from_file(f, x,y,comp,req_comp); fclose(f); return data; } stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s, f); return bmp_load(&s, x,y,comp,req_comp); } #endif stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s, buffer, len); return bmp_load(&s, x,y,comp,req_comp); } // Targa Truevision - TGA // by Jonathan Dummer static int tga_test(stbi *s) { int sz; get8u(s); // discard Offset sz = get8u(s); // color type if( sz > 1 ) return 0; // only RGB or indexed allowed sz = get8u(s); // image type if( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE get16(s); // discard palette start get16(s); // discard palette length get8(s); // discard bits per palette color entry get16(s); // discard x origin get16(s); // discard y origin if( get16(s) < 1 ) return 0; // test width if( get16(s) < 1 ) return 0; // test height sz = get8(s); // bits per pixel if( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed return 1; // seems to have passed everything } #ifndef STBI_NO_STDIO int stbi_tga_test_file (FILE *f) { stbi s; int r,n = ftell(f); start_file(&s, f); r = tga_test(&s); fseek(f,n,SEEK_SET); return r; } #endif int stbi_tga_test_memory (stbi_uc const *buffer, int len) { stbi s; start_mem(&s, buffer, len); return tga_test(&s); } static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) { // read in the TGA header stuff int tga_offset = get8u(s); int tga_indexed = get8u(s); int tga_image_type = get8u(s); int tga_is_RLE = 0; int tga_palette_start = get16le(s); int tga_palette_len = get16le(s); int tga_palette_bits = get8u(s); int tga_x_origin = get16le(s); int tga_y_origin = get16le(s); int tga_width = get16le(s); int tga_height = get16le(s); int tga_bits_per_pixel = get8u(s); int tga_inverted = get8u(s); // image data unsigned char *tga_data; unsigned char *tga_palette = NULL; int i, j; unsigned char raw_data[4]; unsigned char trans_data[] = { 0,0,0,0 }; int RLE_count = 0; int RLE_repeating = 0; int read_next_pixel = 1; // do a tiny bit of precessing if( tga_image_type >= 8 ) { tga_image_type -= 8; tga_is_RLE = 1; } /* int tga_alpha_bits = tga_inverted & 15; */ tga_inverted = 1 - ((tga_inverted >> 5) & 1); // error check if( //(tga_indexed) || (tga_width < 1) || (tga_height < 1) || (tga_image_type < 1) || (tga_image_type > 3) || ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) ) { return NULL; } // If I'm paletted, then I'll use the number of bits from the palette if( tga_indexed ) { tga_bits_per_pixel = tga_palette_bits; } // tga info *x = tga_width; *y = tga_height; if( (req_comp < 1) || (req_comp > 4) ) { // just use whatever the file was req_comp = tga_bits_per_pixel / 8; *comp = req_comp; } else { // force a new number of components *comp = tga_bits_per_pixel/8; } tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); // skip to the data's starting position (offset usually = 0) skip(s, tga_offset ); // do I need to load a palette? if( tga_indexed ) { // any data to skip? (offset usually = 0) skip(s, tga_palette_start ); // load the palette tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 ); } // load the data for( i = 0; i < tga_width * tga_height; ++i ) { // if I'm in RLE mode, do I need to get a RLE chunk? if( tga_is_RLE ) { if( RLE_count == 0 ) { // yep, get the next byte as a RLE command int RLE_cmd = get8u(s); RLE_count = 1 + (RLE_cmd & 127); RLE_repeating = RLE_cmd >> 7; read_next_pixel = 1; } else if( !RLE_repeating ) { read_next_pixel = 1; } } else { read_next_pixel = 1; } // OK, if I need to read a pixel, do it now if( read_next_pixel ) { // load however much data we did have if( tga_indexed ) { // read in 1 byte, then perform the lookup int pal_idx = get8u(s); if( pal_idx >= tga_palette_len ) { // invalid index pal_idx = 0; } pal_idx *= tga_bits_per_pixel / 8; for( j = 0; j*8 < tga_bits_per_pixel; ++j ) { raw_data[j] = tga_palette[pal_idx+j]; } } else { // read in the data raw for( j = 0; j*8 < tga_bits_per_pixel; ++j ) { raw_data[j] = get8u(s); } } // convert raw to the intermediate format switch( tga_bits_per_pixel ) { case 8: // Luminous => RGBA trans_data[0] = raw_data[0]; trans_data[1] = raw_data[0]; trans_data[2] = raw_data[0]; trans_data[3] = 255; break; case 16: // Luminous,Alpha => RGBA trans_data[0] = raw_data[0]; trans_data[1] = raw_data[0]; trans_data[2] = raw_data[0]; trans_data[3] = raw_data[1]; break; case 24: // BGR => RGBA trans_data[0] = raw_data[2]; trans_data[1] = raw_data[1]; trans_data[2] = raw_data[0]; trans_data[3] = 255; break; case 32: // BGRA => RGBA trans_data[0] = raw_data[2]; trans_data[1] = raw_data[1]; trans_data[2] = raw_data[0]; trans_data[3] = raw_data[3]; break; } // clear the reading flag for the next pixel read_next_pixel = 0; } // end of reading a pixel // convert to final format switch( req_comp ) { case 1: // RGBA => Luminance tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); break; case 2: // RGBA => Luminance,Alpha tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); tga_data[i*req_comp+1] = trans_data[3]; break; case 3: // RGBA => RGB tga_data[i*req_comp+0] = trans_data[0]; tga_data[i*req_comp+1] = trans_data[1]; tga_data[i*req_comp+2] = trans_data[2]; break; case 4: // RGBA => RGBA tga_data[i*req_comp+0] = trans_data[0]; tga_data[i*req_comp+1] = trans_data[1]; tga_data[i*req_comp+2] = trans_data[2]; tga_data[i*req_comp+3] = trans_data[3]; break; } // in case we're in RLE mode, keep counting down --RLE_count; } // do I need to invert the image? if( tga_inverted ) { for( j = 0; j*2 < tga_height; ++j ) { int index1 = j * tga_width * req_comp; int index2 = (tga_height - 1 - j) * tga_width * req_comp; for( i = tga_width * req_comp; i > 0; --i ) { unsigned char temp = tga_data[index1]; tga_data[index1] = tga_data[index2]; tga_data[index2] = temp; ++index1; ++index2; } } } // clear my palette, if I had one if( tga_palette != NULL ) { free( tga_palette ); } // the things I do to get rid of an error message, and yet keep // Microsoft's C compilers happy... [8^( tga_palette_start = tga_palette_len = tga_palette_bits = tga_x_origin = tga_y_origin = 0; // OK, done return tga_data; } #ifndef STBI_NO_STDIO stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp) { stbi_uc *data; FILE *f = fopen(filename, "rb"); if (!f) return NULL; data = stbi_tga_load_from_file(f, x,y,comp,req_comp); fclose(f); return data; } stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s, f); return tga_load(&s, x,y,comp,req_comp); } #endif stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s, buffer, len); return tga_load(&s, x,y,comp,req_comp); } // ************************************************************************************************* // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicholas Schulz, tweaked by STB static int psd_test(stbi *s) { if (get32(s) != 0x38425053) return 0; // "8BPS" else return 1; } #ifndef STBI_NO_STDIO int stbi_psd_test_file(FILE *f) { stbi s; int r,n = ftell(f); start_file(&s, f); r = psd_test(&s); fseek(f,n,SEEK_SET); return r; } #endif int stbi_psd_test_memory(stbi_uc const *buffer, int len) { stbi s; start_mem(&s, buffer, len); return psd_test(&s); } static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) { int pixelCount; int channelCount, compression; int channel, i, count, len; int w,h; uint8 *out; // Check identifier if (get32(s) != 0x38425053) // "8BPS" return epuc("not PSD", "Corrupt PSD image"); // Check file type version. if (get16(s) != 1) return epuc("wrong version", "Unsupported version of PSD image"); // Skip 6 reserved bytes. skip(s, 6 ); // Read the number of channels (R, G, B, A, etc). channelCount = get16(s); if (channelCount < 0 || channelCount > 16) return epuc("wrong channel count", "Unsupported number of channels in PSD image"); // Read the rows and columns of the image. h = get32(s); w = get32(s); // Make sure the depth is 8 bits. if (get16(s) != 8) return epuc("unsupported bit depth", "PSD bit depth is not 8 bit"); // Make sure the color mode is RGB. // Valid options are: // 0: Bitmap // 1: Grayscale // 2: Indexed color // 3: RGB color // 4: CMYK color // 7: Multichannel // 8: Duotone // 9: Lab color if (get16(s) != 3) return epuc("wrong color format", "PSD is not in RGB color format"); // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) skip(s,get32(s) ); // Skip the image resources. (resolution, pen tool paths, etc) skip(s, get32(s) ); // Skip the reserved data. skip(s, get32(s) ); // Find out if the data is compressed. // Known values: // 0: no compression // 1: RLE compressed compression = get16(s); if (compression > 1) return epuc("bad compression", "PSD has an unknown compression format"); // Create the destination image. out = (stbi_uc *) malloc(4 * w*h); if (!out) return epuc("outofmem", "Out of memory"); pixelCount = w*h; // Initialize the data to zero. //memset( out, 0, pixelCount * 4 ); // Finally, the image data. if (compression) { // RLE as used by .PSD and .TIFF // Loop until you get the number of unpacked bytes you are expecting: // Read the next source byte into n. // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. // Else if n is 128, noop. // Endloop // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, // which we're going to just skip. skip(s, h * channelCount * 2 ); // Read the RLE data by channel. for (channel = 0; channel < 4; channel++) { uint8 *p; p = out+channel; if (channel >= channelCount) { // Fill this channel with default data. for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; } else { // Read the RLE data. count = 0; while (count < pixelCount) { len = get8(s); if (len == 128) { // No-op. } else if (len < 128) { // Copy next len+1 bytes literally. len++; count += len; while (len) { *p = get8(s); p += 4; len--; } } else if (len > 128) { uint32 val; // Next -len+1 bytes in the dest are replicated from next source byte. // (Interpret len as a negative 8-bit int.) len ^= 0x0FF; len += 2; val = get8(s); count += len; while (len) { *p = val; p += 4; len--; } } } } } } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) // where each channel consists of an 8-bit value for each pixel in the image. // Read the data by channel. for (channel = 0; channel < 4; channel++) { uint8 *p; p = out + channel; if (channel > channelCount) { // Fill this channel with default data. for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; } else { // Read the data. count = 0; for (i = 0; i < pixelCount; i++) *p = get8(s), p += 4; } } } if (req_comp && req_comp != 4) { out = convert_format(out, 4, req_comp, w, h); if (out == NULL) return out; // convert_format frees input on failure } if (comp) *comp = channelCount; *y = h; *x = w; return out; } #ifndef STBI_NO_STDIO stbi_uc *stbi_psd_load(char const *filename, int *x, int *y, int *comp, int req_comp) { stbi_uc *data; FILE *f = fopen(filename, "rb"); if (!f) return NULL; data = stbi_psd_load_from_file(f, x,y,comp,req_comp); fclose(f); return data; } stbi_uc *stbi_psd_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s, f); return psd_load(&s, x,y,comp,req_comp); } #endif stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s, buffer, len); return psd_load(&s, x,y,comp,req_comp); } // ************************************************************************************************* // Radiance RGBE HDR loader // originally by Nicolas Schulz #ifndef STBI_NO_HDR static int hdr_test(stbi *s) { char *signature = "#?RADIANCE\n"; int i; for (i=0; signature[i]; ++i) if (get8(s) != signature[i]) return 0; return 1; } int stbi_hdr_test_memory(stbi_uc const *buffer, int len) { stbi s; start_mem(&s, buffer, len); return hdr_test(&s); } #ifndef STBI_NO_STDIO int stbi_hdr_test_file(FILE *f) { stbi s; int r,n = ftell(f); start_file(&s, f); r = hdr_test(&s); fseek(f,n,SEEK_SET); return r; } #endif #define HDR_BUFLEN 1024 static char *hdr_gettoken(stbi *z, char *buffer) { int len=0; //char *s = buffer, char c = '\0'; c = get8(z); while (!at_eof(z) && c != '\n') { buffer[len++] = c; if (len == HDR_BUFLEN-1) { // flush to end of line while (!at_eof(z) && get8(z) != '\n') ; break; } c = get8(z); } buffer[len] = 0; return buffer; } static void hdr_convert(float *output, stbi_uc *input, int req_comp) { if( input[3] != 0 ) { float f1; // Exponent f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); if (req_comp <= 2) output[0] = (input[0] + input[1] + input[2]) * f1 / 3; else { output[0] = input[0] * f1; output[1] = input[1] * f1; output[2] = input[2] * f1; } if (req_comp == 2) output[1] = 1; if (req_comp == 4) output[3] = 1; } else { switch (req_comp) { case 4: output[3] = 1; /* fallthrough */ case 3: output[0] = output[1] = output[2] = 0; break; case 2: output[1] = 1; /* fallthrough */ case 1: output[0] = 0; break; } } } static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) { char buffer[HDR_BUFLEN]; char *token; int valid = 0; int width, height; stbi_uc *scanline; float *hdr_data; int len; unsigned char count, value; int i, j, k, c1,c2, z; // Check identifier if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) return epf("not HDR", "Corrupt HDR image"); // Parse header while(1) { token = hdr_gettoken(s,buffer); if (token[0] == 0) break; if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; } if (!valid) return epf("unsupported format", "Unsupported HDR format"); // Parse width and height // can't use sscanf() if we're not using stdio! token = hdr_gettoken(s,buffer); if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); token += 3; height = strtol(token, &token, 10); while (*token == ' ') ++token; if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); token += 3; width = strtol(token, NULL, 10); *x = width; *y = height; *comp = 3; if (req_comp == 0) req_comp = 3; // Read data hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); // Load image data // image data is stored as some number of sca if( width < 8 || width >= 32768) { // Read flat data for (j=0; j < height; ++j) { for (i=0; i < width; ++i) { stbi_uc rgbe[4]; main_decode_loop: getn(s, rgbe, 4); hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); } } } else { // Read RLE-encoded data scanline = NULL; for (j = 0; j < height; ++j) { c1 = get8(s); c2 = get8(s); len = get8(s); if (c1 != 2 || c2 != 2 || (len & 0x80)) { // not run-length encoded, so we have to actually use THIS data as a decoded // pixel (note this can't be a valid pixel--one of RGB must be >= 128) stbi_uc rgbe[4] = { c1,c2,len, get8(s) }; hdr_convert(hdr_data, rgbe, req_comp); i = 1; j = 0; free(scanline); goto main_decode_loop; // yes, this is fucking insane; blame the fucking insane format } len <<= 8; len |= get8(s); if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); } if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); for (k = 0; k < 4; ++k) { i = 0; while (i < width) { count = get8(s); if (count > 128) { // Run value = get8(s); count -= 128; for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = get8(s); } } } for (i=0; i < width; ++i) hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } free(scanline); } return hdr_data; } static stbi_uc *hdr_load_rgbe(stbi *s, int *x, int *y, int *comp, int req_comp) { char buffer[HDR_BUFLEN]; char *token; int valid = 0; int width, height; stbi_uc *scanline; stbi_uc *rgbe_data; int len; unsigned char count, value; int i, j, k, c1,c2, z; // Check identifier if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) return epuc("not HDR", "Corrupt HDR image"); // Parse header while(1) { token = hdr_gettoken(s,buffer); if (token[0] == 0) break; if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; } if (!valid) return epuc("unsupported format", "Unsupported HDR format"); // Parse width and height // can't use sscanf() if we're not using stdio! token = hdr_gettoken(s,buffer); if (strncmp(token, "-Y ", 3)) return epuc("unsupported data layout", "Unsupported HDR format"); token += 3; height = strtol(token, &token, 10); while (*token == ' ') ++token; if (strncmp(token, "+X ", 3)) return epuc("unsupported data layout", "Unsupported HDR format"); token += 3; width = strtol(token, NULL, 10); *x = width; *y = height; // RGBE _MUST_ come out as 4 components *comp = 4; req_comp = 4; // Read data rgbe_data = (stbi_uc *) malloc(height * width * req_comp * sizeof(stbi_uc)); // point to the beginning scanline = rgbe_data; // Load image data // image data is stored as some number of scan lines if( width < 8 || width >= 32768) { // Read flat data for (j=0; j < height; ++j) { for (i=0; i < width; ++i) { main_decode_loop: //getn(rgbe, 4); getn(s,scanline, 4); scanline += 4; } } } else { // Read RLE-encoded data for (j = 0; j < height; ++j) { c1 = get8(s); c2 = get8(s); len = get8(s); if (c1 != 2 || c2 != 2 || (len & 0x80)) { // not run-length encoded, so we have to actually use THIS data as a decoded // pixel (note this can't be a valid pixel--one of RGB must be >= 128) scanline[0] = c1; scanline[1] = c2; scanline[2] = len; scanline[3] = get8(s); scanline += 4; i = 1; j = 0; goto main_decode_loop; // yes, this is insane; blame the insane format } len <<= 8; len |= get8(s); if (len != width) { free(rgbe_data); return epuc("invalid decoded scanline length", "corrupt HDR"); } for (k = 0; k < 4; ++k) { i = 0; while (i < width) { count = get8(s); if (count > 128) { // Run value = get8(s); count -= 128; for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = get8(s); } } } // move the scanline on scanline += 4 * width; } } return rgbe_data; } #ifndef STBI_NO_STDIO float *stbi_hdr_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s,f); return hdr_load(&s,x,y,comp,req_comp); } stbi_uc *stbi_hdr_load_rgbe_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s,f); return hdr_load_rgbe(&s,x,y,comp,req_comp); } stbi_uc *stbi_hdr_load_rgbe (char const *filename, int *x, int *y, int *comp, int req_comp) { FILE *f = fopen(filename, "rb"); unsigned char *result; if (!f) return epuc("can't fopen", "Unable to open file"); result = stbi_hdr_load_rgbe_file(f,x,y,comp,req_comp); fclose(f); return result; } #endif float *stbi_hdr_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s,buffer, len); return hdr_load(&s,x,y,comp,req_comp); } stbi_uc *stbi_hdr_load_rgbe_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s,buffer, len); return hdr_load_rgbe(&s,x,y,comp,req_comp); } #endif // STBI_NO_HDR /////////////////////// write image /////////////////////// #ifndef STBI_NO_WRITE static void write8(FILE *f, int x) { uint8 z = (uint8) x; fwrite(&z,1,1,f); } static void writefv(FILE *f, char *fmt, va_list v) { while (*fmt) { switch (*fmt++) { case ' ': break; case '1': { uint8 x = va_arg(v, int); write8(f,x); break; } case '2': { int16 x = va_arg(v, int); write8(f,x); write8(f,x>>8); break; } case '4': { int32 x = va_arg(v, int); write8(f,x); write8(f,x>>8); write8(f,x>>16); write8(f,x>>24); break; } default: assert(0); va_end(v); return; } } } static void writef(FILE *f, char *fmt, ...) { va_list v; va_start(v, fmt); writefv(f,fmt,v); va_end(v); } static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad) { uint8 bg[3] = { 255, 0, 255}, px[3]; uint32 zero = 0; int i,j,k, j_end; if (vdir < 0) j_end = -1, j = y-1; else j_end = y, j = 0; for (; j != j_end; j += vdir) { for (i=0; i < x; ++i) { uint8 *d = (uint8 *) data + (j*x+i)*comp; if (write_alpha < 0) fwrite(&d[comp-1], 1, 1, f); switch (comp) { case 1: case 2: writef(f, "111", d[0],d[0],d[0]); break; case 4: if (!write_alpha) { for (k=0; k < 3; ++k) px[k] = bg[k] + ((d[k] - bg[k]) * d[3])/255; writef(f, "111", px[1-rgb_dir],px[1],px[1+rgb_dir]); break; } /* FALLTHROUGH */ case 3: writef(f, "111", d[1-rgb_dir],d[1],d[1+rgb_dir]); break; } if (write_alpha > 0) fwrite(&d[comp-1], 1, 1, f); } fwrite(&zero,scanline_pad,1,f); } } static int outfile(char const *filename, int rgb_dir, int vdir, int x, int y, int comp, void *data, int alpha, int pad, char *fmt, ...) { FILE *f = fopen(filename, "wb"); if (f) { va_list v; va_start(v, fmt); writefv(f, fmt, v); va_end(v); write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad); fclose(f); } return f != NULL; } int stbi_write_bmp(char const *filename, int x, int y, int comp, void *data) { int pad = (-x*3) & 3; return outfile(filename,-1,-1,x,y,comp,data,0,pad, "11 4 22 4" "4 44 22 444444", 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header } int stbi_write_tga(char const *filename, int x, int y, int comp, void *data) { int has_alpha = !(comp & 1); return outfile(filename, -1,-1, x, y, comp, data, has_alpha, 0, "111 221 2222 11", 0,0,2, 0,0,0, 0,0,x,y, 24+8*has_alpha, 8*has_alpha); } // any other image formats that do interleaved rgb data? // PNG: requires adler32,crc32 -- significant amount of code // PSD: no, channels output separately // TIFF: no, stripwise-interleaved... i think #endif // STBI_NO_WRITE // add in my DDS loading support #ifndef STBI_NO_DDS #include "stbi_DDS_aug_c.h" #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/stb_image_aug.h����������������������������������������0000664�0000000�0000000�00000040317�12660066715�0023605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* stbi-1.16 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c when you control the images you're loading QUICK NOTES: Primarily of interest to game developers and other people who can avoid problematic images and only need the trivial interface JPEG baseline (no JPEG progressive, no oddball channel decimations) PNG non-interlaced BMP non-1bpp, non-RLE TGA (not sure what subset, if a subset) PSD (composited view only, no extra channels) HDR (radiance rgbE format) writes BMP,TGA (define STBI_NO_WRITE to remove code) decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code) supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) TODO: stbi_info_* history: 1.16 major bugfix - convert_format converted one too many pixels 1.15 initialize some fields for thread safety 1.14 fix threadsafe conversion bug; header-file-only version (#define STBI_HEADER_FILE_ONLY before including) 1.13 threadsafe 1.12 const qualifiers in the API 1.11 Support installable IDCT, colorspace conversion routines 1.10 Fixes for 64-bit (don't use "unsigned long") optimized upsampling by Fabian "ryg" Giesen 1.09 Fix format-conversion for PSD code (bad global variables!) 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz 1.07 attempt to fix C++ warning/errors again 1.06 attempt to fix C++ warning/errors again 1.05 fix TGA loading to return correct *comp and use good luminance calc 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR 1.02 support for (subset of) HDR files, float interface for preferred access to them 1.01 fix bug: possible bug in handling right-side up bmps... not sure fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all 1.00 interface to zlib that skips zlib header 0.99 correct handling of alpha in palette 0.98 TGA loader by lonesock; dynamically add loaders (untested) 0.97 jpeg errors on too large a file; also catch another malloc failure 0.96 fix detection of invalid v value - particleman@mollyrocket forum 0.95 during header scan, seek to markers in case of padding 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same 0.93 handle jpegtran output; verbose errors 0.92 read 4,8,16,24,32-bit BMP files of several formats 0.91 output 24-bit Windows 3.0 BMP files 0.90 fix a few more warnings; bump version number to approach 1.0 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd 0.60 fix compiling as c++ 0.59 fix warnings: merge Dave Moore's -Wall fixes 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available 0.56 fix bug: zlib uncompressed mode len vs. nlen 0.55 fix bug: restart_interval not initialized to 0 0.54 allow NULL for 'int *comp' 0.53 fix bug in png 3->4; speedup png decoding 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments 0.51 obey req_comp requests, 1-component jpegs return as 1-component, on 'test' only check type, not whether we support this variant */ #ifndef HEADER_STB_IMAGE_AUGMENTED #define HEADER_STB_IMAGE_AUGMENTED //// begin header file //////////////////////////////////////////////////// // // Limitations: // - no progressive/interlaced support (jpeg, png) // - 8-bit samples only (jpeg, png) // - not threadsafe // - channel subsampling of at most 2 in each dimension (jpeg) // - no delayed line count (jpeg) -- IJG doesn't support either // // Basic usage (see HDR discussion below): // int x,y,n; // unsigned char *data = stbi_load(filename, &x, &y, &n, 0); // // ... process data if not NULL ... // // ... x = width, y = height, n = # 8-bit components per pixel ... // // ... replace '0' with '1'..'4' to force that many components per pixel // stbi_image_free(data) // // Standard parameters: // int *x -- outputs image width in pixels // int *y -- outputs image height in pixels // int *comp -- outputs # of image components in image file // int req_comp -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points // to the pixel data. The pixel data consists of *y scanlines of *x pixels, // with each pixel consisting of N interleaved 8-bit components; the first // pixel pointed to is top-left-most in the image. There is no padding between // image scanlines or between pixels, regardless of format. The number of // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. // If req_comp is non-zero, *comp has the number of components that _would_ // have been output otherwise. E.g. if you set req_comp to 4, you will always // get RGBA output, but you can check *comp to easily see if it's opaque. // // An output image with N components has the following components interleaved // in this order in each pixel: // // N=#comp components // 1 grey // 2 grey, alpha // 3 red, green, blue // 4 red, green, blue, alpha // // If image loading fails for any reason, the return value will be NULL, // and *x, *y, *comp will be unchanged. The function stbi_failure_reason() // can be queried for an extremely brief, end-user unfriendly explanation // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly // more user-friendly ones. // // Paletted PNG and BMP images are automatically depalettized. // // // =========================================================================== // // HDR image support (disable by defining STBI_NO_HDR) // // stb_image now supports loading HDR images in general, and currently // the Radiance .HDR file format, although the support is provided // generically. You can still load any file through the existing interface; // if you attempt to load an HDR file, it will be automatically remapped to // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; // both of these constants can be reconfigured through this interface: // // stbi_hdr_to_ldr_gamma(2.2f); // stbi_hdr_to_ldr_scale(1.0f); // // (note, do not use _inverse_ constants; stbi_image will invert them // appropriately). // // Additionally, there is a new, parallel interface for loading files as // (linear) floats to preserve the full dynamic range: // // float *data = stbi_loadf(filename, &x, &y, &n, 0); // // If you load LDR images through this interface, those images will // be promoted to floating point values, run through the inverse of // constants corresponding to the above: // // stbi_ldr_to_hdr_scale(1.0f); // stbi_ldr_to_hdr_gamma(2.2f); // // Finally, given a filename (or an open file or memory block--see header // file for details) containing image data, you can query for the "most // appropriate" interface to use (that is, whether the image is HDR or // not), using: // // stbi_is_hdr(char *filename); #ifndef STBI_NO_STDIO #include <stdio.h> #endif #define STBI_VERSION 1 enum { STBI_default = 0, // only used for req_comp STBI_grey = 1, STBI_grey_alpha = 2, STBI_rgb = 3, STBI_rgb_alpha = 4, }; typedef unsigned char stbi_uc; #ifdef __cplusplus extern "C" { #endif // WRITING API #if !defined(STBI_NO_WRITE) && !defined(STBI_NO_STDIO) // write a BMP/TGA file given tightly packed 'comp' channels (no padding, nor bmp-stride-padding) // (you must include the appropriate extension in the filename). // returns TRUE on success, FALSE if couldn't open file, error writing file extern int stbi_write_bmp (char const *filename, int x, int y, int comp, void *data); extern int stbi_write_tga (char const *filename, int x, int y, int comp, void *data); #endif // PRIMARY API - works on images of any type // load image by filename, open file, or memory buffer #ifndef STBI_NO_STDIO extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); #endif extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); // for stbi_load_from_file, file pointer is left pointing immediately after image #ifndef STBI_NO_HDR #ifndef STBI_NO_STDIO extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); extern void stbi_hdr_to_ldr_gamma(float gamma); extern void stbi_hdr_to_ldr_scale(float scale); extern void stbi_ldr_to_hdr_gamma(float gamma); extern void stbi_ldr_to_hdr_scale(float scale); #endif // STBI_NO_HDR // get a VERY brief reason for failure // NOT THREADSAFE extern char *stbi_failure_reason (void); // free the loaded image -- this is just free() extern void stbi_image_free (void *retval_from_stbi_load); // get image dimensions & components without fully decoding extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); #ifndef STBI_NO_STDIO extern int stbi_info (char const *filename, int *x, int *y, int *comp); extern int stbi_is_hdr (char const *filename); extern int stbi_is_hdr_from_file(FILE *f); #endif // ZLIB client - used by PNG, available for other purposes extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); // TYPE-SPECIFIC ACCESS // is it a jpeg? extern int stbi_jpeg_test_memory (stbi_uc const *buffer, int len); extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); #ifndef STBI_NO_STDIO extern stbi_uc *stbi_jpeg_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern int stbi_jpeg_test_file (FILE *f); extern stbi_uc *stbi_jpeg_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp); extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp); #endif // is it a png? extern int stbi_png_test_memory (stbi_uc const *buffer, int len); extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp); #ifndef STBI_NO_STDIO extern stbi_uc *stbi_png_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern int stbi_png_info (char const *filename, int *x, int *y, int *comp); extern int stbi_png_test_file (FILE *f); extern stbi_uc *stbi_png_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp); #endif // is it a bmp? extern int stbi_bmp_test_memory (stbi_uc const *buffer, int len); extern stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern int stbi_bmp_test_file (FILE *f); extern stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif // is it a tga? extern int stbi_tga_test_memory (stbi_uc const *buffer, int len); extern stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern int stbi_tga_test_file (FILE *f); extern stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif // is it a psd? extern int stbi_psd_test_memory (stbi_uc const *buffer, int len); extern stbi_uc *stbi_psd_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern int stbi_psd_test_file (FILE *f); extern stbi_uc *stbi_psd_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif // is it an hdr? extern int stbi_hdr_test_memory (stbi_uc const *buffer, int len); extern float * stbi_hdr_load (char const *filename, int *x, int *y, int *comp, int req_comp); extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_hdr_load_rgbe (char const *filename, int *x, int *y, int *comp, int req_comp); extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern int stbi_hdr_test_file (FILE *f); extern float * stbi_hdr_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_hdr_load_rgbe_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif // define new loaders typedef struct { int (*test_memory)(stbi_uc const *buffer, int len); stbi_uc * (*load_from_memory)(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO int (*test_file)(FILE *f); stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp); #endif } stbi_loader; // register a loader by filling out the above structure (you must defined ALL functions) // returns 1 if added or already added, 0 if not added (too many loaders) // NOT THREADSAFE extern int stbi_register_loader(stbi_loader *loader); // define faster low-level operations (typically SIMD support) #if STBI_SIMD typedef void (*stbi_idct_8x8)(uint8 *out, int out_stride, short data[64], unsigned short *dequantize); // compute an integer IDCT on "input" // input[x] = data[x] * dequantize[x] // write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' // CLAMP results to 0..255 typedef void (*stbi_YCbCr_to_RGB_run)(uint8 *output, uint8 const *y, uint8 const *cb, uint8 const *cr, int count, int step); // compute a conversion from YCbCr to RGB // 'count' pixels // write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B // y: Y input channel // cb: Cb input channel; scale/biased to be 0..255 // cr: Cr input channel; scale/biased to be 0..255 extern void stbi_install_idct(stbi_idct_8x8 func); extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); #endif // STBI_SIMD #ifdef __cplusplus } #endif // // //// end header file ///////////////////////////////////////////////////// #endif // STBI_INCLUDE_STB_IMAGE_H �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/stbi_DDS_aug.h�����������������������������������������0000664�0000000�0000000�00000001411�12660066715�0023276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* adding DDS loading support to stbi */ #ifndef HEADER_STB_IMAGE_DDS_AUGMENTATION #define HEADER_STB_IMAGE_DDS_AUGMENTATION // is it a DDS file? extern int stbi_dds_test_memory (stbi_uc const *buffer, int len); extern stbi_uc *stbi_dds_load (char *filename, int *x, int *y, int *comp, int req_comp); extern stbi_uc *stbi_dds_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO extern int stbi_dds_test_file (FILE *f); extern stbi_uc *stbi_dds_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif // // //// end header file ///////////////////////////////////////////////////// #endif // HEADER_STB_IMAGE_DDS_AUGMENTATION �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/SOIL/stbi_DDS_aug_c.h���������������������������������������0000664�0000000�0000000�00000035130�12660066715�0023605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /// DDS file support, does decoding, _not_ direct uploading /// (use SOIL for that ;-) /// A bunch of DirectDraw Surface structures and flags typedef struct { unsigned int dwMagic; unsigned int dwSize; unsigned int dwFlags; unsigned int dwHeight; unsigned int dwWidth; unsigned int dwPitchOrLinearSize; unsigned int dwDepth; unsigned int dwMipMapCount; unsigned int dwReserved1[ 11 ]; // DDPIXELFORMAT struct { unsigned int dwSize; unsigned int dwFlags; unsigned int dwFourCC; unsigned int dwRGBBitCount; unsigned int dwRBitMask; unsigned int dwGBitMask; unsigned int dwBBitMask; unsigned int dwAlphaBitMask; } sPixelFormat; // DDCAPS2 struct { unsigned int dwCaps1; unsigned int dwCaps2; unsigned int dwDDSX; unsigned int dwReserved; } sCaps; unsigned int dwReserved2; } DDS_header ; // the following constants were copied directly off the MSDN website // The dwFlags member of the original DDSURFACEDESC2 structure // can be set to one or more of the following values. #define DDSD_CAPS 0x00000001 #define DDSD_HEIGHT 0x00000002 #define DDSD_WIDTH 0x00000004 #define DDSD_PITCH 0x00000008 #define DDSD_PIXELFORMAT 0x00001000 #define DDSD_MIPMAPCOUNT 0x00020000 #define DDSD_LINEARSIZE 0x00080000 #define DDSD_DEPTH 0x00800000 // DirectDraw Pixel Format #define DDPF_ALPHAPIXELS 0x00000001 #define DDPF_FOURCC 0x00000004 #define DDPF_RGB 0x00000040 // The dwCaps1 member of the DDSCAPS2 structure can be // set to one or more of the following values. #define DDSCAPS_COMPLEX 0x00000008 #define DDSCAPS_TEXTURE 0x00001000 #define DDSCAPS_MIPMAP 0x00400000 // The dwCaps2 member of the DDSCAPS2 structure can be // set to one or more of the following values. #define DDSCAPS2_CUBEMAP 0x00000200 #define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 #define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 #define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 #define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 #define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 #define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 #define DDSCAPS2_VOLUME 0x00200000 static int dds_test(stbi *s) { // check the magic number if (get8(s) != 'D') return 0; if (get8(s) != 'D') return 0; if (get8(s) != 'S') return 0; if (get8(s) != ' ') return 0; // check header size if (get32le(s) != 124) return 0; return 1; } #ifndef STBI_NO_STDIO int stbi_dds_test_file (FILE *f) { stbi s; int r,n = ftell(f); start_file(&s,f); r = dds_test(&s); fseek(f,n,SEEK_SET); return r; } #endif int stbi_dds_test_memory (stbi_uc const *buffer, int len) { stbi s; start_mem(&s,buffer, len); return dds_test(&s); } // helper functions int stbi_convert_bit_range( int c, int from_bits, int to_bits ) { int b = (1 << (from_bits - 1)) + c * ((1 << to_bits) - 1); return (b + (b >> from_bits)) >> from_bits; } void stbi_rgb_888_from_565( unsigned int c, int *r, int *g, int *b ) { *r = stbi_convert_bit_range( (c >> 11) & 31, 5, 8 ); *g = stbi_convert_bit_range( (c >> 05) & 63, 6, 8 ); *b = stbi_convert_bit_range( (c >> 00) & 31, 5, 8 ); } void stbi_decode_DXT1_block( unsigned char uncompressed[16*4], unsigned char compressed[8] ) { int next_bit = 4*8; int i, r, g, b; int c0, c1; unsigned char decode_colors[4*4]; // find the 2 primary colors c0 = compressed[0] + (compressed[1] << 8); c1 = compressed[2] + (compressed[3] << 8); stbi_rgb_888_from_565( c0, &r, &g, &b ); decode_colors[0] = r; decode_colors[1] = g; decode_colors[2] = b; decode_colors[3] = 255; stbi_rgb_888_from_565( c1, &r, &g, &b ); decode_colors[4] = r; decode_colors[5] = g; decode_colors[6] = b; decode_colors[7] = 255; if( c0 > c1 ) { // no alpha, 2 interpolated colors decode_colors[8] = (2*decode_colors[0] + decode_colors[4]) / 3; decode_colors[9] = (2*decode_colors[1] + decode_colors[5]) / 3; decode_colors[10] = (2*decode_colors[2] + decode_colors[6]) / 3; decode_colors[11] = 255; decode_colors[12] = (decode_colors[0] + 2*decode_colors[4]) / 3; decode_colors[13] = (decode_colors[1] + 2*decode_colors[5]) / 3; decode_colors[14] = (decode_colors[2] + 2*decode_colors[6]) / 3; decode_colors[15] = 255; } else { // 1 interpolated color, alpha decode_colors[8] = (decode_colors[0] + decode_colors[4]) / 2; decode_colors[9] = (decode_colors[1] + decode_colors[5]) / 2; decode_colors[10] = (decode_colors[2] + decode_colors[6]) / 2; decode_colors[11] = 255; decode_colors[12] = 0; decode_colors[13] = 0; decode_colors[14] = 0; decode_colors[15] = 0; } // decode the block for( i = 0; i < 16*4; i += 4 ) { int idx = ((compressed[next_bit>>3] >> (next_bit & 7)) & 3) * 4; next_bit += 2; uncompressed[i+0] = decode_colors[idx+0]; uncompressed[i+1] = decode_colors[idx+1]; uncompressed[i+2] = decode_colors[idx+2]; uncompressed[i+3] = decode_colors[idx+3]; } // done } void stbi_decode_DXT23_alpha_block( unsigned char uncompressed[16*4], unsigned char compressed[8] ) { int i, next_bit = 0; // each alpha value gets 4 bits for( i = 3; i < 16*4; i += 4 ) { uncompressed[i] = stbi_convert_bit_range( (compressed[next_bit>>3] >> (next_bit&7)) & 15, 4, 8 ); next_bit += 4; } } void stbi_decode_DXT45_alpha_block( unsigned char uncompressed[16*4], unsigned char compressed[8] ) { int i, next_bit = 8*2; unsigned char decode_alpha[8]; // each alpha value gets 3 bits, and the 1st 2 bytes are the range decode_alpha[0] = compressed[0]; decode_alpha[1] = compressed[1]; if( decode_alpha[0] > decode_alpha[1] ) { // 6 step intermediate decode_alpha[2] = (6*decode_alpha[0] + 1*decode_alpha[1]) / 7; decode_alpha[3] = (5*decode_alpha[0] + 2*decode_alpha[1]) / 7; decode_alpha[4] = (4*decode_alpha[0] + 3*decode_alpha[1]) / 7; decode_alpha[5] = (3*decode_alpha[0] + 4*decode_alpha[1]) / 7; decode_alpha[6] = (2*decode_alpha[0] + 5*decode_alpha[1]) / 7; decode_alpha[7] = (1*decode_alpha[0] + 6*decode_alpha[1]) / 7; } else { // 4 step intermediate, pluss full and none decode_alpha[2] = (4*decode_alpha[0] + 1*decode_alpha[1]) / 5; decode_alpha[3] = (3*decode_alpha[0] + 2*decode_alpha[1]) / 5; decode_alpha[4] = (2*decode_alpha[0] + 3*decode_alpha[1]) / 5; decode_alpha[5] = (1*decode_alpha[0] + 4*decode_alpha[1]) / 5; decode_alpha[6] = 0; decode_alpha[7] = 255; } for( i = 3; i < 16*4; i += 4 ) { int idx = 0, bit; bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; idx += bit << 0; ++next_bit; bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; idx += bit << 1; ++next_bit; bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; idx += bit << 2; ++next_bit; uncompressed[i] = decode_alpha[idx & 7]; } // done } void stbi_decode_DXT_color_block( unsigned char uncompressed[16*4], unsigned char compressed[8] ) { int next_bit = 4*8; int i, r, g, b; int c0, c1; unsigned char decode_colors[4*3]; // find the 2 primary colors c0 = compressed[0] + (compressed[1] << 8); c1 = compressed[2] + (compressed[3] << 8); stbi_rgb_888_from_565( c0, &r, &g, &b ); decode_colors[0] = r; decode_colors[1] = g; decode_colors[2] = b; stbi_rgb_888_from_565( c1, &r, &g, &b ); decode_colors[3] = r; decode_colors[4] = g; decode_colors[5] = b; // Like DXT1, but no choicees: // no alpha, 2 interpolated colors decode_colors[6] = (2*decode_colors[0] + decode_colors[3]) / 3; decode_colors[7] = (2*decode_colors[1] + decode_colors[4]) / 3; decode_colors[8] = (2*decode_colors[2] + decode_colors[5]) / 3; decode_colors[9] = (decode_colors[0] + 2*decode_colors[3]) / 3; decode_colors[10] = (decode_colors[1] + 2*decode_colors[4]) / 3; decode_colors[11] = (decode_colors[2] + 2*decode_colors[5]) / 3; // decode the block for( i = 0; i < 16*4; i += 4 ) { int idx = ((compressed[next_bit>>3] >> (next_bit & 7)) & 3) * 3; next_bit += 2; uncompressed[i+0] = decode_colors[idx+0]; uncompressed[i+1] = decode_colors[idx+1]; uncompressed[i+2] = decode_colors[idx+2]; } // done } static stbi_uc *dds_load(stbi *s, int *x, int *y, int *comp, int req_comp) { // all variables go up front stbi_uc *dds_data = NULL; stbi_uc block[16*4]; stbi_uc compressed[8]; int flags, DXT_family; int has_alpha, has_mipmap; int is_compressed, cubemap_faces; int block_pitch, num_blocks; DDS_header header; int i, sz, cf; // load the header if( sizeof( DDS_header ) != 128 ) { return NULL; } getn( s, (stbi_uc*)(&header), 128 ); // and do some checking if( header.dwMagic != (('D' << 0) | ('D' << 8) | ('S' << 16) | (' ' << 24)) ) return NULL; if( header.dwSize != 124 ) return NULL; flags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; if( (header.dwFlags & flags) != flags ) return NULL; /* According to the MSDN spec, the dwFlags should contain DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if uncompressed. Some DDS writers do not conform to the spec, so I need to make my reader more tolerant */ if( header.sPixelFormat.dwSize != 32 ) return NULL; flags = DDPF_FOURCC | DDPF_RGB; if( (header.sPixelFormat.dwFlags & flags) == 0 ) return NULL; if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) return NULL; // get the image data s->img_x = header.dwWidth; s->img_y = header.dwHeight; s->img_n = 4; is_compressed = (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC; has_alpha = (header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS) / DDPF_ALPHAPIXELS; has_mipmap = (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1); cubemap_faces = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP; /* I need cubemaps to have square faces */ cubemap_faces &= (s->img_x == s->img_y); cubemap_faces *= 5; cubemap_faces += 1; block_pitch = (s->img_x+3) >> 2; num_blocks = block_pitch * ((s->img_y+3) >> 2); /* let the user know what's going on */ *x = s->img_x; *y = s->img_y; *comp = s->img_n; /* is this uncompressed? */ if( is_compressed ) { /* compressed */ // note: header.sPixelFormat.dwFourCC is something like (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24)) DXT_family = 1 + (header.sPixelFormat.dwFourCC >> 24) - '1'; if( (DXT_family < 1) || (DXT_family > 5) ) return NULL; /* check the expected size...oops, nevermind... those non-compliant writers leave dwPitchOrLinearSize == 0 */ // passed all the tests, get the RAM for decoding sz = (s->img_x)*(s->img_y)*4*cubemap_faces; dds_data = (unsigned char*)malloc( sz ); /* do this once for each face */ for( cf = 0; cf < cubemap_faces; ++ cf ) { // now read and decode all the blocks for( i = 0; i < num_blocks; ++i ) { // where are we? int bx, by, bw=4, bh=4; int ref_x = 4 * (i % block_pitch); int ref_y = 4 * (i / block_pitch); // get the next block's worth of compressed data, and decompress it if( DXT_family == 1 ) { // DXT1 getn( s, compressed, 8 ); stbi_decode_DXT1_block( block, compressed ); } else if( DXT_family < 4 ) { // DXT2/3 getn( s, compressed, 8 ); stbi_decode_DXT23_alpha_block ( block, compressed ); getn( s, compressed, 8 ); stbi_decode_DXT_color_block ( block, compressed ); } else { // DXT4/5 getn( s, compressed, 8 ); stbi_decode_DXT45_alpha_block ( block, compressed ); getn( s, compressed, 8 ); stbi_decode_DXT_color_block ( block, compressed ); } // is this a partial block? if( ref_x + 4 > s->img_x ) { bw = s->img_x - ref_x; } if( ref_y + 4 > s->img_y ) { bh = s->img_y - ref_y; } // now drop our decompressed data into the buffer for( by = 0; by < bh; ++by ) { int idx = 4*((ref_y+by+cf*s->img_x)*s->img_x + ref_x); for( bx = 0; bx < bw*4; ++bx ) { dds_data[idx+bx] = block[by*16+bx]; } } } /* done reading and decoding the main image... skip MIPmaps if present */ if( has_mipmap ) { int block_size = 16; if( DXT_family == 1 ) { block_size = 8; } for( i = 1; i < header.dwMipMapCount; ++i ) { int mx = s->img_x >> (i + 2); int my = s->img_y >> (i + 2); if( mx < 1 ) { mx = 1; } if( my < 1 ) { my = 1; } skip( s, mx*my*block_size ); } } }/* per cubemap face */ } else { /* uncompressed */ DXT_family = 0; s->img_n = 3; if( has_alpha ) { s->img_n = 4; } *comp = s->img_n; sz = s->img_x*s->img_y*s->img_n*cubemap_faces; dds_data = (unsigned char*)malloc( sz ); /* do this once for each face */ for( cf = 0; cf < cubemap_faces; ++ cf ) { /* read the main image for this face */ getn( s, &dds_data[cf*s->img_x*s->img_y*s->img_n], s->img_x*s->img_y*s->img_n ); /* done reading and decoding the main image... skip MIPmaps if present */ if( has_mipmap ) { for( i = 1; i < header.dwMipMapCount; ++i ) { int mx = s->img_x >> i; int my = s->img_y >> i; if( mx < 1 ) { mx = 1; } if( my < 1 ) { my = 1; } skip( s, mx*my*s->img_n ); } } } /* data was BGR, I need it RGB */ for( i = 0; i < sz; i += s->img_n ) { unsigned char temp = dds_data[i]; dds_data[i] = dds_data[i+2]; dds_data[i+2] = temp; } } /* finished decompressing into RGBA, adjust the y size if we have a cubemap note: sz is already up to date */ s->img_y *= cubemap_faces; *y = s->img_y; // did the user want something else, or // see if all the alpha values are 255 (i.e. no transparency) has_alpha = 0; if( s->img_n == 4) { for( i = 3; (i < sz) && (has_alpha == 0); i += 4 ) { has_alpha |= (dds_data[i] < 255); } } if( (req_comp <= 4) && (req_comp >= 1) ) { // user has some requirements, meet them if( req_comp != s->img_n ) { dds_data = convert_format( dds_data, s->img_n, req_comp, s->img_x, s->img_y ); *comp = s->img_n; } } else { // user had no requirements, only drop to RGB is no alpha if( (has_alpha == 0) && (s->img_n == 4) ) { dds_data = convert_format( dds_data, 4, 3, s->img_x, s->img_y ); *comp = 3; } } // OK, done return dds_data; } #ifndef STBI_NO_STDIO stbi_uc *stbi_dds_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) { stbi s; start_file(&s,f); return dds_load(&s,x,y,comp,req_comp); } stbi_uc *stbi_dds_load (char *filename, int *x, int *y, int *comp, int req_comp) { stbi_uc *data; FILE *f = fopen(filename, "rb"); if (!f) return NULL; data = stbi_dds_load_from_file(f,x,y,comp,req_comp); fclose(f); return data; } #endif stbi_uc *stbi_dds_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi s; start_mem(&s,buffer, len); return dds_load(&s,x,y,comp,req_comp); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Shader.cpp��������������������������������������������������0000664�0000000�0000000�00000000211�12660066715�0021777�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Shader.cpp * * Created on: Jun 29, 2008 * Author: pete */ #include "Shader.hpp" Shader::Shader() : enabled(false) {} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Shader.hpp��������������������������������������������������0000664�0000000�0000000�00000000524�12660066715�0022013�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Shader.hpp * * Created on: Jun 29, 2008 * Author: pete */ #ifndef SHADER_HPP_ #define SHADER_HPP_ #include <string> #include <map> #include "UserTexture.hpp" class Shader { public: std::map<std::string, UserTexture*> textures; bool enabled; std::string programSource; Shader(); }; #endif /* SHADER_HPP_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/ShaderEngine.cpp��������������������������������������������0000664�0000000�0000000�00000055242�12660066715�0023143�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * ShaderEngine.cpp * * Created on: Jul 18, 2008 * Author: pete */ #include <fstream> #include "PerlinNoise.hpp" #include "ShaderEngine.hpp" #include "BeatDetect.hpp" ShaderEngine::ShaderEngine() { #ifdef USE_CG SetupCg(); #endif } ShaderEngine::~ShaderEngine() { // TODO Auto-generated destructor stub } #ifdef USE_CG void ShaderEngine::setParams(const int texsize, const unsigned int texId, const float aspect, BeatDetect *beatDetect, TextureManager *textureManager) { mainTextureId = texId; this->beatDetect = beatDetect; this->textureManager = textureManager; this->aspect = aspect; this->texsize = texsize; textureManager->setTexture("main", texId, texsize, texsize); glGenTextures(1, &blur1_tex); glBindTexture(GL_TEXTURE_2D, blur1_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texsize/2, texsize/2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glGenTextures(1, &blur2_tex); glBindTexture(GL_TEXTURE_2D, blur2_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texsize / 4, texsize / 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glGenTextures(1, &blur3_tex); glBindTexture(GL_TEXTURE_2D, blur3_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texsize / 8, texsize / 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); blur1_enabled = false; blur2_enabled = false; blur3_enabled = false; //std::cout << "Generating Noise Textures" << std::endl; PerlinNoise noise; glGenTextures(1, &noise_texture_lq_lite); glBindTexture(GL_TEXTURE_2D, noise_texture_lq_lite); glTexImage2D(GL_TEXTURE_2D, 0, 4, 32, 32, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_lq_lite); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noise_lq_lite", noise_texture_lq_lite, 32, 32); glGenTextures(1, &noise_texture_lq); glBindTexture(GL_TEXTURE_2D, noise_texture_lq); glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_lq); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noise_lq", noise_texture_lq, 256, 256); glGenTextures(1, &noise_texture_mq); glBindTexture(GL_TEXTURE_2D, noise_texture_mq); glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_mq); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noise_mq", noise_texture_mq, 256, 256); glGenTextures(1, &noise_texture_hq); glBindTexture(GL_TEXTURE_2D, noise_texture_hq); glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_hq); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noise_hq", noise_texture_hq, 256, 256); glGenTextures(1, &noise_texture_perlin); glBindTexture(GL_TEXTURE_2D, noise_texture_perlin); glTexImage2D(GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_LUMINANCE, GL_FLOAT, noise.noise_perlin); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noise_perlin", noise_texture_perlin, 512, 512); /* glGenTextures( 1, &noise_texture_lq_vol ); glBindTexture( GL_TEXTURE_3D, noise_texture_lq_vol ); glTexImage3D(GL_TEXTURE_3D,0,4,32,32,32,0,GL_LUMINANCE,GL_FLOAT,noise.noise_lq_vol); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noisevol_lq", noise_texture_lq_vol, 256, 256); glGenTextures( 1, &noise_texture_hq_vol ); glBindTexture( GL_TEXTURE_3D, noise_texture_hq_vol ); glTexImage3D(GL_TEXTURE_3D,0,4,32,32,32,0,GL_LUMINANCE,GL_FLOAT,noise.noise_hq_vol); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); textureManager->setTexture("noisevol_hq", noise_texture_hq_vol, 8, 8); */ } bool ShaderEngine::LoadCgProgram(Shader &shader) { //if (p != NULL) cgDestroyProgram(p); //p = NULL; std::string program = shader.programSource; if (program.length() > 0) { size_t found = program.rfind('}'); if (found != std::string::npos) { //std::cout << "last '}' found at: " << int(found) << std::endl; program.replace(int(found), 1, "OUT.color.xyz=ret.xyz;\nOUT.color.w=1;\nreturn OUT;\n}"); } else return false; found = program.rfind('{'); if (found != std::string::npos) { //std::cout << "first '{' found at: " << int(found) << std::endl; program.replace(int(found), 1, "{\nfloat rad=getrad;\nfloat ang=getang;\n"); } else return false; found = program.find("shader_body"); if (found != std::string::npos) { //std::cout << "first 'shader_body' found at: " << int(found) << std::endl; program.replace(int(found), 11, "outtype projectm(float2 uv : TEXCOORD0)\n"); } else return false; shader.textures.clear(); found = 0; found = program.find("sampler_", found); while (found != std::string::npos) { found += 8; size_t end = program.find_first_of(" ;,\n\r)", found); if (end != std::string::npos) { std::string sampler = program.substr((int) found, (int) end - found); UserTexture* texture = new UserTexture(sampler); texture->texID = textureManager->getTexture(texture->name); if (texture->texID != 0) { texture->width = textureManager->getTextureWidth(texture->name); texture->height = textureManager->getTextureHeight(texture->name); } else { if (sampler.substr(0, 4) == "rand") { std::string random_name = textureManager->getRandomTextureName(texture->name); if (random_name.size() > 0) { texture->texID = textureManager->getTexture(random_name); texture->width = textureManager->getTextureWidth(random_name); texture->height = textureManager->getTextureHeight(random_name); } } else { std::string extensions[6]; extensions[0] = ".jpg"; extensions[1] = ".dds"; extensions[2] = ".png"; extensions[3] = ".tga"; extensions[4] = ".bmp"; extensions[5] = ".dib"; for (int x = 0; x < 6; x++) { std::string filename = texture->name + extensions[x]; texture->texID = textureManager->getTexture(filename); if (texture->texID != 0) { texture->width = textureManager->getTextureWidth(filename); texture->height = textureManager->getTextureHeight(filename); break; } } } } if (texture->texID != 0 && shader.textures.find(texture->qname) == shader.textures.end()) shader.textures[texture->qname] = texture; else delete (texture); } found = program.find("sampler_", found); } textureManager->clearRandomTextures(); found = 0; found = program.find("texsize_", found); while (found != std::string::npos) { found += 8; size_t end = program.find_first_of(" ;.,\n\r)", found); if (end != std::string::npos) { std::string tex = program.substr((int) found, (int) end - found); if (shader.textures.find(tex) != shader.textures.end()) { UserTexture* texture = shader.textures[tex]; texture->texsizeDefined = true; //std::cout << "texsize_" << tex << " found" << std::endl; } } found = program.find("texsize_", found); } found = program.find("GetBlur3"); if (found != std::string::npos) blur1_enabled = blur2_enabled = blur3_enabled = true; else { found = program.find("GetBlur2"); if (found != std::string::npos) blur1_enabled = blur2_enabled = true; else { found = program.find("GetBlur1"); if (found != std::string::npos) blur1_enabled = true; } } std::string temp; temp.append(cgTemplate); temp.append(program); //std::cout << "Cg: Compilation Results:" << std::endl << std::endl; //std::cout << program << std::endl; CGprogram p = cgCreateProgram(myCgContext, CG_SOURCE, temp.c_str(),//temp.c_str(), myCgProfile, "projectm", NULL); checkForCgCompileError("creating shader program"); if (p == NULL) return false; cgGLLoadProgram(p); if (checkForCgCompileError("loading shader program")) { p = NULL; return false; } programs[&shader] = p; return true; } else return false; } bool ShaderEngine::checkForCgCompileError(const char *situation) { CGerror error; const char *string = cgGetLastErrorString(&error); error = cgGetError(); if (error != CG_NO_ERROR) { std::cout << "Cg: Compilation Error" << std::endl; std::cout << "Cg: %" << situation << " - " << string << std::endl; if (error == CG_COMPILER_ERROR) { std::cout << "Cg: " << cgGetLastListing(myCgContext) << std::endl; } return true; } return false; } void ShaderEngine::checkForCgError(const char *situation) { CGerror error; const char *string = cgGetLastErrorString(&error); if (error != CG_NO_ERROR) { std::cout << "Cg: %" << situation << " - " << string << std::endl; if (error == CG_COMPILER_ERROR) { std::cout << "Cg: " << cgGetLastListing(myCgContext) << std::endl; } exit(1); } } void ShaderEngine::SetupCg() { std::string line; std::ifstream myfile(CMAKE_INSTALL_PREFIX "/share/projectM/shaders/projectM.cg"); if (myfile.is_open()) { while (!myfile.eof()) { std::getline(myfile, line); cgTemplate.append(line + "\n"); } myfile.close(); } else std::cout << "Unable to load shader template \"" << CMAKE_INSTALL_PREFIX "/share/projectM/shaders/projectM.cg\"" << std::endl; std::ifstream myfile2(CMAKE_INSTALL_PREFIX "/share/projectM/shaders/blur.cg"); if (myfile2.is_open()) { while (!myfile2.eof()) { std::getline(myfile2, line); blurProgram.append(line + "\n"); } myfile2.close(); } else std::cout << "Unable to load blur template" << std::endl; myCgContext = cgCreateContext(); checkForCgError("creating context"); cgGLSetDebugMode(CG_FALSE); cgSetParameterSettingMode(myCgContext, CG_DEFERRED_PARAMETER_SETTING); myCgProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT); // HACK breaks with buggy ati video drivers such as my own // -carmelo.piccione@gmail.com 7/26/2010 //cgGLSetOptimalOptions(myCgProfile); checkForCgError("selecting fragment profile"); profileName = cgGetProfileString(myCgProfile); std::cout << "Cg: Initialized profile: " << profileName << std::endl; //std::cout<< blurProgram.c_str()<<std::endl; blur1Program = cgCreateProgram(myCgContext, CG_SOURCE, blurProgram.c_str(), myCgProfile, "blur1", NULL); checkForCgCompileError("creating blur1 program"); if (blur1Program == NULL) exit(1); cgGLLoadProgram(blur1Program); checkForCgError("loading blur1 program"); blur2Program = cgCreateProgram(myCgContext, CG_SOURCE, blurProgram.c_str(), myCgProfile, "blurVert", NULL); checkForCgCompileError("creating blur2 program"); if (blur2Program == NULL) exit(1); cgGLLoadProgram(blur2Program); checkForCgError("loading blur2 program"); } void ShaderEngine::SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &context) { float slow_roam_cos[4] = { 0.5 + 0.5 * cos(context.time * 0.005), 0.5 + 0.5 * cos(context.time * 0.008), 0.5 + 0.5 * cos(context.time * 0.013), 0.5 + 0.5 * cos(context.time * 0.022) }; float roam_cos[4] = { 0.5 + 0.5 * cos(context.time * 0.3), 0.5 + 0.5 * cos(context.time * 1.3), 0.5 + 0.5 * cos(context.time * 5), 0.5 + 0.5 * cos(context.time * 20) }; float slow_roam_sin[4] = { 0.5 + 0.5 * sin(context.time * 0.005), 0.5 + 0.5 * sin(context.time * 0.008), 0.5 + 0.5 * sin(context.time * 0.013), 0.5 + 0.5 * sin(context.time * 0.022) }; float roam_sin[4] = { 0.5 + 0.5 * sin(context.time * 0.3), 0.5 + 0.5 * sin(context.time * 1.3), 0.5 + 0.5 * sin(context.time * 5), 0.5 + 0.5 * sin(context.time * 20) }; cgGLSetParameter4fv(cgGetNamedParameter(program, "slow_roam_cos"), slow_roam_cos); cgGLSetParameter4fv(cgGetNamedParameter(program, "roam_cos"), roam_cos); cgGLSetParameter4fv(cgGetNamedParameter(program, "slow_roam_sin"), slow_roam_sin); cgGLSetParameter4fv(cgGetNamedParameter(program, "roam_sin"), roam_sin); cgGLSetParameter1f(cgGetNamedParameter(program, "time"), context.time); cgGLSetParameter4f(cgGetNamedParameter(program, "rand_preset"), rand_preset[0], rand_preset[1], rand_preset[2], rand_preset[3]); cgGLSetParameter4f(cgGetNamedParameter(program, "rand_frame"), (rand() % 100) * .01, (rand() % 100) * .01, (rand()% 100) * .01, (rand() % 100) * .01); cgGLSetParameter1f(cgGetNamedParameter(program, "fps"), context.fps); cgGLSetParameter1f(cgGetNamedParameter(program, "frame"), context.frame); cgGLSetParameter1f(cgGetNamedParameter(program, "progress"), context.progress); cgGLSetParameter1f(cgGetNamedParameter(program, "blur1_min"), pipeline.blur1n); cgGLSetParameter1f(cgGetNamedParameter(program, "blur1_max"), pipeline.blur1x); cgGLSetParameter1f(cgGetNamedParameter(program, "blur2_min"), pipeline.blur2n); cgGLSetParameter1f(cgGetNamedParameter(program, "blur2_max"), pipeline.blur2x); cgGLSetParameter1f(cgGetNamedParameter(program, "blur3_min"), pipeline.blur3n); cgGLSetParameter1f(cgGetNamedParameter(program, "blur3_max"), pipeline.blur3x); cgGLSetParameter1f(cgGetNamedParameter(program, "bass"), beatDetect->bass); cgGLSetParameter1f(cgGetNamedParameter(program, "mid"), beatDetect->mid); cgGLSetParameter1f(cgGetNamedParameter(program, "treb"), beatDetect->treb); cgGLSetParameter1f(cgGetNamedParameter(program, "bass_att"), beatDetect->bass_att); cgGLSetParameter1f(cgGetNamedParameter(program, "mid_att"), beatDetect->mid_att); cgGLSetParameter1f(cgGetNamedParameter(program, "treb_att"), beatDetect->treb_att); cgGLSetParameter1f(cgGetNamedParameter(program, "vol"), beatDetect->vol); cgGLSetParameter1f(cgGetNamedParameter(program, "vol_att"), beatDetect->vol); cgGLSetParameter4f(cgGetNamedParameter(program, "texsize"), texsize, texsize, 1 / (float) texsize, 1 / (float) texsize); cgGLSetParameter4f(cgGetNamedParameter(program, "aspect"), 1 / aspect, 1, aspect, 1); if (blur1_enabled) { cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur1"), blur1_tex); cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur1")); } if (blur2_enabled) { cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur2"), blur2_tex); cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur2")); } if (blur3_enabled) { cgGLSetTextureParameter(cgGetNamedParameter(program, "sampler_blur3"), blur3_tex); cgGLEnableTextureParameter(cgGetNamedParameter(program, "sampler_blur3")); } } void ShaderEngine::SetupUserTexture(CGprogram program, const UserTexture* texture) { std::string samplerName = "sampler_" + texture->qname; CGparameter param = cgGetNamedParameter(program, samplerName.c_str()); checkForCgError("getting parameter"); cgGLSetTextureParameter(param, texture->texID); checkForCgError("setting parameter"); cgGLEnableTextureParameter(param); checkForCgError("enabling parameter"); //std::cout<<texture->texID<<" "<<samplerName<<std::endl; if (texture->texsizeDefined) { std::string texsizeName = "texsize_" + texture->name; cgGLSetParameter4f(cgGetNamedParameter(program, texsizeName.c_str()), texture->width, texture->height, 1 / (float) texture->width, 1 / (float) texture->height); checkForCgError("setting parameter texsize"); } } void ShaderEngine::SetupUserTextureState( const UserTexture* texture) { glBindTexture(GL_TEXTURE_2D, texture->texID); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->bilinear ? GL_LINEAR : GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->bilinear ? GL_LINEAR : GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap ? GL_REPEAT : GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap ? GL_REPEAT : GL_CLAMP); } void ShaderEngine::SetupCgQVariables(CGprogram program, const Pipeline &q) { cgGLSetParameter4f(cgGetNamedParameter(program, "_qa"), q.q[0], q.q[1], q.q[2], q.q[3]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qb"), q.q[4], q.q[5], q.q[6], q.q[7]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qc"), q.q[8], q.q[9], q.q[10], q.q[11]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qd"), q.q[12], q.q[13], q.q[14], q.q[15]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qe"), q.q[16], q.q[17], q.q[18], q.q[19]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qf"), q.q[20], q.q[21], q.q[22], q.q[23]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qg"), q.q[24], q.q[25], q.q[26], q.q[27]); cgGLSetParameter4f(cgGetNamedParameter(program, "_qh"), q.q[28], q.q[29], q.q[30], q.q[31]); } void ShaderEngine::setAspect(float aspect) { this->aspect = aspect; } void ShaderEngine::RenderBlurTextures(const Pipeline &pipeline, const PipelineContext &pipelineContext, const int texsize) { if (blur1_enabled || blur2_enabled || blur3_enabled) { float tex[4][2] = { { 0, 1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }; glBlendFunc(GL_ONE, GL_ZERO); glColor4f(1.0, 1.0, 1.0, 1.0f); glBindTexture(GL_TEXTURE_2D, mainTextureId); glEnable(GL_TEXTURE_2D); glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, tex); cgGLEnableProfile(myCgProfile); checkForCgError("enabling profile"); if (blur1_enabled) { cgGLSetParameter4f(cgGetNamedParameter(blur1Program, "srctexsize"), texsize/2, texsize/2, 2 / (float) texsize, 2 / (float) texsize); cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize/2 , texsize/2, 2 / (float) texsize, 2 / (float) texsize); float pointsold[4][2] = { { 0, 1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }; float points[4][2] = { { 0, 0.5 }, { 0, 0 }, { 0.5, 0 }, { 0.5, 0.5 } }; cgGLBindProgram(blur1Program); checkForCgError("binding blur1 program"); glVertexPointer(2, GL_FLOAT, 0, points); glBlendFunc(GL_ONE,GL_ZERO); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glBindTexture(GL_TEXTURE_2D, blur1_tex); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/2, texsize/2); } if (blur2_enabled) { cgGLSetParameter4f(cgGetNamedParameter(blur1Program, "srctexsize"), texsize/2, texsize/2, 2 / (float) texsize, 2 / (float) texsize); cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize/2, texsize/2, 2 / (float) texsize, 2 / (float) texsize); float points[4][2] = { { 0, 0.25 }, { 0, 0 }, { 0.25, 0 }, { 0.25, 0.25 } }; glVertexPointer(2, GL_FLOAT, 0, points); glBlendFunc(GL_ONE,GL_ZERO); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glBindTexture(GL_TEXTURE_2D, blur2_tex); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/4, texsize/4); } if (blur3_enabled) { cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize/4, texsize/4, 4 / (float) texsize, 4/ (float) texsize); cgGLSetParameter4f(cgGetNamedParameter(blur2Program, "srctexsize"), texsize / 4, texsize / 4, 4 / (float) texsize, 4 / (float) texsize); float points[4][2] = { { 0, 0.125 }, { 0, 0 }, { 0.125, 0 }, { 0.125, 0.125 } }; glVertexPointer(2, GL_FLOAT, 0, points); glBlendFunc(GL_ONE,GL_ZERO); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glBindTexture(GL_TEXTURE_2D, blur3_tex); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize/8, texsize/8); } cgGLUnbindProgram(myCgProfile); checkForCgError("unbinding blur2 program"); cgGLDisableProfile(myCgProfile); checkForCgError("disabling blur profile"); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } } void ShaderEngine::loadShader(Shader &shader) { if (shader.enabled) { cgDestroyProgram(programs[&shader]); programs.erase(&shader); } shader.enabled = LoadCgProgram(shader); } void ShaderEngine::disableShader() { if (enabled) { cgGLUnbindProgram(myCgProfile); checkForCgError("disabling fragment profile"); cgGLDisableProfile(myCgProfile); checkForCgError("disabling fragment profile"); } enabled = false; } void ShaderEngine::enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext) { enabled = false; if (shader.enabled) { for (std::map<std::string, UserTexture*>::const_iterator pos = shader.textures.begin(); pos != shader.textures.end(); ++pos) SetupUserTextureState( pos->second); CGprogram program = programs[&shader]; for (std::map<std::string, UserTexture*>::const_iterator pos = shader.textures.begin(); pos != shader.textures.end(); ++pos) SetupUserTexture(program, pos->second); cgGLEnableProfile(myCgProfile); checkForCgError("enabling warp profile"); cgGLBindProgram(program); checkForCgError("binding warp program"); SetupCgVariables(program, pipeline, pipelineContext); SetupCgQVariables(program, pipeline); enabled = true; } } void ShaderEngine::reset() { rand_preset[0] = (rand() % 100) * .01; rand_preset[1] = (rand() % 100) * .01; rand_preset[2] = (rand() % 100) * .01; rand_preset[3] = (rand() % 100) * .01; } #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/ShaderEngine.hpp��������������������������������������������0000664�0000000�0000000�00000004627�12660066715�0023151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * ShaderEngine.hpp * * Created on: Jul 18, 2008 * Author: pete */ #ifndef SHADERENGINE_HPP_ #define SHADERENGINE_HPP_ #include "../Common.hpp" #ifdef USE_GLES1 #include <GLES/gl.h> #else #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #else #include <GL/gl.h> //#include <GL/glu.h> // EDIT BY SJ #endif #endif #ifdef USE_CG #include <Cg/cg.h> /* Can't include this? Is Cg Toolkit installed! */ #include <Cg/cgGL.h> #endif #include "Pipeline.hpp" #include "PipelineContext.hpp" class ShaderEngine; #include "TextureManager.hpp" #include <cstdlib> #include <iostream> #include <map> #include "Shader.hpp" class ShaderEngine { #ifdef USE_CG unsigned int mainTextureId; int texsize; float aspect; BeatDetect *beatDetect; TextureManager *textureManager; GLuint noise_texture_lq_lite; GLuint noise_texture_lq; GLuint noise_texture_mq; GLuint noise_texture_hq; GLuint noise_texture_perlin; GLuint noise_texture_lq_vol; GLuint noise_texture_hq_vol; bool blur1_enabled; bool blur2_enabled; bool blur3_enabled; GLuint blur1_tex; GLuint blur2_tex; GLuint blur3_tex; float rand_preset[4]; CGcontext myCgContext; CGprofile myCgProfile; CGprogram blur1Program; CGprogram blur2Program; bool enabled; std::map<Shader*,CGprogram> programs; std::string cgTemplate; std::string blurProgram; bool LoadCgProgram(Shader &shader); bool checkForCgCompileError(const char *situation); void checkForCgError(const char *situation); void SetupCg(); void SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &pipelineContext); void SetupCgQVariables(CGprogram program, const Pipeline &pipeline); void SetupUserTexture(CGprogram program, const UserTexture* texture); void SetupUserTextureState(const UserTexture* texture); #endif public: ShaderEngine(); virtual ~ShaderEngine(); #ifdef USE_CG void RenderBlurTextures(const Pipeline &pipeline, const PipelineContext &pipelineContext, const int texsize); void loadShader(Shader &shader); void setParams(const int texsize, const unsigned int texId, const float aspect, BeatDetect *beatDetect, TextureManager *textureManager); void enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext); void disableShader(); void reset(); void setAspect(float aspect); std::string profileName; #endif }; #endif /* SHADERENGINE_HPP_ */ ���������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/TextureManager.cpp������������������������������������������0000664�0000000�0000000�00000013207�12660066715�0023535�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifdef LINUX #include <GL/gl.h> #endif #ifdef WIN32 #include <GL/gl.h> //#include "glew.h" #endif #ifdef __APPLE__ #include <OpenGL/gl.h> #endif #ifdef USE_DEVIL #include <IL/ilut.h> #else #include "SOIL/SOIL.h" #endif #ifdef WIN32 #include <dirent-win32/dirent.h> #endif #ifdef LINUX #include <dirent.h> #endif #ifdef MACOS #include <dirent.h> #endif #include "TextureManager.hpp" #include "../Common.hpp" #include "../IdleTextures.hpp" TextureManager::TextureManager(const std::string _presetURL): presetURL(_presetURL) { #ifdef USE_DEVIL ilInit(); iluInit(); ilutInit(); ilutRenderer(ILUT_OPENGL); #endif Preload(); loadTextureDir(); } TextureManager::~TextureManager() { Clear(); } void TextureManager::Preload() { #ifdef USE_DEVIL ILuint image; ilGenImages(1, &image); ilBindImage(image); ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) M_data, M_bytes); GLuint tex = ilutGLBindTexImage(); #else unsigned int tex = SOIL_load_OGL_texture_from_memory( M_data, M_bytes, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MULTIPLY_ALPHA // | SOIL_FLAG_COMPRESS_TO_DXT ); #endif textures["M.tga"]=tex; #ifdef USE_DEVIL ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) project_data,project_bytes); tex = ilutGLBindTexImage(); #else tex = SOIL_load_OGL_texture_from_memory( project_data, project_bytes, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MULTIPLY_ALPHA //| SOIL_FLAG_COMPRESS_TO_DXT ); #endif textures["project.tga"]=tex; #ifdef USE_DEVIL ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) headphones_data, headphones_bytes); tex = ilutGLBindTexImage(); #else tex = SOIL_load_OGL_texture_from_memory( headphones_data, headphones_bytes, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MULTIPLY_ALPHA // | SOIL_FLAG_COMPRESS_TO_DXT ); #endif textures["headphones.tga"]=tex; } void TextureManager::Clear() { for(std::map<std::string, GLuint>::const_iterator iter = textures.begin(); iter != textures.end(); iter++) { glDeleteTextures(1,&iter->second); } textures.clear(); } void TextureManager::setTexture(const std::string name, const unsigned int texId, const int width, const int height) { textures[name] = texId; widths[name] = width; heights[name] = height; } //void TextureManager::unloadTextures(const PresetOutputs::cshape_container &shapes) //{ /* for (PresetOutputs::cshape_container::const_iterator pos = shapes.begin(); pos != shapes.end(); ++pos) { if( (*pos)->enabled==1) { if ( (*pos)->textured) { std::string imageUrl = (*pos)->getImageUrl(); if (imageUrl != "") { std::string fullUrl = presetURL + "/" + imageUrl; ReleaseTexture(LoadTexture(fullUrl.c_str())); } } } } */ //} GLuint TextureManager::getTexture(const std::string filename) { std::string fullURL = presetURL + PATH_SEPARATOR + filename; return getTextureFullpath(filename,fullURL); } GLuint TextureManager::getTextureFullpath(const std::string filename, const std::string imageURL) { if (textures.find(filename)!= textures.end()) { return textures[filename]; } else { #ifdef USE_DEVIL GLuint tex = ilutGLLoadImage((char *)imageURL.c_str()); #else int width, height; unsigned int tex = SOIL_load_OGL_texture_size( imageURL.c_str(), SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, //SOIL_FLAG_POWER_OF_TWO // SOIL_FLAG_MIPMAPS SOIL_FLAG_MULTIPLY_ALPHA //| SOIL_FLAG_COMPRESS_TO_DXT //| SOIL_FLAG_DDS_LOAD_DIRECT ,&width,&height); #endif textures[filename]=tex; widths[filename]=width; heights[filename]=height; return tex; } } int TextureManager::getTextureWidth(const std::string imageURL) { return widths[imageURL]; } int TextureManager::getTextureHeight(const std::string imageURL) { return heights[imageURL]; } unsigned int TextureManager::getTextureMemorySize() { return 0; } void TextureManager::loadTextureDir() { std::string dirname = CMAKE_INSTALL_PREFIX "/share/projectM/textures"; DIR * m_dir; // Allocate a new a stream given the current directory name if ((m_dir = opendir(dirname.c_str())) == NULL) { std::cout<<"No Textures Loaded from "<<dirname<<std::endl; return; // no files loaded. m_entries is empty } struct dirent * dir_entry; while ((dir_entry = readdir(m_dir)) != NULL) { // Convert char * to friendly string std::string filename(dir_entry->d_name); if (filename.length() > 0 && filename[0] == '.') continue; // Create full path name std::string fullname = dirname + PATH_SEPARATOR + filename; unsigned int texId = getTextureFullpath(filename, fullname); if(texId != 0) { user_textures.push_back(texId); textures[filename]=texId; user_texture_names.push_back(filename); } } if (m_dir) { closedir(m_dir); m_dir = 0; } } std::string TextureManager::getRandomTextureName(std::string random_id) { if (user_texture_names.size() > 0) { std::string random_name = user_texture_names[rand() % user_texture_names.size()]; random_textures.push_back(random_id); textures[random_id] = textures[random_name]; return random_name; } else return ""; } void TextureManager::clearRandomTextures() { for (std::vector<std::string>::iterator pos = random_textures.begin(); pos != random_textures.end(); ++pos) { textures.erase(*pos); widths.erase(*pos); heights.erase(*pos); } random_textures.clear(); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/TextureManager.hpp������������������������������������������0000664�0000000�0000000�00000002166�12660066715�0023544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef TextureManager_HPP #define TextureManager_HPP #include <iostream> #include <string> #include <map> #include <vector> class TextureManager { std::string presetURL; std::map<std::string,unsigned int> textures; std::map<std::string,unsigned int> heights; std::map<std::string,unsigned int> widths; std::vector<unsigned int> user_textures; std::vector<std::string> user_texture_names; std::vector<std::string> random_textures; public: ~TextureManager(); TextureManager(std::string _presetURL); //void unloadTextures(const PresetOutputs::cshape_container &shapes); void Clear(); void Preload(); unsigned int getTexture(const std::string filenamne); unsigned int getTextureFullpath(const std::string filename, const std::string imageUrl); unsigned int getTextureMemorySize(); int getTextureWidth(const std::string imageUrl); int getTextureHeight(const std::string imageUrl); void setTexture(const std::string name, const unsigned int texId, const int width, const int height); void loadTextureDir(); std::string getRandomTextureName(std::string rand_name); void clearRandomTextures(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Transformation.hpp������������������������������������������0000664�0000000�0000000�00000003515�12660066715�0023616�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef Transformation_HPP #define Transformation_HPP #include "PerPixelMesh.hpp" #include <math.h> class Transforms { public: inline static void Zoom(PixelPoint &p, const PerPixelContext &context, float zoom, float zoomExponent) { float fZoom2 = powf( zoom, powf( zoomExponent, context.rad*2.0f - 1.0f)); float fZoom2Inv = 1.0f/fZoom2; p.x -= 0.5; p.y -= 0.5; p.x *= fZoom2Inv; p.y *= fZoom2Inv; p.x += 0.5; p.y += 0.5; } inline static void Transform(PixelPoint &p, const PerPixelContext &context, float dx, float dy) { p.x -= dx; p.y -= dy; } inline static void Scale(PixelPoint &p, const PerPixelContext &context, float sy, float sx, float cx, float cy) { p.x = (p.x - cx)/sx + cx; p.y = (p.y - cy)/sy + cy; } inline static void Rotate(PixelPoint &p, const PerPixelContext &context, float angle, float cx, float cy) { float u2 = p.x - cx; float v2 = p.y - cy; float cos_rot = cosf(angle); float sin_rot = sinf(angle); p.x = u2*cos_rot - v2*sin_rot + cx; p.y = u2*sin_rot + v2*cos_rot + cy; } inline static void Warp(PixelPoint &p, const PerPixelContext &context, float time, float speed, float scale, float warp) { float fWarpTime = time * speed; float fWarpScaleInv = 1.0f / scale; float f[4]; f[0] = 11.68f + 4.0f*cosf(fWarpTime*1.413f + 10); f[1] = 8.77f + 3.0f*cosf(fWarpTime*1.113f + 7); f[2] = 10.54f + 3.0f*cosf(fWarpTime*1.233f + 3); f[3] = 11.49f + 4.0f*cosf(fWarpTime*0.933f + 5); p.x += warp*0.0035f*sinf(fWarpTime*0.333f + fWarpScaleInv*(context.x*f[0] - context.y*f[3])); p.y += warp*0.0035f*cosf(fWarpTime*0.375f - fWarpScaleInv*(context.x*f[2] + context.y*f[1])); p.x += warp*0.0035f*cosf(fWarpTime*0.753f - fWarpScaleInv*(context.x*f[1] - context.y*f[2])); p.y += warp*0.0035f*sinf(fWarpTime*0.825f + fWarpScaleInv*(context.x*f[0] + context.y*f[3])); } }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/UserTexture.cpp���������������������������������������������0000664�0000000�0000000�00000001503�12660066715�0023075�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * UserTexture.cpp * * Created on: Jul 16, 2008 * Author: pete */ #include "UserTexture.hpp" UserTexture::UserTexture(std::string qualifiedName): qname(qualifiedName) { if (qualifiedName.substr(0,3) == "fc_") { name = qualifiedName.substr(3); bilinear = true; wrap = false; } else if (qualifiedName.substr(0,3) == "fw_") { name = qualifiedName.substr(3); bilinear = true; wrap = true; } else if (qualifiedName.substr(0,3) == "pc_") { name = qualifiedName.substr(3); bilinear = false; wrap = false; } else if (qualifiedName.substr(0,3) == "pw_") { name = qualifiedName.substr(3); bilinear = false; wrap = true; } else { name = qualifiedName; bilinear = true; wrap = true; } texsizeDefined = false; } UserTexture::~UserTexture() { // TODO Auto-generated destructor stub } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/UserTexture.hpp���������������������������������������������0000664�0000000�0000000�00000000643�12660066715�0023106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * UserTexture.hpp * * Created on: Jul 16, 2008 * Author: pete */ #ifndef USERTEXTURE_HPP_ #define USERTEXTURE_HPP_ #include <string> class UserTexture { public: bool wrap; bool bilinear; bool texsizeDefined; int width; int height; unsigned int texID; std::string qname; std::string name; UserTexture(std::string qualifiedName); virtual ~UserTexture(); }; #endif /* USERTEXTURE_HPP_ */ ���������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/VideoEcho.cpp�����������������������������������������������0000664�0000000�0000000�00000003457�12660066715�0022455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * VideoEcho.cpp * * Created on: Jun 29, 2008 * Author: pete */ #include "../Common.hpp" #ifdef USE_GLES1 #include <GLES/gl.h> #else #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #else #include <GL/gl.h> //#include <GL/glu.h> #endif #endif #include "VideoEcho.hpp" VideoEcho::VideoEcho(): a(0), zoom(1), orientation(Normal) { // TODO Auto-generated constructor stub } VideoEcho::~VideoEcho() { // TODO Auto-generated destructor stub } void VideoEcho::Draw(RenderContext &context) { glEnable(GL_TEXTURE_2D); float tex[4][2] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; float points[4][2] = {{-0.5, -0.5}, {-0.5, 0.5}, { 0.5, 0.5}, { 0.5, -0.5}}; glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2,GL_FLOAT,0,points); glTexCoordPointer(2,GL_FLOAT,0,tex); //Now Blend the Video Echo glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glMatrixMode(GL_TEXTURE); //draw video echo glColor4f(1.0, 1.0, 1.0, a * masterAlpha); glTranslatef(.5, .5, 0); glScalef(1.0/zoom, 1.0/zoom, 1); glTranslatef(-.5, -.5, 0); int flipx=1, flipy=1; switch (orientation) { case Normal: flipx=1;flipy=1;break; case FlipX: flipx=-1;flipy=1;break; case FlipY: flipx=1;flipy=-1;break; case FlipXY: flipx=-1;flipy=-1;break; default: flipx=1;flipy=1; break; } float pointsFlip[4][2] = {{-0.5*flipx, -0.5*flipy}, {-0.5*flipx, 0.5*flipy}, { 0.5*flipx, 0.5*flipy}, { 0.5*flipx, -0.5*flipy}}; glVertexPointer(2,GL_FLOAT,0,pointsFlip); glDrawArrays(GL_TRIANGLE_FAN,0,4); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/VideoEcho.hpp�����������������������������������������������0000664�0000000�0000000�00000000630�12660066715�0022450�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * VideoEcho.hpp * * Created on: Jun 29, 2008 * Author: pete */ #ifndef VIDEOECHO_HPP_ #define VIDEOECHO_HPP_ #include "Renderable.hpp" enum Orientation { Normal=0, FlipX, FlipY, FlipXY }; class VideoEcho: public RenderItem { public: VideoEcho(); virtual ~VideoEcho(); float a; float zoom; Orientation orientation; void Draw(RenderContext &context); }; #endif /* VIDEOECHO_HPP_ */ ��������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/Renderer/Waveform.cpp������������������������������������������������0000664�0000000�0000000�00000005753�12660066715�0022377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Waveform.hpp * * Created on: Jun 25, 2008 * Author: pete */ #ifdef LINUX #include <GL/gl.h> #endif #ifdef WIN32 #include <GL/gl.h> // "glew.h" #endif #ifdef __APPLE__ #include <OpenGL/gl.h> #endif #include "Waveform.hpp" #include <algorithm> #include "BeatDetect.hpp" typedef float floatPair[2]; typedef float floatTriple[3]; typedef float floatQuad[4]; Waveform::Waveform(int samples) : RenderItem(),samples(samples), points(samples), pointContext(samples) { spectrum = false; /* spectrum data or pcm data */ dots = false; /* draw wave as dots or lines */ thick = false; /* draw thicker lines */ additive = false; /* add color values together */ scaling= 1; /* scale factor of waveform */ smoothing = 0; /* smooth factor of waveform */ sep = 0; } void Waveform::Draw(RenderContext &context) { //if (samples > 2048) samples = 2048; if (additive) glBlendFunc(GL_SRC_ALPHA, GL_ONE); else glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (thick) { glLineWidth(context.texsize <= 512 ? 2 : 2*context.texsize/512); glPointSize(context.texsize <= 512 ? 2 : 2*context.texsize/512); } else glPointSize(context.texsize <= 512 ? 1 : context.texsize/512); float *value1 = new float[samples]; float *value2 = new float[samples]; context.beatDetect->pcm->getPCM( value1, samples, 0, spectrum, smoothing, 0); context.beatDetect->pcm->getPCM( value2, samples, 1, spectrum, smoothing, 0); // printf("%f\n",pcmL[0]); float mult= scaling*( spectrum ? 0.015f :1.0f); std::transform(&value1[0],&value1[samples],&value1[0],std::bind2nd(std::multiplies<float>(),mult)); std::transform(&value2[0],&value2[samples],&value2[0],std::bind2nd(std::multiplies<float>(),mult)); WaveformContext waveContext(samples, context.beatDetect); for(int x=0;x< samples;x++) { waveContext.sample = x/(float)(samples - 1); waveContext.sample_int = x; waveContext.left = value1[x]; waveContext.right = value2[x]; points[x] = PerPoint(points[x],waveContext); } floatQuad *colors = new float[samples][4]; floatPair *p = new float[samples][2]; for(int x=0;x< samples;x++) { colors[x][0] = points[x].r; colors[x][1] = points[x].g; colors[x][2] = points[x].b; colors[x][3] = points[x].a * masterAlpha; p[x][0] = points[x].x; p[x][1] = -(points[x].y-1); } glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2,GL_FLOAT,0,p); glColorPointer(4,GL_FLOAT,0,colors); if (dots) glDrawArrays(GL_POINTS,0,samples); else glDrawArrays(GL_LINE_STRIP,0,samples); glPointSize(context.texsize < 512 ? 1 : context.texsize/512); glLineWidth(context.texsize < 512 ? 1 : context.texsize/512); #ifndef USE_GLES1 glDisable(GL_LINE_STIPPLE); #endif glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // glPopMatrix(); delete[] colors; delete[] p; delete[] value1; delete[] value2; } ���������������������silverjuke-16.2.3/src/prjm/src/Renderer/Waveform.hpp������������������������������������������������0000664�0000000�0000000�00000002363�12660066715�0022376�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Waveform.hpp * * Created on: Jun 25, 2008 * Author: pete */ #ifndef WAVEFORM_HPP_ #define WAVEFORM_HPP_ #include "Renderable.hpp" #include <vector> class ColoredPoint { public: float x; float y; float r; float g; float b; float a; ColoredPoint():x(0.5),y(0.5),r(1),g(1),b(1),a(1){}; }; class WaveformContext { public: float sample; int samples; int sample_int; float left; float right; BeatDetect *music; WaveformContext(int samples, BeatDetect *music):samples(samples),music(music){}; }; class Waveform : public RenderItem { public: int samples; /* number of samples associated with this wave form. Usually powers of 2 */ bool spectrum; /* spectrum data or pcm data */ bool dots; /* draw wave as dots or lines */ bool thick; /* draw thicker lines */ bool additive; /* add color values together */ float scaling; /* scale factor of waveform */ float smoothing; /* smooth factor of waveform */ int sep; /* no idea what this is yet... */ Waveform(int samples); void Draw(RenderContext &context); private: virtual ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context)=0; std::vector<ColoredPoint> points; std::vector<float> pointContext; }; #endif /* WAVEFORM_HPP_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/TimeKeeper.cpp�������������������������������������������������������0000664�0000000�0000000�00000004143�12660066715�0021065�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef WIN32 #include <sys/time.h> #else #endif /** !WIN32 */ #include <stdlib.h> #include "TimeKeeper.hpp" #include "RandomNumberGenerators.hpp" TimeKeeper::TimeKeeper(double presetDuration, double smoothDuration, double easterEgg) { _smoothDuration = smoothDuration; _presetDuration = presetDuration; _easterEgg = easterEgg; #ifndef WIN32 gettimeofday ( &this->startTime, NULL ); #else startTime = GetTickCount(); #endif /** !WIN32 */ UpdateTimers(); } void TimeKeeper::UpdateTimers() { #ifndef WIN32 _currentTime = getTicks ( &startTime ) * 0.001; #else _currentTime = getTicks ( startTime ) * 0.001; #endif /** !WIN32 */ _presetFrameA++; _presetFrameB++; } void TimeKeeper::StartPreset() { _isSmoothing = false; _presetTimeA = _currentTime; _presetFrameA = 1; _presetDurationA = sampledPresetDuration(); } void TimeKeeper::StartSmoothing() { _isSmoothing = true; _presetTimeB = _currentTime; _presetFrameB = 1; _presetDurationB = sampledPresetDuration(); } void TimeKeeper::EndSmoothing() { _isSmoothing = false; _presetTimeA = _presetTimeB; _presetFrameA = _presetFrameB; _presetDurationA = _presetDurationB; } bool TimeKeeper::CanHardCut() { return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY); } double TimeKeeper::SmoothRatio() { return (_currentTime - _presetTimeB) / _smoothDuration; } bool TimeKeeper::IsSmoothing() { return _isSmoothing; } double TimeKeeper::GetRunningTime() { return _currentTime; } double TimeKeeper::PresetProgressA() { if (_isSmoothing) return 1.0; else return (_currentTime - _presetTimeA) / _presetDurationA; } double TimeKeeper::PresetProgressB() { return (_currentTime - _presetTimeB) / _presetDurationB; } int TimeKeeper::PresetFrameB() { return _presetFrameB; } int TimeKeeper::PresetFrameA() { return _presetFrameA; } double TimeKeeper::sampledPresetDuration() { #ifdef WIN32 return _presetDuration; #else return fmax(1, fmin(60, RandomNumberGenerators::gaussian (_presetDuration, _easterEgg))); #endif } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/TimeKeeper.hpp�������������������������������������������������������0000664�0000000�0000000�00000002061�12660066715�0021067�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef TimeKeeper_HPP #define TimeKeeper_HPP #ifndef WIN32 #include <sys/time.h> #endif #include "timer.h" #define HARD_CUT_DELAY 3 class TimeKeeper { public: TimeKeeper(double presetDuration, double smoothDuration, double easterEgg); void UpdateTimers(); void StartPreset(); void StartSmoothing(); void EndSmoothing(); bool CanHardCut(); double SmoothRatio(); bool IsSmoothing(); double GetRunningTime(); double PresetProgressA(); double PresetProgressB(); int PresetFrameA(); int PresetFrameB(); double sampledPresetDuration(); void ChangePresetDuration(int seconds) { _presetDuration = seconds; } #ifndef WIN32 /* The first ticks value of the application */ struct timeval startTime; #else long startTime; #endif /** !WIN32 */ private: double _easterEgg; double _presetDuration; double _presetDurationA; double _presetDurationB; double _smoothDuration; double _currentTime; double _presetTimeA; double _presetTimeB; int _presetFrameA; int _presetFrameB; bool _isSmoothing; }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/dlldefs.h������������������������������������������������������������0000775�0000000�0000000�00000002262�12660066715�0020120�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id$ * * DLL definitions for exporting symbols on various platforms * * $Log$ */ #ifndef _DLLDEFS_H #define _DLLDEFS_H #ifndef DLLEXPORT #ifdef WIN32 #define DLLEXPORT __declspec(dllexport) #else /** !WIN32 */ #define DLLEXPORT #endif /** WIN32 */ #endif /** !DLLEXPORT */ #endif /** !_DLLDEFS_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/event.h��������������������������������������������������������������0000775�0000000�0000000�00000006471�12660066715�0017632�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: event.h,v 1.2 2004/10/08 10:54:27 cvs Exp $ * * projectM keycodes. Enables translation from various event schemes such as Win32, SDL * &c. * * $Log: event.h,v $ */ #ifndef _PROJECTM_EVENT_H #define _PROJECTM_EVENT_H typedef enum { /** Event types */ PROJECTM_KEYUP, PROJECTM_KEYDOWN, PROJECTM_VIDEORESIZE, PROJECTM_VIDEOQUIT, } projectMEvent; typedef enum { /** Keycodes */ PROJECTM_K_RETURN, PROJECTM_K_RIGHT, PROJECTM_K_LEFT, PROJECTM_K_UP, PROJECTM_K_DOWN, PROJECTM_K_PAGEUP, PROJECTM_K_PAGEDOWN, PROJECTM_K_INSERT, PROJECTM_K_DELETE, PROJECTM_K_ESCAPE, PROJECTM_K_LSHIFT, PROJECTM_K_RSHIFT, PROJECTM_K_CAPSLOCK, PROJECTM_K_LCTRL, PROJECTM_K_HOME, PROJECTM_K_END, PROJECTM_K_BACKSPACE, PROJECTM_K_F1, PROJECTM_K_F2, PROJECTM_K_F3, PROJECTM_K_F4, PROJECTM_K_F5, PROJECTM_K_F6, PROJECTM_K_F7, PROJECTM_K_F8, PROJECTM_K_F9, PROJECTM_K_F10, PROJECTM_K_F11, PROJECTM_K_F12, PROJECTM_K_0 = 48, PROJECTM_K_1, PROJECTM_K_2, PROJECTM_K_3, PROJECTM_K_4, PROJECTM_K_5, PROJECTM_K_6, PROJECTM_K_7, PROJECTM_K_8, PROJECTM_K_9, PROJECTM_K_A = 65, PROJECTM_K_B, PROJECTM_K_C, PROJECTM_K_D, PROJECTM_K_E, PROJECTM_K_F, PROJECTM_K_G, PROJECTM_K_H, PROJECTM_K_I, PROJECTM_K_J, PROJECTM_K_K, PROJECTM_K_L, PROJECTM_K_M, PROJECTM_K_N, PROJECTM_K_O, PROJECTM_K_P, PROJECTM_K_Q, PROJECTM_K_R, PROJECTM_K_S, PROJECTM_K_T, PROJECTM_K_U, PROJECTM_K_V, PROJECTM_K_W, PROJECTM_K_X, PROJECTM_K_Y, PROJECTM_K_Z, PROJECTM_K_a = 97, PROJECTM_K_b, PROJECTM_K_c, PROJECTM_K_d, PROJECTM_K_e, PROJECTM_K_f, PROJECTM_K_g, PROJECTM_K_h, PROJECTM_K_i, PROJECTM_K_j, PROJECTM_K_k, PROJECTM_K_l, PROJECTM_K_m, PROJECTM_K_n, PROJECTM_K_o, PROJECTM_K_p, PROJECTM_K_q, PROJECTM_K_r, PROJECTM_K_s, PROJECTM_K_t, PROJECTM_K_u, PROJECTM_K_v, PROJECTM_K_w, PROJECTM_K_x, PROJECTM_K_y, PROJECTM_K_z, PROJECTM_K_NONE, PROJECTM_K_PLUS, PROJECTM_K_MINUS, PROJECTM_K_EQUALS } projectMKeycode; typedef enum { /** Modifiers */ PROJECTM_KMOD_LSHIFT, PROJECTM_KMOD_RSHIFT, PROJECTM_KMOD_CAPS, PROJECTM_KMOD_LCTRL, PROJECTM_KMOD_RCTRL, } projectMModifier; #endif /** !_PROJECTM_EVENT_H */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/fatal.h��������������������������������������������������������������0000775�0000000�0000000�00000002457�12660066715�0017600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: fatal.h,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $ * * Error codes * * $Log$ */ #ifndef _FATAL_H #define _FATAL_H /* Fatal Error Definitions */ #define PROJECTM_OUTOFMEM_ERROR -7; /* out of memory */ #define PROJECTM_ERROR -1 /* non specific error */ #define PROJECTM_SUCCESS 1 #define PROJECTM_FAILURE -1 #define PROJECTM_PARSE_ERROR -11 #define PROJECTM_DIV_BY_ZERO -3 #define PROJECTM_OK 2 #endif /** !_FATAL_H */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/fftsg.cpp������������������������������������������������������������0000775�0000000�0000000�00000256105�12660066715�0020156�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Fast Fourier/Cosine/Sine Transform dimension :one data length :power of 2 decimation :frequency radix :split-radix data :inplace table :use functions cdft: Complex Discrete Fourier Transform rdft: Real Discrete Fourier Transform ddct: Discrete Cosine Transform ddst: Discrete Sine Transform dfct: Cosine Transform of RDFT (Real Symmetric DFT) dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) function prototypes void cdft(int, int, double *, int *, double *); void rdft(int, int, double *, int *, double *); void ddct(int, int, double *, int *, double *); void ddst(int, int, double *, int *, double *); void dfct(int, double *, double *, int *, double *); void dfst(int, double *, double *, int *, double *); macro definitions USE_CDFT_PTHREADS : default=not defined CDFT_THREADS_BEGIN_N : must be >= 512, default=8192 CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536 USE_CDFT_WINTHREADS : default=not defined CDFT_THREADS_BEGIN_N : must be >= 512, default=32768 CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288 -------- Complex DFT (Discrete Fourier Transform) -------- [definition] <case1> X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n <case2> X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n (notes: sum_j=0^n-1 is a summation from j=0 to n-1) [usage] <case1> ip[0] = 0; // first time only cdft(2*n, 1, a, ip, w); <case2> ip[0] = 0; // first time only cdft(2*n, -1, a, ip, w); [parameters] 2*n :data length (int) n >= 1, n = power of 2 a[0...2*n-1] :input/output data (double *) input data a[2*j] = Re(x[j]), a[2*j+1] = Im(x[j]), 0<=j<n output data a[2*k] = Re(X[k]), a[2*k+1] = Im(X[k]), 0<=k<n ip[0...*] :work area for bit reversal (int *) length of ip >= 2+sqrt(n) strictly, length of ip >= 2+(1<<(int)(log(n+0.5)/log(2))/2). ip[0],ip[1] are pointers of the cos/sin table. w[0...n/2-1] :cos/sin table (double *) w[],ip[] are initialized if ip[0] == 0. [remark] Inverse of cdft(2*n, -1, a, ip, w); is cdft(2*n, 1, a, ip, w); for (j = 0; j <= 2 * n - 1; j++) { a[j] *= 1.0 / n; } . -------- Real DFT / Inverse of Real DFT -------- [definition] <case1> RDFT R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2 <case2> IRDFT (excluding scale) a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n [usage] <case1> ip[0] = 0; // first time only rdft(n, 1, a, ip, w); <case2> ip[0] = 0; // first time only rdft(n, -1, a, ip, w); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) <case1> output data a[2*k] = R[k], 0<=k<n/2 a[2*k+1] = I[k], 0<k<n/2 a[1] = R[n/2] <case2> input data a[2*j] = R[j], 0<=j<n/2 a[2*j+1] = I[j], 0<j<n/2 a[1] = R[n/2] ip[0...*] :work area for bit reversal (int *) length of ip >= 2+sqrt(n/2) strictly, length of ip >= 2+(1<<(int)(log(n/2+0.5)/log(2))/2). ip[0],ip[1] are pointers of the cos/sin table. w[0...n/2-1] :cos/sin table (double *) w[],ip[] are initialized if ip[0] == 0. [remark] Inverse of rdft(n, 1, a, ip, w); is rdft(n, -1, a, ip, w); for (j = 0; j <= n - 1; j++) { a[j] *= 2.0 / n; } . -------- DCT (Discrete Cosine Transform) / Inverse of DCT -------- [definition] <case1> IDCT (excluding scale) C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n <case2> DCT C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n [usage] <case1> ip[0] = 0; // first time only ddct(n, 1, a, ip, w); <case2> ip[0] = 0; // first time only ddct(n, -1, a, ip, w); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[k] = C[k], 0<=k<n ip[0...*] :work area for bit reversal (int *) length of ip >= 2+sqrt(n/2) strictly, length of ip >= 2+(1<<(int)(log(n/2+0.5)/log(2))/2). ip[0],ip[1] are pointers of the cos/sin table. w[0...n*5/4-1] :cos/sin table (double *) w[],ip[] are initialized if ip[0] == 0. [remark] Inverse of ddct(n, -1, a, ip, w); is a[0] *= 0.5; ddct(n, 1, a, ip, w); for (j = 0; j <= n - 1; j++) { a[j] *= 2.0 / n; } . -------- DST (Discrete Sine Transform) / Inverse of DST -------- [definition] <case1> IDST (excluding scale) S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n <case2> DST S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n [usage] <case1> ip[0] = 0; // first time only ddst(n, 1, a, ip, w); <case2> ip[0] = 0; // first time only ddst(n, -1, a, ip, w); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) <case1> input data a[j] = A[j], 0<j<n a[0] = A[n] output data a[k] = S[k], 0<=k<n <case2> output data a[k] = S[k], 0<k<n a[0] = S[n] ip[0...*] :work area for bit reversal (int *) length of ip >= 2+sqrt(n/2) strictly, length of ip >= 2+(1<<(int)(log(n/2+0.5)/log(2))/2). ip[0],ip[1] are pointers of the cos/sin table. w[0...n*5/4-1] :cos/sin table (double *) w[],ip[] are initialized if ip[0] == 0. [remark] Inverse of ddst(n, -1, a, ip, w); is a[0] *= 0.5; ddst(n, 1, a, ip, w); for (j = 0; j <= n - 1; j++) { a[j] *= 2.0 / n; } . -------- Cosine Transform of RDFT (Real Symmetric DFT) -------- [definition] C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n [usage] ip[0] = 0; // first time only dfct(n, a, t, ip, w); [parameters] n :data length - 1 (int) n >= 2, n = power of 2 a[0...n] :input/output data (double *) output data a[k] = C[k], 0<=k<=n t[0...n/2] :work area (double *) ip[0...*] :work area for bit reversal (int *) length of ip >= 2+sqrt(n/4) strictly, length of ip >= 2+(1<<(int)(log(n/4+0.5)/log(2))/2). ip[0],ip[1] are pointers of the cos/sin table. w[0...n*5/8-1] :cos/sin table (double *) w[],ip[] are initialized if ip[0] == 0. [remark] Inverse of a[0] *= 0.5; a[n] *= 0.5; dfct(n, a, t, ip, w); is a[0] *= 0.5; a[n] *= 0.5; dfct(n, a, t, ip, w); for (j = 0; j <= n; j++) { a[j] *= 2.0 / n; } . -------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- [definition] S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n [usage] ip[0] = 0; // first time only dfst(n, a, t, ip, w); [parameters] n :data length + 1 (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[k] = S[k], 0<k<n (a[0] is used for work area) t[0...n/2-1] :work area (double *) ip[0...*] :work area for bit reversal (int *) length of ip >= 2+sqrt(n/4) strictly, length of ip >= 2+(1<<(int)(log(n/4+0.5)/log(2))/2). ip[0],ip[1] are pointers of the cos/sin table. w[0...n*5/8-1] :cos/sin table (double *) w[],ip[] are initialized if ip[0] == 0. [remark] Inverse of dfst(n, a, t, ip, w); is dfst(n, a, t, ip, w); for (j = 1; j <= n - 1; j++) { a[j] *= 2.0 / n; } . Appendix : The cos/sin table is recalculated when the larger table required. w[] and ip[] are compatible with all routines. */ void cdft(int n, int isgn, double *a, int *ip, double *w) { void makewt(int nw, int *ip, double *w); void cftfsub(int n, double *a, int *ip, int nw, double *w); void cftbsub(int n, double *a, int *ip, int nw, double *w); int nw; nw = ip[0]; if (n > (nw << 2)) { nw = n >> 2; makewt(nw, ip, w); } if (isgn >= 0) { cftfsub(n, a, ip, nw, w); } else { cftbsub(n, a, ip, nw, w); } } void rdft(int n, int isgn, double *a, int *ip, double *w) { void makewt(int nw, int *ip, double *w); void makect(int nc, int *ip, double *c); void cftfsub(int n, double *a, int *ip, int nw, double *w); void cftbsub(int n, double *a, int *ip, int nw, double *w); void rftfsub(int n, double *a, int nc, double *c); void rftbsub(int n, double *a, int nc, double *c); int nw, nc; double xi; nw = ip[0]; if (n > (nw << 2)) { nw = n >> 2; makewt(nw, ip, w); } nc = ip[1]; if (n > (nc << 2)) { nc = n >> 2; makect(nc, ip, w + nw); } if (isgn >= 0) { if (n > 4) { cftfsub(n, a, ip, nw, w); rftfsub(n, a, nc, w + nw); } else if (n == 4) { cftfsub(n, a, ip, nw, w); } xi = a[0] - a[1]; a[0] += a[1]; a[1] = xi; } else { a[1] = 0.5 * (a[0] - a[1]); a[0] -= a[1]; if (n > 4) { rftbsub(n, a, nc, w + nw); cftbsub(n, a, ip, nw, w); } else if (n == 4) { cftbsub(n, a, ip, nw, w); } } } void ddct(int n, int isgn, double *a, int *ip, double *w) { void makewt(int nw, int *ip, double *w); void makect(int nc, int *ip, double *c); void cftfsub(int n, double *a, int *ip, int nw, double *w); void cftbsub(int n, double *a, int *ip, int nw, double *w); void rftfsub(int n, double *a, int nc, double *c); void rftbsub(int n, double *a, int nc, double *c); void dctsub(int n, double *a, int nc, double *c); int j, nw, nc; double xr; nw = ip[0]; if (n > (nw << 2)) { nw = n >> 2; makewt(nw, ip, w); } nc = ip[1]; if (n > nc) { nc = n; makect(nc, ip, w + nw); } if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = a[j] - a[j - 1]; a[j] += a[j - 1]; } a[1] = a[0] - xr; a[0] += xr; if (n > 4) { rftbsub(n, a, nc, w + nw); cftbsub(n, a, ip, nw, w); } else if (n == 4) { cftbsub(n, a, ip, nw, w); } } dctsub(n, a, nc, w + nw); if (isgn >= 0) { if (n > 4) { cftfsub(n, a, ip, nw, w); rftfsub(n, a, nc, w + nw); } else if (n == 4) { cftfsub(n, a, ip, nw, w); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = a[j] - a[j + 1]; a[j] += a[j + 1]; } a[n - 1] = xr; } } void ddst(int n, int isgn, double *a, int *ip, double *w) { void makewt(int nw, int *ip, double *w); void makect(int nc, int *ip, double *c); void cftfsub(int n, double *a, int *ip, int nw, double *w); void cftbsub(int n, double *a, int *ip, int nw, double *w); void rftfsub(int n, double *a, int nc, double *c); void rftbsub(int n, double *a, int nc, double *c); void dstsub(int n, double *a, int nc, double *c); int j, nw, nc; double xr; nw = ip[0]; if (n > (nw << 2)) { nw = n >> 2; makewt(nw, ip, w); } nc = ip[1]; if (n > nc) { nc = n; makect(nc, ip, w + nw); } if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = -a[j] - a[j - 1]; a[j] -= a[j - 1]; } a[1] = a[0] + xr; a[0] -= xr; if (n > 4) { rftbsub(n, a, nc, w + nw); cftbsub(n, a, ip, nw, w); } else if (n == 4) { cftbsub(n, a, ip, nw, w); } } dstsub(n, a, nc, w + nw); if (isgn >= 0) { if (n > 4) { cftfsub(n, a, ip, nw, w); rftfsub(n, a, nc, w + nw); } else if (n == 4) { cftfsub(n, a, ip, nw, w); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = -a[j] - a[j + 1]; a[j] -= a[j + 1]; } a[n - 1] = -xr; } } void dfct(int n, double *a, double *t, int *ip, double *w) { void makewt(int nw, int *ip, double *w); void makect(int nc, int *ip, double *c); void cftfsub(int n, double *a, int *ip, int nw, double *w); void rftfsub(int n, double *a, int nc, double *c); void dctsub(int n, double *a, int nc, double *c); int j, k, l, m, mh, nw, nc; double xr, xi, yr, yi; nw = ip[0]; if (n > (nw << 3)) { nw = n >> 3; makewt(nw, ip, w); } nc = ip[1]; if (n > (nc << 1)) { nc = n >> 1; makect(nc, ip, w + nw); } m = n >> 1; yi = a[m]; xi = a[0] + a[n]; a[0] -= a[n]; t[0] = xi - yi; t[m] = xi + yi; if (n > 2) { mh = m >> 1; for (j = 1; j < mh; j++) { k = m - j; xr = a[j] - a[n - j]; xi = a[j] + a[n - j]; yr = a[k] - a[n - k]; yi = a[k] + a[n - k]; a[j] = xr; a[k] = yr; t[j] = xi - yi; t[k] = xi + yi; } t[mh] = a[mh] + a[n - mh]; a[mh] -= a[n - mh]; dctsub(m, a, nc, w + nw); if (m > 4) { cftfsub(m, a, ip, nw, w); rftfsub(m, a, nc, w + nw); } else if (m == 4) { cftfsub(m, a, ip, nw, w); } a[n - 1] = a[0] - a[1]; a[1] = a[0] + a[1]; for (j = m - 2; j >= 2; j -= 2) { a[2 * j + 1] = a[j] + a[j + 1]; a[2 * j - 1] = a[j] - a[j + 1]; } l = 2; m = mh; while (m >= 2) { dctsub(m, t, nc, w + nw); if (m > 4) { cftfsub(m, t, ip, nw, w); rftfsub(m, t, nc, w + nw); } else if (m == 4) { cftfsub(m, t, ip, nw, w); } a[n - l] = t[0] - t[1]; a[l] = t[0] + t[1]; k = 0; for (j = 2; j < m; j += 2) { k += l << 2; a[k - l] = t[j] - t[j + 1]; a[k + l] = t[j] + t[j + 1]; } l <<= 1; mh = m >> 1; for (j = 0; j < mh; j++) { k = m - j; t[j] = t[m + k] - t[m + j]; t[k] = t[m + k] + t[m + j]; } t[mh] = t[m + mh]; m = mh; } a[l] = t[0]; a[n] = t[2] - t[1]; a[0] = t[2] + t[1]; } else { a[1] = a[0]; a[2] = t[0]; a[0] = t[1]; } } void dfst(int n, double *a, double *t, int *ip, double *w) { void makewt(int nw, int *ip, double *w); void makect(int nc, int *ip, double *c); void cftfsub(int n, double *a, int *ip, int nw, double *w); void rftfsub(int n, double *a, int nc, double *c); void dstsub(int n, double *a, int nc, double *c); int j, k, l, m, mh, nw, nc; double xr, xi, yr, yi; nw = ip[0]; if (n > (nw << 3)) { nw = n >> 3; makewt(nw, ip, w); } nc = ip[1]; if (n > (nc << 1)) { nc = n >> 1; makect(nc, ip, w + nw); } if (n > 2) { m = n >> 1; mh = m >> 1; for (j = 1; j < mh; j++) { k = m - j; xr = a[j] + a[n - j]; xi = a[j] - a[n - j]; yr = a[k] + a[n - k]; yi = a[k] - a[n - k]; a[j] = xr; a[k] = yr; t[j] = xi + yi; t[k] = xi - yi; } t[0] = a[mh] - a[n - mh]; a[mh] += a[n - mh]; a[0] = a[m]; dstsub(m, a, nc, w + nw); if (m > 4) { cftfsub(m, a, ip, nw, w); rftfsub(m, a, nc, w + nw); } else if (m == 4) { cftfsub(m, a, ip, nw, w); } a[n - 1] = a[1] - a[0]; a[1] = a[0] + a[1]; for (j = m - 2; j >= 2; j -= 2) { a[2 * j + 1] = a[j] - a[j + 1]; a[2 * j - 1] = -a[j] - a[j + 1]; } l = 2; m = mh; while (m >= 2) { dstsub(m, t, nc, w + nw); if (m > 4) { cftfsub(m, t, ip, nw, w); rftfsub(m, t, nc, w + nw); } else if (m == 4) { cftfsub(m, t, ip, nw, w); } a[n - l] = t[1] - t[0]; a[l] = t[0] + t[1]; k = 0; for (j = 2; j < m; j += 2) { k += l << 2; a[k - l] = -t[j] - t[j + 1]; a[k + l] = t[j] - t[j + 1]; } l <<= 1; mh = m >> 1; for (j = 1; j < mh; j++) { k = m - j; t[j] = t[m + k] + t[m + j]; t[k] = t[m + k] - t[m + j]; } t[0] = t[m + mh]; m = mh; } a[l] = t[0]; } a[0] = 0; } /* -------- initializing routines -------- */ #include <math.h> void makewt(int nw, int *ip, double *w) { void makeipt(int nw, int *ip); int j, nwh, nw0, nw1; double delta, wn4r, wk1r, wk1i, wk3r, wk3i; ip[0] = nw; ip[1] = 1; if (nw > 2) { nwh = nw >> 1; delta = atan(1.0) / nwh; wn4r = cos(delta * nwh); w[0] = 1; w[1] = wn4r; if (nwh == 4) { w[2] = cos(delta * 2); w[3] = sin(delta * 2); } else if (nwh > 4) { makeipt(nw, ip); w[2] = 0.5 / cos(delta * 2); w[3] = 0.5 / cos(delta * 6); for (j = 4; j < nwh; j += 4) { w[j] = cos(delta * j); w[j + 1] = sin(delta * j); w[j + 2] = cos(3 * delta * j); w[j + 3] = -sin(3 * delta * j); } } nw0 = 0; while (nwh > 2) { nw1 = nw0 + nwh; nwh >>= 1; w[nw1] = 1; w[nw1 + 1] = wn4r; if (nwh == 4) { wk1r = w[nw0 + 4]; wk1i = w[nw0 + 5]; w[nw1 + 2] = wk1r; w[nw1 + 3] = wk1i; } else if (nwh > 4) { wk1r = w[nw0 + 4]; wk3r = w[nw0 + 6]; w[nw1 + 2] = 0.5 / wk1r; w[nw1 + 3] = 0.5 / wk3r; for (j = 4; j < nwh; j += 4) { wk1r = w[nw0 + 2 * j]; wk1i = w[nw0 + 2 * j + 1]; wk3r = w[nw0 + 2 * j + 2]; wk3i = w[nw0 + 2 * j + 3]; w[nw1 + j] = wk1r; w[nw1 + j + 1] = wk1i; w[nw1 + j + 2] = wk3r; w[nw1 + j + 3] = wk3i; } } nw0 = nw1; } } } void makeipt(int nw, int *ip) { int j, l, m, m2, p, q; ip[2] = 0; ip[3] = 16; m = 2; for (l = nw; l > 32; l >>= 2) { m2 = m << 1; q = m2 << 3; for (j = m; j < m2; j++) { p = ip[j] << 2; ip[m + j] = p; ip[m2 + j] = p + q; } m = m2; } } void makect(int nc, int *ip, double *c) { int j, nch; double delta; ip[1] = nc; if (nc > 1) { nch = nc >> 1; delta = atan(1.0) / nch; c[0] = cos(delta * nch); c[nch] = 0.5 * c[0]; for (j = 1; j < nch; j++) { c[j] = 0.5 * cos(delta * j); c[nc - j] = 0.5 * sin(delta * j); } } } /* -------- child routines -------- */ #ifdef USE_CDFT_PTHREADS #define USE_CDFT_THREADS #ifndef CDFT_THREADS_BEGIN_N #define CDFT_THREADS_BEGIN_N 8192 #endif #ifndef CDFT_4THREADS_BEGIN_N #define CDFT_4THREADS_BEGIN_N 65536 #endif #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define cdft_thread_t pthread_t #define cdft_thread_create(thp,func,argp) { \ if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #define cdft_thread_wait(th) { \ if (pthread_join(th, NULL) != 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #endif /* USE_CDFT_PTHREADS */ #ifdef USE_CDFT_WINTHREADS #define USE_CDFT_THREADS #ifndef CDFT_THREADS_BEGIN_N #define CDFT_THREADS_BEGIN_N 32768 #endif #ifndef CDFT_4THREADS_BEGIN_N #define CDFT_4THREADS_BEGIN_N 524288 #endif #include <windows.h> #include <stdio.h> #include <stdlib.h> #define cdft_thread_t HANDLE #define cdft_thread_create(thp,func,argp) { \ DWORD thid; \ *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \ if (*(thp) == 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #define cdft_thread_wait(th) { \ WaitForSingleObject(th, INFINITE); \ CloseHandle(th); \ } #endif /* USE_CDFT_WINTHREADS */ void cftfsub(int n, double *a, int *ip, int nw, double *w) { void bitrv2(int n, int *ip, double *a); void bitrv216(double *a); void bitrv208(double *a); void cftf1st(int n, double *a, double *w); void cftrec4(int n, double *a, int nw, double *w); void cftleaf(int n, int isplt, double *a, int nw, double *w); void cftfx41(int n, double *a, int nw, double *w); void cftf161(double *a, double *w); void cftf081(double *a, double *w); void cftf040(double *a); void cftx020(double *a); #ifdef USE_CDFT_THREADS void cftrec4_th(int n, double *a, int nw, double *w); #endif /* USE_CDFT_THREADS */ if (n > 8) { if (n > 32) { cftf1st(n, a, &w[nw - (n >> 2)]); #ifdef USE_CDFT_THREADS if (n > CDFT_THREADS_BEGIN_N) { cftrec4_th(n, a, nw, w); } else #endif /* USE_CDFT_THREADS */ if (n > 512) { cftrec4(n, a, nw, w); } else if (n > 128) { cftleaf(n, 1, a, nw, w); } else { cftfx41(n, a, nw, w); } bitrv2(n, ip, a); } else if (n == 32) { cftf161(a, &w[nw - 8]); bitrv216(a); } else { cftf081(a, w); bitrv208(a); } } else if (n == 8) { cftf040(a); } else if (n == 4) { cftx020(a); } } void cftbsub(int n, double *a, int *ip, int nw, double *w) { void bitrv2conj(int n, int *ip, double *a); void bitrv216neg(double *a); void bitrv208neg(double *a); void cftb1st(int n, double *a, double *w); void cftrec4(int n, double *a, int nw, double *w); void cftleaf(int n, int isplt, double *a, int nw, double *w); void cftfx41(int n, double *a, int nw, double *w); void cftf161(double *a, double *w); void cftf081(double *a, double *w); void cftb040(double *a); void cftx020(double *a); #ifdef USE_CDFT_THREADS void cftrec4_th(int n, double *a, int nw, double *w); #endif /* USE_CDFT_THREADS */ if (n > 8) { if (n > 32) { cftb1st(n, a, &w[nw - (n >> 2)]); #ifdef USE_CDFT_THREADS if (n > CDFT_THREADS_BEGIN_N) { cftrec4_th(n, a, nw, w); } else #endif /* USE_CDFT_THREADS */ if (n > 512) { cftrec4(n, a, nw, w); } else if (n > 128) { cftleaf(n, 1, a, nw, w); } else { cftfx41(n, a, nw, w); } bitrv2conj(n, ip, a); } else if (n == 32) { cftf161(a, &w[nw - 8]); bitrv216neg(a); } else { cftf081(a, w); bitrv208neg(a); } } else if (n == 8) { cftb040(a); } else if (n == 4) { cftx020(a); } } void bitrv2(int n, int *ip, double *a) { int j, j1, k, k1, l, m, nh, nm; double xr, xi, yr, yi; m = 1; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; nm = 4 * m; if (l == 8) { for (k = 0; k < m; k++) { for (j = 0; j < k; j++) { j1 = 4 * j + 2 * ip[m + k]; k1 = 4 * k + 2 * ip[m + j]; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 -= nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nh; k1 += 2; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 += nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += 2; k1 += nh; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 -= nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nh; k1 -= 2; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 += nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; } k1 = 4 * k + 2 * ip[m + k]; j1 = k1 + 2; k1 += nh; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 -= nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= 2; k1 -= nh; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nh + 2; k1 += nh + 2; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nh - nm; k1 += 2 * nm - 2; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; } } else { for (k = 0; k < m; k++) { for (j = 0; j < k; j++) { j1 = 4 * j + ip[m + k]; k1 = 4 * k + ip[m + j]; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nh; k1 += 2; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += 2; k1 += nh; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nh; k1 -= 2; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; } k1 = 4 * k + ip[m + k]; j1 = k1 + 2; k1 += nh; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += nm; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; } } } void bitrv2conj(int n, int *ip, double *a) { int j, j1, k, k1, l, m, nh, nm; double xr, xi, yr, yi; m = 1; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; nm = 4 * m; if (l == 8) { for (k = 0; k < m; k++) { for (j = 0; j < k; j++) { j1 = 4 * j + 2 * ip[m + k]; k1 = 4 * k + 2 * ip[m + j]; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 -= nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nh; k1 += 2; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 += nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += 2; k1 += nh; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 -= nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nh; k1 -= 2; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 += nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; } k1 = 4 * k + 2 * ip[m + k]; j1 = k1 + 2; k1 += nh; a[j1 - 1] = -a[j1 - 1]; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; j1 += nm; k1 += 2 * nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 -= nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= 2; k1 -= nh; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nh + 2; k1 += nh + 2; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nh - nm; k1 += 2 * nm - 2; a[j1 - 1] = -a[j1 - 1]; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; } } else { for (k = 0; k < m; k++) { for (j = 0; j < k; j++) { j1 = 4 * j + ip[m + k]; k1 = 4 * k + ip[m + j]; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nh; k1 += 2; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += 2; k1 += nh; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += nm; k1 += nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nh; k1 -= 2; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 -= nm; k1 -= nm; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; } k1 = 4 * k + ip[m + k]; j1 = k1 + 2; k1 += nh; a[j1 - 1] = -a[j1 - 1]; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; j1 += nm; k1 += nm; a[j1 - 1] = -a[j1 - 1]; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; } } } void bitrv216(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x7r = a[14]; x7i = a[15]; x8r = a[16]; x8i = a[17]; x10r = a[20]; x10i = a[21]; x11r = a[22]; x11i = a[23]; x12r = a[24]; x12i = a[25]; x13r = a[26]; x13i = a[27]; x14r = a[28]; x14i = a[29]; a[2] = x8r; a[3] = x8i; a[4] = x4r; a[5] = x4i; a[6] = x12r; a[7] = x12i; a[8] = x2r; a[9] = x2i; a[10] = x10r; a[11] = x10i; a[14] = x14r; a[15] = x14i; a[16] = x1r; a[17] = x1i; a[20] = x5r; a[21] = x5i; a[22] = x13r; a[23] = x13i; a[24] = x3r; a[25] = x3i; a[26] = x11r; a[27] = x11i; a[28] = x7r; a[29] = x7i; } void bitrv216neg(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i, x15r, x15i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x6r = a[12]; x6i = a[13]; x7r = a[14]; x7i = a[15]; x8r = a[16]; x8i = a[17]; x9r = a[18]; x9i = a[19]; x10r = a[20]; x10i = a[21]; x11r = a[22]; x11i = a[23]; x12r = a[24]; x12i = a[25]; x13r = a[26]; x13i = a[27]; x14r = a[28]; x14i = a[29]; x15r = a[30]; x15i = a[31]; a[2] = x15r; a[3] = x15i; a[4] = x7r; a[5] = x7i; a[6] = x11r; a[7] = x11i; a[8] = x3r; a[9] = x3i; a[10] = x13r; a[11] = x13i; a[12] = x5r; a[13] = x5i; a[14] = x9r; a[15] = x9i; a[16] = x1r; a[17] = x1i; a[18] = x14r; a[19] = x14i; a[20] = x6r; a[21] = x6i; a[22] = x10r; a[23] = x10i; a[24] = x2r; a[25] = x2i; a[26] = x12r; a[27] = x12i; a[28] = x4r; a[29] = x4i; a[30] = x8r; a[31] = x8i; } void bitrv208(double *a) { double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i; x1r = a[2]; x1i = a[3]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x6r = a[12]; x6i = a[13]; a[2] = x4r; a[3] = x4i; a[6] = x6r; a[7] = x6i; a[8] = x1r; a[9] = x1i; a[12] = x3r; a[13] = x3i; } void bitrv208neg(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x6r = a[12]; x6i = a[13]; x7r = a[14]; x7i = a[15]; a[2] = x7r; a[3] = x7i; a[4] = x3r; a[5] = x3i; a[6] = x5r; a[7] = x5i; a[8] = x1r; a[9] = x1i; a[10] = x6r; a[11] = x6i; a[12] = x2r; a[13] = x2i; a[14] = x4r; a[15] = x4i; } void cftf1st(int n, double *a, double *w) { int j, j0, j1, j2, j3, k, m, mh; double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i; mh = n >> 3; m = 2 * mh; j1 = m; j2 = j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = a[1] + a[j2 + 1]; x1r = a[0] - a[j2]; x1i = a[1] - a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; a[j2] = x1r - x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r + x3i; a[j3 + 1] = x1i - x3r; wn4r = w[1]; csc1 = w[2]; csc3 = w[3]; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; k = 0; for (j = 2; j < mh - 2; j += 4) { k += 4; wk1r = csc1 * (wd1r + w[k]); wk1i = csc1 * (wd1i + w[k + 1]); wk3r = csc3 * (wd3r + w[k + 2]); wk3i = csc3 * (wd3i + w[k + 3]); wd1r = w[k]; wd1i = w[k + 1]; wd3r = w[k + 2]; wd3i = w[k + 3]; j1 = j + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = a[j + 1] + a[j2 + 1]; x1r = a[j] - a[j2]; x1i = a[j + 1] - a[j2 + 1]; y0r = a[j + 2] + a[j2 + 2]; y0i = a[j + 3] + a[j2 + 3]; y1r = a[j + 2] - a[j2 + 2]; y1i = a[j + 3] - a[j2 + 3]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; y2r = a[j1 + 2] + a[j3 + 2]; y2i = a[j1 + 3] + a[j3 + 3]; y3r = a[j1 + 2] - a[j3 + 2]; y3i = a[j1 + 3] - a[j3 + 3]; a[j] = x0r + x2r; a[j + 1] = x0i + x2i; a[j + 2] = y0r + y2r; a[j + 3] = y0i + y2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; a[j1 + 2] = y0r - y2r; a[j1 + 3] = y0i - y2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = y1r - y3i; x0i = y1i + y3r; a[j2 + 2] = wd1r * x0r - wd1i * x0i; a[j2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; x0r = y1r + y3i; x0i = y1i - y3r; a[j3 + 2] = wd3r * x0r + wd3i * x0i; a[j3 + 3] = wd3r * x0i - wd3i * x0r; j0 = m - j; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0] + a[j2]; x0i = a[j0 + 1] + a[j2 + 1]; x1r = a[j0] - a[j2]; x1i = a[j0 + 1] - a[j2 + 1]; y0r = a[j0 - 2] + a[j2 - 2]; y0i = a[j0 - 1] + a[j2 - 1]; y1r = a[j0 - 2] - a[j2 - 2]; y1i = a[j0 - 1] - a[j2 - 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; y2r = a[j1 - 2] + a[j3 - 2]; y2i = a[j1 - 1] + a[j3 - 1]; y3r = a[j1 - 2] - a[j3 - 2]; y3i = a[j1 - 1] - a[j3 - 1]; a[j0] = x0r + x2r; a[j0 + 1] = x0i + x2i; a[j0 - 2] = y0r + y2r; a[j0 - 1] = y0i + y2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; a[j1 - 2] = y0r - y2r; a[j1 - 1] = y0i - y2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = y1r - y3i; x0i = y1i + y3r; a[j2 - 2] = wd1i * x0r - wd1r * x0i; a[j2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; x0r = y1r + y3i; x0i = y1i - y3r; a[j3 - 2] = wd3i * x0r + wd3r * x0i; a[j3 - 1] = wd3i * x0i - wd3r * x0r; } wk1r = csc1 * (wd1r + wn4r); wk1i = csc1 * (wd1i + wn4r); wk3r = csc3 * (wd3r - wn4r); wk3i = csc3 * (wd3i - wn4r); j0 = mh; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0 - 2] + a[j2 - 2]; x0i = a[j0 - 1] + a[j2 - 1]; x1r = a[j0 - 2] - a[j2 - 2]; x1i = a[j0 - 1] - a[j2 - 1]; x2r = a[j1 - 2] + a[j3 - 2]; x2i = a[j1 - 1] + a[j3 - 1]; x3r = a[j1 - 2] - a[j3 - 2]; x3i = a[j1 - 1] - a[j3 - 1]; a[j0 - 2] = x0r + x2r; a[j0 - 1] = x0i + x2i; a[j1 - 2] = x0r - x2r; a[j1 - 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 - 2] = wk1r * x0r - wk1i * x0i; a[j2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 - 2] = wk3r * x0r + wk3i * x0i; a[j3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[j0] + a[j2]; x0i = a[j0 + 1] + a[j2 + 1]; x1r = a[j0] - a[j2]; x1i = a[j0 + 1] - a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[j0] = x0r + x2r; a[j0 + 1] = x0i + x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wn4r * (x0r - x0i); a[j2 + 1] = wn4r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = -wn4r * (x0r + x0i); a[j3 + 1] = -wn4r * (x0i - x0r); x0r = a[j0 + 2] + a[j2 + 2]; x0i = a[j0 + 3] + a[j2 + 3]; x1r = a[j0 + 2] - a[j2 + 2]; x1i = a[j0 + 3] - a[j2 + 3]; x2r = a[j1 + 2] + a[j3 + 2]; x2i = a[j1 + 3] + a[j3 + 3]; x3r = a[j1 + 2] - a[j3 + 2]; x3i = a[j1 + 3] - a[j3 + 3]; a[j0 + 2] = x0r + x2r; a[j0 + 3] = x0i + x2i; a[j1 + 2] = x0r - x2r; a[j1 + 3] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 + 2] = wk1i * x0r - wk1r * x0i; a[j2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 + 2] = wk3i * x0r + wk3r * x0i; a[j3 + 3] = wk3i * x0i - wk3r * x0r; } void cftb1st(int n, double *a, double *w) { int j, j0, j1, j2, j3, k, m, mh; double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i; mh = n >> 3; m = 2 * mh; j1 = m; j2 = j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = -a[1] - a[j2 + 1]; x1r = a[0] - a[j2]; x1i = -a[1] + a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i - x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i + x2i; a[j2] = x1r + x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r - x3i; a[j3 + 1] = x1i - x3r; wn4r = w[1]; csc1 = w[2]; csc3 = w[3]; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; k = 0; for (j = 2; j < mh - 2; j += 4) { k += 4; wk1r = csc1 * (wd1r + w[k]); wk1i = csc1 * (wd1i + w[k + 1]); wk3r = csc3 * (wd3r + w[k + 2]); wk3i = csc3 * (wd3i + w[k + 3]); wd1r = w[k]; wd1i = w[k + 1]; wd3r = w[k + 2]; wd3i = w[k + 3]; j1 = j + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = -a[j + 1] - a[j2 + 1]; x1r = a[j] - a[j2]; x1i = -a[j + 1] + a[j2 + 1]; y0r = a[j + 2] + a[j2 + 2]; y0i = -a[j + 3] - a[j2 + 3]; y1r = a[j + 2] - a[j2 + 2]; y1i = -a[j + 3] + a[j2 + 3]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; y2r = a[j1 + 2] + a[j3 + 2]; y2i = a[j1 + 3] + a[j3 + 3]; y3r = a[j1 + 2] - a[j3 + 2]; y3i = a[j1 + 3] - a[j3 + 3]; a[j] = x0r + x2r; a[j + 1] = x0i - x2i; a[j + 2] = y0r + y2r; a[j + 3] = y0i - y2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i + x2i; a[j1 + 2] = y0r - y2r; a[j1 + 3] = y0i + y2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = y1r + y3i; x0i = y1i + y3r; a[j2 + 2] = wd1r * x0r - wd1i * x0i; a[j2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; x0r = y1r - y3i; x0i = y1i - y3r; a[j3 + 2] = wd3r * x0r + wd3i * x0i; a[j3 + 3] = wd3r * x0i - wd3i * x0r; j0 = m - j; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0] + a[j2]; x0i = -a[j0 + 1] - a[j2 + 1]; x1r = a[j0] - a[j2]; x1i = -a[j0 + 1] + a[j2 + 1]; y0r = a[j0 - 2] + a[j2 - 2]; y0i = -a[j0 - 1] - a[j2 - 1]; y1r = a[j0 - 2] - a[j2 - 2]; y1i = -a[j0 - 1] + a[j2 - 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; y2r = a[j1 - 2] + a[j3 - 2]; y2i = a[j1 - 1] + a[j3 - 1]; y3r = a[j1 - 2] - a[j3 - 2]; y3i = a[j1 - 1] - a[j3 - 1]; a[j0] = x0r + x2r; a[j0 + 1] = x0i - x2i; a[j0 - 2] = y0r + y2r; a[j0 - 1] = y0i - y2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i + x2i; a[j1 - 2] = y0r - y2r; a[j1 - 1] = y0i + y2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = y1r + y3i; x0i = y1i + y3r; a[j2 - 2] = wd1i * x0r - wd1r * x0i; a[j2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; x0r = y1r - y3i; x0i = y1i - y3r; a[j3 - 2] = wd3i * x0r + wd3r * x0i; a[j3 - 1] = wd3i * x0i - wd3r * x0r; } wk1r = csc1 * (wd1r + wn4r); wk1i = csc1 * (wd1i + wn4r); wk3r = csc3 * (wd3r - wn4r); wk3i = csc3 * (wd3i - wn4r); j0 = mh; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0 - 2] + a[j2 - 2]; x0i = -a[j0 - 1] - a[j2 - 1]; x1r = a[j0 - 2] - a[j2 - 2]; x1i = -a[j0 - 1] + a[j2 - 1]; x2r = a[j1 - 2] + a[j3 - 2]; x2i = a[j1 - 1] + a[j3 - 1]; x3r = a[j1 - 2] - a[j3 - 2]; x3i = a[j1 - 1] - a[j3 - 1]; a[j0 - 2] = x0r + x2r; a[j0 - 1] = x0i - x2i; a[j1 - 2] = x0r - x2r; a[j1 - 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 - 2] = wk1r * x0r - wk1i * x0i; a[j2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 - 2] = wk3r * x0r + wk3i * x0i; a[j3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[j0] + a[j2]; x0i = -a[j0 + 1] - a[j2 + 1]; x1r = a[j0] - a[j2]; x1i = -a[j0 + 1] + a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[j0] = x0r + x2r; a[j0 + 1] = x0i - x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wn4r * (x0r - x0i); a[j2 + 1] = wn4r * (x0i + x0r); x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = -wn4r * (x0r + x0i); a[j3 + 1] = -wn4r * (x0i - x0r); x0r = a[j0 + 2] + a[j2 + 2]; x0i = -a[j0 + 3] - a[j2 + 3]; x1r = a[j0 + 2] - a[j2 + 2]; x1i = -a[j0 + 3] + a[j2 + 3]; x2r = a[j1 + 2] + a[j3 + 2]; x2i = a[j1 + 3] + a[j3 + 3]; x3r = a[j1 + 2] - a[j3 + 2]; x3i = a[j1 + 3] - a[j3 + 3]; a[j0 + 2] = x0r + x2r; a[j0 + 3] = x0i - x2i; a[j1 + 2] = x0r - x2r; a[j1 + 3] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 + 2] = wk1i * x0r - wk1r * x0i; a[j2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 + 2] = wk3i * x0r + wk3r * x0i; a[j3 + 3] = wk3i * x0i - wk3r * x0r; } #ifdef USE_CDFT_THREADS struct cdft_arg_st { int n0; int n; double *a; int nw; double *w; }; typedef struct cdft_arg_st cdft_arg_t; void cftrec4_th(int n, double *a, int nw, double *w) { void *cftrec1_th(void *p); void *cftrec2_th(void *p); int i, idiv4, m, nthread; cdft_thread_t th[4]; cdft_arg_t ag[4]; nthread = 2; idiv4 = 0; m = n >> 1; if (n > CDFT_4THREADS_BEGIN_N) { nthread = 4; idiv4 = 1; m >>= 1; } for (i = 0; i < nthread; i++) { ag[i].n0 = n; ag[i].n = m; ag[i].a = &a[i * m]; ag[i].nw = nw; ag[i].w = w; if (i != idiv4) { cdft_thread_create(&th[i], cftrec1_th, &ag[i]); } else { cdft_thread_create(&th[i], cftrec2_th, &ag[i]); } } for (i = 0; i < nthread; i++) { cdft_thread_wait(th[i]); } } void *cftrec1_th(void *p) { int cfttree(int n, int j, int k, double *a, int nw, double *w); void cftleaf(int n, int isplt, double *a, int nw, double *w); void cftmdl1(int n, double *a, double *w); int isplt, j, k, m, n, n0, nw; double *a, *w; n0 = ((cdft_arg_t *) p)->n0; n = ((cdft_arg_t *) p)->n; a = ((cdft_arg_t *) p)->a; nw = ((cdft_arg_t *) p)->nw; w = ((cdft_arg_t *) p)->w; m = n0; while (m > 512) { m >>= 2; cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); } cftleaf(m, 1, &a[n - m], nw, w); k = 0; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a, nw, w); cftleaf(m, isplt, &a[j - m], nw, w); } return (void *) 0; } void *cftrec2_th(void *p) { int cfttree(int n, int j, int k, double *a, int nw, double *w); void cftleaf(int n, int isplt, double *a, int nw, double *w); void cftmdl2(int n, double *a, double *w); int isplt, j, k, m, n, n0, nw; double *a, *w; n0 = ((cdft_arg_t *) p)->n0; n = ((cdft_arg_t *) p)->n; a = ((cdft_arg_t *) p)->a; nw = ((cdft_arg_t *) p)->nw; w = ((cdft_arg_t *) p)->w; k = 1; m = n0; while (m > 512) { m >>= 2; k <<= 2; cftmdl2(m, &a[n - m], &w[nw - m]); } cftleaf(m, 0, &a[n - m], nw, w); k >>= 1; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a, nw, w); cftleaf(m, isplt, &a[j - m], nw, w); } return (void *) 0; } #endif /* USE_CDFT_THREADS */ void cftrec4(int n, double *a, int nw, double *w) { int cfttree(int n, int j, int k, double *a, int nw, double *w); void cftleaf(int n, int isplt, double *a, int nw, double *w); void cftmdl1(int n, double *a, double *w); int isplt, j, k, m; m = n; while (m > 512) { m >>= 2; cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); } cftleaf(m, 1, &a[n - m], nw, w); k = 0; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a, nw, w); cftleaf(m, isplt, &a[j - m], nw, w); } } int cfttree(int n, int j, int k, double *a, int nw, double *w) { void cftmdl1(int n, double *a, double *w); void cftmdl2(int n, double *a, double *w); int i, isplt, m; if ((k & 3) != 0) { isplt = k & 1; if (isplt != 0) { cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]); } else { cftmdl2(n, &a[j - n], &w[nw - n]); } } else { m = n; for (i = k; (i & 3) == 0; i >>= 2) { m <<= 2; } isplt = i & 1; if (isplt != 0) { while (m > 128) { cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]); m >>= 2; } } else { while (m > 128) { cftmdl2(m, &a[j - m], &w[nw - m]); m >>= 2; } } } return isplt; } void cftleaf(int n, int isplt, double *a, int nw, double *w) { void cftmdl1(int n, double *a, double *w); void cftmdl2(int n, double *a, double *w); void cftf161(double *a, double *w); void cftf162(double *a, double *w); void cftf081(double *a, double *w); void cftf082(double *a, double *w); if (n == 512) { cftmdl1(128, a, &w[nw - 64]); cftf161(a, &w[nw - 8]); cftf162(&a[32], &w[nw - 32]); cftf161(&a[64], &w[nw - 8]); cftf161(&a[96], &w[nw - 8]); cftmdl2(128, &a[128], &w[nw - 128]); cftf161(&a[128], &w[nw - 8]); cftf162(&a[160], &w[nw - 32]); cftf161(&a[192], &w[nw - 8]); cftf162(&a[224], &w[nw - 32]); cftmdl1(128, &a[256], &w[nw - 64]); cftf161(&a[256], &w[nw - 8]); cftf162(&a[288], &w[nw - 32]); cftf161(&a[320], &w[nw - 8]); cftf161(&a[352], &w[nw - 8]); if (isplt != 0) { cftmdl1(128, &a[384], &w[nw - 64]); cftf161(&a[480], &w[nw - 8]); } else { cftmdl2(128, &a[384], &w[nw - 128]); cftf162(&a[480], &w[nw - 32]); } cftf161(&a[384], &w[nw - 8]); cftf162(&a[416], &w[nw - 32]); cftf161(&a[448], &w[nw - 8]); } else { cftmdl1(64, a, &w[nw - 32]); cftf081(a, &w[nw - 8]); cftf082(&a[16], &w[nw - 8]); cftf081(&a[32], &w[nw - 8]); cftf081(&a[48], &w[nw - 8]); cftmdl2(64, &a[64], &w[nw - 64]); cftf081(&a[64], &w[nw - 8]); cftf082(&a[80], &w[nw - 8]); cftf081(&a[96], &w[nw - 8]); cftf082(&a[112], &w[nw - 8]); cftmdl1(64, &a[128], &w[nw - 32]); cftf081(&a[128], &w[nw - 8]); cftf082(&a[144], &w[nw - 8]); cftf081(&a[160], &w[nw - 8]); cftf081(&a[176], &w[nw - 8]); if (isplt != 0) { cftmdl1(64, &a[192], &w[nw - 32]); cftf081(&a[240], &w[nw - 8]); } else { cftmdl2(64, &a[192], &w[nw - 64]); cftf082(&a[240], &w[nw - 8]); } cftf081(&a[192], &w[nw - 8]); cftf082(&a[208], &w[nw - 8]); cftf081(&a[224], &w[nw - 8]); } } void cftmdl1(int n, double *a, double *w) { int j, j0, j1, j2, j3, k, m, mh; double wn4r, wk1r, wk1i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; mh = n >> 3; m = 2 * mh; j1 = m; j2 = j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = a[1] + a[j2 + 1]; x1r = a[0] - a[j2]; x1i = a[1] - a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; a[j2] = x1r - x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r + x3i; a[j3 + 1] = x1i - x3r; wn4r = w[1]; k = 0; for (j = 2; j < mh; j += 2) { k += 4; wk1r = w[k]; wk1i = w[k + 1]; wk3r = w[k + 2]; wk3i = w[k + 3]; j1 = j + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = a[j + 1] + a[j2 + 1]; x1r = a[j] - a[j2]; x1i = a[j + 1] - a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i + x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; j0 = m - j; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0] + a[j2]; x0i = a[j0 + 1] + a[j2 + 1]; x1r = a[j0] - a[j2]; x1i = a[j0 + 1] - a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[j0] = x0r + x2r; a[j0 + 1] = x0i + x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; } j0 = mh; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0] + a[j2]; x0i = a[j0 + 1] + a[j2 + 1]; x1r = a[j0] - a[j2]; x1i = a[j0 + 1] - a[j2 + 1]; x2r = a[j1] + a[j3]; x2i = a[j1 + 1] + a[j3 + 1]; x3r = a[j1] - a[j3]; x3i = a[j1 + 1] - a[j3 + 1]; a[j0] = x0r + x2r; a[j0 + 1] = x0i + x2i; a[j1] = x0r - x2r; a[j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wn4r * (x0r - x0i); a[j2 + 1] = wn4r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = -wn4r * (x0r + x0i); a[j3 + 1] = -wn4r * (x0i - x0r); } void cftmdl2(int n, double *a, double *w) { int j, j0, j1, j2, j3, k, kr, m, mh; double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i; mh = n >> 3; m = 2 * mh; wn4r = w[1]; j1 = m; j2 = j1 + m; j3 = j2 + m; x0r = a[0] - a[j2 + 1]; x0i = a[1] + a[j2]; x1r = a[0] + a[j2 + 1]; x1i = a[1] - a[j2]; x2r = a[j1] - a[j3 + 1]; x2i = a[j1 + 1] + a[j3]; x3r = a[j1] + a[j3 + 1]; x3i = a[j1 + 1] - a[j3]; y0r = wn4r * (x2r - x2i); y0i = wn4r * (x2i + x2r); a[0] = x0r + y0r; a[1] = x0i + y0i; a[j1] = x0r - y0r; a[j1 + 1] = x0i - y0i; y0r = wn4r * (x3r - x3i); y0i = wn4r * (x3i + x3r); a[j2] = x1r - y0i; a[j2 + 1] = x1i + y0r; a[j3] = x1r + y0i; a[j3 + 1] = x1i - y0r; k = 0; kr = 2 * m; for (j = 2; j < mh; j += 2) { k += 4; wk1r = w[k]; wk1i = w[k + 1]; wk3r = w[k + 2]; wk3i = w[k + 3]; kr -= 4; wd1i = w[kr]; wd1r = w[kr + 1]; wd3i = w[kr + 2]; wd3r = w[kr + 3]; j1 = j + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j] - a[j2 + 1]; x0i = a[j + 1] + a[j2]; x1r = a[j] + a[j2 + 1]; x1i = a[j + 1] - a[j2]; x2r = a[j1] - a[j3 + 1]; x2i = a[j1 + 1] + a[j3]; x3r = a[j1] + a[j3 + 1]; x3i = a[j1 + 1] - a[j3]; y0r = wk1r * x0r - wk1i * x0i; y0i = wk1r * x0i + wk1i * x0r; y2r = wd1r * x2r - wd1i * x2i; y2i = wd1r * x2i + wd1i * x2r; a[j] = y0r + y2r; a[j + 1] = y0i + y2i; a[j1] = y0r - y2r; a[j1 + 1] = y0i - y2i; y0r = wk3r * x1r + wk3i * x1i; y0i = wk3r * x1i - wk3i * x1r; y2r = wd3r * x3r + wd3i * x3i; y2i = wd3r * x3i - wd3i * x3r; a[j2] = y0r + y2r; a[j2 + 1] = y0i + y2i; a[j3] = y0r - y2r; a[j3 + 1] = y0i - y2i; j0 = m - j; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0] - a[j2 + 1]; x0i = a[j0 + 1] + a[j2]; x1r = a[j0] + a[j2 + 1]; x1i = a[j0 + 1] - a[j2]; x2r = a[j1] - a[j3 + 1]; x2i = a[j1 + 1] + a[j3]; x3r = a[j1] + a[j3 + 1]; x3i = a[j1 + 1] - a[j3]; y0r = wd1i * x0r - wd1r * x0i; y0i = wd1i * x0i + wd1r * x0r; y2r = wk1i * x2r - wk1r * x2i; y2i = wk1i * x2i + wk1r * x2r; a[j0] = y0r + y2r; a[j0 + 1] = y0i + y2i; a[j1] = y0r - y2r; a[j1 + 1] = y0i - y2i; y0r = wd3i * x1r + wd3r * x1i; y0i = wd3i * x1i - wd3r * x1r; y2r = wk3i * x3r + wk3r * x3i; y2i = wk3i * x3i - wk3r * x3r; a[j2] = y0r + y2r; a[j2 + 1] = y0i + y2i; a[j3] = y0r - y2r; a[j3 + 1] = y0i - y2i; } wk1r = w[m]; wk1i = w[m + 1]; j0 = mh; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; x0r = a[j0] - a[j2 + 1]; x0i = a[j0 + 1] + a[j2]; x1r = a[j0] + a[j2 + 1]; x1i = a[j0 + 1] - a[j2]; x2r = a[j1] - a[j3 + 1]; x2i = a[j1 + 1] + a[j3]; x3r = a[j1] + a[j3 + 1]; x3i = a[j1 + 1] - a[j3]; y0r = wk1r * x0r - wk1i * x0i; y0i = wk1r * x0i + wk1i * x0r; y2r = wk1i * x2r - wk1r * x2i; y2i = wk1i * x2i + wk1r * x2r; a[j0] = y0r + y2r; a[j0 + 1] = y0i + y2i; a[j1] = y0r - y2r; a[j1 + 1] = y0i - y2i; y0r = wk1i * x1r - wk1r * x1i; y0i = wk1i * x1i + wk1r * x1r; y2r = wk1r * x3r - wk1i * x3i; y2i = wk1r * x3i + wk1i * x3r; a[j2] = y0r - y2r; a[j2 + 1] = y0i - y2i; a[j3] = y0r + y2r; a[j3 + 1] = y0i + y2i; } void cftfx41(int n, double *a, int nw, double *w) { void cftf161(double *a, double *w); void cftf162(double *a, double *w); void cftf081(double *a, double *w); void cftf082(double *a, double *w); if (n == 128) { cftf161(a, &w[nw - 8]); cftf162(&a[32], &w[nw - 32]); cftf161(&a[64], &w[nw - 8]); cftf161(&a[96], &w[nw - 8]); } else { cftf081(a, &w[nw - 8]); cftf082(&a[16], &w[nw - 8]); cftf081(&a[32], &w[nw - 8]); cftf081(&a[48], &w[nw - 8]); } } void cftf161(double *a, double *w) { double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; wn4r = w[1]; wk1r = w[2]; wk1i = w[3]; x0r = a[0] + a[16]; x0i = a[1] + a[17]; x1r = a[0] - a[16]; x1i = a[1] - a[17]; x2r = a[8] + a[24]; x2i = a[9] + a[25]; x3r = a[8] - a[24]; x3i = a[9] - a[25]; y0r = x0r + x2r; y0i = x0i + x2i; y4r = x0r - x2r; y4i = x0i - x2i; y8r = x1r - x3i; y8i = x1i + x3r; y12r = x1r + x3i; y12i = x1i - x3r; x0r = a[2] + a[18]; x0i = a[3] + a[19]; x1r = a[2] - a[18]; x1i = a[3] - a[19]; x2r = a[10] + a[26]; x2i = a[11] + a[27]; x3r = a[10] - a[26]; x3i = a[11] - a[27]; y1r = x0r + x2r; y1i = x0i + x2i; y5r = x0r - x2r; y5i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y9r = wk1r * x0r - wk1i * x0i; y9i = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; y13r = wk1i * x0r - wk1r * x0i; y13i = wk1i * x0i + wk1r * x0r; x0r = a[4] + a[20]; x0i = a[5] + a[21]; x1r = a[4] - a[20]; x1i = a[5] - a[21]; x2r = a[12] + a[28]; x2i = a[13] + a[29]; x3r = a[12] - a[28]; x3i = a[13] - a[29]; y2r = x0r + x2r; y2i = x0i + x2i; y6r = x0r - x2r; y6i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y10r = wn4r * (x0r - x0i); y10i = wn4r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; y14r = wn4r * (x0r + x0i); y14i = wn4r * (x0i - x0r); x0r = a[6] + a[22]; x0i = a[7] + a[23]; x1r = a[6] - a[22]; x1i = a[7] - a[23]; x2r = a[14] + a[30]; x2i = a[15] + a[31]; x3r = a[14] - a[30]; x3i = a[15] - a[31]; y3r = x0r + x2r; y3i = x0i + x2i; y7r = x0r - x2r; y7i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y11r = wk1i * x0r - wk1r * x0i; y11i = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; y15r = wk1r * x0r - wk1i * x0i; y15i = wk1r * x0i + wk1i * x0r; x0r = y12r - y14r; x0i = y12i - y14i; x1r = y12r + y14r; x1i = y12i + y14i; x2r = y13r - y15r; x2i = y13i - y15i; x3r = y13r + y15r; x3i = y13i + y15i; a[24] = x0r + x2r; a[25] = x0i + x2i; a[26] = x0r - x2r; a[27] = x0i - x2i; a[28] = x1r - x3i; a[29] = x1i + x3r; a[30] = x1r + x3i; a[31] = x1i - x3r; x0r = y8r + y10r; x0i = y8i + y10i; x1r = y8r - y10r; x1i = y8i - y10i; x2r = y9r + y11r; x2i = y9i + y11i; x3r = y9r - y11r; x3i = y9i - y11i; a[16] = x0r + x2r; a[17] = x0i + x2i; a[18] = x0r - x2r; a[19] = x0i - x2i; a[20] = x1r - x3i; a[21] = x1i + x3r; a[22] = x1r + x3i; a[23] = x1i - x3r; x0r = y5r - y7i; x0i = y5i + y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); x0r = y5r + y7i; x0i = y5i - y7r; x3r = wn4r * (x0r - x0i); x3i = wn4r * (x0i + x0r); x0r = y4r - y6i; x0i = y4i + y6r; x1r = y4r + y6i; x1i = y4i - y6r; a[8] = x0r + x2r; a[9] = x0i + x2i; a[10] = x0r - x2r; a[11] = x0i - x2i; a[12] = x1r - x3i; a[13] = x1i + x3r; a[14] = x1r + x3i; a[15] = x1i - x3r; x0r = y0r + y2r; x0i = y0i + y2i; x1r = y0r - y2r; x1i = y0i - y2i; x2r = y1r + y3r; x2i = y1i + y3i; x3r = y1r - y3r; x3i = y1i - y3i; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x0r - x2r; a[3] = x0i - x2i; a[4] = x1r - x3i; a[5] = x1i + x3r; a[6] = x1r + x3i; a[7] = x1i - x3r; } void cftf162(double *a, double *w) { double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, x0r, x0i, x1r, x1i, x2r, x2i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; wn4r = w[1]; wk1r = w[4]; wk1i = w[5]; wk3r = w[6]; wk3i = -w[7]; wk2r = w[8]; wk2i = w[9]; x1r = a[0] - a[17]; x1i = a[1] + a[16]; x0r = a[8] - a[25]; x0i = a[9] + a[24]; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); y0r = x1r + x2r; y0i = x1i + x2i; y4r = x1r - x2r; y4i = x1i - x2i; x1r = a[0] + a[17]; x1i = a[1] - a[16]; x0r = a[8] + a[25]; x0i = a[9] - a[24]; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); y8r = x1r - x2i; y8i = x1i + x2r; y12r = x1r + x2i; y12i = x1i - x2r; x0r = a[2] - a[19]; x0i = a[3] + a[18]; x1r = wk1r * x0r - wk1i * x0i; x1i = wk1r * x0i + wk1i * x0r; x0r = a[10] - a[27]; x0i = a[11] + a[26]; x2r = wk3i * x0r - wk3r * x0i; x2i = wk3i * x0i + wk3r * x0r; y1r = x1r + x2r; y1i = x1i + x2i; y5r = x1r - x2r; y5i = x1i - x2i; x0r = a[2] + a[19]; x0i = a[3] - a[18]; x1r = wk3r * x0r - wk3i * x0i; x1i = wk3r * x0i + wk3i * x0r; x0r = a[10] + a[27]; x0i = a[11] - a[26]; x2r = wk1r * x0r + wk1i * x0i; x2i = wk1r * x0i - wk1i * x0r; y9r = x1r - x2r; y9i = x1i - x2i; y13r = x1r + x2r; y13i = x1i + x2i; x0r = a[4] - a[21]; x0i = a[5] + a[20]; x1r = wk2r * x0r - wk2i * x0i; x1i = wk2r * x0i + wk2i * x0r; x0r = a[12] - a[29]; x0i = a[13] + a[28]; x2r = wk2i * x0r - wk2r * x0i; x2i = wk2i * x0i + wk2r * x0r; y2r = x1r + x2r; y2i = x1i + x2i; y6r = x1r - x2r; y6i = x1i - x2i; x0r = a[4] + a[21]; x0i = a[5] - a[20]; x1r = wk2i * x0r - wk2r * x0i; x1i = wk2i * x0i + wk2r * x0r; x0r = a[12] + a[29]; x0i = a[13] - a[28]; x2r = wk2r * x0r - wk2i * x0i; x2i = wk2r * x0i + wk2i * x0r; y10r = x1r - x2r; y10i = x1i - x2i; y14r = x1r + x2r; y14i = x1i + x2i; x0r = a[6] - a[23]; x0i = a[7] + a[22]; x1r = wk3r * x0r - wk3i * x0i; x1i = wk3r * x0i + wk3i * x0r; x0r = a[14] - a[31]; x0i = a[15] + a[30]; x2r = wk1i * x0r - wk1r * x0i; x2i = wk1i * x0i + wk1r * x0r; y3r = x1r + x2r; y3i = x1i + x2i; y7r = x1r - x2r; y7i = x1i - x2i; x0r = a[6] + a[23]; x0i = a[7] - a[22]; x1r = wk1i * x0r + wk1r * x0i; x1i = wk1i * x0i - wk1r * x0r; x0r = a[14] + a[31]; x0i = a[15] - a[30]; x2r = wk3i * x0r - wk3r * x0i; x2i = wk3i * x0i + wk3r * x0r; y11r = x1r + x2r; y11i = x1i + x2i; y15r = x1r - x2r; y15i = x1i - x2i; x1r = y0r + y2r; x1i = y0i + y2i; x2r = y1r + y3r; x2i = y1i + y3i; a[0] = x1r + x2r; a[1] = x1i + x2i; a[2] = x1r - x2r; a[3] = x1i - x2i; x1r = y0r - y2r; x1i = y0i - y2i; x2r = y1r - y3r; x2i = y1i - y3i; a[4] = x1r - x2i; a[5] = x1i + x2r; a[6] = x1r + x2i; a[7] = x1i - x2r; x1r = y4r - y6i; x1i = y4i + y6r; x0r = y5r - y7i; x0i = y5i + y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[8] = x1r + x2r; a[9] = x1i + x2i; a[10] = x1r - x2r; a[11] = x1i - x2i; x1r = y4r + y6i; x1i = y4i - y6r; x0r = y5r + y7i; x0i = y5i - y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[12] = x1r - x2i; a[13] = x1i + x2r; a[14] = x1r + x2i; a[15] = x1i - x2r; x1r = y8r + y10r; x1i = y8i + y10i; x2r = y9r - y11r; x2i = y9i - y11i; a[16] = x1r + x2r; a[17] = x1i + x2i; a[18] = x1r - x2r; a[19] = x1i - x2i; x1r = y8r - y10r; x1i = y8i - y10i; x2r = y9r + y11r; x2i = y9i + y11i; a[20] = x1r - x2i; a[21] = x1i + x2r; a[22] = x1r + x2i; a[23] = x1i - x2r; x1r = y12r - y14i; x1i = y12i + y14r; x0r = y13r + y15i; x0i = y13i - y15r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[24] = x1r + x2r; a[25] = x1i + x2i; a[26] = x1r - x2r; a[27] = x1i - x2i; x1r = y12r + y14i; x1i = y12i - y14r; x0r = y13r - y15i; x0i = y13i + y15r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[28] = x1r - x2i; a[29] = x1i + x2r; a[30] = x1r + x2i; a[31] = x1i - x2r; } void cftf081(double *a, double *w) { double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; wn4r = w[1]; x0r = a[0] + a[8]; x0i = a[1] + a[9]; x1r = a[0] - a[8]; x1i = a[1] - a[9]; x2r = a[4] + a[12]; x2i = a[5] + a[13]; x3r = a[4] - a[12]; x3i = a[5] - a[13]; y0r = x0r + x2r; y0i = x0i + x2i; y2r = x0r - x2r; y2i = x0i - x2i; y1r = x1r - x3i; y1i = x1i + x3r; y3r = x1r + x3i; y3i = x1i - x3r; x0r = a[2] + a[10]; x0i = a[3] + a[11]; x1r = a[2] - a[10]; x1i = a[3] - a[11]; x2r = a[6] + a[14]; x2i = a[7] + a[15]; x3r = a[6] - a[14]; x3i = a[7] - a[15]; y4r = x0r + x2r; y4i = x0i + x2i; y6r = x0r - x2r; y6i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; x2r = x1r + x3i; x2i = x1i - x3r; y5r = wn4r * (x0r - x0i); y5i = wn4r * (x0r + x0i); y7r = wn4r * (x2r - x2i); y7i = wn4r * (x2r + x2i); a[8] = y1r + y5r; a[9] = y1i + y5i; a[10] = y1r - y5r; a[11] = y1i - y5i; a[12] = y3r - y7i; a[13] = y3i + y7r; a[14] = y3r + y7i; a[15] = y3i - y7r; a[0] = y0r + y4r; a[1] = y0i + y4i; a[2] = y0r - y4r; a[3] = y0i - y4i; a[4] = y2r - y6i; a[5] = y2i + y6r; a[6] = y2r + y6i; a[7] = y2i - y6r; } void cftf082(double *a, double *w) { double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; wn4r = w[1]; wk1r = w[2]; wk1i = w[3]; y0r = a[0] - a[9]; y0i = a[1] + a[8]; y1r = a[0] + a[9]; y1i = a[1] - a[8]; x0r = a[4] - a[13]; x0i = a[5] + a[12]; y2r = wn4r * (x0r - x0i); y2i = wn4r * (x0i + x0r); x0r = a[4] + a[13]; x0i = a[5] - a[12]; y3r = wn4r * (x0r - x0i); y3i = wn4r * (x0i + x0r); x0r = a[2] - a[11]; x0i = a[3] + a[10]; y4r = wk1r * x0r - wk1i * x0i; y4i = wk1r * x0i + wk1i * x0r; x0r = a[2] + a[11]; x0i = a[3] - a[10]; y5r = wk1i * x0r - wk1r * x0i; y5i = wk1i * x0i + wk1r * x0r; x0r = a[6] - a[15]; x0i = a[7] + a[14]; y6r = wk1i * x0r - wk1r * x0i; y6i = wk1i * x0i + wk1r * x0r; x0r = a[6] + a[15]; x0i = a[7] - a[14]; y7r = wk1r * x0r - wk1i * x0i; y7i = wk1r * x0i + wk1i * x0r; x0r = y0r + y2r; x0i = y0i + y2i; x1r = y4r + y6r; x1i = y4i + y6i; a[0] = x0r + x1r; a[1] = x0i + x1i; a[2] = x0r - x1r; a[3] = x0i - x1i; x0r = y0r - y2r; x0i = y0i - y2i; x1r = y4r - y6r; x1i = y4i - y6i; a[4] = x0r - x1i; a[5] = x0i + x1r; a[6] = x0r + x1i; a[7] = x0i - x1r; x0r = y1r - y3i; x0i = y1i + y3r; x1r = y5r - y7r; x1i = y5i - y7i; a[8] = x0r + x1r; a[9] = x0i + x1i; a[10] = x0r - x1r; a[11] = x0i - x1i; x0r = y1r + y3i; x0i = y1i - y3r; x1r = y5r + y7r; x1i = y5i + y7i; a[12] = x0r - x1i; a[13] = x0i + x1r; a[14] = x0r + x1i; a[15] = x0i - x1r; } void cftf040(double *a) { double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[4]; x0i = a[1] + a[5]; x1r = a[0] - a[4]; x1i = a[1] - a[5]; x2r = a[2] + a[6]; x2i = a[3] + a[7]; x3r = a[2] - a[6]; x3i = a[3] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x1r - x3i; a[3] = x1i + x3r; a[4] = x0r - x2r; a[5] = x0i - x2i; a[6] = x1r + x3i; a[7] = x1i - x3r; } void cftb040(double *a) { double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[4]; x0i = a[1] + a[5]; x1r = a[0] - a[4]; x1i = a[1] - a[5]; x2r = a[2] + a[6]; x2i = a[3] + a[7]; x3r = a[2] - a[6]; x3i = a[3] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x1r + x3i; a[3] = x1i - x3r; a[4] = x0r - x2r; a[5] = x0i - x2i; a[6] = x1r - x3i; a[7] = x1i + x3r; } void cftx020(double *a) { double x0r, x0i; x0r = a[0] - a[2]; x0i = a[1] - a[3]; a[0] += a[2]; a[1] += a[3]; a[2] = x0r; a[3] = x0i; } void rftfsub(int n, double *a, int nc, double *c) { int j, k, kk, ks, m; double wkr, wki, xr, xi, yr, yi; m = n >> 1; ks = 2 * nc / m; kk = 0; for (j = 2; j < m; j += 2) { k = n - j; kk += ks; wkr = 0.5 - c[nc - kk]; wki = c[kk]; xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr - wki * xi; yi = wkr * xi + wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; } } void rftbsub(int n, double *a, int nc, double *c) { int j, k, kk, ks, m; double wkr, wki, xr, xi, yr, yi; m = n >> 1; ks = 2 * nc / m; kk = 0; for (j = 2; j < m; j += 2) { k = n - j; kk += ks; wkr = 0.5 - c[nc - kk]; wki = c[kk]; xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr + wki * xi; yi = wkr * xi - wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; } } void dctsub(int n, double *a, int nc, double *c) { int j, k, kk, ks, m; double wkr, wki, xr; m = n >> 1; ks = nc / n; kk = 0; for (j = 1; j < m; j++) { k = n - j; kk += ks; wkr = c[kk] - c[nc - kk]; wki = c[kk] + c[nc - kk]; xr = wki * a[j] - wkr * a[k]; a[j] = wkr * a[j] + wki * a[k]; a[k] = xr; } a[m] *= c[0]; } void dstsub(int n, double *a, int nc, double *c) { int j, k, kk, ks, m; double wkr, wki, xr; m = n >> 1; ks = nc / n; kk = 0; for (j = 1; j < m; j++) { k = n - j; kk += ks; wkr = c[kk] - c[nc - kk]; wki = c[kk] + c[nc - kk]; xr = wki * a[k] - wkr * a[j]; a[k] = wkr * a[k] + wki * a[j]; a[j] = xr; } a[m] *= c[0]; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/fftsg.h��������������������������������������������������������������0000775�0000000�0000000�00000002154�12660066715�0017614�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: fftsg.h,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ * * Wrapper for rdft() and friends * * $Log$ */ #ifndef _FFTSG_H #define _FFTSG_H extern void rdft(int n, int isgn, double *a, int *ip, double *w); #endif /** !_FFTSG_H */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/���������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0017460�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/Example.cpp����������������������������������������������������0000664�0000000�0000000�00000001673�12660066715�0021566�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <vector> #include <omptl/omptl_numeric> #include <omptl/omptl_algorithm> #include <cstdlib> #include <cmath> #include <iostream> #include <omp.h> const unsigned N = 100 * (1 << 20); template <typename T> struct Sqrt { T operator()(const T &x) const { return std::sqrt(x); } }; int main (int argc, char * const argv[]) { // Number of threads is derived from environment // variable "OMP_NUM_THREADS" std::cout << "Threads: " << omp_get_max_threads() << std::endl; std::vector<int> v1(N); omptl::generate(v1.begin(), v1.end(), std::rand); omptl::sort(v1.begin(), v1.end()); omptl::random_shuffle(v1.begin(), v1.end()); std::vector<int> v2(N); omptl::transform(v1.begin(), v1.end(), v2.begin(), Sqrt<int>()); std::cout << "Nr 3's: " << omptl::count(v2.begin(), v2.end(), 3) << std::endl; std::cout << "Sum: " << omptl::accumulate(v2.begin(), v2.end(), 0) << std::endl; std::cout << *v1.begin() << std::endl; return 0; } ���������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/License.txt����������������������������������������������������0000664�0000000�0000000�00000063500�12660066715�0021607�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the library's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. <signature of Ty Coon>, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl����������������������������������������������������������0000664�0000000�0000000�00000002512�12660066715�0020536�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #ifndef OMPTL #define OMPTL 1 #ifndef _OPENMP #define par_generate generate #else #ifdef OMPTL_NO_DEBUG #define OMPTL_ASSERT(X) #else #include <cassert> #define OMPTL_ASSERT(X) assert(X) #endif // For debugging #ifndef _OMPTL_DEBUG_NO_OMP #include <omp.h> #else #define omp_get_max_threads() (2) #endif #endif /* ifndef _OPENMP */ struct _Pfunc { static unsigned Pfunc() { #ifdef _OPENMP assert(omp_get_max_threads() > 0); return omp_get_max_threads(); #else return 0; #endif } }; #endif /* OMPTL */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_algorithm������������������������������������������������0000664�0000000�0000000�00000057261�12660066715�0022617�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #ifndef OMPTL_ALGORITHM #define OMPTL_ALGORITHM 1 #include <algorithm> #include "omptl" namespace omptl { template <class ForwardIterator> ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class BinaryPredicate> ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T, class StrictWeakOrdering> bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result, const unsigned P = _Pfunc::Pfunc()); /* * Note: implementation assumes that * ::std::iterator_traits<InputIterator>::difference_type(0) will * return a difference_type representing zero. */ template <class InputIterator, class EqualityComparable> typename ::std::iterator_traits<InputIterator>::difference_type count(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class EqualityComparable, class Size> void count(InputIterator first, InputIterator last, const EqualityComparable& value, Size& n, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class Predicate> typename InputIterator::difference_type count_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class Predicate, class Size> void count_if(InputIterator first, InputIterator last, Predicate pred, Size& n, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2> bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T, class StrictWeakOrdering> ::std::pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> ::std::pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> void fill(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class OutputIterator, class Size, class T> OutputIterator fill_n(OutputIterator first, Size n, const T& value, const unsigned P = _Pfunc::Pfunc()); /* * find suffers from a loss of efficiency when executed in parallel! */ template<class InputIterator, class EqualityComparable> InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P = _Pfunc::Pfunc()); /* * find_if suffers from a loss of efficiency when executed in parallel! */ template<class InputIterator, class Predicate> InputIterator find_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate comp, const unsigned P = _Pfunc::Pfunc() ); template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const unsigned P = _Pfunc::Pfunc() ); /* * find_first_of suffers from a loss of efficiency when executed in parallel! */ template <class InputIterator, class ForwardIterator, class BinaryPredicate> InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class ForwardIterator> InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, const unsigned P = _Pfunc::Pfunc()); // Calls to UnaryFunction f must be completely independent template <class InputIterator, class UnaryFunction> UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f, const unsigned P = _Pfunc::Pfunc()); // Not parallellized, Generator is explicitly allowed and expected to return // different results on subsequent calls. Order is therefor respected unless // the programmer explicitly accepts responsibility and calls par_generate. template <class ForwardIterator, class Generator> void generate(ForwardIterator first, ForwardIterator last, Generator gen); template <class ForwardIterator, class Generator> void par_generate(ForwardIterator first, ForwardIterator last, Generator gen, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class StrictWeakOrdering> void push_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> void push_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class StrictWeakOrdering> inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class StrictWeakOrdering> void make_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> void make_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class StrictWeakOrdering> void sort_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> void sort_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); // Warning: includes loses some efficiency in parallel. template <class InputIterator1, class InputIterator2, class StrictWeakOrdering> bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2> bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, BinaryPredicate comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T, class StrictWeakOrdering> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class BinaryPredicate> ForwardIterator min_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator> ForwardIterator min_element(ForwardIterator first, ForwardIterator last, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class BinaryPredicate> ForwardIterator max_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator> ForwardIterator max_element(ForwardIterator first, ForwardIterator last, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class BinaryPredicate> ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2> ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class StrictWeakOrdering> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class StrictWeakOrdering> void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class RandomAccessIterator, class StrictWeakOrdering> RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class RandomAccessIterator> RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class Predicate> ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator, class StrictWeakOrdering> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator, class StrictWeakOrdering> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class Predicate> ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator> void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template <class RandomAccessIterator, class RandomNumberGenerator> void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator &rgen, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class Predicate> ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator, class Predicate> OutputIterator remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator, class T> OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator, class Predicate, class T> OutputIterator replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class Predicate, class T> void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last, const unsigned P = _Pfunc::Pfunc()); template <class BidirectionalIterator, class OutputIterator> OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator> ForwardIterator rotate( ForwardIterator first, ForwardIterator middle, ForwardIterator last, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class OutputIterator> OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); // search suffers from a loss of efficiency when executed in parallel! template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class Integer, class T, class BinaryPredicate> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Integer count, const T& value, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class Integer, class T> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Integer count, const T& value, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template<typename RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template<typename RandomAccessIterator, class StrictWeakOrdering> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template<typename RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last, const unsigned P = _Pfunc::Pfunc()); template<typename RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator1, class ForwardIterator2> ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator, class UnaryFunction> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class BinaryPredicate> ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator> ForwardIterator unique(ForwardIterator first, ForwardIterator last, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator, class BinaryPredicate> OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator> OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T, class StrictWeakOrdering> ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P = _Pfunc::Pfunc()); template <class ForwardIterator, class T> ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P = _Pfunc::Pfunc()); } // namespace omptl #ifdef _OPENMP #include "omptl_algorithm_par.h" #else #include "omptl_algorithm_ser.h" #endif #endif /* OMPTL_ALGORITHM */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_algorithm_par.h������������������������������������������0000664�0000000�0000000�00000203213�12660066715�0023675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include <functional> #include <utility> #include <cmath> #include <cstdlib> #include "omptl_tools.h" #include "omptl_numeric" #include <iterator> namespace omptl { /* * Not (yet) paralellized due to data dependance. */ template <class ForwardIterator> ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, const unsigned P) { return ::std::adjacent_find(first, last); } /* * Not (yet) paralellized due to data dependance. */ template <class ForwardIterator, class BinaryPredicate> ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred, const unsigned P) { return ::std::adjacent_find(first, last, binary_pred); } template <class ForwardIterator, class T, class StrictWeakOrdering> bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::binary_search(first, last, value, comp); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); bool result = 0; #pragma omp parallel for reduction(|:result) for (int t = 0; t < int(P); ++t) result |= ::std::binary_search(partitions[t].first, partitions[t].second, value, comp); return result; } template <class ForwardIterator, class T> bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { typedef typename ::std::iterator_traits<ForwardIterator>::value_type VT; return ::omptl::binary_search(first, last, value, ::std::less<VT>()); } template <class IteratorInTag, class IteratorOutTag> struct Copy_ { template <class IteratorIn, class IteratorOut> static IteratorOut _copy(IteratorIn first, IteratorIn last, IteratorOut result, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::copy(first, last, result); ::std::vector< ::std::pair<IteratorIn, IteratorIn> > source_partitions(P); ::omptl::_partition_range(first, last, source_partitions, P); ::std::vector<IteratorOut> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, result, dest_partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { IteratorOut tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::copy(source_partitions[t].first, source_partitions[t].second, dest_partitions[t]); } return result; } }; template <class IteratorOutTag> struct Copy_< ::std::input_iterator_tag, IteratorOutTag > { template <class InputIterator, class OutputIterator> static OutputIterator _copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::std::copy(first, last, result); } }; template <class IteratorInTag> struct Copy_<IteratorInTag, ::std::output_iterator_tag> { template <class InputIterator, class OutputIterator> static OutputIterator _copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::std::copy(first, last, result); } }; template <class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::omptl::Copy_< typename ::std::iterator_traits<InputIterator>::iterator_category, typename ::std::iterator_traits<OutputIterator>::iterator_category> ::_copy(first, last, result, P); } template <class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::copy_backward(first, last, result); ::std::vector< ::std::pair<BidirectionalIterator1, BidirectionalIterator1> > source_partitions(P); ::omptl::_partition_range(first, last, source_partitions, P); ::std::vector<BidirectionalIterator2> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, result, dest_partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { BidirectionalIterator2 tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::copy_backward( source_partitions[t].first, source_partitions[t].second, dest_partitions[t] ); } return result; } template <class IteratorTag> struct Count_ { template <class Iterator, class EqualityComparable> static typename ::std::iterator_traits<Iterator>::difference_type count(Iterator first, Iterator last, const EqualityComparable& value, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::count(first, last, value); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); typename ::std::iterator_traits<Iterator>::difference_type result = 0; #pragma omp parallel for reduction(+:result) for (int t = 0; t < int(P); ++t) result += ::std::count( partitions[t].first, partitions[t].second, value ); return result; } }; template <> struct Count_< ::std::input_iterator_tag > { template <class Iterator, class EqualityComparable> static typename ::std::iterator_traits<Iterator>::difference_type count(Iterator first, Iterator last, const EqualityComparable& value, const unsigned P) { return ::std::count(first, last, value); } }; template <class InputIterator, class EqualityComparable> typename ::std::iterator_traits<InputIterator>::difference_type count(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P) { return ::omptl::Count_<typename ::std::iterator_traits<InputIterator>::iterator_category>:: count(first, last, value, P); } template <class InputIterator, class EqualityComparable, class Size> void count(InputIterator first, InputIterator last, const EqualityComparable& value, Size& n, const unsigned P) { n = ::omptl::count(first, last, value, P); } template <class IteratorTag> struct Count_if_ { template <class Iterator, class Predicate> static typename ::std::iterator_traits<Iterator>::difference_type count_if(Iterator first, Iterator last, Predicate pred, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::count_if(first, last, pred); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); typename ::std::iterator_traits<Iterator>::difference_type result = 0; #pragma omp parallel for reduction(+:result) for (int t = 0; t < int(P); ++t) result += ::std::count_if(partitions[t].first, partitions[t].second, pred); return result; } }; template <> struct Count_if_< ::std::input_iterator_tag > { template <class InputIterator, class Predicate> typename ::std::iterator_traits<InputIterator>::difference_type static count_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P) { return ::std::count_if(first, last, pred); } }; template <class InputIterator, class Predicate> typename ::std::iterator_traits<InputIterator>::difference_type count_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P) { return ::omptl::Count_if_<typename ::std::iterator_traits<InputIterator>::iterator_category>:: count_if(first, last, pred, P); } template <class InputIterator, class Predicate, class Size> void count_if(InputIterator first, InputIterator last, Predicate pred, Size& n, const unsigned P) { n = ::omptl::count_if(first, last, pred, P); } template<class Iterator1Tag, class Iterator2Tag> struct Equal_ { template <class Iterator1, class Iterator2, class BinaryPredicate> static bool _equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, BinaryPredicate binary_pred, const unsigned P) { if (_linear_serial_is_faster(first1, last1, P)) return ::std::equal(first1, last1, first2, binary_pred); ::std::vector< ::std::pair<Iterator1, Iterator1> > source_partitions(P); ::omptl::_partition_range(first1, last1, source_partitions, P); ::std::vector<Iterator2> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, first2, dest_partitions, P); bool result = true; #pragma omp parallel for reduction(&:result) for (int t = 0; t < int(P); ++t) result &= ::std::equal( source_partitions[t].first, source_partitions[t].second, dest_partitions[t],binary_pred); return result; } }; template<class Iterator2Tag> struct Equal_<std::input_iterator_tag, Iterator2Tag> { template <class InputIterator1, class Iterator2, class BinaryPredicate> static bool _equal(InputIterator1 first1, InputIterator1 last1, Iterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::equal(first1, last1, first2, binary_pred); } }; template<class Iterator1Tag> struct Equal_<Iterator1Tag, std::input_iterator_tag> { template <class Iterator1, class InputIterator2, class BinaryPredicate> static bool _equal(Iterator1 first1, Iterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::equal(first1, last1, first2, binary_pred); } }; template<> struct Equal_<std::input_iterator_tag, std::input_iterator_tag> { template <class InputIterator1, class InputIterator2, class BinaryPredicate> static bool _equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::equal(first1, last1, first2, binary_pred); } }; template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { // return ::std::equal(first1, last1, first2, binary_pred); return ::omptl::Equal_< typename ::std::iterator_traits<InputIterator1>::iterator_category, typename ::std::iterator_traits<InputIterator2>::iterator_category> ::_equal(first1, last1, first2, binary_pred, P); } template <class InputIterator1, class InputIterator2> bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator1>::value_type VT; return ::omptl::equal(first1, last1, first2, ::std::equal_to<VT>()); } //TODO template <class ForwardIterator, class T, class StrictWeakOrdering> ::std::pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { return ::std::equal_range(first, last, value, comp); } template <class ForwardIterator, class T> ::std::pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { typedef typename ::std::iterator_traits<ForwardIterator>::value_type VT; return ::omptl::equal_range(first, last, value, ::std::less<VT>(), P); } template <class ForwardIterator, class T> void fill(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { assert(P > 0u); if (_linear_serial_is_faster(first, last, P)) { ::std::fill(first, last, value); return; } assert(std::distance(first, last) >= 0); assert(2*(int)P <= std::distance(first, last)); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) ::std::fill(partitions[t].first, partitions[t].second, value); } template <class IteratorTag> struct Fill_n_ { template <class Iterator, class Size, class T> static Iterator fill_n(Iterator first, Size n, const T& value, const unsigned P) { assert(P > 0u); Iterator last = first; std::advance(last, n); if (_linear_serial_is_faster(first, last, P)) return ::std::fill_n(first, n, value); const Size range = (n / P) + ( (n % P) ? 1 : 0 ); ::std::vector<Size> ranges(P); ::std::fill_n(ranges.begin(), P - 1, range); ranges[P - 1] = n - (P - 1) * range; ::std::vector<Iterator> partitions(P); partitions[0] = first; for (unsigned int i = 1; i < P; ++i) { partitions[i] = partitions[i - 1]; ::std::advance(partitions[i], range); } Iterator result; #pragma omp parallel for for (int t = 0; t < int(P); ++t) { Iterator tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::fill_n(partitions[t], ranges[t], value); } return result; } }; template <> struct Fill_n_< ::std::output_iterator_tag > { template <class OutputIterator, class Size, class T> static OutputIterator fill_n(OutputIterator first, Size n, const T& value, const unsigned P) { return ::std::fill_n(first, n, value); } }; template <class OutputIterator, class Size, class T> OutputIterator fill_n(OutputIterator first, Size n, const T& value, const unsigned P) { return ::omptl::Fill_n_<typename ::std::iterator_traits<OutputIterator>::iterator_category>:: fill_n(first, n, value, P); } template <class IteratorTag> struct Find_ { template <class Iterator, class EqualityComparable> static Iterator find(Iterator first, Iterator last, const EqualityComparable& value, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::find(first, last, value); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); std::vector<Iterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { results[t] = ::std::find(partitions[t].first, partitions[t].second, value); if (results[t] == partitions[t].second) results[t] = last; } typename std::vector<Iterator>::iterator result = ::std::find_if(results.begin(),results.end(), ::std::bind2nd(::std::not_equal_to<Iterator>(), last) ); if ( result != results.end() ) return *result; return last; } }; template <> struct Find_< ::std::input_iterator_tag > { template<class InputIterator, class EqualityComparable> static InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P) { return std::find(first, last, value); } }; template<class InputIterator, class EqualityComparable> InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P) { return ::omptl::Find_< typename ::std::iterator_traits<InputIterator>::iterator_category>:: find(first, last, value, P); } template <class IteratorTag> struct Find_if_ { template <class Iterator, class Predicate> static Iterator find_if(Iterator first, Iterator last, Predicate pred, const unsigned P, IteratorTag) { if (_linear_serial_is_faster(first, last, P)) return ::std::find_if(first, last, pred); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<Iterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { results[t] = ::std::find_if(partitions[t].first, partitions[t].second, pred); if (results[t] == partitions[t].second) results[t] = last; } const typename ::std::vector<Iterator>::iterator result = ::std::find_if(results.begin(), results.end(), ::std::bind2nd(::std::not_equal_to<Iterator>(), last) ); if ( result != results.end() ) return *result; return last; } }; template <> struct Find_if_< ::std::input_iterator_tag > { template <class InputIterator, class Predicate> static InputIterator _find_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P) { return ::std::find_if(first, last, pred); } }; template<class InputIterator, class Predicate> InputIterator find_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P) { return ::omptl::Find_if_<typename ::std::iterator_traits<InputIterator>::iterator_category>:: find_if(first, last, pred, P); } // TODO template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate comp, const unsigned P) { return ::std::find_end(first1, last1, first2, last2, comp); } template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const unsigned P) { // typedef typename ::std::iterator_traits<ForwardIterator1>::value_type VT; // return ::omptl::find_end(first1, last1, first2, last2, ::std::less<VT>()); return ::std::find_end(first1, last1, first2, last2); } // find_first_of suffers from a loss of efficiency, and potentially a loss of // performance when executed in parallel! template <class IteratorTag> struct Find_first_of_ { template <class Iterator, class ForwardIterator, class BinaryPredicate> static Iterator find_first_of(Iterator first1, Iterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp, const unsigned P) { if (_linear_serial_is_faster(first1, last1, P)) return ::std::find_first_of(first1, last1, first2, last2, comp); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first1, last1, partitions, P); ::std::vector<Iterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { results[t] = ::std::find_first_of(partitions[t].first, partitions[t].second, first2, last2, comp); if (results[t] == partitions[t].second) results[t] = last1; } const typename ::std::vector<Iterator>::iterator result = ::std::find_if(results.begin(),results.end(), ::std::bind2nd(::std::not_equal_to<Iterator>(), last1)); if ( result != results.end() ) return *result; return last1; } }; template <> struct Find_first_of_< ::std::input_iterator_tag > { template <class InputIterator, class ForwardIterator, class BinaryPredicate> static InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp, const unsigned P) { return ::std::find_first_of(first1, last1, first2, last2, comp); } }; template <class InputIterator, class ForwardIterator, class BinaryPredicate> InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp, const unsigned P) { return ::omptl::Find_first_of_<typename ::std::iterator_traits<InputIterator>::iterator_category>:: find_first_of(first1, last1, first2, last2, comp, P); } template <class InputIterator, class ForwardIterator> InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator>::value_type VT; return ::omptl::find_first_of(first1, last1, first2, last2, ::std::equal_to<VT>()); } template <class IteratorTag> struct For_each_ { template <class Iterator, class UnaryFunction> static UnaryFunction for_each(Iterator first, Iterator last, UnaryFunction f, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::for_each(first, last, f); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) ::std::for_each(partitions[t].first, partitions[t].second, f); return f; } }; template <> struct For_each_< ::std::input_iterator_tag > { template <class InputIterator, class UnaryFunction> static UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f, const unsigned P) { return ::std::for_each(first, last, f); } }; template <class InputIterator, class UnaryFunction> UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f, const unsigned P) { return ::omptl::For_each_<typename ::std::iterator_traits<InputIterator>::iterator_category>:: for_each(first, last, f, P); } template <class ForwardIterator, class Generator> void generate(ForwardIterator first, ForwardIterator last, Generator gen) { ::std::generate(first, last, gen); } template <class ForwardIterator, class Generator> void par_generate(ForwardIterator first, ForwardIterator last, Generator gen, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) { ::std::generate(first, last, gen); return; } ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) ::std::generate(partitions[t].first, partitions[t].second, gen); } template <class RandomAccessIterator, class StrictWeakOrdering> void push_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::push_heap(first, last, comp); } template <class RandomAccessIterator> void push_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<RandomAccessIterator>::value_type>(), return ::std::push_heap(first, last); } template <class RandomAccessIterator, class StrictWeakOrdering> inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::pop_heap(first, last, comp); } template <class RandomAccessIterator> inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<RandomAccessIterator>::value_type> return ::std::pop_heap(first, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void make_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::make_heap(first, last, comp); } template <class RandomAccessIterator> void make_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<RandomAccessIterator>::value_type>(), return ::std::make_heap(first, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void sort_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::sort_heap(first, last, comp); } template <class RandomAccessIterator> void sort_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<RandomAccessIterator>::value_type> return ::std::sort_heap(first, last); } template <class Iterator1Tag, class Iterator2Tag> struct Includes_ { template <class Iterator1, class Iterator2, class StrictWeakOrdering> static bool includes(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, StrictWeakOrdering comp, const unsigned P) { if (_linear_serial_is_faster(first2, last2, P)) return ::std::includes(first1, last1, first2, last2, comp); /* * Includes is parallelized by splitting the second range * (needles), rather than the first (the haystack). */ ::std::vector< ::std::pair<Iterator2, Iterator2> >partitions(P); ::omptl::_partition_range(first2, last2, partitions, P); bool result = true; // Hence, all needles should be found in the haystack #pragma omp parallel for reduction(&:result) for (int t = 0; t < int(P); ++t) result &= ::std::includes(first1, last1, partitions[t].first, partitions[t].second, comp); return result; } }; template <class Iterator2Tag> struct Includes_< ::std::input_iterator_tag, Iterator2Tag > { template <class InputIterator1, class Iterator2, class StrictWeakOrdering> static bool includes(InputIterator1 first1, InputIterator1 last1, Iterator2 first2, Iterator2 last2, StrictWeakOrdering comp, const unsigned P) { return ::std::includes(first1, last1, first2, last2, comp); } }; template <class Iterator1Tag> struct Includes_<Iterator1Tag, ::std::input_iterator_tag> { template <class Iterator1, class InputIterator2, class StrictWeakOrdering> static bool includes(Iterator1 first1, Iterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering comp, const unsigned P) { return ::std::includes(first1, last1, first2, last2, comp); } }; template <> struct Includes_< ::std::input_iterator_tag, ::std::input_iterator_tag > { template <class InputIterator1, class InputIterator2, class StrictWeakOrdering> static bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering comp, const unsigned P) { return ::std::includes(first1, last1, first2, last2, comp); } }; template <class InputIterator1, class InputIterator2, class StrictWeakOrdering> bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering comp, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator1>::iterator_category IC1; typedef typename ::std::iterator_traits<InputIterator2>::iterator_category IC2; return ::omptl::Includes_<IC1, IC2> ::includes(first1, last1, first2, last2, comp, P); } template <class InputIterator1, class InputIterator2> bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator1>::value_type VT; return ::omptl::includes(first1, last1, first2, last2, ::std::less<VT>()); } template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, BinaryPredicate comp, const unsigned P) { return ::std::lexicographical_compare(first1, last1, first2, last2, comp); } template <class InputIterator1, class InputIterator2> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<InputIterator1>::value_type> return ::std::lexicographical_compare(first1, last1, first2, last2); } template <class ForwardIterator, class T, class StrictWeakOrdering> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { if (_logn_serial_is_faster(first, last, P)) return ::std::lower_bound(first, last, value, comp); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<ForwardIterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = ::std::lower_bound(partitions[t].first, partitions[t].second, value, comp); const typename ::std::vector<ForwardIterator>::iterator result = ::std::find_if(results.begin(), results.end(), ::std::bind2nd(::std::not_equal_to<ForwardIterator>(), last) ); if (result != results.end()) return *result; return last; } template <class ForwardIterator, class T> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::omptl::lower_bound(first, last, value, ::std::less<T>(), P); } // Not parallelized, dependencies between data. template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::merge(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<InputIterator1>::value_type> return ::std::merge(first1, last1, first2, last2, result); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator min_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::min_element(first, last, comp); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<ForwardIterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = ::std::min_element(partitions[t].first, partitions[t].second, comp); ForwardIterator result = results[0]; for (unsigned int i = 1; i < P; ++i) if ( (result != last) && (results[i] != last) && comp(*results[i], *result) ) result = results[i]; return result; } template <class ForwardIterator> ForwardIterator min_element(ForwardIterator first, ForwardIterator last, const unsigned P) { typedef typename ::std::iterator_traits<ForwardIterator>::value_type value_type; return ::omptl::min_element(first, last, ::std::less<value_type>(), P); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator max_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::max_element(first, last, comp); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<ForwardIterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = ::std::max_element(partitions[t].first, partitions[t].second, comp); ForwardIterator result = results[0]; for (unsigned int i = 1; i < P; ++i) { if ( (result != last) && (results[i] != last) && comp(*result, *results[i]) ) result = results[i]; } return result; } template <class ForwardIterator> ForwardIterator max_element(ForwardIterator first, ForwardIterator last, const unsigned P) { typedef typename ::std::iterator_traits<ForwardIterator>::value_type value_type; return ::omptl::max_element(first, last, ::std::less<value_type>(), P); } template <class Iterator1Tag, class Iterator2Tag> struct Mismatch_ { template <class Iterator1, class Iterator2, class BinaryPredicate> static ::std::pair<Iterator1, Iterator2> mismatch(Iterator1 first1, Iterator1 last1, Iterator2 first2, BinaryPredicate binary_pred, const unsigned P) { if (_linear_serial_is_faster(first1, last1, P)) return ::std::mismatch(first1, last1, first2, binary_pred); ::std::vector< ::std::pair<Iterator1, Iterator1> > source_partitions(P); ::omptl::_partition_range(first1, last1, source_partitions, P); ::std::vector<Iterator2> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, first2, dest_partitions, P); ::std::vector< ::std::pair<Iterator1, Iterator2> > results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = ::std::mismatch(source_partitions[t].first, source_partitions[t].second, dest_partitions[t], binary_pred); // This could have been done more elegantly with select1st for (unsigned int i = 0; i < P - 1; ++i) if (results[i].first != source_partitions[i].second) return results[i]; return results[P - 1]; } }; template <class Iterator1Tag> struct Mismatch_<Iterator1Tag, ::std::input_iterator_tag > { template <class InputIterator1, class InputIterator2, class BinaryPredicate> static ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::mismatch(first1, last1, first2, binary_pred); } }; template <class Iterator2Tag> struct Mismatch_< ::std::input_iterator_tag, Iterator2Tag > { template <class InputIterator1, class InputIterator2, class BinaryPredicate> static ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::mismatch(first1, last1, first2, binary_pred); } }; template <> struct Mismatch_< ::std::input_iterator_tag, ::std::input_iterator_tag > { template <class InputIterator1, class InputIterator2, class BinaryPredicate> static ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::mismatch(first1, last1, first2, binary_pred); } }; template <class InputIterator1, class InputIterator2, class BinaryPredicate> ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::omptl::Mismatch_< typename ::std::iterator_traits<InputIterator1>::iterator_category, typename ::std::iterator_traits<InputIterator2>::iterator_category>:: mismatch(first1, last1, first2, binary_pred, P); } template <class InputIterator1, class InputIterator2> ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator1>::value_type VT; return ::omptl::mismatch(first1, last1, first2,::std::equal_to<VT>(),P); } // TODO How can this be parallelized ? template <class RandomAccessIterator, class StrictWeakOrdering> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::nth_element(first, nth, last, comp); } template <class RandomAccessIterator> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, const unsigned P) { // typedef typename // ::std::iterator_traits<RandomAccessIterator>::value_type // ::std::less<VT> ::std::nth_element(first, nth, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { const typename ::std::iterator_traits<RandomAccessIterator>::difference_type N = ::std::distance(first, last); assert(N >= 0); if (2*(int)P < N) { ::omptl::_pivot_range(first, last, *middle); ::omptl::sort(first, middle, comp, P); } else ::std::partial_sort(first, last, middle); } template <class RandomAccessIterator> void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, const unsigned P) { typedef typename ::std::iterator_traits<RandomAccessIterator>::value_type VT; ::omptl::partial_sort(first, middle, last, ::std::less<VT>(), P); } // Not parallelized due to dependencies. template <class InputIterator, class RandomAccessIterator, class StrictWeakOrdering> RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, StrictWeakOrdering comp, const unsigned P) { return ::std::partial_sort_copy(first, last, result_first, result_last, comp); } // Not parallelized due to dependencies. template <class InputIterator, class RandomAccessIterator> RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<InputIterator>::value_type>(), return ::std::partial_sort_copy(first, last, result_first, result_last); } // Not (yet) parallelized, not straightforward due to possible dependencies // between subtasks. template <class ForwardIterator, class Predicate> ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P) { return ::std::partition(first, last, pred); } // Not (yet) parallelized, not straightforward due to possible dependencies // between subtasks. template <class ForwardIterator, class Predicate> ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P) { return ::std::stable_partition(first, last, pred); } template <class BidirectionalIterator, class StrictWeakOrdering> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::next_permutation(first, last, comp); } template <class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<BidirectionalIterator>::value_type> return ::std::next_permutation(first, last); } template <class BidirectionalIterator, class StrictWeakOrdering> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::prev_permutation(first, last, comp); } template <class BidirectionalIterator> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, const unsigned P) { // ::std::less<typename // ::std::iterator_traits<BidirectionalIterator>::value_type>(), return ::std::prev_permutation(first, last); } template <class RandomAccessIterator> void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { ::std::random_shuffle(first, last); } template <class RandomAccessIterator, class RandomNumberGenerator> void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rgen, const unsigned P) { ::std::random_shuffle(first, last, rgen); } // Not (yet) parallelized, not straightforward due to possible dependencies // between subtasks. template <class ForwardIterator, class T> ForwardIterator remove( ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::std::remove(first, last, value); } // Not (yet) parallelized, not straightforward due to possible dependencies // between subtasks. template <class ForwardIterator, class Predicate> ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P) { return ::std::remove_if(first, last, pred); } // Not parallelized due to possible complications with OutputIterators. // No par_remove_copy exists due to possible dependencies between subtasks. template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value, const unsigned P) { return ::std::remove_copy(first, last, result, value); } // Not parallelized due to possible complications with OutputIterators. // No par_remove_copy_if exists due to possible dependencies between subtasks. template <class InputIterator, class OutputIterator, class Predicate> OutputIterator remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const unsigned P) { return ::std::remove_copy(first, last, result, pred); } template <class ForwardIterator, class T> void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) { ::std::replace(first, last, old_value, new_value); return; } ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) ::std::replace(partitions[t].first, partitions[t].second, old_value, new_value); } template <class Iterator1Tag, class Iterator2Tag> struct Replace_copy_if_ { template <class Iterator1, class Iterator2, class Predicate, class T> static Iterator2 replace_copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Predicate pred, const T& new_value, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::replace_copy_if(first, last, result, pred, new_value); ::std::vector< ::std::pair<Iterator1, Iterator1> > source_partitions(P); ::omptl::_partition_range(first, last, source_partitions, P); ::std::vector<Iterator2> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, result, dest_partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { Iterator2 tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::replace_copy_if( source_partitions[t].first, source_partitions[t].second, dest_partitions[t], pred, new_value); } return result; } }; template <class Iterator2Tag> struct Replace_copy_if_< ::std::input_iterator_tag, Iterator2Tag> { template <class Iterator1, class Iterator2, class Predicate, class T> static Iterator2 replace_copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Predicate pred, const T& new_value, const unsigned P) { return ::std::replace_copy_if(first, last, result, pred, new_value); } }; template <class Iterator1Tag> struct Replace_copy_if_< Iterator1Tag, ::std::output_iterator_tag> { template <class Iterator1, class OutputIterator, class Predicate, class T> static OutputIterator replace_copy_if(Iterator1 first, Iterator1 last, OutputIterator result, Predicate pred, const T& new_value, const unsigned P) { return ::std::replace_copy_if(first, last, result, pred, new_value); } }; template <> struct Replace_copy_if_< ::std::input_iterator_tag, ::std::output_iterator_tag> { template <class InputIterator, class OutputIterator, class Predicate, class T> static OutputIterator replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value, const unsigned P) { return ::std::replace_copy_if(first, last, result, pred, new_value); } }; template <class InputIterator, class OutputIterator, class Predicate, class T> OutputIterator replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value, const unsigned P) { return ::omptl::Replace_copy_if_< typename ::std::iterator_traits< InputIterator>::iterator_category, typename ::std::iterator_traits<OutputIterator>::iterator_category> ::replace_copy_if(first, last, result, pred, new_value, P); } template <class InputIterator, class OutputIterator, class T> OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value, const unsigned P) { return ::omptl::replace_copy_if(first, last, result, ::std::bind2nd(::std::equal_to<T>(), old_value), new_value, P); } template <class ForwardIterator, class Predicate, class T> void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::replace_if(first, last, pred, new_value); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) ::std::replace_if(partitions[t].first, partitions[t].second, pred, new_value); } // TODO template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last, const unsigned P) { ::std::reverse(first, last); } // TODO template <class BidirectionalIterator, class OutputIterator> OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result, const unsigned P) { return ::std::reverse_copy(first, last, result); } // TODO template <class ForwardIterator> ForwardIterator rotate( ForwardIterator first, ForwardIterator middle, ForwardIterator last, const unsigned P) { return ::std::rotate(first, middle, last); } // TODO template <class ForwardIterator, class OutputIterator> OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result, const unsigned P) { return ::std::rotate(first, middle, last, result); } /* This can't be right - partitioning the range might cut valid subsequences in [first1-last1] template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred, const unsigned P) { if (_linear_serial_is_faster(first1, last1, P)) return ::std::search(first1, last1, first2, last2, binary_pred); ::std::vector< ::std::pair<ForwardIterator1, ForwardIterator1> > partitions(P); ::omptl::_partition_range(first1, last1, partitions, P); ::std::vector<ForwardIterator1> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { results[t] = ::std::search(partitions[t].first, partitions[t].second, first2, last2, binary_pred); } const typename ::std::vector<ForwardIterator1>::iterator result = ::std::find_if(results.begin(), results.end(), ::std::bind2nd(::std::not_equal_to<ForwardIterator1>(), last1)); if (result != results.end()) return *result; return last1; } */ template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred, const unsigned P) { return ::std::search(first1, last1, first2, last2, binary_pred); } template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const unsigned P) { // typedef typename // ::std::iterator_traits<ForwardIterator1>::value_type VT; // return ::omptl::search(first1, last1, first2, last2, // ::std::equal_to<VT>(), P); return ::std::search(first1, last1, first2, last2); } // TODO template <class ForwardIterator, class Integer, class T, class BinaryPredicate> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Integer count, const T& value, BinaryPredicate binary_pred, const unsigned P) { return ::std::search_n(first, last, count, value, binary_pred); } template <class ForwardIterator, class Integer, class T> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Integer count, const T& value, const unsigned P) { // ::std::equal_to<typename // ::std::iterator_traits<ForwardIterator>::value_type> return ::std::search_n(first, last, count, value); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_difference(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_difference(first1, last1, first2, last2, result); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_intersection( first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_intersection( first1, last1, first2, last2, result); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_symmetric_difference( first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_symmetric_difference( first1, last1, first2, last2, result); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_union(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_union(first1, last1, first2, last2, result); } template<typename RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { if ( ::omptl::_nlogn_serial_is_faster(first, last, P) ) { ::std::sort(first, last, comp); return; } // Generate pivots typedef typename ::std::iterator_traits<RandomAccessIterator>::value_type value_type; ::std::vector<value_type> pivots; _find_pivots(first, last, pivots, P); // Sort sufficiently to respect pivot order ::std::vector< ::std::pair<RandomAccessIterator, RandomAccessIterator> > partitions(P); ::omptl::_partition_range_by_pivots(first, last, pivots, partitions, comp, P); // Sort #pragma omp parallel for for (int t = 0; t < int(P); ++t) ::std::sort(partitions[t].first, partitions[t].second, comp); } template<typename RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { typedef typename ::std::iterator_traits<RandomAccessIterator>::value_type VT; ::omptl::sort(first, last, std::less<VT>(), P); } /* template<typename RandomAccessIterator, class StrictWeakOrdering> void _par_stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { if ( ::omptl::_nlogn_serial_is_faster(first, last, P) ) { ::std::stable_sort(first, last, comp); return; } // Generate pivots ::std::vector<typename ::std::iterator_traits<RandomAccessIterator>::value_type> pivots; _find_pivots(first, last, pivots, P); // Sort sufficiently to respect pivot order ::std::vector< ::std::pair<RandomAccessIterator, RandomAccessIterator> > partitions(P); ::omptl::_partition_range_stable_by_pivots(first, last, pivots, partitions, comp, P); // Sort #pragma omp parallel for // default(none) shared(partitions) for (int t = 0; t < int(P); ++t) ::std::stable_sort(partitions[t].first, partitions[t].second, comp); } template<typename RandomAccessIterator, class StrictWeakOrdering> void _stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::stable_sort(first, last, comp); } template<typename RandomAccessIterator> void _stable_sort(RandomAccessIterator first, RandomAccessIterator last, std::less<typename ::std::iterator_traits<RandomAccessIterator>::value_type> comp, const unsigned P) { ::omptl::_par_stable_sort(first, last, comp, P); } // template<typename RandomAccessIterator> // void _stable_sort(RandomAccessIterator first, RandomAccessIterator last, // std::greater< // typename ::std::iterator_traits<RandomAccessIterator>::value_type> comp, // const unsigned P) // { // ::omptl::_par_stable_sort(first, last, comp, P); // } */ template<typename RandomAccessIterator, class StrictWeakOrdering> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::stable_sort(first, last, comp); } template<typename RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { typedef typename ::std::iterator_traits<RandomAccessIterator>::value_type VT; ::omptl::stable_sort(first, last, std::less<VT>(), P); } template <class ForwardIterator1, class ForwardIterator2> ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, const unsigned P) { if (_linear_serial_is_faster(first1, last1, P)) return ::std::swap_ranges(first1, last1, first2); ::std::vector< ::std::pair<ForwardIterator1, ForwardIterator1> > source_partitions(P); ::omptl::_partition_range(first1, last1, source_partitions, P); ::std::vector<ForwardIterator2> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, first2, dest_partitions, P); ForwardIterator2 result; #pragma omp parallel for for (int t = 0; t < int(P); ++t) { ForwardIterator2 tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::swap_ranges(source_partitions[t].first, source_partitions[t].second, dest_partitions[t]); } return result; } template <class IteratorInTag, class IteratorOutTag> struct Transform_ { template <class IteratorIn, class IteratorOut, class UnaryFunction> static IteratorOut transform(IteratorIn first, IteratorIn last, IteratorOut result, UnaryFunction op, const unsigned P) { if (_linear_serial_is_faster(first, last, P)) return ::std::transform(first, last, result, op); ::std::vector< ::std::pair<IteratorIn, IteratorIn> > source_partitions(P); ::omptl::_partition_range(first, last, source_partitions, P); ::std::vector<IteratorOut> dest_partitions(P); ::omptl::_copy_partitions(source_partitions, result, dest_partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { IteratorOut tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::transform(source_partitions[t].first, source_partitions[t].second, dest_partitions[t], op); } return result; } }; template <class IteratorInTag> struct Transform_<IteratorInTag, ::std::output_iterator_tag> { template <class InputIterator, class OutputIterator, class UnaryFunction> static OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op, const unsigned P) { return ::std::transform(first, last, result, op); } }; template <class IteratorOutTag> struct Transform_< ::std::input_iterator_tag, IteratorOutTag > { template <class InputIterator, class OutputIterator, class UnaryFunction> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op, const unsigned P) { return ::std::transform(first, last, result, op); } }; template <> struct Transform_< ::std::input_iterator_tag, ::std::output_iterator_tag > { template <class InputIterator, class OutputIterator, class UnaryFunction> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op, const unsigned P) { return ::std::transform(first, last, result, op); } }; template <class InputIterator, class OutputIterator, class UnaryFunction> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op, const unsigned P) { return ::omptl::Transform_< typename ::std::iterator_traits< InputIterator>::iterator_category, typename ::std::iterator_traits<OutputIterator>::iterator_category>:: transform(first, last, result, op, P); } template <class Iterator1Tag, class Iterator2Tag, class IteratorOutTag> struct Transform2_ { template <class Iterator1, class Iterator2, class IteratorOut, class BinaryFunction> static IteratorOut transform(Iterator1 first1, Iterator1 last1, Iterator2 first2, IteratorOut result, BinaryFunction binary_op, const unsigned P) { if (_linear_serial_is_faster(first1, last1, P)) return ::std::transform(first1, last1, first2, result, binary_op); ::std::vector< ::std::pair<Iterator1, Iterator1> > source_partitions1(P); ::omptl::_partition_range(first1, last1, source_partitions1, P); ::std::vector<Iterator2> source_partitions2(P); ::omptl::_copy_partitions(source_partitions1, first2, source_partitions2 , P); ::std::vector<IteratorOut> dest_partitions(P); ::omptl::_copy_partitions(source_partitions1, result, dest_partitions, P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) { IteratorOut tmp; *( (t == int(P-1)) ? &result : &tmp ) = ::std::transform(source_partitions1[t].first, source_partitions1[t].second, source_partitions2[t], dest_partitions[t], binary_op); } return result; } }; template <class Iterator2Tag, class IteratorOutTag> struct Transform2_< ::std::input_iterator_tag, Iterator2Tag, IteratorOutTag > { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <class Iterator1Tag, class IteratorOutTag> struct Transform2_< Iterator1Tag, ::std::input_iterator_tag, IteratorOutTag > { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <class Iterator1Tag, class Iterator2Tag> struct Transform2_< Iterator1Tag, Iterator2Tag, ::std::output_iterator_tag> { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <class IteratorOutTag> struct Transform2_< ::std::input_iterator_tag, ::std::input_iterator_tag, IteratorOutTag > { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <class Iterator1Tag> struct Transform2_< Iterator1Tag, ::std:: input_iterator_tag, ::std::output_iterator_tag > { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <class Iterator2Tag> struct Transform2_< ::std:: input_iterator_tag, Iterator2Tag, ::std::output_iterator_tag > { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <> struct Transform2_< ::std:: input_iterator_tag, ::std:: input_iterator_tag, ::std::output_iterator_tag > { template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> static OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } }; template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::omptl::Transform2_< typename ::std::iterator_traits<InputIterator1>::iterator_category, typename ::std::iterator_traits<InputIterator2>::iterator_category, typename ::std::iterator_traits<OutputIterator>::iterator_category>:: transform(first1, last1, first2, result, binary_op, P); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred, const unsigned P) { return ::std::unique(first, last, binary_pred); } template <class ForwardIterator> ForwardIterator unique(ForwardIterator first, ForwardIterator last, const unsigned P) { // ::std::equal_to<typename // ::std::iterator_traits<ForwardIterator>::value_type>(), return ::std::unique(first, last); } template <class InputIterator, class OutputIterator, class BinaryPredicate> OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred, const unsigned P) { return ::std::unique_copy(first, last, result, binary_pred); } template <class InputIterator, class OutputIterator> OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { // ::std::equal_to<typename // ::std::iterator_traits<InputIterator>::value_type>(), return ::std::unique_copy(first, last, result); } template <class ForwardIterator, class T, class StrictWeakOrdering> ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { if (_logn_serial_is_faster(first, last, P)) return ::std::upper_bound(first, last, value, comp); ::std::vector< ::std::pair<ForwardIterator, ForwardIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<ForwardIterator> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = ::std::upper_bound(partitions[t].first, partitions[t].second, value, comp); // There has to be a better way... for (unsigned int i = P - 1; i > 0; --i) if (results[i] != partitions[i].second) return results[i]; return results[0]; } template <class ForwardIterator, class T> ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { typedef typename ::std::iterator_traits<ForwardIterator>::value_type VT; return ::omptl::upper_bound(first, last, value, ::std::less<VT>(), P); } } /* namespace omptl */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_algorithm_ser.h������������������������������������������0000664�0000000�0000000�00000063305�12660066715�0023712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA namespace omptl { template <class ForwardIterator> ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, const unsigned P) { return ::std::adjacent_find(first, last); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred, const unsigned P) { return ::std::adjacent_find(first, last, binary_pred); } template <class ForwardIterator, class T, class StrictWeakOrdering> bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { return ::std::binary_search(first, last, value, comp); } template <class ForwardIterator, class T> bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::std::binary_search(first, last, value); } template <class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::std::copy(first, last, result); } template <class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result, const unsigned P) { return ::std::copy_backward(first, last, result); } template <class InputIterator, class EqualityComparable> typename ::std::iterator_traits<InputIterator>::difference_type count(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P) { return ::std::count(first, last, value); } template <class InputIterator, class EqualityComparable, class Size> void count(InputIterator first, InputIterator last, const EqualityComparable& value, Size& n, const unsigned P) { return ::std::count_if(first, last, value, n); } template <class InputIterator, class Predicate> typename InputIterator::difference_type count_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P) { return ::std::count_if(first, last, pred); } template <class InputIterator, class Predicate, class Size> void count_if(InputIterator first, InputIterator last, Predicate pred, Size& n, const unsigned P) { return ::std::count_if(first, last, pred, n); } template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::equal(first1, last1, first2, binary_pred); } template <class InputIterator1, class InputIterator2> bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P) { return ::std::equal(first1, last1, first2); } template <class ForwardIterator, class T, class StrictWeakOrdering> ::std::pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { return ::std::equal_range(first, last, value, comp); } template <class ForwardIterator, class T> ::std::pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::std::equal_range(first, last, value); } template <class ForwardIterator, class T> void fill(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { ::std::fill(first, last, value); } template <class OutputIterator, class Size, class T> OutputIterator fill_n(OutputIterator first, Size n, const T& value, const unsigned P) { return ::std::fill_n(first, n, value); } template<class InputIterator, class EqualityComparable> InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value, const unsigned P) { return ::std::find(first, last, value); } template<class InputIterator, class Predicate> InputIterator find_if(InputIterator first, InputIterator last, Predicate pred, const unsigned P) { return ::std::find_if(first, last, pred); } template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate comp, const unsigned P) { return ::std::find_end(first1, last1, first2, last2, comp); } template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const unsigned P) { return ::std::find_end(first1, last1, first2, last2); } template <class InputIterator, class ForwardIterator, class BinaryPredicate> InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp, const unsigned P) { return ::std::find_first_of(first1, last1, first2, last2, comp); } template <class InputIterator, class ForwardIterator> InputIterator find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, const unsigned P) { return ::std::find_first_of(first1, last1, first2, last2); } template <class InputIterator, class UnaryFunction> UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f, const unsigned P) { return ::std::for_each(first, last, f); } template <class ForwardIterator, class Generator> void generate(ForwardIterator first, ForwardIterator last, Generator gen) { ::std::generate(first, last, gen); } template <class ForwardIterator, class Generator> void par_generate(ForwardIterator first, ForwardIterator last, Generator gen, const unsigned P) { ::std::generate(first, last, gen); } template <class RandomAccessIterator, class StrictWeakOrdering> void push_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::push_heap(first, last, comp); } template <class RandomAccessIterator> void push_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { ::std::push_heap(first, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void pop_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::pop_heap(first, last, comp); } template <class RandomAccessIterator> void pop_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { ::std::pop_heap(first, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void make_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::make_heap(first, last, comp); } template <class RandomAccessIterator> void make_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { ::std::make_heap(first, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void sort_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { ::std::sort_heap(first, last, comp); } template <class RandomAccessIterator> void sort_heap(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { ::std::sort_heap(first, last); } template <class InputIterator1, class InputIterator2, class StrictWeakOrdering> bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering comp, const unsigned P) { return ::std::includes(first1, last1, first2, last2, comp); } template <class InputIterator1, class InputIterator2> bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, const unsigned P) { return ::std::includes(first1, last1, first2, last2); } template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, BinaryPredicate comp, const unsigned P) { return ::std::lexicographical_compare(first1, last1, first2, last2, comp); } template <class InputIterator1, class InputIterator2> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, const unsigned P) { return ::std::lexicographical_compare(first1, last1, first2, last2); } template <class ForwardIterator, class T, class StrictWeakOrdering> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { return ::std::lower_bound(first, last, value, comp); } template <class ForwardIterator, class T> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::std::lower_bound(first, last, value); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::mismatch(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::mismatch(first1, last1, first2, last2, result); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator min_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp, const unsigned P) { return ::std::min_element(first, last, comp); } template <class ForwardIterator> ForwardIterator min_element(ForwardIterator first, ForwardIterator last, const unsigned P) { return ::std::min_element(first, last); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator max_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp, const unsigned P) { return ::std::max_element(first, last, comp); } template <class ForwardIterator> ForwardIterator max_element(ForwardIterator first, ForwardIterator last, const unsigned P) { return ::std::max_element(first, last); } template <class InputIterator1, class InputIterator2, class BinaryPredicate> ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred, const unsigned P) { return ::std::mismatch(first1, last1, first2, binary_pred); } template <class InputIterator1, class InputIterator2> ::std::pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P) { return ::std::mismatch(first1, last1, first2); } template <class RandomAccessIterator, class StrictWeakOrdering> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::nth_element(first, nth, last, comp); } template <class RandomAccessIterator> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, const unsigned P) { return ::std::nth_element(first, nth, last); } template <class RandomAccessIterator, class StrictWeakOrdering> void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::partial_sort(first, middle, last, comp); } template <class RandomAccessIterator> void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, const unsigned P) { return ::std::partial_sort(first, middle, last); } template <class InputIterator, class RandomAccessIterator, class StrictWeakOrdering> RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, StrictWeakOrdering comp, const unsigned P) { return ::std::partial_sort_copy(first, last, result_first, result_last, comp); } template <class InputIterator, class RandomAccessIterator> RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, const unsigned P) { return ::std::partial_sort_copy(first, last, result_first, result_last); } template <class ForwardIterator, class Predicate> ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P) { return ::std::partition(first, last, pred); } template <class BidirectionalIterator, class StrictWeakOrdering> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::next_permutation(first, last, comp); } template <class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, const unsigned P) { return ::std::next_permutation(first, last); } template <class BidirectionalIterator, class StrictWeakOrdering> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::prev_permutation(first, last, comp); } template <class BidirectionalIterator> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, const unsigned P) { return ::std::prev_permutation(first, last); } template <class ForwardIterator, class Predicate> ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P) { return ::std::stable_partition(first, last, pred); } template <class RandomAccessIterator> void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { return ::std::random_shuffle(first, last); } template <class RandomAccessIterator, class RandomNumberGenerator> void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator &rgen, const unsigned P) { return ::std::random_shuffle(first, last, rgen); } template <class ForwardIterator, class T> ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::std::remove(first, last, value); } template <class ForwardIterator, class Predicate> ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, Predicate pred, const unsigned P) { return ::std::remove_if(first, last, pred); } template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value, const unsigned P) { return ::std::remove_copy(first, last, result, value); } template <class InputIterator, class OutputIterator, class Predicate> OutputIterator remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const unsigned P) { return ::std::remove_copy_if(first, last, result, pred); } template <class ForwardIterator, class T> void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value, const unsigned P) { return ::std::replace(first, last, old_value, new_value); } template <class InputIterator, class OutputIterator, class T> OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value, const unsigned P) { return ::std::replace_copy(first, last, result, old_value, new_value); } template <class InputIterator, class OutputIterator, class Predicate, class T> OutputIterator replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value, const unsigned P) { return ::std::replace_copy_if(first, last, result, pred, new_value); } template <class ForwardIterator, class Predicate, class T> void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value, const unsigned P) { return ::std::replace_if(first, last, pred, new_value); } template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last, const unsigned P) { return ::std::reverse(first, last); } template <class BidirectionalIterator, class OutputIterator> OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result, const unsigned P) { return ::std::reverse_copy(first, last, result); } template <class ForwardIterator> ForwardIterator rotate( ForwardIterator first, ForwardIterator middle, ForwardIterator last, const unsigned P) { return ::std::rotate(first, middle, last); } template <class ForwardIterator, class OutputIterator> OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result, const unsigned P) { return ::std::rotate_copy(first, middle, last, result); } template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred, const unsigned P) { return ::std::search(first1, last1, first2, last2, binary_pred); } template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, const unsigned P) { return ::std::search(first1, last1, first2, last2); } template <class ForwardIterator, class Integer, class T, class BinaryPredicate> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Integer count, const T& value, BinaryPredicate binary_pred, const unsigned P) { return ::std::search_n(first, last, count, value, binary_pred); } template <class ForwardIterator, class Integer, class T> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Integer count, const T& value, const unsigned P) { return ::std::search_n(first, last, count, value); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_difference(first1, last1, first2, last2, result,comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_difference(first1, last1, first2, last2, result); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_intersection(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_intersection(first1, last1, first2, last2, result); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_symmetric_difference(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_symmetric_difference(first1, last1, first2, last2, result); } template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp, const unsigned P) { return ::std::set_union(first1, last1, first2, last2, result, comp); } template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, const unsigned P) { return ::std::set_union(first1, last1, first2, last2, result); } template<typename RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { return ::std::stable_sort(first, last); } template<typename RandomAccessIterator, class StrictWeakOrdering> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::stable_sort(first, last, comp); } template<typename RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) { return ::std::sort(first, last); } template<typename RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp, const unsigned P) { return ::std::sort(first, last, comp); } template <class ForwardIterator1, class ForwardIterator2> ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, const unsigned P) { return ::std::swap_ranges(first1, last1, first2); } template <class InputIterator, class OutputIterator, class UnaryFunction> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op, const unsigned P) { return ::std::transform(first, last, result, op); } template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::transform(first1, last1, first2, result, binary_op); } template <class ForwardIterator, class BinaryPredicate> ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred, const unsigned P) { return ::std::unique(first, last, binary_pred); } template <class ForwardIterator> ForwardIterator unique(ForwardIterator first, ForwardIterator last, const unsigned P) { return ::std::unique(first, last); } template <class InputIterator, class OutputIterator, class BinaryPredicate> OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred, const unsigned P) { return ::std::unique_copy(first, last, result, binary_pred); } template <class InputIterator, class OutputIterator> OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::std::unique_copy(first, last, result); } template <class ForwardIterator, class T, class StrictWeakOrdering> ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp, const unsigned P) { return ::std::upper_bound(first, last, value, comp); } template <class ForwardIterator, class T> ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, const unsigned P) { return ::std::upper_bound(first, last, value); } } // namespace omptl ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_numeric��������������������������������������������������0000664�0000000�0000000�00000005643�12660066715�0022270�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #ifndef OMPTL_NUMERIC #define OMPTL_NUMERIC 1 #include <numeric> #include "omptl" namespace omptl { template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class T, class BinaryFunction> T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op, const unsigned P = _Pfunc::Pfunc()); /* * Not (yet) paralellized due to data dependance. */ template <class InputIterator, class OutputIterator, class BinaryFunction> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryFunction binary_op, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, const unsigned P = _Pfunc::Pfunc()); // Not paralellized due to dependencies and complications with OutputIterators. template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, const unsigned P = _Pfunc::Pfunc()); template <class InputIterator, class OutputIterator> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, const unsigned P = _Pfunc::Pfunc()); } // namespace omptl #ifdef _OPENMP #include "omptl_numeric_par.h" #else #include "omptl_numeric_ser.h" #endif #include "omptl_numeric_extentions.h" #endif /* OMPTL_NUMERIC */ ���������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_numeric_extentions.h�������������������������������������0000664�0000000�0000000�00000007023�12660066715�0024770�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2007 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include <cmath> namespace omptl { // Extentions template <class Iterator,class T,class UnaryFunction, class BinaryFunction> T transform_accumulate(Iterator first, Iterator last, T init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P = _Pfunc::Pfunc()); template <class Iterator, class T, class UnaryFunction> T transform_accumulate(Iterator first, Iterator last, T init, UnaryFunction unary_op, const unsigned P = _Pfunc::Pfunc()); // "Manhattan" distance template <class InputIterator1, class InputIterator2> typename ::std::iterator_traits<InputIterator1>::value_type L1(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P = _Pfunc::Pfunc()); // "Euclidean" distance template <class InputIterator1, class InputIterator2> typename ::std::iterator_traits<InputIterator1>::value_type L2(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P = _Pfunc::Pfunc()); // "Euclidean" length template <class InputIterator> typename ::std::iterator_traits<InputIterator>::value_type L2(InputIterator first, InputIterator last, const unsigned P = _Pfunc::Pfunc()); } // namespace #ifdef _OPENMP #include "omptl_numeric_extentions_par.h" #else #include "omptl_numeric_extentions_ser.h" #endif namespace omptl { // "Manhattan" distance template <class InputIterator1, class InputIterator2> typename ::std::iterator_traits<InputIterator1>::value_type L1(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator1>::value_type VT; return ::omptl::inner_product(first1, last1, first2, VT(0), std::plus<VT>(), std::minus<VT>(), P); } template <typename T> struct _MinusSq { T operator()(const T &lhs, const T &rhs) const { const T d = lhs - rhs; return d*d; } }; // "Euclidean" distance template <class InputIterator1, class InputIterator2> typename ::std::iterator_traits<InputIterator1>::value_type L2(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator1>::value_type VT; return ::std::sqrt(::omptl::inner_product(first1, last1, first2, VT(0), std::plus<VT>(), _MinusSq<VT>(), P)); } template <typename T> struct _Sq { T operator()(const T &d) const { return d*d; } }; // "Euclidean" length template <class InputIterator> typename ::std::iterator_traits<InputIterator>::value_type L2(InputIterator first, InputIterator last, const unsigned P) { typedef typename ::std::iterator_traits<InputIterator>::value_type VT; return ::std::sqrt(::omptl::transform_accumulate(first, last, VT(0), _Sq<VT>(), std::plus<VT>(), P)); } } /* namespace _OMPTL_EXTENTION_NAMESPACE */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_numeric_extentions_par.h���������������������������������0000664�0000000�0000000�00000011505�12660066715�0025632�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2007 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA namespace omptl { // transform_accumulate template <class Iterator, class T, class UnaryFunction, class BinaryFunction> T _ser_transform_accumulate(Iterator first, Iterator last, T init, UnaryFunction unary_op, BinaryFunction binary_op) { // serial version while (first != last) { init = binary_op(unary_op(*first), init); ++first; } return init; } template <class Iterator,class T, class UnaryFunction, class BinaryFunction> T _par_transform_accumulate(Iterator first, Iterator last, const T init, const T par_init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P = omp_get_max_threads()) { assert(P > 0u); if (_linear_serial_is_faster(first, last, P)) return _ser_transform_accumulate(first, last, init, unary_op, binary_op); assert(2*(int)P <= std::distance(first, last)); ::std::vector< ::std::pair<Iterator, Iterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<T> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = _ser_transform_accumulate(partitions[t].first, partitions[t].second, par_init, unary_op, binary_op); return ::std::accumulate(results.begin(), results.end(), init, binary_op); } template <class Iterator, class T, class UnaryFunction> T _transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, ::std::plus<typename UnaryFunction::result_type> binary_op, const unsigned P = omp_get_max_threads()) { return ::omptl::_par_transform_accumulate(first, last, init, typename UnaryFunction::result_type(0), unary_op, binary_op, P); } template <class Iterator, class T, class UnaryFunction> T _transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, ::std::multiplies<typename UnaryFunction::result_type>binary_op, const unsigned P = omp_get_max_threads()) { return ::omptl::_par_transform_accumulate(first, last, init, typename UnaryFunction::result_type(1), unary_op, binary_op, P); } template <class Iterator, class T, class UnaryFunction, class BinaryFunction> T _transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P = omp_get_max_threads()) { return ::omptl::_ser_transform_accumulate(first, last, init, unary_op,binary_op); } template <class IteratorTag> struct _TransformAccumulate { template <class Iterator, class T, class UnaryFunction, class BinaryFunction> static typename BinaryFunction::result_type transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P = omp_get_max_threads()) { return ::omptl::_transform_accumulate(first, last, init, unary_op, binary_op, P); } }; template <> struct _TransformAccumulate< ::std::input_iterator_tag > { template <class Iterator, class T, class UnaryFunction, class BinaryFunction> static typename BinaryFunction::result_type transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P = omp_get_max_threads()) { return ::omptl::_ser_transform_accumulate(first, last, init, unary_op, binary_op); } }; template <class Iterator, class T, class UnaryFunction, class BinaryFunction> T transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P = omp_get_max_threads()) { return ::omptl::_TransformAccumulate <typename ::std::iterator_traits<Iterator>::iterator_category> ::transform_accumulate(first, last, init, unary_op, binary_op, P); } template <class Iterator, class T, class UnaryFunction> T transform_accumulate(Iterator first, Iterator last, const T init, UnaryFunction unary_op, const unsigned P=omp_get_max_threads()) { typedef typename UnaryFunction::result_type RT; return ::omptl::transform_accumulate(first, last, init, unary_op, ::std::plus<RT>(), P); } } /* namespace omptl */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_numeric_extentions_ser.h���������������������������������0000664�0000000�0000000�00000002706�12660066715�0025644�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2007 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA namespace omptl { // transform_accumulate template <class Iterator,class T, class UnaryFunction,class BinaryFunction> T transform_accumulate(Iterator first, Iterator last, T init, UnaryFunction unary_op, BinaryFunction binary_op, const unsigned P) { // serial version while (first != last) { init = binary_op(unary_op(*first), init); ++first; } return init; } template <class Iterator, class T, class UnaryFunction> T transform_accumulate(Iterator first, Iterator last, T init, UnaryFunction unary_op, const unsigned P) { return omptl::transform_accumulate(first, last, init, unary_op, std::plus<T>()); } } /* namespace std */ ����������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_numeric_par.h��������������������������������������������0000664�0000000�0000000�00000022233�12660066715�0023352�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #ifndef OMPTL_NUMERIC_H #define OMPTL_NUMERIC_H 1 #include <utility> #include <functional> #include <iterator> #include "omptl_algorithm" #include "omptl_tools.h" namespace omptl { template <class IteratorTag> struct _Accumulate { template <class InputIterator, class T, class BinaryFunction> static T accumulate(InputIterator first, InputIterator last, T init, T par_init, BinaryFunction binary_op, const unsigned P) { assert(P > 0u); if (_linear_serial_is_faster(first, last, P)) return ::std::accumulate(first, last, init, binary_op); assert(2*(int)P <= std::distance(first, last)); ::std::vector< ::std::pair<InputIterator, InputIterator> > partitions(P); ::omptl::_partition_range(first, last, partitions, P); ::std::vector<T> results(P); #pragma omp parallel for for (int t = 0; t < int(P); ++t) results[t] = ::std::accumulate( partitions[t].first, partitions[t].second, par_init, binary_op); return ::std::accumulate(results.begin(), results.end(), init, binary_op); } }; template <> struct _Accumulate< ::std::input_iterator_tag > { template <class InputIterator, class T, class BinaryFunction> static T accumulate(InputIterator first, InputIterator last, T init, T par_init, BinaryFunction binary_op, const unsigned P) { return ::std::accumulate(first, last, init, binary_op); } }; template <class InputIterator, class BinaryFunction> struct _AccumulateOp { template <class T> static T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op, const unsigned P) { assert(P > 0u); return ::std::accumulate(first, last, init, binary_op); } }; template <class InputIterator> struct _AccumulateOp<InputIterator, ::std::plus<typename ::std::iterator_traits<InputIterator>::value_type> > { typedef ::std::plus<typename ::std::iterator_traits<InputIterator>::value_type> BinaryFunction; template <class T> static T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op, const unsigned P) { assert(P > 0u); return ::omptl::_Accumulate< typename ::std::iterator_traits<InputIterator>::iterator_category>:: accumulate(first, last, init, T(0), binary_op, P); } }; template <class InputIterator> struct _AccumulateOp<InputIterator, ::std::multiplies<typename ::std::iterator_traits<InputIterator>::value_type> > { typedef ::std::multiplies<typename ::std::iterator_traits<InputIterator>::value_type> BinaryFunction; template <class T> static T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op, const unsigned P) { assert(P > 0u); return ::omptl::_Accumulate<typename ::std::iterator_traits<InputIterator>::iterator_category>:: accumulate(first, last, init, T(1), binary_op, P); } }; template <class InputIterator, class T, class BinaryFunction> T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op, const unsigned P) { assert(P > 0u); return ::omptl::_AccumulateOp<InputIterator, BinaryFunction>:: accumulate(first, last, init, binary_op, P); } template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init, const unsigned P) { assert(P > 0u); typedef typename std::iterator_traits<InputIterator>::value_type VT; return ::omptl::accumulate(first, last, init, std::plus<VT>(), P); } template <class InputIterator, class OutputIterator, class BinaryFunction> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::adjacent_difference(first, last, result, binary_op); } template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { // ::std::minus<typename ::std::iterator_traits<InputIterator>::value_type>() return ::std::adjacent_difference(first, last, result); } template <class Iterator1Tag, class Iterator2Tag> struct _InnerProduct { template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> static T inner_product( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P) { return ::std::inner_product(first1, last1, first2, init, binary_op1, binary_op2); } template <class Iterator1, class Iterator2, class T, class BinaryFunction2> static T inner_product(Iterator1 first1, Iterator1 last1, Iterator2 first2, T init, ::std::plus<T> binary_op1, BinaryFunction2 binary_op2, const unsigned P) { assert(P > 0u); if (_linear_serial_is_faster(first1, last1, P)) return ::std::inner_product(first1, last1, first2, init, binary_op1, binary_op2); assert(2*(int)P <= std::distance(first1, last1)); ::std::vector< ::std::pair<Iterator1, Iterator1> > partitions1(P); ::omptl::_partition_range(first1, last1, partitions1, P); ::std::vector<Iterator2> partitions2(P); ::omptl::_copy_partitions(partitions1, first2, partitions2, P); #pragma omp parallel for reduction(+:init) for (int t = 0; t < int(P); ++t) init += ::std::inner_product( partitions1[t].first, partitions1[t].second, partitions2[t], T(0.0), binary_op1, binary_op2); return init; } }; template <class Iterator2Tag> struct _InnerProduct< ::std::input_iterator_tag, Iterator2Tag> { template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> static T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P) { return ::std::inner_product(first1, last1, first2, init, binary_op1, binary_op2); } }; template <class Iterator1Tag> struct _InnerProduct<Iterator1Tag, ::std::input_iterator_tag> { template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> static T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P) { return ::std::inner_product(first1, last1, first2, init, binary_op1, binary_op2); } }; template <> struct _InnerProduct< ::std::input_iterator_tag, ::std::input_iterator_tag > { template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> static T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P) { return ::std::inner_product(first1, last1, first2, init, binary_op1, binary_op2); } }; template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P) { return _InnerProduct< typename ::std::iterator_traits<InputIterator1>::iterator_category, typename ::std::iterator_traits<InputIterator2>::iterator_category> ::inner_product(first1, last1, first2, init, binary_op1, binary_op2, P); } template <class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, const unsigned P) { return ::omptl::inner_product(first1, last1, first2, init, ::std::plus<T>(), ::std::multiplies<T>(), P); } template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, const unsigned P) { return ::std::partial_sum(first, last, result, binary_op); } template <class InputIterator, class OutputIterator> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { // ::std::plus<typename ::std::iterator_traits<InputIterator>::value_type>(), return ::std::partial_sum(first, last, result); } } // namespace omptl #endif /* OMPTL_NUMERIC_H */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_numeric_ser.h��������������������������������������������0000664�0000000�0000000�00000006001�12660066715�0023354�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA namespace omptl { template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init, const unsigned P) { return ::std::accumulate(first, last, init); } template <class InputIterator, class T, class BinaryFunction> T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op, const unsigned P) { return ::std::accumulate(first, last, init, binary_op); } /* * Not (yet) paralellized due to data dependance. */ template <class InputIterator, class OutputIterator, class BinaryFunction> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryFunction binary_op, const unsigned P) { return ::std::adjacent_difference(first, last, result, binary_op); } template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::std::adjacent_difference(first, last, result); } template <class InputIterator1, class InputIterator2, class T, class BinaryFunction1, class BinaryFunction2> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, const unsigned P) { return ::std::inner_product(first1, last1, first2, init, binary_op1, binary_op2); } template <class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, const unsigned P) { return ::std::inner_product(first1, last1, first2, init); } // Not paralellized due to dependencies and complications with OutputIterators. template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, const unsigned P) { return ::std::partial_sum(first, last, result, binary_op); } template <class InputIterator, class OutputIterator> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, const unsigned P) { return ::std::partial_sum(first, last, result); } } // namespace omptl �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/omptl/omptl_tools.h��������������������������������������������������0000664�0000000�0000000�00000025257�12660066715�0022217�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Fokko Beekhof // Email contact: Fokko.Beekhof@cui.unige.ch // The OMPTL library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library 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 // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #ifndef OMPTL_TOOLS_H #define OMPTL_TOOLS_H 1 #include <utility> #include <vector> #include <cassert> #include <algorithm> #include <climits> namespace omptl { // Log of the number of operations that is expected to run faster in a single // thread. const unsigned C = 12; template <typename T> T log2N_(T n) { if (n == 0) return 0; const unsigned b[] = #if (WORD_BIT == 32) {0x2u, 0xCu, 0xF0u, 0xFF00u, 0xFFFF0000u}; #else // 64-bit {0x2u, 0xCu, 0xF0u, 0xFF00u, 0xFFFF0000u, 0xFFFFFFFF00000000u}; assert(WORD_BIT == 64); #endif const T S[] = {1u, 2u, 4u, 8u, 16u, 32u, 64u, 128u}; T result = 0u; // result of log2(v) will go here for (int i = static_cast<int>(sizeof(T)); i >= 0; --i) { if (n & b[i]) { n >>= S[i]; result |= S[i]; } } return result; } template<typename Iterator> bool _linear_serial_is_faster(Iterator first, Iterator last, const unsigned P) { assert(P > 0u); assert(::std::distance(first, last) >= 0); const unsigned N = ::std::distance(first, last); return (N < 2u*P) || (log2N_(N) < C); } template<typename Iterator> bool _logn_serial_is_faster(Iterator first, Iterator last, const unsigned P) { assert(P > 0u); assert(::std::distance(first, last) >= 0); const unsigned N = ::std::distance(first, last); return (N < 2u*P) || (log2N_(N) < (1 << C)); } template<typename Iterator> bool _nlogn_serial_is_faster(Iterator first, Iterator last, const unsigned P) { assert(P > 0u); assert(::std::distance(first, last) >= 0); const unsigned N = ::std::distance(first, last); return (N < 2u*P) || (N*log2N_(N) < (1 << C)); } template<typename Iterator1, typename Iterator2> void _copy_partitions(const ::std::vector< ::std::pair<Iterator1, Iterator1> > &source_partitions, Iterator2 first, ::std::vector<Iterator2> &dest_partitions, const unsigned P) { assert(source_partitions.size() == P); assert(dest_partitions.size() == P); for (unsigned i = 0; i < P; ++i) { dest_partitions[i] = first; // The last "advance" is very important, it may create space // if it is an InsertIterator or something like that. ::std::advance(first, ::std::distance( source_partitions[i].first, source_partitions[i].second) ); } } // Divide a given range into P partitions template<typename Iterator> void _partition_range(Iterator first, Iterator last, ::std::vector< ::std::pair<Iterator, Iterator> > &partitions, const unsigned P) { assert(partitions.size() == P); typedef ::std::pair<Iterator, Iterator> Partition; const unsigned N = ::std::distance(first, last); const unsigned range = N / P + ((N%P)? 1 : 0); assert(2u*P <= N); assert(range <= N); // All but last partition have same range Iterator currentLast = first; ::std::advance(currentLast, range); for (unsigned i = 0; i < P - 1; ++i) { partitions[i] = Partition(first, currentLast); first = currentLast; ::std::advance(currentLast, range); } // Last range may be shorter assert(::std::distance(first, last) <= range); partitions[P - 1] = Partition(first, last); } // Given a range, re-arrange the items such that all elements smaller than // the pivot precede all other values. Returns an Iterator to the first // element not smaller than the pivot. template<typename Iterator, class StrictWeakOrdering> Iterator _stable_pivot_range(Iterator first, Iterator last, const typename ::std::iterator_traits<Iterator>::value_type pivot, StrictWeakOrdering comp = std::less< typename ::std::iterator_traits<Iterator>::value_type>()) { Iterator pivotIt = last; while (first < last) { if (comp(*first, pivot)) ++first; else { Iterator high = first; while ( (++high < last) && !comp(*high, pivot) ) /* nop */; if (high < last) ::std::iter_swap(first, last); first = pivotIt = ++high; } } return pivotIt; } template<typename Iterator, class StrictWeakOrdering> Iterator _pivot_range(Iterator first, Iterator last, const typename ::std::iterator_traits<Iterator>::value_type pivot, StrictWeakOrdering comp) { while (first < last) { if (comp(*first, pivot)) ++first; else { while ( (first < --last) && !comp(*last, pivot) ) /* nop */; ::std::iter_swap(first, last); } } return last; } template<typename Iterator, class StrictWeakOrdering> void _partition_range_by_pivots(Iterator first, Iterator last, const ::std::vector<typename ::std::iterator_traits<Iterator>::value_type> &pivots, ::std::vector< ::std::pair<Iterator, Iterator> > &partitions, StrictWeakOrdering comp, const unsigned P) { assert(partitions.size() == P); typedef ::std::pair<Iterator, Iterator> Partition; ::std::vector<Iterator> ptable(P); ::std::vector<typename ::std::iterator_traits<Iterator>::value_type> pvts(pivots.size()); ::std::vector<Iterator> borders; ::std::vector<bool> used(pivots.size()); ::std::fill(used.begin(), used.end(), false); borders.push_back(first); borders.push_back(last); partitions[0].first = first; partitions[0].second = last; for (unsigned p = 1; (1 << p) <= (int)P; ++p) { const int PROC = (1 << p); const int PIVOTS = (1 << (p-1)); assert(PIVOTS <= (int)pivots.size()); #pragma omp parallel for //default(none) shared(used, pvts) for (int t = 0; t < PIVOTS; ++t) { const int index = int(P / PROC) + 2 * t * int(P / PROC) - 1; assert(index < (int)pivots.size()); assert(!used[index]); used[index] = true; pvts[t] = pivots[index]; /*::std::cout << "pvts T: " << t << " --> " << index << " " << pvts[t] << ::std::endl;*/ } #pragma omp parallel for //default(none) private(comp) // shared(ptable, pvts, partitions) for (int t = 0; t < PIVOTS; ++t) ptable[t] = _pivot_range(partitions[t].first, partitions[t].second, pvts[t], comp); for (int i = 0; i < PIVOTS; ++i) { // ::std::cout << "ADD: " << ::std::distance(first, ptable[t]) << ::std::endl; borders.push_back(ptable[i]); } ::std::sort(borders.begin(), borders.end()); for (unsigned i = 0; i < borders.size() - 1; ++i) { partitions[i].first = borders[i]; partitions[i].second = borders[i + 1]; } /*::std::cout << "PASS: " << p << ::std::endl; for (t = 0; t < (1 << p); ++t) ::std::cout << t << ": " << ::std::distance(first, partitions[t].first) << " - " << ::std::distance(first, partitions[t].second) << ::std::endl;*/ } for (unsigned i = 0; i < pivots.size(); ++i) if(!used[i]) pvts[i] = pivots[i]; #pragma omp parallel for // default(none) private(t, comp) // shared(used, ptable, pvts, partitions) for (int t = 0; t < int(pivots.size()); ++t) if (!used[t]) ptable[t] = _pivot_range(partitions[t].first, partitions[t].second, pvts[t], comp); for (unsigned i = 0; i < pivots.size(); ++i) { if (!used[i]) { // ::std::cout << "LAST ADD: " << ::std::distance(first, ptable[i]) // << ::std::endl; borders.push_back(ptable[i]); } } ::std::sort(borders.begin(), borders.end()); assert(borders.size() - 1 == P); for (unsigned i = 0; i < P; ++i) { partitions[i].first = borders[i]; partitions[i].second = borders[i + 1]; } // ::std::cout << "LAST: " << p << ::std::endl; // for (t = 0; t < P; ++t) // ::std::cout << t << ": " << ::std::distance(first, partitions[t].first) // << " - " << ::std::distance(first, partitions[t].second) // << ::std::endl; } template<typename Iterator> void _partition_range_stable_by_pivots(Iterator first, Iterator last, const ::std::vector<typename ::std::iterator_traits<Iterator>::value_type> &pivots, ::std::vector< ::std::pair<Iterator, Iterator> > &partitions, std::less<typename ::std::iterator_traits<Iterator>::value_type> comp, const unsigned P) { typedef ::std::pair<Iterator, Iterator> Partition; Iterator start = first; for (unsigned i = 0; i < P - 1; ++i) { Iterator low = start; while (low < last) { // Find a value not lower than the pivot. while( (*low < pivots[i]) && (low < last) ) ::std::advance(low, 1); // Entire range scanned ? if (low == last) break; // Find a value lower than the pivot, starting from // low, working our way up. Iterator high = low; ::std::advance(high, 1); while( !(*high < pivots[i]) && (high < last) ) ::std::advance(high, 1); // Entire range scanned ? if (high == last) break; // Swap values assert( !(*low<pivots[i]) && (*high<pivots[i]) ); ::std::iter_swap(low, high); } partitions[i] = Partition(start, low); start = low; } partitions[P - 1] = Partition(start, last); } /* * The sample ratio is used to sample more data. This way, the pivots can be * chosen more wisely, which is our only guarantee we can generate partitions * of equal size. */ template<typename RandomAccessIterator> void _find_pivots(RandomAccessIterator first, RandomAccessIterator last, ::std::vector<typename ::std::iterator_traits<RandomAccessIterator>::value_type> &pivots, const unsigned P, unsigned SAMPLE_RATIO = 10) { assert(SAMPLE_RATIO > 0); const unsigned N = ::std::distance(first, last); assert(N >= 2u*P); // Adjust the constant. Erm. while (SAMPLE_RATIO * (P + 1) > N) SAMPLE_RATIO /= 2; pivots.clear(); pivots.reserve(P - 1); typedef typename ::std::iterator_traits<RandomAccessIterator>::value_type value_type; ::std::vector<value_type> samples; const unsigned NSAMPLES = SAMPLE_RATIO * P + SAMPLE_RATIO; samples.reserve(NSAMPLES); for (unsigned i = 0; i < NSAMPLES; ++i) { const unsigned offset = i * (N-1) / (NSAMPLES - 1); assert(offset < N); samples.push_back(*(first + offset)); // std::cout << "offset: " << offset << " sample: " << samples[i] << std::endl; } assert(samples.size() == NSAMPLES); // Sort samples to create relative ordering in data ::std::sort(samples.begin(), samples.end()); // Take pivots from sampled data for (unsigned i = 1; i < P; ++i) { pivots.push_back(samples[i * samples.size() / P]); /*std::cout << "pivot: " << i << " idx: " << (i * samples.size() / P) << " " << pivots[i-1] << std::endl;*/ } assert(pivots.size() == P - 1); } } // namespace omptl #endif /* OMPTL_TOOLS_H */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/projectM.cpp���������������������������������������������������������0000664�0000000�0000000�00000063464�12660066715�0020631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ #include "Renderer/RenderItemMatcher.hpp" #include "Renderer/RenderItemMergeFunction.hpp" #include "fatal.h" #include "Common.hpp" #ifdef WIN32 #include <dirent-win32/dirent.h> #endif #include "timer.h" #include <iostream> #ifdef LINUX #include "time.h" #endif #ifdef WIN32 #include <time.h> #endif #include "Renderer/PipelineContext.hpp" #include <iostream> #include "projectM.hpp" #include "Renderer/BeatDetect.hpp" #include "Preset.hpp" #include "PipelineMerger.hpp" #include "PCM.hpp" //Sound data handler (buffering, FFT, etc.) #include <map> #include "Renderer/Renderer.hpp" #include "PresetChooser.hpp" #include "ConfigFile.h" #include "Renderer/TextureManager.hpp" #include "TimeKeeper.hpp" #include "Renderer/RenderItemMergeFunction.hpp" #ifdef USE_THREADS #ifdef __WXMSW__ #include <pthread-win32/pthread.h> #else #include "pthread.h" #endif pthread_mutex_t mutex; pthread_cond_t condition; pthread_t thread; #ifdef SYNC_PRESET_SWITCHES pthread_mutex_t preset_mutex; #endif #endif projectM::~projectM() { #ifdef USE_THREADS std::cout << "[projectM] thread "; printf("c"); running = false; printf("l"); pthread_cond_signal(&condition); printf("e"); pthread_mutex_unlock( &mutex ); printf("a"); pthread_detach(thread); printf("n"); pthread_cond_destroy(&condition); printf("u"); pthread_mutex_destroy( &mutex ); #ifdef SYNC_PRESET_SWITCHES pthread_mutex_destroy( &preset_mutex ); #endif printf("p"); std::cout << std::endl; #endif destroyPresetTools(); if ( renderer ) delete ( renderer ); if ( beatDetect ) delete ( beatDetect ); if ( _pcm ) { delete ( _pcm ); _pcm = 0; } delete(_pipelineContext); delete(_pipelineContext2); #ifdef WIN32 m_activePreset.release(); // EDIT BY SJ - don't know why, but the pointer m_activePreset points to is bad at this time #endif } unsigned projectM::initRenderToTexture() { return renderer->initRenderToTexture(); } void projectM::projectM_resetTextures() { renderer->ResetTextures(); } projectM::projectM ( std::string config_file, int flags) : beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext()) { readConfig(config_file); projectM_reset(); projectM_resetGL(_settings.windowWidth, _settings.windowHeight); } projectM::projectM(const Settings& settings, int flags): beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext()) { readSettings(settings); projectM_reset(); projectM_resetGL(_settings.windowWidth, _settings.windowHeight); } bool projectM::writeConfig(const std::string & configFile, const Settings & settings) { ConfigFile config ( configFile ); config.add("Mesh X", settings.meshX); config.add("Mesh Y", settings.meshY); config.add("Texture Size", settings.textureSize); config.add("FPS", settings.fps); config.add("Window Width", settings.windowWidth); config.add("Window Height", settings.windowHeight); config.add("Smooth Preset Duration", settings.smoothPresetDuration); config.add("Preset Duration", settings.presetDuration); config.add("Preset Path", settings.presetURL); config.add("Title Font", settings.titleFontURL); config.add("Menu Font", settings.menuFontURL); config.add("Hard Cut Sensitivity", settings.beatSensitivity); config.add("Aspect Correction", settings.aspectCorrection); config.add("Easter Egg Parameter", settings.easterEgg); config.add("Shuffle Enabled", settings.shuffleEnabled); config.add("Soft Cut Ratings Enabled", settings.softCutRatingsEnabled); std::fstream file(configFile.c_str()); if (file) { file << config; return true; } else return false; } void projectM::readConfig (const std::string & configFile ) { std::cout << "[projectM] config file: " << configFile << std::endl; ConfigFile config ( configFile ); _settings.meshX = config.read<int> ( "Mesh X", 32 ); _settings.meshY = config.read<int> ( "Mesh Y", 24 ); _settings.textureSize = config.read<int> ( "Texture Size", 512 ); _settings.fps = config.read<int> ( "FPS", 35 ); _settings.windowWidth = config.read<int> ( "Window Width", 512 ); _settings.windowHeight = config.read<int> ( "Window Height", 512 ); _settings.smoothPresetDuration = config.read<int> ( "Smooth Preset Duration", config.read<int>("Smooth Transition Duration", 10)); _settings.presetDuration = config.read<int> ( "Preset Duration", 15 ); #ifdef LINUX _settings.presetURL = config.read<string> ( "Preset Path", CMAKE_INSTALL_PREFIX "/share/projectM/presets" ); #endif #ifdef __APPLE__ /// @bug awful hardcoded hack- need to add intelligence to cmake wrt bundling - carm _settings.presetURL = config.read<string> ( "Preset Path", "../Resources/presets" ); #endif #ifdef WIN32 _settings.presetURL = config.read<string> ( "Preset Path", CMAKE_INSTALL_PREFIX "/share/projectM/presets" ); #endif #ifdef __APPLE__ _settings.titleFontURL = config.read<string> ( "Title Font", "../Resources/fonts/Vera.tff"); _settings.menuFontURL = config.read<string> ( "Menu Font", "../Resources/fonts/VeraMono.ttf"); #endif #ifdef LINUX _settings.titleFontURL = config.read<string> ( "Title Font", projectM_FONT_TITLE ); _settings.menuFontURL = config.read<string> ( "Menu Font", projectM_FONT_MENU ); #endif #ifdef WIN32 _settings.titleFontURL = config.read<string> ( "Title Font", projectM_FONT_TITLE ); _settings.menuFontURL = config.read<string> ( "Menu Font", projectM_FONT_MENU ); #endif _settings.shuffleEnabled = config.read<bool> ( "Shuffle Enabled", true); _settings.easterEgg = config.read<float> ( "Easter Egg Parameter", 0.0); _settings.softCutRatingsEnabled = config.read<float> ( "Soft Cut Ratings Enabled", false); projectM_init ( _settings.meshX, _settings.meshY, _settings.fps, _settings.textureSize, _settings.windowWidth,_settings.windowHeight); _settings.beatSensitivity = beatDetect->beat_sensitivity = config.read<float> ( "Hard Cut Sensitivity", 10.0 ); if ( config.read ( "Aspect Correction", true ) ) { _settings.aspectCorrection = true; renderer->correction = true; } else { _settings.aspectCorrection = false; renderer->correction = false; } } void projectM::readSettings (const Settings & settings ) { _settings.meshX = settings.meshX; _settings.meshY = settings.meshY; _settings.textureSize = settings.textureSize; _settings.fps = settings.fps; _settings.windowWidth = settings.windowWidth; _settings.windowHeight = settings.windowHeight; _settings.smoothPresetDuration = settings.smoothPresetDuration; _settings.presetDuration = settings.presetDuration; _settings.softCutRatingsEnabled = settings.softCutRatingsEnabled; _settings.presetURL = settings.presetURL; _settings.titleFontURL = settings.titleFontURL; _settings.menuFontURL = settings.menuFontURL; _settings.shuffleEnabled = settings.shuffleEnabled; _settings.easterEgg = settings.easterEgg; projectM_init ( _settings.meshX, _settings.meshY, _settings.fps, _settings.textureSize, _settings.windowWidth,_settings.windowHeight); _settings.beatSensitivity = settings.beatSensitivity; _settings.aspectCorrection = settings.aspectCorrection; } #ifdef USE_THREADS static void *thread_callback(void *prjm) { projectM *p = (projectM *)prjm; p->thread_func(prjm); return NULL;} void *projectM::thread_func(void *vptr_args) { pthread_mutex_lock( &mutex ); // printf("in thread: %f\n", timeKeeper->PresetProgressB()); while (true) { pthread_cond_wait( &condition, &mutex ); if(!running) { pthread_mutex_unlock( &mutex ); return NULL; } evaluateSecondPreset(); } } #endif void projectM::evaluateSecondPreset() { pipelineContext2().time = timeKeeper->GetRunningTime(); pipelineContext2().frame = timeKeeper->PresetFrameB(); pipelineContext2().progress = timeKeeper->PresetProgressB(); m_activePreset2->Render(*beatDetect, pipelineContext2()); } void projectM::renderFrame() { #ifdef SYNC_PRESET_SWITCHES pthread_mutex_lock(&preset_mutex); #endif #ifdef DEBUG char fname[1024]; FILE *f = NULL; int index = 0; int x, y; #endif timeKeeper->UpdateTimers(); /* if (timeKeeper->IsSmoothing()) { printf("Smoothing A:%f, B:%f, S:%f\n", timeKeeper->PresetProgressA(), timeKeeper->PresetProgressB(), timeKeeper->SmoothRatio()); } else { printf(" A:%f\n", timeKeeper->PresetProgressA()); }*/ mspf= ( int ) ( 1000.0/ ( float ) settings().fps ); //milliseconds per frame /// @bug who is responsible for updating this now?" pipelineContext().time = timeKeeper->GetRunningTime(); pipelineContext().frame = timeKeeper->PresetFrameA(); pipelineContext().progress = timeKeeper->PresetProgressA(); //m_activePreset->Render(*beatDetect, pipelineContext()); beatDetect->detectFromSamples(); //m_activePreset->evaluateFrame(); //if the preset isn't locked and there are more presets if ( renderer->noSwitch==false && !m_presetChooser->empty() ) { //if preset is done and we're not already switching if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing()) { if (settings().shuffleEnabled) selectRandom(false); else selectNext(false); } else if ((beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut()) { // printf("Hard Cut\n"); if (settings().shuffleEnabled) selectRandom(true); else selectNext(true); } } if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() ) { // printf("start thread\n"); assert ( m_activePreset2.get() ); #ifdef USE_THREADS pthread_cond_signal(&condition); pthread_mutex_unlock( &mutex ); #endif m_activePreset->Render(*beatDetect, pipelineContext()); #ifdef USE_THREADS pthread_mutex_lock( &mutex ); #else evaluateSecondPreset(); #endif Pipeline pipeline; pipeline.setStaticPerPixel(settings().meshX, settings().meshY); assert(_matcher); PipelineMerger::mergePipelines( m_activePreset->pipeline(), m_activePreset2->pipeline(), pipeline, _matcher->matchResults(), *_merger, timeKeeper->SmoothRatio()); renderer->RenderFrame(pipeline, pipelineContext()); pipeline.drawables.clear(); /* while (!pipeline.drawables.empty()) { delete(pipeline.drawables.back()); pipeline.drawables.pop_back(); } */ } else { if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 ) { //printf("End Smooth\n"); m_activePreset = m_activePreset2; timeKeeper->EndSmoothing(); } //printf("Normal\n"); m_activePreset->Render(*beatDetect, pipelineContext()); renderer->RenderFrame (m_activePreset->pipeline(), pipelineContext()); } // std::cout<< m_activePreset->absoluteFilePath()<<std::endl; // renderer->presetName = m_activePreset->absoluteFilePath(); count++; #ifndef WIN32 /** Frame-rate limiter */ /** Compute once per preset */ if ( this->count%100==0 ) { this->renderer->realfps=100.0/ ( ( getTicks ( &timeKeeper->startTime )-this->fpsstart ) /1000 ); this->fpsstart=getTicks ( &timeKeeper->startTime ); } int timediff = getTicks ( &timeKeeper->startTime )-this->timestart; if ( timediff < this->mspf ) { // printf("%s:",this->mspf-timediff); int sleepTime = ( unsigned int ) ( this->mspf-timediff ) * 1000; // DWRITE ( "usleep: %d\n", sleepTime ); if ( sleepTime > 0 && sleepTime < 100000 ) { if ( usleep ( sleepTime ) != 0 ) {}} } this->timestart=getTicks ( &timeKeeper->startTime ); #endif /** !WIN32 */ #ifdef SYNC_PRESET_SWITCHES pthread_mutex_unlock(&preset_mutex); #endif } void projectM::projectM_reset() { this->mspf = 0; this->timed = 0; this->timestart = 0; this->count = 0; this->fpsstart = 0; setlocale(LC_NUMERIC, "C"); projectM_resetengine(); } void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height ) { setlocale(LC_NUMERIC, "C"); /** Initialise start time */ timeKeeper = new TimeKeeper(_settings.presetDuration,_settings.smoothPresetDuration, _settings.easterEgg); /** Nullify frame stash */ /** Initialise per-pixel matrix calculations */ /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */ assert ( !beatDetect ); if (!_pcm) _pcm = new PCM(); assert(pcm()); beatDetect = new BeatDetect ( _pcm ); if ( _settings.fps > 0 ) mspf= ( int ) ( 1000.0/ ( float ) _settings.fps ); else mspf = 0; this->renderer = new Renderer ( width, height, gx, gy, texsize, beatDetect, settings().presetURL, settings().titleFontURL, settings().menuFontURL ); running = true; initPresetTools(gx, gy); #ifdef USE_THREADS pthread_mutex_init(&mutex, NULL); #ifdef SYNC_PRESET_SWITCHES pthread_mutex_init(&preset_mutex, NULL); #endif pthread_cond_init(&condition, NULL); if (pthread_create(&thread, NULL, thread_callback, this) != 0) { std::cerr << "[projectM] failed to allocate a thread! try building with option USE_THREADS turned off" << std::endl;; exit(EXIT_FAILURE); } pthread_mutex_lock( &mutex ); #endif /// @bug order of operatoins here is busted //renderer->setPresetName ( m_activePreset->name() ); timeKeeper->StartPreset(); assert(pcm()); pipelineContext().fps = fps; pipelineContext2().fps = fps; } /* Reinitializes the engine variables to a default (conservative and sane) value */ void projectM::projectM_resetengine() { if ( beatDetect != NULL ) { beatDetect->reset(); } } /** Resets OpenGL state */ void projectM::projectM_resetGL ( int w, int h ) { /** Stash the new dimensions */ renderer->reset ( w,h ); } /** Sets the title to display */ void projectM::projectM_setTitle ( std::string title ) { if ( title != renderer->title ) { renderer->title=title; renderer->drawtitle=1; } } int projectM::initPresetTools(int gx, int gy) { /* Set the seed to the current time in seconds */ srand ( time ( NULL ) ); std::string url = (m_flags & FLAG_DISABLE_PLAYLIST_LOAD) ? std::string() : settings().presetURL; if ( ( m_presetLoader = new PresetLoader ( gx, gy, url) ) == 0 ) { m_presetLoader = 0; std::cerr << "[projectM] error allocating preset loader" << std::endl; return PROJECTM_FAILURE; } if ( ( m_presetChooser = new PresetChooser ( *m_presetLoader, settings().softCutRatingsEnabled ) ) == 0 ) { delete ( m_presetLoader ); m_presetChooser = 0; m_presetLoader = 0; std::cerr << "[projectM] error allocating preset chooser" << std::endl; return PROJECTM_FAILURE; } // Start the iterator if (!m_presetPos) m_presetPos = new PresetIterator(); // Initialize a preset queue position as well // m_presetQueuePos = new PresetIterator(); // Start at end ptr- this allows next/previous to easily be done from this position. *m_presetPos = m_presetChooser->end(); // Load idle preset std::cerr << "[projectM] Allocating idle preset..." << std::endl; m_activePreset = m_presetLoader->loadPreset ("idle://Geiss & Sperl - Feedback (projectM idle HDR mix).milk"); renderer->SetPipeline(m_activePreset->pipeline()); // Case where no valid presets exist in directory. Could also mean // playlist initialization was deferred if (m_presetChooser->empty()) { //std::cerr << "[projectM] warning: no valid files found in preset directory \"" //<< m_presetLoader->directoryName() << "\"" << std::endl; } _matcher = new RenderItemMatcher(); _merger = new MasterRenderItemMerge(); //_merger->add(new WaveFormMergeFunction()); _merger->add(new ShapeMerge()); _merger->add(new BorderMerge()); //_merger->add(new BorderMergeFunction()); /// @bug These should be requested by the preset factories. _matcher->distanceFunction().addMetric(new ShapeXYDistance()); //std::cerr << "[projectM] Idle preset allocated." << std::endl; projectM_resetengine(); //std::cerr << "[projectM] engine has been reset." << std::endl; return PROJECTM_SUCCESS; } void projectM::destroyPresetTools() { if ( m_presetPos ) delete ( m_presetPos ); m_presetPos = 0; if ( m_presetChooser ) delete ( m_presetChooser ); m_presetChooser = 0; if ( m_presetLoader ) delete ( m_presetLoader ); m_presetLoader = 0; } /// @bug queuePreset case isn't handled void projectM::removePreset(unsigned int index) { unsigned int chooserIndex = **m_presetPos; m_presetLoader->removePreset(index); // Case: no more presets, set iterator to end if (m_presetChooser->empty()) *m_presetPos = m_presetChooser->end(); // Case: chooser index has become one less due to removal of an index below it else if (chooserIndex > index) { chooserIndex--; *m_presetPos = m_presetChooser->begin(chooserIndex); } // Case: we have deleted the active preset position // Set iterator to end of chooser else if (chooserIndex == index) { *m_presetPos = m_presetChooser->end(); } } unsigned int projectM::addPresetURL ( const std::string & presetURL, const std::string & presetName, const RatingList & ratings) { bool restorePosition = false; if (*m_presetPos == m_presetChooser->end()) restorePosition = true; int index = m_presetLoader->addPresetURL ( presetURL, presetName, ratings); if (restorePosition) *m_presetPos = m_presetChooser->end(); return index; } void projectM::selectPreset ( unsigned int index, bool hardCut) { if (m_presetChooser->empty()) return; if (!hardCut) { timeKeeper->StartSmoothing(); } *m_presetPos = m_presetChooser->begin(index); if (!hardCut) { switchPreset(m_activePreset2); } else { switchPreset(m_activePreset); timeKeeper->StartPreset(); } presetSwitchedEvent(hardCut, **m_presetPos); } void projectM::selectRandom(const bool hardCut) { if (m_presetChooser->empty()) return; if (!hardCut) { timeKeeper->StartSmoothing(); } *m_presetPos = m_presetChooser->weightedRandom(hardCut); if (!hardCut) { switchPreset(m_activePreset2); } else { switchPreset(m_activePreset); timeKeeper->StartPreset(); } presetSwitchedEvent(hardCut, **m_presetPos); } void projectM::selectPrevious(const bool hardCut) { if (m_presetChooser->empty()) return; if (!hardCut) { timeKeeper->StartSmoothing(); } m_presetChooser->previousPreset(*m_presetPos); if (!hardCut) { switchPreset(m_activePreset2); } else { switchPreset(m_activePreset); timeKeeper->StartPreset(); } presetSwitchedEvent(hardCut, **m_presetPos); // m_activePreset = m_presetPos->allocate(); // renderer->SetPipeline(m_activePreset->pipeline()); // renderer->setPresetName(m_activePreset->name()); //timeKeeper->StartPreset(); } void projectM::selectNext(const bool hardCut) { if (m_presetChooser->empty()) return; if (!hardCut) { timeKeeper->StartSmoothing(); std::cout << "start smoothing" << std::endl; } m_presetChooser->nextPreset(*m_presetPos); if (!hardCut) { switchPreset(m_activePreset2); } else { switchPreset(m_activePreset); timeKeeper->StartPreset(); } presetSwitchedEvent(hardCut, **m_presetPos); } /** * * @param targetPreset */ void projectM::switchPreset(std::auto_ptr<Preset> & targetPreset) { #ifdef SYNC_PRESET_SWITCHES pthread_mutex_lock(&preset_mutex); #endif targetPreset = m_presetPos->allocate(); // Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches renderer->setPresetName(targetPreset->name()); renderer->SetPipeline(targetPreset->pipeline()); #ifdef SYNC_PRESET_SWITCHES pthread_mutex_unlock(&preset_mutex); #endif } void projectM::setPresetLock ( bool isLocked ) { renderer->noSwitch = isLocked; } bool projectM::isPresetLocked() const { return renderer->noSwitch; } std::string projectM::getPresetURL ( unsigned int index ) const { return m_presetLoader->getPresetURL(index); } int projectM::getPresetRating ( unsigned int index, const PresetRatingType ratingType) const { return m_presetLoader->getPresetRating(index, ratingType); } std::string projectM::getPresetName ( unsigned int index ) const { return m_presetLoader->getPresetName(index); } void projectM::clearPlaylist ( ) { m_presetLoader->clear(); *m_presetPos = m_presetChooser->end(); } void projectM::selectPresetPosition(unsigned int index) { *m_presetPos = m_presetChooser->begin(index); } bool projectM::selectedPresetIndex(unsigned int & index) const { if (*m_presetPos == m_presetChooser->end()) return false; index = **m_presetPos; return true; } bool projectM::presetPositionValid() const { return (*m_presetPos != m_presetChooser->end()); } unsigned int projectM::getPlaylistSize() const { return m_presetLoader->size(); } void projectM::changePresetRating (unsigned int index, int rating, const PresetRatingType ratingType) { m_presetLoader->setRating(index, rating, ratingType); presetRatingChanged(index, rating, ratingType); } void projectM::insertPresetURL(unsigned int index, const std::string & presetURL, const std::string & presetName, const RatingList & ratings) { bool atEndPosition = false; int newSelectedIndex = 0; if (*m_presetPos == m_presetChooser->end()) // Case: preset not selected { atEndPosition = true; } else if (**m_presetPos < index) // Case: inserting before selected preset { newSelectedIndex = **m_presetPos; } else if (**m_presetPos > index) // Case: inserting after selected preset { newSelectedIndex++; } else // Case: inserting at selected preset { newSelectedIndex++; } m_presetLoader->insertPresetURL (index, presetURL, presetName, ratings); if (atEndPosition) *m_presetPos = m_presetChooser->end(); else *m_presetPos = m_presetChooser->begin(newSelectedIndex); } void projectM::changePresetName ( unsigned int index, std::string name ) { m_presetLoader->setPresetName(index, name); } void projectM::changeTextureSize(int size) { _settings.textureSize = size; delete renderer; renderer = new Renderer(_settings.windowWidth, _settings.windowHeight, _settings.meshX, _settings.meshY, _settings.textureSize, beatDetect, _settings.presetURL, _settings.titleFontURL, _settings.menuFontURL); } void projectM::changePresetDuration(int seconds) { timeKeeper->ChangePresetDuration(seconds); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/projectM.hpp���������������������������������������������������������0000664�0000000�0000000�00000022523�12660066715�0020625�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: projectM.hpp,v 1.1.1.1 2005/12/23 18:05:11 psperl Exp $ * * Encapsulation of ProjectM engine * * $Log$ */ #ifndef _PROJECTM_HPP #define _PROJECTM_HPP #ifdef WIN32 #include <dirent-win32/dirent.h> #else #include <dirent.h> #endif /** WIN32 */ #include <cmath> #include <cstdio> #include <string> #include <cstdlib> #ifndef WIN32 #include <unistd.h> #endif #include <sys/types.h> #ifdef MACOS //#include <MacWindows.h> //#include <gl.h> //#include <glu.h> #else #ifdef WIN32 #include <windows.h> #endif /** WIN32 */ #endif /** MACOS */ #ifdef WIN322 #define inline #endif /** WIN32 */ #include "dlldefs.h" #include "event.h" #include "fatal.h" class PipelineContext; #include "PCM.hpp" class BeatDetect; class PCM; class Func; class Renderer; class Preset; class PresetIterator; class PresetChooser; class PresetLoader; class TimeKeeper; class Pipeline; class RenderItemMatcher; class MasterRenderItemMerge; #include "Common.hpp" #include "Preset.hpp" // EDIT BY SJ - added to avoid warning C4150 on MSW - std::auto_ptr<Preset> destructors cannot be called without declaration of 'Preset', maybe the stuff is inlined on MSW #include <memory> #ifdef WIN32 #pragma warning (disable:4244) #pragma warning (disable:4305) #endif /** WIN32 */ #ifdef MACOS2 #define inline #endif /** KEEP THIS UP TO DATE! */ #define PROJECTM_VERSION "2.0.00" #define PROJECTM_TITLE "projectM 2.0.00" /** Interface types */ typedef enum { MENU_INTERFACE, SHELL_INTERFACE, EDITOR_INTERFACE, DEFAULT_INTERFACE, BROWSER_INTERFACE } interface_t; /// A functor class that allows users of this library to specify random preset behavior class RandomizerFunctor { public: RandomizerFunctor(PresetChooser & chooser) ; virtual ~RandomizerFunctor(); virtual double operator() (int index); private: const PresetChooser & m_chooser; }; class DLLEXPORT projectM { public: static const int FLAG_NONE = 0; static const int FLAG_DISABLE_PLAYLIST_LOAD = 1 << 0; struct Settings { int meshX; int meshY; int fps; int textureSize; int windowWidth; int windowHeight; std::string presetURL; std::string titleFontURL; std::string menuFontURL; int smoothPresetDuration; int presetDuration; float beatSensitivity; bool aspectCorrection; float easterEgg; bool shuffleEnabled; bool softCutRatingsEnabled; }; projectM(std::string config_file, int flags = FLAG_NONE); projectM(const Settings& settings, int flags = FLAG_NONE); //DLLEXPORT projectM(int gx, int gy, int fps, int texsize, int width, int height,std::string preset_url,std::string title_fonturl, std::string title_menuurl); void projectM_resetGL( int width, int height ); void projectM_resetTextures(); void projectM_setTitle( std::string title ); void renderFrame(); unsigned initRenderToTexture(); void key_handler( projectMEvent event, projectMKeycode keycode, projectMModifier modifier ); virtual ~projectM(); void changeTextureSize(int size); void changePresetDuration(int seconds); const Settings & settings() const { return _settings; } /// Writes a settings configuration to the specified file static bool writeConfig(const std::string & configFile, const Settings & settings); /// Sets preset iterator position to the passed in index void selectPresetPosition(unsigned int index); /// Plays a preset immediately void selectPreset(unsigned int index, bool hardCut = true); /// Removes a preset from the play list. If it is playing then it will continue as normal until next switch void removePreset(unsigned int index); /// Sets the randomization functor. If set to null, the traversal will move in order according to the playlist void setRandomizer(RandomizerFunctor * functor); /// Tell projectM to play a particular preset when it chooses to switch /// If the preset is locked the queued item will be not switched to until the lock is released /// Subsequent calls to this function effectively nullifies previous calls. void queuePreset(unsigned int index); /// Returns true if a preset is queued up to play next bool isPresetQueued() const; /// Removes entire playlist, The currently loaded preset will end up sticking until new presets are added void clearPlaylist(); /// Turn on or off a lock that prevents projectM from switching to another preset void setPresetLock(bool isLocked); /// Returns true if the active preset is locked bool isPresetLocked() const; /// Returns index of currently active preset. In the case where the active /// preset was removed from the playlist, this function will return the element /// before active preset (thus the next in order preset is invariant with respect /// to the removal) bool selectedPresetIndex(unsigned int & index) const; /// Add a preset url to the play list. Appended to bottom. Returns index of preset unsigned int addPresetURL(const std::string & presetURL, const std::string & presetName, const RatingList & ratingList); /// Insert a preset url to the play list at the suggested index. void insertPresetURL(unsigned int index, const std::string & presetURL, const std::string & presetName, const RatingList & ratingList); /// Returns true if the selected preset position points to an actual preset in the /// currently loaded playlist bool presetPositionValid() const; /// Returns the url associated with a preset index std::string getPresetURL(unsigned int index) const; /// Returns the preset name associated with a preset index std::string getPresetName ( unsigned int index ) const; void changePresetName ( unsigned int index, std::string name ); /// Returns the rating associated with a preset index int getPresetRating (unsigned int index, const PresetRatingType ratingType) const; void changePresetRating (unsigned int index, int rating, const PresetRatingType ratingType); /// Returns the size of the play list unsigned int getPlaylistSize() const; void evaluateSecondPreset(); inline void setShuffleEnabled(bool value) { _settings.shuffleEnabled = value; /// idea@ call a virtualfunction shuffleChanged() } inline bool isShuffleEnabled() const { return _settings.shuffleEnabled; } /// Occurs when active preset has switched. Switched to index is returned virtual void presetSwitchedEvent(bool isHardCut, unsigned int index) const {}; virtual void shuffleEnabledValueChanged(bool isEnabled) const {}; /// Occurs whenever preset rating has changed via changePresetRating() method virtual void presetRatingChanged(unsigned int index, int rating, PresetRatingType ratingType) const {}; inline PCM * pcm() { return _pcm; } void *thread_func(void *vptr_args); PipelineContext & pipelineContext() { return *_pipelineContext; } PipelineContext & pipelineContext2() { return *_pipelineContext2; } void selectPrevious(const bool); void selectNext(const bool); void selectRandom(const bool); private: PCM * _pcm; double sampledPresetDuration(); BeatDetect * beatDetect; Renderer *renderer; PipelineContext * _pipelineContext; PipelineContext * _pipelineContext2; Settings _settings; int wvw; //windowed dimensions int wvh; /** Timing information */ int mspf; int timed; int timestart; int count; float fpsstart; void readConfig(const std::string &configFile); void readSettings(const Settings &settings); void projectM_init(int gx, int gy, int fps, int texsize, int width, int height); void projectM_reset(); void projectM_initengine(); void projectM_resetengine(); /// Initializes preset loading / management libraries int initPresetTools(int gx, int gy); /// Deinitialize all preset related tools. Usually done before projectM cleanup void destroyPresetTools(); void default_key_handler( projectMEvent event, projectMKeycode keycode ); /// The current position of the directory iterator PresetIterator * m_presetPos; /// Required by the preset chooser. Manages a loaded preset directory PresetLoader * m_presetLoader; /// Provides accessor functions to choose presets PresetChooser * m_presetChooser; /// Currently loaded preset std::auto_ptr<Preset> m_activePreset; /// Destination preset when smooth preset switching std::auto_ptr<Preset> m_activePreset2; TimeKeeper *timeKeeper; int m_flags; RenderItemMatcher * _matcher; MasterRenderItemMerge * _merger; bool running; Pipeline* currentPipe; void switchPreset(std::auto_ptr<Preset> & targetPreset); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/timer.cpp������������������������������������������������������������0000775�0000000�0000000�00000002633�12660066715�0020160�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: timer.c,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $ * * Platform-independent timer */ #include "timer.h" #include <stdlib.h> #ifndef WIN32 /** Get number of ticks since the given timestamp */ unsigned int getTicks( struct timeval *start ) { struct timeval now; unsigned int ticks; gettimeofday(&now, NULL); ticks=(now.tv_sec-start->tv_sec)*1000+(now.tv_usec-start->tv_usec)/1000; return(ticks); } #else unsigned int getTicks( long start ) { return GetTickCount() - start; } #endif /** !WIN32 */ �����������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/timer.h��������������������������������������������������������������0000775�0000000�0000000�00000002705�12660066715�0017625�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: timer.h,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ * * Platform-independent timer * * $Log: timer.h,v $ * Revision 1.1.1.1 2005/12/23 18:05:00 psperl * Imported * * Revision 1.2 2004/10/05 09:19:40 cvs * Fixed header include defines * * Revision 1.1.1.1 2004/10/04 12:56:00 cvs * Imported * */ #ifndef _TIMER_H #define _TIMER_H #ifndef WIN32 #include <sys/time.h> unsigned int getTicks( struct timeval *start ); struct timeval GetCurrentTime(); #else #include <windows.h> unsigned int getTicks( long start ); #endif /** !WIN32 */ #endif /** _TIMER_H */ �����������������������������������������������������������silverjuke-16.2.3/src/prjm/src/wipemalloc.cpp�������������������������������������������������������0000775�0000000�0000000�00000002545�12660066715�0021176�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2004 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: wipemalloc.c,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $ * * Clean memory allocator */ #include "wipemalloc.h" void *wipemalloc( size_t count ) { void *mem = malloc( count ); if ( mem != NULL ) { memset( mem, 0, count ); } else { printf( "wipemalloc() failed to allocate %d bytes\n", (int)count ); } return mem; } /** Safe memory deallocator */ void wipefree( void *ptr ) { if ( ptr != NULL ) { free( ptr ); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/prjm/src/wipemalloc.h���������������������������������������������������������0000775�0000000�0000000�00000003227�12660066715�0020641�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * projectM -- Milkdrop-esque visualisation SDK * Copyright (C)2003-2007 projectM Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * See 'LICENSE.txt' included within this release * */ /** * $Id: wipemalloc.h,v 1.1.1.1 2005/12/23 18:05:03 psperl Exp $ * * Contains an inline function which can replace malloc() that also * call memset( ..., 0, sizeof( ... ) ) on the allocated block for * safe initialization * * $Log$ */ #ifndef _WIPEMALLOC_H #define _WIPEMALLOC_H #ifndef MACOS #ifndef HAVE_AIX /** AIX has malloc() defined in a strange place... */ #ifdef WIN32 #include <malloc.h> #endif #include <string.h> #include <stdlib.h> #else #include <stdlib.h> #endif /** !HAVE_AIX */ #else #include <string.h> #include <stdlib.h> #endif /** !MACOS */ #include <stdio.h> #ifdef PANTS #if defined(WIN32) && !defined(inline) #define inline #endif #endif /** Safe memory allocator */ void *wipemalloc( size_t count ); void wipefree( void *ptr ); #endif /** !_WIPEMALLOC_H */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0015342�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/cfunction.c���������������������������������������������������������������0000664�0000000�0000000�00000024756�12660066715�0017514�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: cfunction.c 1124 2006-08-02 16:40:07Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> #endif #include "see_see.h" #include "see_value.h" #include "see_mem.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_no.h" #include "see_cfunction.h" #include "see_interpreter.h" #include "see_error.h" #include "see_stringdefs.h" #include "see_cfunction_private.h" /* * cfunction * * These are the ECMAScript objects that wrap native C functions. * They are referred to in the introduction of section 15 of the * standard as 'built-in' functions. * * They have a [[Call]] property which invokes the appropriate * C function, and also has a "length" property which * gives the typical number of arguments to the [[Call]] method. * Their prototype is the anonymous CFunction prototype object (whose * own prototype is Function.prototype). * * The length property is implemented in a way equivalent to the * requirement that it "has the attributes { ReadOnly, DontDelete, * DontEnum } (and not others)." (15) * */ struct cfunction { struct SEE_object object; SEE_call_fn_t func; int length; struct SEE_string *name; void *sec_domain; }; static void cfunction_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static int cfunction_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static void cfunction_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void *cfunction_get_sec_domain(struct SEE_interpreter *, struct SEE_object *); /* * CFunction object class */ struct SEE_objectclass SEE_cfunction_class = { "Function", /* Class */ cfunction_get, /* Get */ SEE_no_put, /* Put */ SEE_no_canput, /* CanPut */ cfunction_hasproperty, /* HasProperty */ SEE_no_delete, /* Delete */ SEE_native_defaultvalue,/* DefaultValue */ SEE_no_enumerator, /* enumerator */ NULL, /* Construct (15) */ cfunction_call, /* Call */ NULL, /* HasInstance */ cfunction_get_sec_domain/* get_sec_domain */ }; /* * Return a CFunction object that wraps a C function */ struct SEE_object * SEE_cfunction_make(interp, func, name, length) struct SEE_interpreter *interp; SEE_call_fn_t func; struct SEE_string *name; int length; { struct cfunction *f; f = SEE_NEW(interp, struct cfunction); f->object.objectclass = &SEE_cfunction_class; f->object.Prototype = interp->Function_prototype; /* 15 */ f->func = func; f->name = name; f->length = length; f->sec_domain = interp->sec_domain; return (struct SEE_object *)f; } /*------------------------------------------------------------ * CFunction class methods */ static void cfunction_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { struct cfunction *f = (struct cfunction *)o; if ((SEE_COMPAT_JS(interp, >=, JS11)) && SEE_string_cmp(p, STR(__proto__)) == 0) { SEE_SET_OBJECT(res, o->Prototype); return; } if (SEE_string_cmp(p, STR(length)) == 0) SEE_SET_NUMBER(res, f->length); else SEE_OBJECT_GET(interp, o->Prototype, p, res); } static int cfunction_hasproperty(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { if (SEE_string_cmp(p, STR(length)) == 0) return 1; return SEE_OBJECT_HASPROPERTY(interp, o->Prototype, p); } static void cfunction_call(interp, o, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *o, *thisobj; int argc; struct SEE_value **argv, *res; { struct cfunction *f = (struct cfunction *)o; (*f->func)(interp, o, thisobj, argc, argv, res); } void SEE_cfunction_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; struct cfunction *f = (struct cfunction *)thisobj; s = SEE_string_new(interp, 0); SEE_string_append(s, STR(cfunction_body1)); SEE_string_append(s, f->name); SEE_string_append(s, STR(cfunction_body2)); SEE_string_append_int(s, (int)f->func); SEE_string_append(s, STR(cfunction_body3)); SEE_SET_STRING(res, s); } struct SEE_string * SEE_cfunction_getname(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct cfunction *f = (struct cfunction *)o; return f->name; } /* Converts a SEE_string of ASCII chars into a C string */ static char * to_ascii_string(interp, s) struct SEE_interpreter *interp; struct SEE_string *s; { int i; char *zs; zs = SEE_NEW_STRING_ARRAY(interp, char, s->length + 1); for (i = 0; i < s->length; i++) if (s->data[i] == 0) SEE_error_throw_string(interp, interp->TypeError, STR(string_contains_null)); else if (s->data[i] >= 0x80) SEE_error_throw_string(interp, interp->TypeError, STR(string_not_ascii)); else zs[i] = s->data[i]; zs[s->length] = 0; return zs; } /* Converts a SEE_string of chars into a UTF-8 string */ static char * to_utf8_string(interp, s) struct SEE_interpreter *interp; struct SEE_string *s; { char *zs; int zslen, i; zslen = SEE_string_utf8_size(interp, s) + 1; zs = SEE_NEW_STRING_ARRAY(interp, char, zslen); SEE_string_toutf8(interp, zs, zslen, s); for (i = 0; i < zslen - 1; i++) if (zs[i] == 0) SEE_error_throw_string(interp, interp->TypeError, STR(string_contains_null)); return zs; } void SEE_parse_args( struct SEE_interpreter *interp, int argc, struct SEE_value **argv, const char *fmt, ... ) { va_list ap; int i, init = 1, isundef; const char *f; struct SEE_value val, undef, *arg; struct SEE_string **stringp; int *intp; SEE_int32_t *int32p; SEE_uint32_t *uint32p; SEE_uint16_t *uint16p; SEE_number_t *numberp; struct SEE_object **objectpp; struct SEE_value *valuep; char **charpp; SEE_SET_UNDEFINED(&undef); va_start(ap, fmt); for (i = 0, f = fmt; *f; f++) { if (!init && i >= argc) break; arg = i < argc ? argv[i] : &undef; isundef = SEE_VALUE_GET_TYPE(arg) == SEE_UNDEFINED; switch (*f) { case ' ': break; case 's': i++; if (isundef && !init) break; SEE_ToString(interp, arg, &val); stringp = va_arg(ap, struct SEE_string **); *stringp = val.u.string; break; case 'A': if (isundef) { i++; if (!init) continue; charpp = va_arg(ap, char **); *charpp = NULL; break; } /* else fallthrough */ case 'a': i++; if (isundef && !init) break; SEE_ToString(interp, arg, &val); charpp = va_arg(ap, char **); *charpp = to_ascii_string(interp, val.u.string); break; case 'Z': if (isundef) { i++; if (!init) continue; charpp = va_arg(ap, char **); *charpp = NULL; break; } /* else fallthrough */ case 'z': i++; if (isundef && !init) break; SEE_ToString(interp, arg, &val); charpp = va_arg(ap, char **); *charpp = to_utf8_string(interp, val.u.string); break; case 'b': i++; if (isundef && !init) break; SEE_ToBoolean(interp, arg, &val); intp = va_arg(ap, int *); *intp = val.u.boolean; break; case 'i': i++; if (isundef && !init) break; int32p = va_arg(ap, SEE_int32_t *); *int32p = SEE_ToInt32(interp, arg); break; case 'u': i++; if (isundef && !init) break; uint32p = va_arg(ap, SEE_uint32_t *); *uint32p = SEE_ToUint32(interp, arg); break; case 'h': i++; if (isundef && !init) break; uint16p = va_arg(ap, SEE_uint16_t *); *uint16p = SEE_ToUint16(interp, arg); break; case 'n': i++; if (isundef && !init) break; SEE_ToNumber(interp, arg, &val); numberp = va_arg(ap, SEE_number_t *); *numberp = val.u.number; break; case 'O': if (isundef || SEE_VALUE_GET_TYPE(arg) == SEE_NULL) { i++; if (!init && isundef) continue; objectpp = va_arg(ap, struct SEE_object **); *objectpp = NULL; break; } /* else fallthrough */ case 'o': i++; if (isundef && !init) break; SEE_ToObject(interp, arg, &val); i++; objectpp = va_arg(ap, struct SEE_object **); *objectpp = val.u.object; break; case 'p': i++; if (isundef && !init) break; valuep = va_arg(ap, struct SEE_value *); SEE_ToPrimitive(interp, arg, NULL, valuep); break; case 'v': i++; if (isundef && !init) break; valuep = va_arg(ap, struct SEE_value *); SEE_VALUE_COPY(valuep, arg); break; case '|': init = 0; break; case 'x': i++; break; case '.': if (i < argc) SEE_error_throw_string(interp, interp->TypeError, STR(too_many_args)); break; } } va_end(ap); } static void * cfunction_get_sec_domain(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct cfunction *f = (struct cfunction *)o; return f->sec_domain; } ������������������silverjuke-16.2.3/src/see/debug.c�������������������������������������������������������������������0000664�0000000�0000000�00000017122�12660066715�0016577�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: debug.c 936 2006-01-21 03:51:30Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_try.h" #include "see_value.h" #include "see_object.h" #include "see_string.h" #include "see_debug.h" #include "see_interpreter.h" #include "see_function.h" /* * Print the contents of a value, without raising an exception */ void SEE_PrintValue(interp, v, f) struct SEE_interpreter *interp; const struct SEE_value *v; FILE *f; { if (v == NULL) { fprintf(f, "NULL"); return; } switch (SEE_VALUE_GET_TYPE(v)) { case SEE_UNDEFINED: fprintf(f, "undefined"); break; case SEE_NULL: fprintf(f, "null"); break; case SEE_BOOLEAN: fprintf(f, v->u.boolean ? "true" : "false"); break; case SEE_NUMBER: fprintf(f, "%.30g", v->u.number); break; case SEE_STRING: SEE_PrintString(interp, v->u.string, f); break; case SEE_OBJECT: SEE_PrintObject(interp, v->u.object, f); break; case SEE_REFERENCE: fprintf(f, "<ref base=<object %p> prop=", (void *)v->u.reference.base); SEE_string_fputs(v->u.reference.property, f); fprintf(f, ">"); break; case SEE_COMPLETION: switch (v->u.completion.type) { case SEE_COMPLETION_NORMAL: fprintf(f, "<normal"); if (v->u.completion.value) { fprintf(f, " "); SEE_PrintValue(interp, v->u.completion.value, f); } fprintf(f, ">"); break; case SEE_COMPLETION_BREAK: fprintf(f, "<break"); if (v->u.completion.target != (void *)1) fprintf(f, " %p", v->u.completion.target); fprintf(f, ">"); break; case SEE_COMPLETION_CONTINUE: fprintf(f, "<continue"); if (v->u.completion.target != (void *)2) fprintf(f, " %p", v->u.completion.target); fprintf(f, ">"); break; case SEE_COMPLETION_RETURN: fprintf(f, "<return "); SEE_PrintValue(interp, v->u.completion.value, f); fprintf(f, ">"); break; case SEE_COMPLETION_THROW: fprintf(f, "<throw "); SEE_PrintValue(interp, v->u.completion.value, f); fprintf(f, ">"); break; default: fprintf(f, "<BAD completion %d>", v->u.completion.type); } break; default: fprintf(f, "<BAD value %d>", SEE_VALUE_GET_TYPE(v)); } } /* * Print an object without raising an exception. * The object's class is shown in quotes. * If the object is known to the interpreter (eg Object, Array.prototype, etc.) * then its original name is shown in parentheses. */ void SEE_PrintObject(interp, o, f) struct SEE_interpreter *interp; const struct SEE_object *o; FILE *f; { const char *known; if (o == NULL) known = "NULL"; else if (interp == NULL) known = NULL; else if (o == interp->Global) known = "Global"; else if (o == interp->Object) known = "Object"; else if (o == interp->Object_prototype) known = "Object.prototype"; else if (o == interp->Error) known = "Error"; else if (o == interp->EvalError) known = "EvalError"; else if (o == interp->RangeError) known = "RangeError"; else if (o == interp->ReferenceError) known = "ReferenceError"; else if (o == interp->SyntaxError) known = "SyntaxError"; else if (o == interp->TypeError) known = "TypeError"; else if (o == interp->URIError) known = "URIError"; else if (o == interp->String) known = "String"; else if (o == interp->String_prototype) known = "String.prototype"; else if (o == interp->Function) known = "Function"; else if (o == interp->Function_prototype)known = "Function.prototype"; else if (o == interp->Array) known = "Array"; else if (o == interp->Array_prototype) known = "Array.prototype"; else if (o == interp->Number) known = "Number"; else if (o == interp->Number_prototype) known = "Number.prototype"; else if (o == interp->Boolean) known = "Boolean"; else if (o == interp->Boolean_prototype)known = "Boolean.prototype"; else if (o == interp->Math) known = "Math"; else if (o == interp->RegExp) known = "RegExp"; else if (o == interp->RegExp_prototype) known = "RegExp.prototype"; else if (o == interp->Date) known = "Date"; else if (o == interp->Date_prototype) known = "Date.prototype"; else known = NULL; fprintf(f, "<object %p", (void *)o); if (known) fprintf(f, " (%s)", known); if (o && o->objectclass && !known) { fprintf(f, " \"%s\"", o->objectclass->Class); } fprintf(f, ">"); } /* * Print a string, in 'literal' form to the given stdio file. */ void SEE_PrintString(interp, s, f) struct SEE_interpreter *interp; const struct SEE_string *s; FILE *f; { unsigned int i; if (s == NULL) fprintf(f, "<NULL>"); else { /* NB Replicates most of SEE_string_literal(). */ fprintf(f, "\""); for (i = 0; i < s->length; i++) { SEE_char_t c = s->data[i]; if (c == '\\') fprintf(f, "\\\\"); else if (c == '\"') fprintf(f, "\\\""); else if (c == '\n') fprintf(f, "\\n"); else if (c == '\t') fprintf(f, "\\t"); else if (c >= ' ' && c <= '~') fputc(c & 0x7f, f); else if (c < 0x100) fprintf(f, "\\x%02x", c); else fprintf(f, "\\u%04x", c); } fprintf(f, "\"<%s%s%p>", s->flags & SEE_STRING_FLAG_INTERNED ? "i" : "", s->flags & SEE_STRING_FLAG_STATIC ? "s" : "", (void *)s); } } void SEE_PrintTraceback(interp, f) struct SEE_interpreter *interp; FILE *f; { struct SEE_traceback *tb; struct SEE_string *locstr, *fname; struct SEE_object *fo; if (!interp->traceback) return; fprintf(f, "traceback:\n"); for (tb = interp->traceback; tb; tb = tb->prev) { locstr = SEE_location_string(interp, tb->call_location); fprintf(f, "\t"); SEE_string_fputs(locstr, f); fo = tb->callee; if (fo == NULL) fprintf(f, "?"); else if (tb->call_type == SEE_CALLTYPE_CONSTRUCT) fprintf(f, "new %s", fo->objectclass->Class ? fo->objectclass->Class : "?"); else if (tb->call_type == SEE_CALLTYPE_CALL) { fprintf(f, "call "); /* XXX is fo == interp->Global_eval case handled OK? */ fname = SEE_function_getname(interp, fo); if (fname) { SEE_string_fputs(fname, f); fprintf(f, "()"); } else fprintf(f, "<anonymous function>"); } else SEE_PrintObject(interp, fo, f); fprintf(f, "\n"); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/dprint.c������������������������������������������������������������������0000664�0000000�0000000�00000004672�12660066715�0017017�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2005 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id$ */ /* * This module controls how debugging messages are printed. */ #if HAVE_CONFIG_H # include <config.h> #endif #ifndef NDEBUG #if STDC_HEADERS # include <stdio.h> # include <stdarg.h> #endif #include "see_string.h" #include "see_debug.h" #include "see_dprint.h" /* * Prints text for debugging */ void SEE_dprintf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); (void)vfprintf(stderr, fmt, ap); va_end(ap); } /* * Prints a SEE string for debugging */ void SEE_dprints(s) const struct SEE_string *s; { (void)SEE_string_fputs(s, stderr); } /* * Prints a SEE value for debugging */ void SEE_dprintv(interp, v) struct SEE_interpreter *interp; const struct SEE_value *v; { SEE_PrintValue(interp, v, stderr); } /* * Prints a SEE object for debugging */ void SEE_dprinto(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { SEE_PrintObject(interp, o, stderr); } #endif ����������������������������������������������������������������������silverjuke-16.2.3/src/see/dtoa.c��������������������������������������������������������������������0000664�0000000�0000000�00000205067�12660066715�0016447�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: dtoa.c 724 2004-10-22 13:52:41Z d $ */ /* These headers are used for intergration into SEE */ #include "see_dtoa.h" #include "see_dtoa_config.h" /**************************************************************** * * The author of this software is David M. Gay. * * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. * * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. * ***************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* On a machine with IEEE extended-precision registers, it is * necessary to specify double-precision (53-bit) rounding precision * before invoking strtod or dtoa. If the machine uses (the equivalent * of) Intel 80x87 arithmetic, the call * _control87(PC_53, MCW_PC); * does this with many compilers. Whether this or another call is * appropriate depends on the compiler; for this to work, it may be * necessary to #include "see_float.h" or another system-dependent header * file. */ /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. * * This strtod returns a nearest machine number to the input decimal * string (or sets errno to ERANGE). With IEEE arithmetic, ties are * broken by the IEEE round-even rule. Otherwise ties are broken by * biased rounding (add half and chop). * * Inspired loosely by William D. Clinger's paper "How to Read Floating * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. * * Modifications: * * 1. We only require IEEE, IBM, or VAX double-precision * arithmetic (not IEEE double-extended). * 2. We get by with floating-point arithmetic in a case that * Clinger missed -- when we're computing d * 10^n * for a small integer d and the integer n is not too * much larger than 22 (the maximum integer k for which * we can represent 10^k exactly), we may be able to * compute (d*10^k) * 10^(e-k) with just one roundoff. * 3. Rather than a bit-at-a-time adjustment of the binary * result in the hard case, we use floating-point * arithmetic to determine the adjustment to within * one bit; only in really hard cases do we need to * compute a second residual. * 4. Because of 3., we don't need a large table of powers of 10 * for ten-to-e (just some small tables, e.g. of 10^k * for 0 <= k <= 22). */ /* * #define IEEE_8087 for IEEE-arithmetic machines where the least * significant byte has the lowest address. * #define IEEE_MC68k for IEEE-arithmetic machines where the most * significant byte has the lowest address. * #define Long int on machines with 32-bit ints and 64-bit longs. * #define IBM for IBM mainframe-style floating-point arithmetic. * #define VAX for VAX-style floating-point arithmetic (D_floating). * #define No_leftright to omit left-right logic in fast floating-point * computation of dtoa. * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 * and strtod and dtoa should round accordingly. * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 * and Honor_FLT_ROUNDS is not #defined. * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines * that use extended-precision instructions to compute rounded * products and quotients) with IBM. * #define ROUND_BIASED for IEEE-format with biased rounding. * #define Inaccurate_Divide for IEEE-format with correctly rounded * products but inaccurate quotients, e.g., for Intel i860. * #define NO_LONG_LONG on machines that do not have a "long long" * integer type (of >= 64 bits). On such machines, you can * #define Just_16 to store 16 bits per 32-bit Long when doing * high-precision integer arithmetic. Whether this speeds things * up or slows things down depends on the machine and the number * being converted. If long long is available and the name is * something other than "long long", #define Llong to be the name, * and if "unsigned Llong" does not work as an unsigned version of * Llong, #define #ULLong to be the corresponding unsigned type. * #define KR_headers for old-style C function headers. * #define Bad_float_h if your system lacks a float.h or if it does not * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) * if memory is available and otherwise does something you deem * appropriate. If MALLOC is undefined, malloc will be invoked * directly -- and assumed always to succeed. * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making * memory allocations from a private pool of memory when possible. * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, * unless #defined to be a different length. This default length * suffices to get rid of MALLOC calls except for unusual cases, * such as decimal-to-binary conversion of a very long string of * digits. The longest string dtoa can return is about 751 bytes * long. For conversions by strtod of strings of 800 digits and * all dtoa conversions in single-threaded executions with 8-byte * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte * pointers, PRIVATE_MEM >= 7112 appears adequate. * #define INFNAN_CHECK on IEEE systems to cause strtod to check for * Infinity and NaN (case insensitively). On some systems (e.g., * some HP systems), it may be necessary to #define NAN_WORD0 * appropriately -- to the most significant word of a quiet NaN. * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, * strtod also accepts (case insensitively) strings of the form * NaN(x), where x is a string of hexadecimal digits and spaces; * if there is only one string of hexadecimal digits, it is taken * for the 52 fraction bits of the resulting NaN; if there are two * or more strings of hex digits, the first is for the high 20 bits, * the second and subsequent for the low 32 bits, with intervening * white space ignored; but if this results in none of the 52 * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0 * and NAN_WORD1 are used instead. * #define MULTIPLE_THREADS if the system offers preemptively scheduled * multiple threads. In this case, you must provide (or suitably * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed * in pow5mult, ensures lazy evaluation of only one copy of high * powers of 5; omitting this lock would introduce a small * probability of wasting memory, but would otherwise be harmless.) * You must also invoke freedtoa(s) to free the value s returned by * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that * avoids underflows on inputs whose result does not underflow. * If you #define NO_IEEE_Scale on a machine that uses IEEE-format * floating-point numbers and flushes underflows to zero rather * than implementing gradual underflow, then you must also #define * Sudden_Underflow. * #define YES_ALIAS to permit aliasing certain double values with * arrays of ULongs. This leads to slightly better code with * some compilers and was always used prior to 19990916, but it * is not strictly legal and can cause trouble with aggressively * optimizing compilers (e.g., gcc 2.95.1 under -O2). * #define USE_LOCALE to use the current locale's decimal_point value. * #define SET_INEXACT if IEEE arithmetic is being used and extra * computation should be done to set the inexact flag when the * result is inexact and avoid setting inexact when the result * is exact. In this case, dtoa.c must be compiled in * an environment, perhaps provided by #include "see_dtoa.c" in a * suitable wrapper, that defines two functions, * int get_inexact(void); * void clear_inexact(void); * such that get_inexact() returns a nonzero value if the * inexact bit is already set, and clear_inexact() sets the * inexact bit to 0. When SET_INEXACT is #defined, strtod * also does extra computations to set the underflow and overflow * flags when appropriate (i.e., when the result is tiny and * inexact or when it is a numeric value rounded to +-infinity). * #define NO_ERRNO if strtod should not assign errno = ERANGE when * the result overflows to +-Infinity or underflows to 0. */ #ifndef Long #define Long long #endif #ifndef ULong typedef unsigned Long ULong; #endif #ifdef DEBUG #include <stdio.h> #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} #endif #include <stdlib.h> #include <string.h> #ifdef USE_LOCALE #include "see_locale.h" #endif #ifdef MALLOC #ifdef KR_headers extern char *MALLOC(); #else extern void *MALLOC(size_t); #endif #else #define MALLOC malloc #endif #ifndef Omit_Private_Memory #ifndef PRIVATE_MEM #define PRIVATE_MEM 2304 #endif #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) static double private_mem[PRIVATE_mem], *pmem_next = private_mem; #endif #undef IEEE_Arith #undef Avoid_Underflow #ifdef IEEE_MC68k #define IEEE_Arith #endif #ifdef IEEE_8087 #define IEEE_Arith #endif #include <errno.h> #ifdef Bad_float_h #ifdef IEEE_Arith #define DBL_DIG 15 #define DBL_MAX_10_EXP 308 #define DBL_MAX_EXP 1024 #define FLT_RADIX 2 #endif /*IEEE_Arith*/ #ifdef IBM #define DBL_DIG 16 #define DBL_MAX_10_EXP 75 #define DBL_MAX_EXP 63 #define FLT_RADIX 16 #define DBL_MAX 7.2370055773322621e+75 #endif #ifdef VAX #define DBL_DIG 16 #define DBL_MAX_10_EXP 38 #define DBL_MAX_EXP 127 #define FLT_RADIX 2 #define DBL_MAX 1.7014118346046923e+38 #endif #ifndef LONG_MAX #define LONG_MAX 2147483647 #endif #else /* ifndef Bad_float_h */ #include <float.h> #endif /* Bad_float_h */ #ifndef __MATH_H__ #include <math.h> #endif #ifdef __cplusplus extern "C" { #endif #ifndef CONST #ifdef KR_headers #define CONST /* blank */ #else #define CONST const #endif #endif #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. #endif typedef union { double d; ULong L[2]; } U; #ifdef YES_ALIAS #define dval(x) x #ifdef IEEE_8087 #define word0(x) ((ULong *)&x)[1] #define word1(x) ((ULong *)&x)[0] #else #define word0(x) ((ULong *)&x)[0] #define word1(x) ((ULong *)&x)[1] #endif #else #ifdef IEEE_8087 #define word0(x) ((U*)&x)->L[1] #define word1(x) ((U*)&x)->L[0] #else #define word0(x) ((U*)&x)->L[0] #define word1(x) ((U*)&x)->L[1] #endif #define dval(x) ((U*)&x)->d #endif /* The following definition of Storeinc is appropriate for MIPS processors. * An alternative that might be better on some machines is * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) */ #if defined(IEEE_8087) + defined(VAX) #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ ((unsigned short *)a)[0] = (unsigned short)c, a++) #else #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ ((unsigned short *)a)[1] = (unsigned short)c, a++) #endif /* #define P DBL_MANT_DIG */ /* Ten_pmax = floor(P*log(2)/log(5)) */ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ #ifdef IEEE_Arith #define Exp_shift 20 #define Exp_shift1 20 #define Exp_msk1 0x100000 #define Exp_msk11 0x100000 #define Exp_mask 0x7ff00000 #define P 53 #define Bias 1023 #define Emin (-1022) #define Exp_1 0x3ff00000 #define Exp_11 0x3ff00000 #define Ebits 11 #define Frac_mask 0xfffff #define Frac_mask1 0xfffff #define Ten_pmax 22 #define Bletch 0x10 #define Bndry_mask 0xfffff #define Bndry_mask1 0xfffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 1 #define Tiny0 0 #define Tiny1 1 #define Quick_max 14 #define Int_max 14 #ifndef NO_IEEE_Scale #define Avoid_Underflow #ifdef Flush_Denorm /* debugging option */ #undef Sudden_Underflow #endif #endif #ifndef Flt_Rounds #ifdef FLT_ROUNDS #define Flt_Rounds FLT_ROUNDS #else #define Flt_Rounds 1 #endif #endif /*Flt_Rounds*/ #ifdef Honor_FLT_ROUNDS #define Rounding rounding #undef Check_FLT_ROUNDS #define Check_FLT_ROUNDS #else #define Rounding Flt_Rounds #endif #else /* ifndef IEEE_Arith */ #undef Check_FLT_ROUNDS #undef Honor_FLT_ROUNDS #undef SET_INEXACT #undef Sudden_Underflow #define Sudden_Underflow #ifdef IBM #undef Flt_Rounds #define Flt_Rounds 0 #define Exp_shift 24 #define Exp_shift1 24 #define Exp_msk1 0x1000000 #define Exp_msk11 0x1000000 #define Exp_mask 0x7f000000 #define P 14 #define Bias 65 #define Exp_1 0x41000000 #define Exp_11 0x41000000 #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ #define Frac_mask 0xffffff #define Frac_mask1 0xffffff #define Bletch 4 #define Ten_pmax 22 #define Bndry_mask 0xefffff #define Bndry_mask1 0xffffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 4 #define Tiny0 0x100000 #define Tiny1 0 #define Quick_max 14 #define Int_max 15 #else /* VAX */ #undef Flt_Rounds #define Flt_Rounds 1 #define Exp_shift 23 #define Exp_shift1 7 #define Exp_msk1 0x80 #define Exp_msk11 0x800000 #define Exp_mask 0x7f80 #define P 56 #define Bias 129 #define Exp_1 0x40800000 #define Exp_11 0x4080 #define Ebits 8 #define Frac_mask 0x7fffff #define Frac_mask1 0xffff007f #define Ten_pmax 24 #define Bletch 2 #define Bndry_mask 0xffff007f #define Bndry_mask1 0xffff007f #define LSB 0x10000 #define Sign_bit 0x8000 #define Log2P 1 #define Tiny0 0x80 #define Tiny1 0 #define Quick_max 15 #define Int_max 15 #endif /* IBM, VAX */ #endif /* IEEE_Arith */ #ifndef IEEE_Arith #define ROUND_BIASED #endif #ifdef RND_PRODQUOT #define rounded_product(a,b) a = rnd_prod(a, b) #define rounded_quotient(a,b) a = rnd_quot(a, b) #ifdef KR_headers extern double rnd_prod(), rnd_quot(); #else extern double rnd_prod(double, double), rnd_quot(double, double); #endif #else #define rounded_product(a,b) a *= b #define rounded_quotient(a,b) a /= b #endif #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) #define Big1 0xffffffff #ifndef Pack_32 #define Pack_32 #endif #ifdef KR_headers #define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff) #else #define FFFFFFFF 0xffffffffUL #endif #ifdef NO_LONG_LONG #undef ULLong #ifdef Just_16 #undef Pack_32 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long. * This makes some inner loops simpler and sometimes saves work * during multiplications, but it often seems to make things slightly * slower. Hence the default is now to store 32 bits per Long. */ #endif #else /* long long available */ #ifndef Llong #define Llong long long #endif #ifndef ULLong #define ULLong unsigned Llong #endif #endif /* NO_LONG_LONG */ #ifndef MULTIPLE_THREADS #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ #define FREE_DTOA_LOCK(n) /*nothing*/ #endif #define Kmax 15 #ifdef __cplusplus extern "C" double strtod(const char *s00, char **se); extern "C" char *dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); #endif struct Bigint { struct Bigint *next; int k, maxwds, sign, wds; ULong x[1]; }; typedef struct Bigint Bigint; static Bigint *freelist[Kmax+1]; static Bigint * Balloc #ifdef KR_headers (k) int k; #else (int k) #endif { int x; Bigint *rv; #ifndef Omit_Private_Memory unsigned int len; #endif ACQUIRE_DTOA_LOCK(0); if (rv = freelist[k]) { freelist[k] = rv->next; } else { x = 1 << k; #ifdef Omit_Private_Memory rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); #else len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) /sizeof(double); if (pmem_next - private_mem + len <= PRIVATE_mem) { rv = (Bigint*)pmem_next; pmem_next += len; } else rv = (Bigint*)MALLOC(len*sizeof(double)); #endif rv->k = k; rv->maxwds = x; } FREE_DTOA_LOCK(0); rv->sign = rv->wds = 0; return rv; } static void Bfree #ifdef KR_headers (v) Bigint *v; #else (Bigint *v) #endif { if (v) { ACQUIRE_DTOA_LOCK(0); v->next = freelist[v->k]; freelist[v->k] = v; FREE_DTOA_LOCK(0); } } #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ y->wds*sizeof(Long) + 2*sizeof(int)) static Bigint * multadd #ifdef KR_headers (b, m, a) Bigint *b; int m, a; #else (Bigint *b, int m, int a) /* multiply by m and add a */ #endif { int i, wds; #ifdef ULLong ULong *x; ULLong carry, y; #else ULong carry, *x, y; #ifdef Pack_32 ULong xi, z; #endif #endif Bigint *b1; wds = b->wds; x = b->x; i = 0; carry = a; do { #ifdef ULLong y = *x * (ULLong)m + carry; carry = y >> 32; *x++ = y & FFFFFFFF; #else #ifdef Pack_32 xi = *x; y = (xi & 0xffff) * m + carry; z = (xi >> 16) * m + (y >> 16); carry = z >> 16; *x++ = (z << 16) + (y & 0xffff); #else y = *x * m + carry; carry = y >> 16; *x++ = y & 0xffff; #endif #endif } while(++i < wds); if (carry) { if (wds >= b->maxwds) { b1 = Balloc(b->k+1); Bcopy(b1, b); Bfree(b); b = b1; } b->x[wds++] = carry; b->wds = wds; } return b; } static Bigint * s2b #ifdef KR_headers (s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9; #else (CONST char *s, int nd0, int nd, ULong y9) #endif { Bigint *b; int i, k; Long x, y; x = (nd + 8) / 9; for(k = 0, y = 1; x > y; y <<= 1, k++) ; #ifdef Pack_32 b = Balloc(k); b->x[0] = y9; b->wds = 1; #else b = Balloc(k+1); b->x[0] = y9 & 0xffff; b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; #endif i = 9; if (9 < nd0) { s += 9; do b = multadd(b, 10, *s++ - '0'); while(++i < nd0); s++; } else s += 10; for(; i < nd; i++) b = multadd(b, 10, *s++ - '0'); return b; } static int hi0bits #ifdef KR_headers (x) register ULong x; #else (register ULong x) #endif { register int k = 0; if (!(x & 0xffff0000)) { k = 16; x <<= 16; } if (!(x & 0xff000000)) { k += 8; x <<= 8; } if (!(x & 0xf0000000)) { k += 4; x <<= 4; } if (!(x & 0xc0000000)) { k += 2; x <<= 2; } if (!(x & 0x80000000)) { k++; if (!(x & 0x40000000)) return 32; } return k; } static int lo0bits #ifdef KR_headers (y) ULong *y; #else (ULong *y) #endif { register int k; register ULong x = *y; if (x & 7) { if (x & 1) return 0; if (x & 2) { *y = x >> 1; return 1; } *y = x >> 2; return 2; } k = 0; if (!(x & 0xffff)) { k = 16; x >>= 16; } if (!(x & 0xff)) { k += 8; x >>= 8; } if (!(x & 0xf)) { k += 4; x >>= 4; } if (!(x & 0x3)) { k += 2; x >>= 2; } if (!(x & 1)) { k++; x >>= 1; if (!x) return 32; } *y = x; return k; } static Bigint * i2b #ifdef KR_headers (i) int i; #else (int i) #endif { Bigint *b; b = Balloc(1); b->x[0] = i; b->wds = 1; return b; } static Bigint * mult #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { Bigint *c; int k, wa, wb, wc; ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; ULong y; #ifdef ULLong ULLong carry, z; #else ULong carry, z; #ifdef Pack_32 ULong z2; #endif #endif if (a->wds < b->wds) { c = a; a = b; b = c; } k = a->k; wa = a->wds; wb = b->wds; wc = wa + wb; if (wc > a->maxwds) k++; c = Balloc(k); for(x = c->x, xa = x + wc; x < xa; x++) *x = 0; xa = a->x; xae = xa + wa; xb = b->x; xbe = xb + wb; xc0 = c->x; #ifdef ULLong for(; xb < xbe; xc0++) { if (y = *xb++) { x = xa; xc = xc0; carry = 0; do { z = *x++ * (ULLong)y + *xc + carry; carry = z >> 32; *xc++ = z & FFFFFFFF; } while(x < xae); *xc = carry; } } #else #ifdef Pack_32 for(; xb < xbe; xb++, xc0++) { if (y = *xb & 0xffff) { x = xa; xc = xc0; carry = 0; do { z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; carry = z >> 16; z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; carry = z2 >> 16; Storeinc(xc, z2, z); } while(x < xae); *xc = carry; } if (y = *xb >> 16) { x = xa; xc = xc0; carry = 0; z2 = *xc; do { z = (*x & 0xffff) * y + (*xc >> 16) + carry; carry = z >> 16; Storeinc(xc, z, z2); z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; carry = z2 >> 16; } while(x < xae); *xc = z2; } } #else for(; xb < xbe; xc0++) { if (y = *xb++) { x = xa; xc = xc0; carry = 0; do { z = *x++ * y + *xc + carry; carry = z >> 16; *xc++ = z & 0xffff; } while(x < xae); *xc = carry; } } #endif #endif for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; c->wds = wc; return c; } static Bigint *p5s; static Bigint * pow5mult #ifdef KR_headers (b, k) Bigint *b; int k; #else (Bigint *b, int k) #endif { Bigint *b1, *p5, *p51; int i; static int p05[3] = { 5, 25, 125 }; if (i = k & 3) b = multadd(b, p05[i-1], 0); if (!(k >>= 2)) return b; if (!(p5 = p5s)) { /* first time */ #ifdef MULTIPLE_THREADS ACQUIRE_DTOA_LOCK(1); if (!(p5 = p5s)) { p5 = p5s = i2b(625); p5->next = 0; } FREE_DTOA_LOCK(1); #else p5 = p5s = i2b(625); p5->next = 0; #endif } for(;;) { if (k & 1) { b1 = mult(b, p5); Bfree(b); b = b1; } if (!(k >>= 1)) break; if (!(p51 = p5->next)) { #ifdef MULTIPLE_THREADS ACQUIRE_DTOA_LOCK(1); if (!(p51 = p5->next)) { p51 = p5->next = mult(p5,p5); p51->next = 0; } FREE_DTOA_LOCK(1); #else p51 = p5->next = mult(p5,p5); p51->next = 0; #endif } p5 = p51; } return b; } static Bigint * lshift #ifdef KR_headers (b, k) Bigint *b; int k; #else (Bigint *b, int k) #endif { int i, k1, n, n1; Bigint *b1; ULong *x, *x1, *xe, z; #ifdef Pack_32 n = k >> 5; #else n = k >> 4; #endif k1 = b->k; n1 = n + b->wds + 1; for(i = b->maxwds; n1 > i; i <<= 1) k1++; b1 = Balloc(k1); x1 = b1->x; for(i = 0; i < n; i++) *x1++ = 0; x = b->x; xe = x + b->wds; #ifdef Pack_32 if (k &= 0x1f) { k1 = 32 - k; z = 0; do { *x1++ = *x << k | z; z = *x++ >> k1; } while(x < xe); if (*x1 = z) ++n1; } #else if (k &= 0xf) { k1 = 16 - k; z = 0; do { *x1++ = *x << k & 0xffff | z; z = *x++ >> k1; } while(x < xe); if (*x1 = z) ++n1; } #endif else do *x1++ = *x++; while(x < xe); b1->wds = n1 - 1; Bfree(b); return b1; } static int cmp #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { ULong *xa, *xa0, *xb, *xb0; int i, j; i = a->wds; j = b->wds; #ifdef DEBUG if (i > 1 && !a->x[i-1]) Bug("cmp called with a->x[a->wds-1] == 0"); if (j > 1 && !b->x[j-1]) Bug("cmp called with b->x[b->wds-1] == 0"); #endif if (i -= j) return i; xa0 = a->x; xa = xa0 + j; xb0 = b->x; xb = xb0 + j; for(;;) { if (*--xa != *--xb) return *xa < *xb ? -1 : 1; if (xa <= xa0) break; } return 0; } static Bigint * diff #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { Bigint *c; int i, wa, wb; ULong *xa, *xae, *xb, *xbe, *xc; #ifdef ULLong ULLong borrow, y; #else ULong borrow, y; #ifdef Pack_32 ULong z; #endif #endif i = cmp(a,b); if (!i) { c = Balloc(0); c->wds = 1; c->x[0] = 0; return c; } if (i < 0) { c = a; a = b; b = c; i = 1; } else i = 0; c = Balloc(a->k); c->sign = i; wa = a->wds; xa = a->x; xae = xa + wa; wb = b->wds; xb = b->x; xbe = xb + wb; xc = c->x; borrow = 0; #ifdef ULLong do { y = (ULLong)*xa++ - *xb++ - borrow; borrow = y >> 32 & (ULong)1; *xc++ = y & FFFFFFFF; } while(xb < xbe); while(xa < xae) { y = *xa++ - borrow; borrow = y >> 32 & (ULong)1; *xc++ = y & FFFFFFFF; } #else #ifdef Pack_32 do { y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(xc, z, y); } while(xb < xbe); while(xa < xae) { y = (*xa & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*xa++ >> 16) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(xc, z, y); } #else do { y = *xa++ - *xb++ - borrow; borrow = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } while(xb < xbe); while(xa < xae) { y = *xa++ - borrow; borrow = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } #endif #endif while(!*--xc) wa--; c->wds = wa; return c; } static double ulp #ifdef KR_headers (x) double x; #else (double x) #endif { register Long L; double a; L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; #ifndef Avoid_Underflow #ifndef Sudden_Underflow if (L > 0) { #endif #endif #ifdef IBM L |= Exp_msk1 >> 4; #endif word0(a) = L; word1(a) = 0; #ifndef Avoid_Underflow #ifndef Sudden_Underflow } else { L = -L >> Exp_shift; if (L < Exp_shift) { word0(a) = 0x80000 >> L; word1(a) = 0; } else { word0(a) = 0; L -= Exp_shift; word1(a) = L >= 31 ? 1 : 1 << 31 - L; } } #endif #endif return dval(a); } static double b2d #ifdef KR_headers (a, e) Bigint *a; int *e; #else (Bigint *a, int *e) #endif { ULong *xa, *xa0, w, y, z; int k; double d; #ifdef VAX ULong d0, d1; #else #define d0 word0(d) #define d1 word1(d) #endif xa0 = a->x; xa = xa0 + a->wds; y = *--xa; #ifdef DEBUG if (!y) Bug("zero y in b2d"); #endif k = hi0bits(y); *e = 32 - k; #ifdef Pack_32 if (k < Ebits) { d0 = Exp_1 | y >> Ebits - k; w = xa > xa0 ? *--xa : 0; d1 = y << (32-Ebits) + k | w >> Ebits - k; goto ret_d; } z = xa > xa0 ? *--xa : 0; if (k -= Ebits) { d0 = Exp_1 | y << k | z >> 32 - k; y = xa > xa0 ? *--xa : 0; d1 = z << k | y >> 32 - k; } else { d0 = Exp_1 | y; d1 = z; } #else if (k < Ebits + 16) { z = xa > xa0 ? *--xa : 0; d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; w = xa > xa0 ? *--xa : 0; y = xa > xa0 ? *--xa : 0; d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; goto ret_d; } z = xa > xa0 ? *--xa : 0; w = xa > xa0 ? *--xa : 0; k -= Ebits + 16; d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; y = xa > xa0 ? *--xa : 0; d1 = w << k + 16 | y << k; #endif ret_d: #ifdef VAX word0(d) = d0 >> 16 | d0 << 16; word1(d) = d1 >> 16 | d1 << 16; #else #undef d0 #undef d1 #endif return dval(d); } static Bigint * d2b #ifdef KR_headers (d, e, bits) double d; int *e, *bits; #else (double d, int *e, int *bits) #endif { Bigint *b; int de, k; ULong *x, y, z; #ifndef Sudden_Underflow int i; #endif #ifdef VAX ULong d0, d1; d0 = word0(d) >> 16 | word0(d) << 16; d1 = word1(d) >> 16 | word1(d) << 16; #else #define d0 word0(d) #define d1 word1(d) #endif #ifdef Pack_32 b = Balloc(1); #else b = Balloc(2); #endif x = b->x; z = d0 & Frac_mask; d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ #ifdef Sudden_Underflow de = (int)(d0 >> Exp_shift); #ifndef IBM z |= Exp_msk11; #endif #else if (de = (int)(d0 >> Exp_shift)) z |= Exp_msk1; #endif #ifdef Pack_32 if (y = d1) { if (k = lo0bits(&y)) { x[0] = y | z << 32 - k; z >>= k; } else x[0] = y; #ifndef Sudden_Underflow i = #endif b->wds = (x[1] = z) ? 2 : 1; } else { #ifdef DEBUG if (!z) Bug("Zero passed to d2b"); #endif k = lo0bits(&z); x[0] = z; #ifndef Sudden_Underflow i = #endif b->wds = 1; k += 32; } #else if (y = d1) { if (k = lo0bits(&y)) if (k >= 16) { x[0] = y | z << 32 - k & 0xffff; x[1] = z >> k - 16 & 0xffff; x[2] = z >> k; i = 2; } else { x[0] = y & 0xffff; x[1] = y >> 16 | z << 16 - k & 0xffff; x[2] = z >> k & 0xffff; x[3] = z >> k+16; i = 3; } else { x[0] = y & 0xffff; x[1] = y >> 16; x[2] = z & 0xffff; x[3] = z >> 16; i = 3; } } else { #ifdef DEBUG if (!z) Bug("Zero passed to d2b"); #endif k = lo0bits(&z); if (k >= 16) { x[0] = z; i = 0; } else { x[0] = z & 0xffff; x[1] = z >> 16; i = 1; } k += 32; } while(!x[i]) --i; b->wds = i + 1; #endif #ifndef Sudden_Underflow if (de) { #endif #ifdef IBM *e = (de - Bias - (P-1) << 2) + k; *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask); #else *e = de - Bias - (P-1) + k; *bits = P - k; #endif #ifndef Sudden_Underflow } else { *e = de - Bias - (P-1) + 1 + k; #ifdef Pack_32 *bits = 32*i - hi0bits(x[i-1]); #else *bits = (i+2)*16 - hi0bits(x[i]); #endif } #endif return b; } #undef d0 #undef d1 static double ratio #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { double da, db; int k, ka, kb; dval(da) = b2d(a, &ka); dval(db) = b2d(b, &kb); #ifdef Pack_32 k = ka - kb + 32*(a->wds - b->wds); #else k = ka - kb + 16*(a->wds - b->wds); #endif #ifdef IBM if (k > 0) { word0(da) += (k >> 2)*Exp_msk1; if (k &= 3) dval(da) *= 1 << k; } else { k = -k; word0(db) += (k >> 2)*Exp_msk1; if (k &= 3) dval(db) *= 1 << k; } #else if (k > 0) word0(da) += k*Exp_msk1; else { k = -k; word0(db) += k*Exp_msk1; } #endif return dval(da) / dval(db); } static CONST double tens[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22 #ifdef VAX , 1e23, 1e24 #endif }; static CONST double #ifdef IEEE_Arith bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, #ifdef Avoid_Underflow 9007199254740992.*9007199254740992.e-256 /* = 2^106 * 1e-53 */ #else 1e-256 #endif }; /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ /* flag unnecessarily. It leads to a song and dance at the end of strtod. */ #define Scale_Bit 0x10 #define n_bigtens 5 #else #ifdef IBM bigtens[] = { 1e16, 1e32, 1e64 }; static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; #define n_bigtens 3 #else bigtens[] = { 1e16, 1e32 }; static CONST double tinytens[] = { 1e-16, 1e-32 }; #define n_bigtens 2 #endif #endif #ifndef IEEE_Arith #undef INFNAN_CHECK #endif #ifdef INFNAN_CHECK #ifndef NAN_WORD0 #define NAN_WORD0 0x7ff80000 #endif #ifndef NAN_WORD1 #define NAN_WORD1 0 #endif static int match #ifdef KR_headers (sp, t) char **sp, *t; #else (CONST char **sp, char *t) #endif { int c, d; CONST char *s = *sp; while(d = *t++) { if ((c = *++s) >= 'A' && c <= 'Z') c += 'a' - 'A'; if (c != d) return 0; } *sp = s + 1; return 1; } #ifndef No_Hex_NaN static void hexnan #ifdef KR_headers (rvp, sp) double *rvp; CONST char **sp; #else (double *rvp, CONST char **sp) #endif { ULong c, x[2]; CONST char *s; int havedig, udx0, xshift; x[0] = x[1] = 0; havedig = xshift = 0; udx0 = 1; s = *sp; while(c = *(CONST unsigned char*)++s) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'a' && c <= 'f') c += 10 - 'a'; else if (c >= 'A' && c <= 'F') c += 10 - 'A'; else if (c <= ' ') { if (udx0 && havedig) { udx0 = 0; xshift = 1; } continue; } else if (/*(*/ c == ')' && havedig) { *sp = s + 1; break; } else return; /* invalid form: don't change *sp */ havedig = 1; if (xshift) { xshift = 0; x[0] = x[1]; x[1] = 0; } if (udx0) x[0] = (x[0] << 4) | (x[1] >> 28); x[1] = (x[1] << 4) | c; } if ((x[0] &= 0xfffff) || x[1]) { word0(*rvp) = Exp_mask | x[0]; word1(*rvp) = x[1]; } } #endif /*No_Hex_NaN*/ #endif /* INFNAN_CHECK */ double strtod #ifdef KR_headers (s00, se) CONST char *s00; char **se; #else (CONST char *s00, char **se) #endif { #ifdef Avoid_Underflow int scale; #endif int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; CONST char *s, *s0, *s1; double aadj, aadj1, adj, rv, rv0; Long L; ULong y, z; Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; #ifdef SET_INEXACT int inexact, oldinexact; #endif #ifdef Honor_FLT_ROUNDS int rounding; #endif #ifdef USE_LOCALE CONST char *s2; #endif sign = nz0 = nz = 0; dval(rv) = 0.; for(s = s00;;s++) switch(*s) { case '-': sign = 1; /* no break */ case '+': if (*++s) goto break2; /* no break */ case 0: goto ret0; case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': continue; default: goto break2; } break2: if (*s == '0') { nz0 = 1; while(*++s == '0') ; if (!*s) goto ret; } s0 = s; y = z = 0; for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) if (nd < 9) y = 10*y + c - '0'; else if (nd < 16) z = 10*z + c - '0'; nd0 = nd; #ifdef USE_LOCALE s1 = localeconv()->decimal_point; if (c == *s1) { c = '.'; if (*++s1) { s2 = s; for(;;) { if (*++s2 != *s1) { c = 0; break; } if (!*++s1) { s = s2; break; } } } } #endif if (c == '.') { c = *++s; if (!nd) { for(; c == '0'; c = *++s) nz++; if (c > '0' && c <= '9') { s0 = s; nf += nz; nz = 0; goto have_dig; } goto dig_done; } for(; c >= '0' && c <= '9'; c = *++s) { have_dig: nz++; if (c -= '0') { nf += nz; for(i = 1; i < nz; i++) if (nd++ < 9) y *= 10; else if (nd <= DBL_DIG + 1) z *= 10; if (nd++ < 9) y = 10*y + c; else if (nd <= DBL_DIG + 1) z = 10*z + c; nz = 0; } } } dig_done: e = 0; if (c == 'e' || c == 'E') { if (!nd && !nz && !nz0) { goto ret0; } s00 = s; esign = 0; switch(c = *++s) { case '-': esign = 1; case '+': c = *++s; } if (c >= '0' && c <= '9') { while(c == '0') c = *++s; if (c > '0' && c <= '9') { L = c - '0'; s1 = s; while((c = *++s) >= '0' && c <= '9') L = 10*L + c - '0'; if (s - s1 > 8 || L > 19999) /* Avoid confusion from exponents * so large that e might overflow. */ e = 19999; /* safe for 16 bit ints */ else e = (int)L; if (esign) e = -e; } else e = 0; } else s = s00; } if (!nd) { if (!nz && !nz0) { #ifdef INFNAN_CHECK /* Check for Nan and Infinity */ switch(c) { case 'i': case 'I': if (match(&s,"nf")) { --s; if (!match(&s,"inity")) ++s; word0(rv) = 0x7ff00000; word1(rv) = 0; goto ret; } break; case 'n': case 'N': if (match(&s, "an")) { word0(rv) = NAN_WORD0; word1(rv) = NAN_WORD1; #ifndef No_Hex_NaN if (*s == '(') /*)*/ hexnan(&rv, &s); #endif goto ret; } } #endif /* INFNAN_CHECK */ ret0: s = s00; sign = 0; } goto ret; } e1 = e -= nf; /* Now we have nd0 digits, starting at s0, followed by a * decimal point, followed by nd-nd0 digits. The number we're * after is the integer represented by those digits times * 10**e */ if (!nd0) nd0 = nd; k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; dval(rv) = y; if (k > 9) { #ifdef SET_INEXACT if (k > DBL_DIG) oldinexact = get_inexact(); #endif dval(rv) = tens[k - 9] * dval(rv) + z; } bd0 = 0; if (nd <= DBL_DIG #ifndef RND_PRODQUOT #ifndef Honor_FLT_ROUNDS && Flt_Rounds == 1 #endif #endif ) { if (!e) goto ret; if (e > 0) { if (e <= Ten_pmax) { #ifdef VAX goto vax_ovfl_check; #else #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv = -rv; sign = 0; } #endif /* rv = */ rounded_product(dval(rv), tens[e]); goto ret; #endif } i = DBL_DIG - nd; if (e <= Ten_pmax + i) { /* A fancier test would sometimes let us do * this for larger i values. */ #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv = -rv; sign = 0; } #endif e -= i; dval(rv) *= tens[i]; #ifdef VAX /* VAX exponent range is so narrow we must * worry about overflow here... */ vax_ovfl_check: word0(rv) -= P*Exp_msk1; /* rv = */ rounded_product(dval(rv), tens[e]); if ((word0(rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) goto ovfl; word0(rv) += P*Exp_msk1; #else /* rv = */ rounded_product(dval(rv), tens[e]); #endif goto ret; } } #ifndef Inaccurate_Divide else if (e >= -Ten_pmax) { #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv = -rv; sign = 0; } #endif /* rv = */ rounded_quotient(dval(rv), tens[-e]); goto ret; } #endif } e1 += nd - k; #ifdef IEEE_Arith #ifdef SET_INEXACT inexact = 1; if (k <= DBL_DIG) oldinexact = get_inexact(); #endif #ifdef Avoid_Underflow scale = 0; #endif #ifdef Honor_FLT_ROUNDS if ((rounding = Flt_Rounds) >= 2) { if (sign) rounding = rounding == 2 ? 0 : 2; else if (rounding != 2) rounding = 0; } #endif #endif /*IEEE_Arith*/ /* Get starting approximation = rv * 10**e1 */ if (e1 > 0) { if (i = e1 & 15) dval(rv) *= tens[i]; if (e1 &= ~15) { if (e1 > DBL_MAX_10_EXP) { ovfl: #ifndef NO_ERRNO errno = ERANGE; #endif /* Can't trust HUGE_VAL */ #ifdef IEEE_Arith #ifdef Honor_FLT_ROUNDS switch(rounding) { case 0: /* toward 0 */ case 3: /* toward -infinity */ word0(rv) = Big0; word1(rv) = Big1; break; default: word0(rv) = Exp_mask; word1(rv) = 0; } #else /*Honor_FLT_ROUNDS*/ word0(rv) = Exp_mask; word1(rv) = 0; #endif /*Honor_FLT_ROUNDS*/ #ifdef SET_INEXACT /* set overflow bit */ dval(rv0) = 1e300; dval(rv0) *= dval(rv0); #endif #else /*IEEE_Arith*/ word0(rv) = Big0; word1(rv) = Big1; #endif /*IEEE_Arith*/ if (bd0) goto retfree; goto ret; } e1 >>= 4; for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) dval(rv) *= bigtens[j]; /* The last multiplication could overflow. */ word0(rv) -= P*Exp_msk1; dval(rv) *= bigtens[j]; if ((z = word0(rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-P)) goto ovfl; if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { /* set to largest number */ /* (Can't trust DBL_MAX) */ word0(rv) = Big0; word1(rv) = Big1; } else word0(rv) += P*Exp_msk1; } } else if (e1 < 0) { e1 = -e1; if (i = e1 & 15) dval(rv) /= tens[i]; if (e1 >>= 4) { if (e1 >= 1 << n_bigtens) goto undfl; #ifdef Avoid_Underflow if (e1 & Scale_Bit) scale = 2*P; for(j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) dval(rv) *= tinytens[j]; if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask) >> Exp_shift)) > 0) { /* scaled rv is denormal; zap j low bits */ if (j >= 32) { word1(rv) = 0; if (j >= 53) word0(rv) = (P+2)*Exp_msk1; else word0(rv) &= 0xffffffff << j-32; } else word1(rv) &= 0xffffffff << j; } #else for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) dval(rv) *= tinytens[j]; /* The last multiplication could underflow. */ dval(rv0) = dval(rv); dval(rv) *= tinytens[j]; if (!dval(rv)) { dval(rv) = 2.*dval(rv0); dval(rv) *= tinytens[j]; #endif if (!dval(rv)) { undfl: dval(rv) = 0.; #ifndef NO_ERRNO errno = ERANGE; #endif if (bd0) goto retfree; goto ret; } #ifndef Avoid_Underflow word0(rv) = Tiny0; word1(rv) = Tiny1; /* The refinement below will clean * this approximation up. */ } #endif } } /* Now the hard part -- adjusting rv to the correct value.*/ /* Put digits into bd: true value = bd * 10^e */ bd0 = s2b(s0, nd0, nd, y); for(;;) { bd = Balloc(bd0->k); Bcopy(bd, bd0); bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ bs = i2b(1); if (e >= 0) { bb2 = bb5 = 0; bd2 = bd5 = e; } else { bb2 = bb5 = -e; bd2 = bd5 = 0; } if (bbe >= 0) bb2 += bbe; else bd2 -= bbe; bs2 = bb2; #ifdef Honor_FLT_ROUNDS if (rounding != 1) bs2++; #endif #ifdef Avoid_Underflow j = bbe - scale; i = j + bbbits - 1; /* logb(rv) */ if (i < Emin) /* denormal */ j += P - Emin; else j = P + 1 - bbbits; #else /*Avoid_Underflow*/ #ifdef Sudden_Underflow #ifdef IBM j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); #else j = P + 1 - bbbits; #endif #else /*Sudden_Underflow*/ j = bbe; i = j + bbbits - 1; /* logb(rv) */ if (i < Emin) /* denormal */ j += P - Emin; else j = P + 1 - bbbits; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ bb2 += j; bd2 += j; #ifdef Avoid_Underflow bd2 += scale; #endif i = bb2 < bd2 ? bb2 : bd2; if (i > bs2) i = bs2; if (i > 0) { bb2 -= i; bd2 -= i; bs2 -= i; } if (bb5 > 0) { bs = pow5mult(bs, bb5); bb1 = mult(bs, bb); Bfree(bb); bb = bb1; } if (bb2 > 0) bb = lshift(bb, bb2); if (bd5 > 0) bd = pow5mult(bd, bd5); if (bd2 > 0) bd = lshift(bd, bd2); if (bs2 > 0) bs = lshift(bs, bs2); delta = diff(bb, bd); dsign = delta->sign; delta->sign = 0; i = cmp(delta, bs); #ifdef Honor_FLT_ROUNDS if (rounding != 1) { if (i < 0) { /* Error is less than an ulp */ if (!delta->x[0] && delta->wds <= 1) { /* exact */ #ifdef SET_INEXACT inexact = 0; #endif break; } if (rounding) { if (dsign) { adj = 1.; goto apply_adj; } } else if (!dsign) { adj = -1.; if (!word1(rv) && !(word0(rv) & Frac_mask)) { y = word0(rv) & Exp_mask; #ifdef Avoid_Underflow if (!scale || y > 2*P*Exp_msk1) #else if (y) #endif { delta = lshift(delta,Log2P); if (cmp(delta, bs) <= 0) adj = -0.5; } } apply_adj: #ifdef Avoid_Underflow if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) word0(adj) += (2*P+1)*Exp_msk1 - y; #else #ifdef Sudden_Underflow if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { word0(rv) += P*Exp_msk1; dval(rv) += adj*ulp(dval(rv)); word0(rv) -= P*Exp_msk1; } else #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ dval(rv) += adj*ulp(dval(rv)); } break; } adj = ratio(delta, bs); if (adj < 1.) adj = 1.; if (adj <= 0x7ffffffe) { /* adj = rounding ? ceil(adj) : floor(adj); */ y = adj; if (y != adj) { if (!((rounding>>1) ^ dsign)) y++; adj = y; } } #ifdef Avoid_Underflow if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) word0(adj) += (2*P+1)*Exp_msk1 - y; #else #ifdef Sudden_Underflow if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { word0(rv) += P*Exp_msk1; adj *= ulp(dval(rv)); if (dsign) dval(rv) += adj; else dval(rv) -= adj; word0(rv) -= P*Exp_msk1; goto cont; } #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ adj *= ulp(dval(rv)); if (dsign) dval(rv) += adj; else dval(rv) -= adj; goto cont; } #endif /*Honor_FLT_ROUNDS*/ if (i < 0) { /* Error is less than half an ulp -- check for * special case of mantissa a power of two. */ if (dsign || word1(rv) || word0(rv) & Bndry_mask #ifdef IEEE_Arith #ifdef Avoid_Underflow || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1 #else || (word0(rv) & Exp_mask) <= Exp_msk1 #endif #endif ) { #ifdef SET_INEXACT if (!delta->x[0] && delta->wds <= 1) inexact = 0; #endif break; } if (!delta->x[0] && delta->wds <= 1) { /* exact result */ #ifdef SET_INEXACT inexact = 0; #endif break; } delta = lshift(delta,Log2P); if (cmp(delta, bs) > 0) goto drop_down; break; } if (i == 0) { /* exactly half-way between */ if (dsign) { if ((word0(rv) & Bndry_mask1) == Bndry_mask1 && word1(rv) == ( #ifdef Avoid_Underflow (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : #endif 0xffffffff)) { /*boundary case -- increment exponent*/ word0(rv) = (word0(rv) & Exp_mask) + Exp_msk1 #ifdef IBM | Exp_msk1 >> 4 #endif ; word1(rv) = 0; #ifdef Avoid_Underflow dsign = 0; #endif break; } } else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { drop_down: /* boundary case -- decrement exponent */ #ifdef Sudden_Underflow /*{{*/ L = word0(rv) & Exp_mask; #ifdef IBM if (L < Exp_msk1) #else #ifdef Avoid_Underflow if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) #else if (L <= Exp_msk1) #endif /*Avoid_Underflow*/ #endif /*IBM*/ goto undfl; L -= Exp_msk1; #else /*Sudden_Underflow}{*/ #ifdef Avoid_Underflow if (scale) { L = word0(rv) & Exp_mask; if (L <= (2*P+1)*Exp_msk1) { if (L > (P+2)*Exp_msk1) /* round even ==> */ /* accept rv */ break; /* rv = smallest denormal */ goto undfl; } } #endif /*Avoid_Underflow*/ L = (word0(rv) & Exp_mask) - Exp_msk1; #endif /*Sudden_Underflow}}*/ word0(rv) = L | Bndry_mask1; word1(rv) = 0xffffffff; #ifdef IBM goto cont; #else break; #endif } #ifndef ROUND_BIASED if (!(word1(rv) & LSB)) break; #endif if (dsign) dval(rv) += ulp(dval(rv)); #ifndef ROUND_BIASED else { dval(rv) -= ulp(dval(rv)); #ifndef Sudden_Underflow if (!dval(rv)) goto undfl; #endif } #ifdef Avoid_Underflow dsign = 1 - dsign; #endif #endif break; } if ((aadj = ratio(delta, bs)) <= 2.) { if (dsign) aadj = aadj1 = 1.; else if (word1(rv) || word0(rv) & Bndry_mask) { #ifndef Sudden_Underflow if (word1(rv) == Tiny1 && !word0(rv)) goto undfl; #endif aadj = 1.; aadj1 = -1.; } else { /* special case -- power of FLT_RADIX to be */ /* rounded down... */ if (aadj < 2./FLT_RADIX) aadj = 1./FLT_RADIX; else aadj *= 0.5; aadj1 = -aadj; } } else { aadj *= 0.5; aadj1 = dsign ? aadj : -aadj; #ifdef Check_FLT_ROUNDS switch(Rounding) { case 2: /* towards +infinity */ aadj1 -= 0.5; break; case 0: /* towards 0 */ case 3: /* towards -infinity */ aadj1 += 0.5; } #else if (Flt_Rounds == 0) aadj1 += 0.5; #endif /*Check_FLT_ROUNDS*/ } y = word0(rv) & Exp_mask; /* Check for overflow */ if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { dval(rv0) = dval(rv); word0(rv) -= P*Exp_msk1; adj = aadj1 * ulp(dval(rv)); dval(rv) += adj; if ((word0(rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { if (word0(rv0) == Big0 && word1(rv0) == Big1) goto ovfl; word0(rv) = Big0; word1(rv) = Big1; goto cont; } else word0(rv) += P*Exp_msk1; } else { #ifdef Avoid_Underflow if (scale && y <= 2*P*Exp_msk1) { if (aadj <= 0x7fffffff) { if ((z = aadj) <= 0) z = 1; aadj = z; aadj1 = dsign ? aadj : -aadj; } word0(aadj1) += (2*P+1)*Exp_msk1 - y; } adj = aadj1 * ulp(dval(rv)); dval(rv) += adj; #else #ifdef Sudden_Underflow if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { dval(rv0) = dval(rv); word0(rv) += P*Exp_msk1; adj = aadj1 * ulp(dval(rv)); dval(rv) += adj; #ifdef IBM if ((word0(rv) & Exp_mask) < P*Exp_msk1) #else if ((word0(rv) & Exp_mask) <= P*Exp_msk1) #endif { if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1) goto undfl; word0(rv) = Tiny0; word1(rv) = Tiny1; goto cont; } else word0(rv) -= P*Exp_msk1; } else { adj = aadj1 * ulp(dval(rv)); dval(rv) += adj; } #else /*Sudden_Underflow*/ /* Compute adj so that the IEEE rounding rules will * correctly round rv + adj in some half-way cases. * If rv * ulp(rv) is denormalized (i.e., * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid * trouble from bits lost to denormalization; * example: 1.2e-307 . */ if (y <= (P-1)*Exp_msk1 && aadj > 1.) { aadj1 = (double)(int)(aadj + 0.5); if (!dsign) aadj1 = -aadj1; } adj = aadj1 * ulp(dval(rv)); dval(rv) += adj; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ } z = word0(rv) & Exp_mask; #ifndef SET_INEXACT #ifdef Avoid_Underflow if (!scale) #endif if (y == z) { /* Can we stop now? */ L = (Long)aadj; aadj -= L; /* The tolerances below are conservative. */ if (dsign || word1(rv) || word0(rv) & Bndry_mask) { if (aadj < .4999999 || aadj > .5000001) break; } else if (aadj < .4999999/FLT_RADIX) break; } #endif cont: Bfree(bb); Bfree(bd); Bfree(bs); Bfree(delta); } #ifdef SET_INEXACT if (inexact) { if (!oldinexact) { word0(rv0) = Exp_1 + (70 << Exp_shift); word1(rv0) = 0; dval(rv0) += 1.; } } else if (!oldinexact) clear_inexact(); #endif #ifdef Avoid_Underflow if (scale) { word0(rv0) = Exp_1 - 2*P*Exp_msk1; word1(rv0) = 0; dval(rv) *= dval(rv0); #ifndef NO_ERRNO /* try to avoid the bug of testing an 8087 register value */ if (word0(rv) == 0 && word1(rv) == 0) errno = ERANGE; #endif } #endif /* Avoid_Underflow */ #ifdef SET_INEXACT if (inexact && !(word0(rv) & Exp_mask)) { /* set underflow bit */ dval(rv0) = 1e-300; dval(rv0) *= dval(rv0); } #endif retfree: Bfree(bb); Bfree(bd); Bfree(bs); Bfree(bd0); Bfree(delta); ret: if (se) *se = (char *)s; return sign ? -dval(rv) : dval(rv); } static int quorem #ifdef KR_headers (b, S) Bigint *b, *S; #else (Bigint *b, Bigint *S) #endif { int n; ULong *bx, *bxe, q, *sx, *sxe; #ifdef ULLong ULLong borrow, carry, y, ys; #else ULong borrow, carry, y, ys; #ifdef Pack_32 ULong si, z, zs; #endif #endif n = S->wds; #ifdef DEBUG /*debug*/ if (b->wds > n) /*debug*/ Bug("oversize b in quorem"); #endif if (b->wds < n) return 0; sx = S->x; sxe = sx + --n; bx = b->x; bxe = bx + n; q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ #ifdef DEBUG /*debug*/ if (q > 9) /*debug*/ Bug("oversized quotient in quorem"); #endif if (q) { borrow = 0; carry = 0; do { #ifdef ULLong ys = *sx++ * (ULLong)q + carry; carry = ys >> 32; y = *bx - (ys & FFFFFFFF) - borrow; borrow = y >> 32 & (ULong)1; *bx++ = y & FFFFFFFF; #else #ifdef Pack_32 si = *sx++; ys = (si & 0xffff) * q + carry; zs = (si >> 16) * q + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*bx >> 16) - (zs & 0xffff) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(bx, z, y); #else ys = *sx++ * q + carry; carry = ys >> 16; y = *bx - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; *bx++ = y & 0xffff; #endif #endif } while(sx <= sxe); if (!*bxe) { bx = b->x; while(--bxe > bx && !*bxe) --n; b->wds = n; } } if (cmp(b, S) >= 0) { q++; borrow = 0; carry = 0; bx = b->x; sx = S->x; do { #ifdef ULLong ys = *sx++ + carry; carry = ys >> 32; y = *bx - (ys & FFFFFFFF) - borrow; borrow = y >> 32 & (ULong)1; *bx++ = y & FFFFFFFF; #else #ifdef Pack_32 si = *sx++; ys = (si & 0xffff) + carry; zs = (si >> 16) + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*bx >> 16) - (zs & 0xffff) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(bx, z, y); #else ys = *sx++ + carry; carry = ys >> 16; y = *bx - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; *bx++ = y & 0xffff; #endif #endif } while(sx <= sxe); bx = b->x; bxe = bx + n; if (!*bxe) { while(--bxe > bx && !*bxe) --n; b->wds = n; } } return q; } #ifndef MULTIPLE_THREADS static char *dtoa_result; #endif static char * #ifdef KR_headers rv_alloc(i) int i; #else rv_alloc(int i) #endif { int j, k, *r; j = sizeof(ULong); for(k = 0; sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; j <<= 1) k++; r = (int*)Balloc(k); *r = k; return #ifndef MULTIPLE_THREADS dtoa_result = #endif (char *)(r+1); } static char * #ifdef KR_headers nrv_alloc(s, rve, n) char *s, **rve; int n; #else nrv_alloc(char *s, char **rve, int n) #endif { char *rv, *t; t = rv = rv_alloc(n); while(*t = *s++) t++; if (rve) *rve = t; return rv; } /* freedtoa(s) must be used to free values s returned by dtoa * when MULTIPLE_THREADS is #defined. It should be used in all cases, * but for consistency with earlier versions of dtoa, it is optional * when MULTIPLE_THREADS is not defined. */ void #ifdef KR_headers freedtoa(s) char *s; #else freedtoa(char *s) #endif { Bigint *b = (Bigint *)((int *)s - 1); b->maxwds = 1 << (b->k = *(int*)b); Bfree(b); #ifndef MULTIPLE_THREADS if (s == dtoa_result) dtoa_result = 0; #endif } /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. * * Inspired by "How to Print Floating-Point Numbers Accurately" by * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. * * Modifications: * 1. Rather than iterating, we use a simple numeric overestimate * to determine k = floor(log10(d)). We scale relevant * quantities using O(log2(k)) rather than O(k) multiplications. * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't * try to generate digits strictly left to right. Instead, we * compute with fewer bits and propagate the carry if necessary * when rounding the final digit up. This is often faster. * 3. Under the assumption that input will be rounded nearest, * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. * That is, we allow equality in stopping tests when the * round-nearest rule will give the same floating-point value * as would satisfaction of the stopping test with strict * inequality. * 4. We remove common factors of powers of 2 from relevant * quantities. * 5. When converting floating-point integers less than 1e16, * we use floating-point arithmetic rather than resorting * to multiple-precision integers. * 6. When asked to produce fewer than 15 digits, we first try * to get by with floating-point arithmetic; we resort to * multiple-precision integer arithmetic only if we cannot * guarantee that the floating-point calculation has given * the correctly rounded result. For k requested digits and * "uniformly" distributed input, the probability is * something like 10^(k-15) that we must resort to the Long * calculation. */ char * dtoa #ifdef KR_headers (d, mode, ndigits, decpt, sign, rve) double d; int mode, ndigits, *decpt, *sign; char **rve; #else (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) #endif { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from the returned string. If not null, *rve is set to point to the end of the return value. If d is +-Infinity or NaN, then *decpt is set to 9999. mode: 0 ==> shortest string that yields d when read in and rounded to nearest. 1 ==> like 0, but with Steele & White stopping rule; e.g. with IEEE P754 arithmetic , mode 0 gives 1e23 whereas mode 1 gives 9.999999999999999e22. 2 ==> max(1,ndigits) significant digits. This gives a return value similar to that of ecvt, except that trailing zeros are suppressed. 3 ==> through ndigits past the decimal point. This gives a return value similar to that from fcvt, except that trailing zeros are suppressed, and ndigits can be negative. 4,5 ==> similar to 2 and 3, respectively, but (in round-nearest mode) with the tests of mode 0 to possibly return a shorter string that rounds to d. With IEEE arithmetic and compilation with -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same as modes 2 and 3 when FLT_ROUNDS != 1. 6-9 ==> Debugging modes similar to mode - 4: don't try fast floating-point estimate (if applicable). Values of mode other than 0-9 are treated as mode 0. Sufficient space is allocated to the return value to hold the suppressed trailing zeros. */ int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, spec_case, try_quick; Long L; #ifndef Sudden_Underflow int denorm; ULong x; #endif Bigint *b, *b1, *delta, *mlo, *mhi, *S; double d2, ds, eps; char *s, *s0; #ifdef Honor_FLT_ROUNDS int rounding; #endif #ifdef SET_INEXACT int inexact, oldinexact; #endif #ifndef MULTIPLE_THREADS if (dtoa_result) { freedtoa(dtoa_result); dtoa_result = 0; } #endif if (word0(d) & Sign_bit) { /* set sign for everything, including 0's and NaNs */ *sign = 1; word0(d) &= ~Sign_bit; /* clear sign bit */ } else *sign = 0; #if defined(IEEE_Arith) + defined(VAX) #ifdef IEEE_Arith if ((word0(d) & Exp_mask) == Exp_mask) #else if (word0(d) == 0x8000) #endif { /* Infinity or NaN */ *decpt = 9999; #ifdef IEEE_Arith if (!word1(d) && !(word0(d) & 0xfffff)) return nrv_alloc("Infinity", rve, 8); #endif return nrv_alloc("NaN", rve, 3); } #endif #ifdef IBM dval(d) += 0; /* normalize */ #endif if (!dval(d)) { *decpt = 1; return nrv_alloc("0", rve, 1); } #ifdef SET_INEXACT try_quick = oldinexact = get_inexact(); inexact = 1; #endif #ifdef Honor_FLT_ROUNDS if ((rounding = Flt_Rounds) >= 2) { if (*sign) rounding = rounding == 2 ? 0 : 2; else if (rounding != 2) rounding = 0; } #endif b = d2b(dval(d), &be, &bbits); #ifdef Sudden_Underflow i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); #else if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) { #endif dval(d2) = dval(d); word0(d2) &= Frac_mask1; word0(d2) |= Exp_11; #ifdef IBM if (j = 11 - hi0bits(word0(d2) & Frac_mask)) dval(d2) /= 1 << j; #endif /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 * log10(x) = log(x) / log(10) * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) * * This suggests computing an approximation k to log10(d) by * * k = (i - Bias)*0.301029995663981 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); * * We want k to be too large rather than too small. * The error in the first-order Taylor series approximation * is in our favor, so we just round up the constant enough * to compensate for any error in the multiplication of * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, * adding 1e-13 to the constant term more than suffices. * Hence we adjust the constant term to 0.1760912590558. * (We could get a more accurate k by invoking log10, * but this is probably not worthwhile.) */ i -= Bias; #ifdef IBM i <<= 2; i += j; #endif #ifndef Sudden_Underflow denorm = 0; } else { /* d is denormalized */ i = bbits + be + (Bias + (P-1) - 1); x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 : word1(d) << 32 - i; dval(d2) = x; word0(d2) -= 31*Exp_msk1; /* adjust exponent */ i -= (Bias + (P-1) - 1) + 1; denorm = 1; } #endif ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; k = (int)ds; if (ds < 0. && ds != k) k--; /* want k = floor(ds) */ k_check = 1; if (k >= 0 && k <= Ten_pmax) { if (dval(d) < tens[k]) k--; k_check = 0; } j = bbits - i - 1; if (j >= 0) { b2 = 0; s2 = j; } else { b2 = -j; s2 = 0; } if (k >= 0) { b5 = 0; s5 = k; s2 += k; } else { b2 -= k; b5 = -k; s5 = 0; } if (mode < 0 || mode > 9) mode = 0; #ifndef SET_INEXACT #ifdef Check_FLT_ROUNDS try_quick = Rounding == 1; #else try_quick = 1; #endif #endif /*SET_INEXACT*/ if (mode > 5) { mode -= 4; try_quick = 0; } leftright = 1; switch(mode) { case 0: case 1: ilim = ilim1 = -1; i = 18; ndigits = 0; break; case 2: leftright = 0; /* no break */ case 4: if (ndigits <= 0) ndigits = 1; ilim = ilim1 = i = ndigits; break; case 3: leftright = 0; /* no break */ case 5: i = ndigits + k + 1; ilim = i; ilim1 = i - 1; if (i <= 0) i = 1; } s = s0 = rv_alloc(i); #ifdef Honor_FLT_ROUNDS if (mode > 1 && rounding != 1) leftright = 0; #endif if (ilim >= 0 && ilim <= Quick_max && try_quick) { /* Try to get by with floating-point arithmetic. */ i = 0; dval(d2) = dval(d); k0 = k; ilim0 = ilim; ieps = 2; /* conservative */ if (k > 0) { ds = tens[k&0xf]; j = k >> 4; if (j & Bletch) { /* prevent overflows */ j &= Bletch - 1; dval(d) /= bigtens[n_bigtens-1]; ieps++; } for(; j; j >>= 1, i++) if (j & 1) { ieps++; ds *= bigtens[i]; } dval(d) /= ds; } else if (j1 = -k) { dval(d) *= tens[j1 & 0xf]; for(j = j1 >> 4; j; j >>= 1, i++) if (j & 1) { ieps++; dval(d) *= bigtens[i]; } } if (k_check && dval(d) < 1. && ilim > 0) { if (ilim1 <= 0) goto fast_failed; ilim = ilim1; k--; dval(d) *= 10.; ieps++; } dval(eps) = ieps*dval(d) + 7.; word0(eps) -= (P-1)*Exp_msk1; if (ilim == 0) { S = mhi = 0; dval(d) -= 5.; if (dval(d) > dval(eps)) goto one_digit; if (dval(d) < -dval(eps)) goto no_digits; goto fast_failed; } #ifndef No_leftright if (leftright) { /* Use Steele & White method of only * generating digits needed. */ dval(eps) = 0.5/tens[ilim-1] - dval(eps); for(i = 0;;) { L = dval(d); dval(d) -= L; *s++ = '0' + (int)L; if (dval(d) < dval(eps)) goto ret1; if (1. - dval(d) < dval(eps)) goto bump_up; if (++i >= ilim) break; dval(eps) *= 10.; dval(d) *= 10.; } } else { #endif /* Generate ilim digits, then fix them up. */ dval(eps) *= tens[ilim-1]; for(i = 1;; i++, dval(d) *= 10.) { L = (Long)(dval(d)); if (!(dval(d) -= L)) ilim = i; *s++ = '0' + (int)L; if (i == ilim) { if (dval(d) > 0.5 + dval(eps)) goto bump_up; else if (dval(d) < 0.5 - dval(eps)) { while(*--s == '0'); s++; goto ret1; } break; } } #ifndef No_leftright } #endif fast_failed: s = s0; dval(d) = dval(d2); k = k0; ilim = ilim0; } /* Do we have a "small" integer? */ if (be >= 0 && k <= Int_max) { /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { S = mhi = 0; if (ilim < 0 || dval(d) <= 5*ds) goto no_digits; goto one_digit; } for(i = 1;; i++, dval(d) *= 10.) { L = (Long)(dval(d) / ds); dval(d) -= L*ds; #ifdef Check_FLT_ROUNDS /* If FLT_ROUNDS == 2, L will usually be high by 1 */ if (dval(d) < 0) { L--; dval(d) += ds; } #endif *s++ = '0' + (int)L; if (!dval(d)) { #ifdef SET_INEXACT inexact = 0; #endif break; } if (i == ilim) { #ifdef Honor_FLT_ROUNDS if (mode > 1) switch(rounding) { case 0: goto ret1; case 2: goto bump_up; } #endif dval(d) += dval(d); if (dval(d) > ds || dval(d) == ds && L & 1) { bump_up: while(*--s == '9') if (s == s0) { k++; *s = '0'; break; } ++*s++; } break; } } goto ret1; } m2 = b2; m5 = b5; mhi = mlo = 0; if (leftright) { i = #ifndef Sudden_Underflow denorm ? be + (Bias + (P-1) - 1 + 1) : #endif #ifdef IBM 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); #else 1 + P - bbits; #endif b2 += i; s2 += i; mhi = i2b(1); } if (m2 > 0 && s2 > 0) { i = m2 < s2 ? m2 : s2; b2 -= i; m2 -= i; s2 -= i; } if (b5 > 0) { if (leftright) { if (m5 > 0) { mhi = pow5mult(mhi, m5); b1 = mult(mhi, b); Bfree(b); b = b1; } if (j = b5 - m5) b = pow5mult(b, j); } else b = pow5mult(b, b5); } S = i2b(1); if (s5 > 0) S = pow5mult(S, s5); /* Check for special case that d is a normalized power of 2. */ spec_case = 0; if ((mode < 2 || leftright) #ifdef Honor_FLT_ROUNDS && rounding == 1 #endif ) { if (!word1(d) && !(word0(d) & Bndry_mask) #ifndef Sudden_Underflow && word0(d) & (Exp_mask & ~Exp_msk1) #endif ) { /* The special case */ b2 += Log2P; s2 += Log2P; spec_case = 1; } } /* Arrange for convenient computation of quotients: * shift left if necessary so divisor has 4 leading 0 bits. * * Perhaps we should just compute leading 28 bits of S once * and for all and pass them and a shift to quorem, so it * can do shifts and ors to compute the numerator for q. */ #ifdef Pack_32 if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) i = 32 - i; #else if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf) i = 16 - i; #endif if (i > 4) { i -= 4; b2 += i; m2 += i; s2 += i; } else if (i < 4) { i += 28; b2 += i; m2 += i; s2 += i; } if (b2 > 0) b = lshift(b, b2); if (s2 > 0) S = lshift(S, s2); if (k_check) { if (cmp(b,S) < 0) { k--; b = multadd(b, 10, 0); /* we botched the k estimate */ if (leftright) mhi = multadd(mhi, 10, 0); ilim = ilim1; } } if (ilim <= 0 && (mode == 3 || mode == 5)) { if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { /* no digits, fcvt style */ no_digits: k = -1 - ndigits; goto ret; } one_digit: *s++ = '1'; k++; goto ret; } if (leftright) { if (m2 > 0) mhi = lshift(mhi, m2); /* Compute mlo -- check for special case * that d is a normalized power of 2. */ mlo = mhi; if (spec_case) { mhi = Balloc(mhi->k); Bcopy(mhi, mlo); mhi = lshift(mhi, Log2P); } for(i = 1;;i++) { dig = quorem(b,S) + '0'; /* Do we yet have the shortest decimal string * that will round to d? */ j = cmp(b, mlo); delta = diff(S, mhi); j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta); #ifndef ROUND_BIASED if (j1 == 0 && mode != 1 && !(word1(d) & 1) #ifdef Honor_FLT_ROUNDS && rounding >= 1 #endif ) { if (dig == '9') goto round_9_up; if (j > 0) dig++; #ifdef SET_INEXACT else if (!b->x[0] && b->wds <= 1) inexact = 0; #endif *s++ = dig; goto ret; } #endif if (j < 0 || j == 0 && mode != 1 #ifndef ROUND_BIASED && !(word1(d) & 1) #endif ) { if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT inexact = 0; #endif goto accept_dig; } #ifdef Honor_FLT_ROUNDS if (mode > 1) switch(rounding) { case 0: goto accept_dig; case 2: goto keep_dig; } #endif /*Honor_FLT_ROUNDS*/ if (j1 > 0) { b = lshift(b, 1); j1 = cmp(b, S); if ((j1 > 0 || j1 == 0 && dig & 1) && dig++ == '9') goto round_9_up; } accept_dig: *s++ = dig; goto ret; } if (j1 > 0) { #ifdef Honor_FLT_ROUNDS if (!rounding) goto accept_dig; #endif if (dig == '9') { /* possible if i == 1 */ round_9_up: *s++ = '9'; goto roundoff; } *s++ = dig + 1; goto ret; } #ifdef Honor_FLT_ROUNDS keep_dig: #endif *s++ = dig; if (i == ilim) break; b = multadd(b, 10, 0); if (mlo == mhi) mlo = mhi = multadd(mhi, 10, 0); else { mlo = multadd(mlo, 10, 0); mhi = multadd(mhi, 10, 0); } } } else for(i = 1;; i++) { *s++ = dig = quorem(b,S) + '0'; if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT inexact = 0; #endif goto ret; } if (i >= ilim) break; b = multadd(b, 10, 0); } /* Round off last digit */ #ifdef Honor_FLT_ROUNDS switch(rounding) { case 0: goto trimzeros; case 2: goto roundoff; } #endif b = lshift(b, 1); j = cmp(b, S); if (j > 0 || j == 0 && dig & 1) { roundoff: while(*--s == '9') if (s == s0) { k++; *s++ = '1'; goto ret; } ++*s++; } else { // trimzeros: while(*--s == '0'); s++; } ret: Bfree(S); if (mhi) { if (mlo && mlo != mhi) Bfree(mlo); Bfree(mhi); } ret1: #ifdef SET_INEXACT if (inexact) { if (!oldinexact) { word0(d) = Exp_1 + (70 << Exp_shift); word1(d) = 0; dval(d) += 1.; } } else if (!oldinexact) clear_inexact(); #endif Bfree(b); *s = 0; *decpt = k + 1; if (rve) *rve = s; return s0; } #ifdef __cplusplus } #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/enumerate.c���������������������������������������������������������������0000664�0000000�0000000�00000014325�12660066715�0017500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: enumerate.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdlib.h> #endif #include "see_interpreter.h" #include "see_string.h" #include "see_object.h" #include "see_mem.h" #include "see_enumerate.h" #include "see_array.h" /* * Enumeration of an object's properties * * (12.6) The for-in statement requires 'delete-safe' enumeration of an * object's property names. The SEE_enumerate() function of this module * constructs a nul-terminated array of names of all the enumerable * properties of the given object. A property name is enumerable if an object * or one of its prototypes has a property of that name, AND the * 'shallowest' property of that name DOESN'T have the 'DONT_ENUM' flag * set. * * SEE_enumerate() returns the list of names, BUT (according to the standard) * the for-in iterator MUST NOT include the property name if it has been * deleted in the meantime. That means a HasProperty check must be made * each time! (slow!) (See parser.c's IterationStatement evaluator to * make sure it happens.) * * Doing it this way (pre-computing the list of possible names and then * checking for deletions later) is probably faster than checking for * duplicates each time, and certainly simpler and safer than having * back references from the [[Delete]] methods that update the dynamic * enumerators. */ struct propname_list { struct SEE_string *name; struct propname_list *next; int dontenum, depth; }; static int make_list(struct SEE_interpreter *interp, struct SEE_object *o, int depth, struct propname_list **head); static int slist_cmp_nice(const void *a, const void *b); static int slist_cmp_fast(const void *a, const void *b); /* * Add the property names of the local object to the property name list. */ static int make_list(interp, o, depth, head) struct SEE_interpreter *interp; struct SEE_object *o; int depth; struct propname_list **head; { struct propname_list *l; struct SEE_string *s; struct SEE_enum *e; int dontenum; int count; e = SEE_OBJECT_ENUMERATOR(interp, o); count = 0; while ((s = SEE_ENUM_NEXT(interp, e, &dontenum)) != NULL) { l = SEE_NEW(interp, struct propname_list); l->name = s; l->depth = depth; l->dontenum = dontenum; l->next = *head; *head = l; count++; } if (o->Prototype) count += make_list(interp, o->Prototype, depth + 1, head); return count; } /* * Property name comparison function. */ static int slist_cmp_nice(a, b) const void *a, *b; { struct propname_list **sa = (struct propname_list **)a; struct propname_list **sb = (struct propname_list **)b; if ((*sa)->name != (*sb)->name) { SEE_uint32_t ai, bi; if (SEE_to_array_index((*sa)->name, &ai) && SEE_to_array_index((*sb)->name, &bi)) return ai - bi; return SEE_string_cmp((*sa)->name, (*sb)->name); } return (*sa)->depth - (*sb)->depth; } /* * Property name comparison function. Uses property addresses * in memory to order. */ static int slist_cmp_fast(a, b) const void *a, *b; { struct propname_list **sa = (struct propname_list **)a; struct propname_list **sb = (struct propname_list **)b; if ((*sa)->name != (*sb)->name) return (int)(*sa)->name - (int)(*sb)->name; return (*sa)->depth - (*sb)->depth; } /* * Return nul-terminated array of string pointers to * all enumerable properties of an object and of its * prototypes. */ struct SEE_string ** SEE_enumerate(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct propname_list *head = NULL, **slist, **sp; int count, i; struct SEE_string *current, **res; count = make_list(interp, o, 0, &head); /* * Copy the linked list of property names into * an array, and sort it. (Comparison function * is constant time). */ slist = SEE_ALLOCA(interp, struct propname_list *, count); for (sp = slist; head; head = head->next) *sp++ = head; qsort(slist, count, sizeof slist[0], SEE_COMPAT_JS(interp, >=, JS11) /* EXT:1 */ ? slist_cmp_nice : slist_cmp_fast); /* * Remove duplicate names from the array; also * remove the unique names from the array when their shallowest * entry has the DONT-ENUM flag set. */ current = NULL; sp = slist; for (i = 0; i < count; i++) { if (slist[i]->name != current) { current = slist[i]->name; if (!slist[i]->dontenum) *sp++ = slist[i]; } } count = sp - slist; res = SEE_NEW_ARRAY(interp, struct SEE_string *, count + 1); for (i = 0; i < count; i++) res[i] = slist[i]->name; res[count] = NULL; return res; } /* Fast release of memory allocated by SEE_enumerate. May be a no-op */ void SEE_enumerate_free(interp, props) struct SEE_interpreter *interp; struct SEE_string **props; { void *data = props; SEE_free(interp, &data); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/error.c�������������������������������������������������������������������0000664�0000000�0000000�00000013435�12660066715�0016645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: error.c 1081 2006-05-07 05:58:32Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> # include <stdarg.h> #endif //#if HAVE_ERRNO_H #include <errno.h> //#else //extern int errno; //#endif #include "see_value.h" #include "see_object.h" #include "see_interpreter.h" #include "see_try.h" #include "see_mem.h" #include "see_error.h" #include "see_string.h" #include "see_stringdefs.h" #include "see_dprint.h" #ifndef NDEBUG int SEE_error_debug = 0; #endif static void error_throw(struct SEE_interpreter *, struct SEE_object *, int, const char *, int, const char *, va_list) SEE_dead; /* * Throw an error, optionally using the given string as the error message. * The string is prefixed it with the current try location. */ void SEE_error__throw_string(interp, obj, filename, lineno, s) struct SEE_interpreter *interp; struct SEE_object *obj; const char *filename; int lineno; struct SEE_string *s; { volatile struct SEE_try_context *ctxt_save; struct SEE_value res; /* If no try-catch context exists, we should abort immediately */ if (!interp->try_context) { struct SEE_value v; #ifndef NDEBUG if (s) { dprintf("message: "); dprints(s); dprintf("\n"); } #endif SEE_SET_OBJECT(&v, obj); SEE_throw_abort(interp, &v, filename, lineno); /* NOTREACHED */ } /* * Temporarily remove the current try-catch context * so that any exceptions thrown recusively during the construction * of the error cause an interpreter abort in the block above. */ ctxt_save = interp->try_context; interp->try_context = NULL; { struct SEE_string *msg; struct SEE_value v, *argv[1]; msg = SEE_string_concat(interp, SEE_location_string(interp, interp->try_location), s ? s : STR(error)); SEE_SET_STRING(&v, msg); argv[0] = &v; SEE_OBJECT_CONSTRUCT(interp, obj, obj, 1, argv, &res); #ifndef NDEBUG if (SEE_error_debug) dprintf("throwing object %p from %s:%d\n", res.u.object, filename ? filename : "unknown", lineno); #endif } interp->try_context = ctxt_save; SEE__THROW(interp, &res, filename, lineno); } /* * Helper function for constructing an error message */ static void error_throw(interp, obj, errval, filename, lineno, fmt, ap) struct SEE_interpreter *interp; struct SEE_object *obj; int errval; /* -1 means no error message */ const char *filename; int lineno; const char *fmt; va_list ap; { struct SEE_string *s, *t; volatile struct SEE_try_context *ctxt_save; /* Detect recursive errors: */ if (!interp->try_context) { struct SEE_value v; SEE_SET_OBJECT(&v, obj); SEE_throw_abort(interp, &v, filename, lineno); } ctxt_save = interp->try_context; interp->try_context = NULL; if (fmt) { s = SEE_string_vsprintf(interp, fmt, ap); if (errval != -1) { #if HAVE_STRERROR t = SEE_string_sprintf(interp, ": %s", strerror(errval)); #else t = SEE_string_sprintf(interp, ": error %d", errval); #endif SEE_string_append(s, t); } } else s = NULL; interp->try_context = ctxt_save; SEE_error__throw_string(interp, obj, filename, lineno, s); } /* * Throw an error, using the given arguments as the error * message. */ void SEE_error__throw(struct SEE_interpreter *interp, struct SEE_object *obj, const char *filename, int lineno, const char *fmt, ...) { va_list ap; va_start(ap, fmt); error_throw(interp, obj, -1, filename, lineno, fmt, ap); va_end(ap); } #if !HAVE_VARIADIC_MACROS void SEE_error__throw0(struct SEE_interpreter *interp, struct SEE_object *obj, const char *fmt, ...) { va_list ap; va_start(ap, fmt); error_throw(interp, obj, -1, NULL, 0, fmt, ap); va_end(ap); } #endif /* * Throw an error, with the given message appending ':' and the * system error message. (See manual page for 'errno') */ void SEE_error__throw_sys(struct SEE_interpreter *interp, struct SEE_object *obj, const char *filename, int lineno, const char *fmt, ...) { va_list ap; int errval = errno; va_start(ap, fmt); error_throw(interp, obj, errval, filename, lineno, fmt, ap); va_end(ap); } #if !HAVE_VARIADIC_MACROS void SEE_error__throw_sys0(struct SEE_interpreter *interp, struct SEE_object *obj, const char *fmt, ...) { va_list ap; int errval = errno; va_start(ap, fmt); error_throw(interp, obj, errval, NULL, 0, fmt, ap); va_end(ap); } #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/function.c����������������������������������������������������������������0000664�0000000�0000000�00000012121�12660066715�0017330�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: function.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_mem.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_interpreter.h" #include "see_debug.h" #include "see_context.h" #include "see_function.h" #include "see_parse.h" #include "see_stringdefs.h" /* * A function is an internal object that embodies executable code, and * can be shared between Function instances. * The terminology used in the standard is to say that Function instances * which share the same 'function' (but may have different scope), and * have all their non-internal properties linked, are "joined". (13.1.2) * * These internal function structures encapsulate a FormalParameterList * and a FunctionBody (but not the Scope chain). In the mechanism for * Function instance creation (13.2) 'struct function' pointer comparison * is sufficient for telling if two Function instances are joined. */ /* * Create a new function 'core' entity (struct function) with a initial * common function object instance. */ struct function * SEE_function_make(interp, name, params, body) struct SEE_interpreter *interp; struct SEE_string *name; struct var *params; void *body; { struct function *f; int i; struct var *v; struct SEE_value val, r9; struct SEE_object *F; f = SEE_NEW(interp, struct function); f->body = body; f->sec_domain = interp->sec_domain; /* * Convert the linked list of parameter name strings into * a fixed array of string pointers. This is done because * the Arguments object needs to seek the list. */ f->nparams = 0; for (v = params; v; v = v->next) f->nparams++; if (f->nparams) { f->params = SEE_NEW_ARRAY(interp, struct SEE_string *, f->nparams); for (i = 0, v = params; v; v = v->next, i++) f->params[i] = v->name; } else f->params = NULL; f->name = name; f->next = NULL; f->cache = NULL; f->common = NULL; /* 13.2 step 2: make object F */ F = SEE_function_inst_create(interp, f, NULL); /* * NB: SEE_function_inst_create() will perform the equivalent * of steps 13 through 19 of 13.2 at this point. */ /* 13.2 step 8 + 15.3.5.1: add the 'length' property */ SEE_SET_NUMBER(&val, f->nparams); SEE_OBJECT_PUT(interp, F, STR(length), &val, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); /* 13.2 step 9 - a prototype object */ SEE_SET_OBJECT(&r9, SEE_Object_new(interp)); /* 13.2 step 10 - the prototype's 'constructor' property */ SEE_SET_OBJECT(&val, F); SEE_OBJECT_PUT(interp, r9.u.object, STR(constructor), &val, SEE_ATTR_DONTENUM); /* 13.2 step 11 + 15.3.5.2 - add the 'prototype' property */ SEE_OBJECT_PUT(interp, F, STR(prototype), &r9, SEE_ATTR_DONTDELETE); /* (see 15.3.5.2) */ /* f.arguments = null */ if (SEE_COMPAT_JS(interp, >=, JS11)) { /* EXT:2 */ struct SEE_value v; SEE_SET_NULL(&v); SEE_OBJECT_PUT(interp, F, STR(arguments), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); } /* Check if the function body is empty */ f->is_empty = SEE_functionbody_isempty(interp, f); return f; } /* * 10.1.3 parameter instantiation */ void SEE_function_put_args(context, f, argc, argv) struct SEE_context *context; struct function *f; int argc; struct SEE_value **argv; { struct SEE_value undefv; int i; /* Install the actual arguments */ SEE_SET_UNDEFINED(&undefv); for (i = 0; i < f->nparams; i++) SEE_OBJECT_PUT(context->interpreter, context->variable, f->params[i], i < argc ? argv[i] : &undefv, context->varattr); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/input_lookahead.c���������������������������������������������������������0000664�0000000�0000000�00000007171�12660066715�0020662�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: input_lookahead.c 751 2004-12-02 11:24:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_type.h" #include "see_input.h" #include "see_mem.h" /* * an n-character lookahead input filter */ static SEE_unicode_t la_next(struct SEE_input *); static void la_close(struct SEE_input *); static struct SEE_inputclass la_inputclass = { la_next, la_close }; struct lookahead { struct SEE_input input; struct SEE_input * sub; int max, ptr; struct { SEE_unicode_t ch; int eof; } buf[1]; }; static SEE_unicode_t la_next(inp) struct SEE_input *inp; { struct lookahead *la = (struct lookahead *)inp; SEE_unicode_t next = inp->lookahead; struct SEE_input *sub = la->sub; inp->lookahead = la->buf[la->ptr].ch; inp->eof = la->buf[la->ptr].eof; la->buf[la->ptr].ch = sub->lookahead; la->buf[la->ptr].eof = sub->eof; if (!sub->eof) SEE_INPUT_NEXT(sub); la->ptr = (la->ptr + 1) % la->max; return next; } /* * Return the lookahead buffer that we have available */ int SEE_input_lookahead_copy(inp, buf, buflen) struct SEE_input *inp; SEE_unicode_t *buf; int buflen; { struct lookahead *la = (struct lookahead *)inp; int i; if (buflen <= 0 || inp->eof) return 0; buf[0] = inp->lookahead; for (i = 0; i < la->max && i + 1 < buflen && !la->buf[(la->ptr + i) % la->max].eof; i++) buf[i+1] = la->buf[(la->ptr + i) % la->max].ch; return i + 1; } static void la_close(inp) struct SEE_input *inp; { struct lookahead *la = (struct lookahead *)inp; SEE_INPUT_CLOSE(la->sub); } struct SEE_input * SEE_input_lookahead(sub, max) struct SEE_input *sub; int max; { struct lookahead *la; int i; la = (struct lookahead *)SEE_malloc(sub->interpreter, sizeof (struct lookahead) + (max - 1) * sizeof la->buf[0]); la->input.inputclass = &la_inputclass; la->input.filename = sub->filename; la->input.first_lineno = sub->first_lineno; la->input.interpreter = sub->interpreter; la->sub = sub; la->ptr = 0; la->max = max; for (i = 0; i < max + 1; i++) la_next((struct SEE_input *)la); return (struct SEE_input *)la; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/input_string.c������������������������������������������������������������0000664�0000000�0000000�00000006600�12660066715�0020235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: input_string.c 751 2004-12-02 11:24:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_mem.h" #include "see_type.h" #include "see_input.h" #include "see_string.h" #include "see_stringdefs.h" /* * input for in-memory ECMAscript UTF-16 strings. * (Used when 'eval'ing a string from within the interpreter.) */ static SEE_unicode_t input_string_next(struct SEE_input *); static void input_string_close(struct SEE_input *); struct SEE_inputclass input_string_class = { input_string_next, input_string_close }; struct input_string { struct SEE_input inp; const SEE_char_t *cur, *end; }; static SEE_unicode_t input_string_next(inp) struct SEE_input *inp; { struct input_string *inps = (struct input_string *)inp; SEE_unicode_t next, c, c2; next = inps->inp.lookahead; if (inps->cur >= inps->end) { inps->inp.eof = 1; } else { c = *inps->cur++; if ((c & 0xfc00) == 0xd800 && inps->cur < inps->end) { c2 = *inps->cur; if ((c2 & 0xfc00) == 0xdc00) { inps->cur++; c = (((c & 0x3ff) << 10) | (c2 & 0x3ff)) + 0x10000; } else { c = SEE_INPUT_BADCHAR; } } inps->inp.lookahead = c; inps->inp.eof = 0; } return next; } static void input_string_close(inp) struct SEE_input *inp; { struct input_string *inps = (struct input_string *)inp; inps->cur = NULL; inps->end = NULL; } struct SEE_input * SEE_input_string(interp, s) struct SEE_interpreter *interp; struct SEE_string *s; { struct input_string *inps; inps = SEE_NEW(interp, struct input_string); inps->cur = s->data; inps->end = s->data + s->length; inps->inp.inputclass = &input_string_class; inps->inp.interpreter = interp; inps->inp.filename = STR(string_input_name); inps->inp.first_lineno = 1; SEE_INPUT_NEXT((struct SEE_input *)inps); /* prime */ return (struct SEE_input *)inps; } ��������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/intern.c������������������������������������������������������������������0000664�0000000�0000000�00000023372�12660066715�0017014�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: intern.c 1091 2006-06-21 14:45:44Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_type.h" #include "see_string.h" #include "see_try.h" #include "see_mem.h" #include "see_intern.h" #include "see_error.h" #include "see_interpreter.h" #include "see_system.h" #include "see_stringdefs.h" #include "see_dprint.h" /* * Internalised strings. * * 'Interning' a string means to replace it with a unique pointer * to a previously stored string. * When a previously unseen string is interned, a copy is made. * The result is that string comparison becomes a pointer comparison * (much faster) and is primarily used for identifiers. * * This module uses a three-level intern strategy: the first level is the * static list of library strings generated by string.defs. The second level * is the application-wide "global" intern table, which applications must set * up early and not change after the creation of any interpreter. The * third level is the interpreter-local intern cache. * * This strategy allow the sharing of application static strings, * while avoiding the need for mutual exclusion techniques between * interpreters (since the library and application static strings are * read-only). */ #define HASHTABSZ 257 #define HASHLENMAX 8 /* prefix of string hashed on */ struct intern { /* element in the intern hash table */ struct intern *next; struct SEE_string *string; }; typedef struct intern *(intern_tab_t[HASHTABSZ]); /* Prototypes */ static struct intern * make(struct SEE_interpreter *, struct SEE_string *); static unsigned int hash(const struct SEE_string *); static struct intern ** find(intern_tab_t *, struct SEE_string *, unsigned int); static void global_init(void); /** System-wide intern table */ static intern_tab_t global_intern_tab; static int global_intern_tab_initialized; #ifndef NDEBUG static int global_intern_tab_locked = 0; int SEE_debug_intern; #endif /** * Make an intern entry in the hash table containing the string s, * and flag s as being interned. */ static struct intern * make(interp, s) struct SEE_interpreter *interp; /* may be NULL */ struct SEE_string *s; { struct intern *i; i = SEE_NEW(interp, struct intern); i->string = s; s->flags |= SEE_STRING_FLAG_INTERNED; i->next = NULL; return i; } /** Compute the hash value of a string */ static unsigned int hash(s) const struct SEE_string *s; { unsigned int j, h = 0; for (j = 0; j < HASHLENMAX && j < s->length; j++) h = (h << 1) ^ s->data[j]; return h % HASHTABSZ; } /** Compute the hash value of an ASCII string */ static unsigned int hash_ascii(s, lenret) const char *s; unsigned int *lenret; { unsigned int j, h = 0; const char *t; for (j = 0, t = s; j < HASHLENMAX && *t; j++, t++) h = (h << 1) ^ *t; while (*t) t++; *lenret = t - s; return h % HASHTABSZ; } /** Find an interned string */ static struct intern ** find(intern_tab, s, hash) intern_tab_t *intern_tab; struct SEE_string *s; unsigned int hash; { struct intern **x; x = &(*intern_tab)[hash]; while (*x && SEE_string_cmp((*x)->string, s) != 0) x = &((*x)->next); return x; } /** Returns true if an SEE_string contains the ASCII string s */ static int ascii_eq(str, s) struct SEE_string *str; const char *s; { unsigned int len = str->length; SEE_char_t *c = str->data; while (len--) if (!*s) return 0; else if (*c++ != *s++) return 0; return *s == 0; } /** Find an interned string */ static struct intern ** find_ascii(intern_tab, s, hash) intern_tab_t *intern_tab; const char *s; unsigned int hash; { struct intern **x; x = &(*intern_tab)[hash]; while (*x && !ascii_eq((*x)->string, s)) x = &((*x)->next); return x; } /** Create an interpreter-local intern table */ void _SEE_intern_init(interp) struct SEE_interpreter *interp; { intern_tab_t *intern_tab; unsigned int i; global_init(); #ifndef NDEBUG global_intern_tab_locked = 1; #endif intern_tab = SEE_NEW(interp, intern_tab_t); for (i = 0; i < HASHTABSZ; i++) (*intern_tab)[i] = NULL; interp->intern_tab = intern_tab; } static int is_uninternable(s) struct SEE_string *s; { return s == NULL || (s->flags & SEE_STRING_FLAG_INTERNED) || (s >= &SEE_stringtab[0] && s < &SEE_stringtab[SEE_nstringtab]); } /** * Intern a string relative to an interpreter. Also reads the global table * Note that a different pointer to s is *ALWAYS* returned unless s was * originally returned by SEE_intern. In other words, on the first occurrence * of a string, it is duplicated. This makes it save to intern strings that * are later changed. However, you MUST not alter strings returned from * this function. */ struct SEE_string * SEE_intern(interp, s) struct SEE_interpreter *interp; struct SEE_string *s; { struct intern **x; unsigned int h; #ifndef NDEBUG const char *where = NULL; # define WHERE(f) do { if (SEE_debug_intern) where=f; } while (0) #else # define WHERE(f) /* nothing */ #endif if (is_uninternable(s)) { #ifndef NDEBUG if (SEE_debug_intern) { dprintf("INTERN "); dprints(s); dprintf(" -> %p [interned]\n", s); } #endif return s; } SEE_ASSERT(interp, s->interpreter == interp); /* Look in system-wide intern table first */ h = hash(s); x = find(&global_intern_tab, s, h); WHERE("global"); if (!*x) { x = find(interp->intern_tab, s, h); WHERE("local"); if (!*x) { *x = make(interp, SEE_string_dup(interp, s)); WHERE("new"); } } #ifndef NDEBUG if (SEE_debug_intern) { dprintf("INTERN "); dprints(s); dprintf(" -> %p [%s h=%d]\n", (*x)->string, where, h); } #endif return (*x)->string; } /** Efficiently convert an ASCII C string into a SEE string and internalise */ struct SEE_string * SEE_intern_ascii(interp, s) struct SEE_interpreter *interp; const char *s; { struct SEE_string *str; const char *t; SEE_char_t *c; unsigned int h, len; struct intern **x; #ifndef NDEBUG const char *where = NULL; #endif SEE_ASSERT(interp, s != NULL); h = hash_ascii(s, &len); x = find_ascii(&global_intern_tab, s, h); WHERE("global"); if (!*x) { x = find_ascii(interp->intern_tab, s, h); WHERE("local"); if (!*x) { WHERE("new"); str = SEE_NEW(interp, struct SEE_string); str->length = len; str->data = SEE_NEW_STRING_ARRAY(interp, SEE_char_t, len); for (c = str->data, t = s; *t;) *c++ = *t++; str->interpreter = interp; str->stringclass = NULL; str->flags = 0; SEE_ASSERT(interp, hash(str) == h); *x = make(interp, str); } } #ifndef NDEBUG if (SEE_debug_intern) dprintf("INTERN %s -> %p [%s h=%d ascii]\n", s, (*x)->string, where, h); #endif return (*x)->string; } /* * Interns a string, and frees the original string. */ void SEE_intern_and_free(interp, sp) struct SEE_interpreter *interp; struct SEE_string **sp; { struct SEE_string *is; if (is_uninternable(*sp)) { #ifndef NDEBUG if (SEE_debug_intern) { dprintf("INTERN "); dprints(*sp); dprintf(" -> %p [hit & free]\n", *sp); } #endif return; } is = SEE_intern(interp, *sp); SEE_string_free(interp, sp); *sp = is; } static void global_init() { unsigned int i, h; struct intern **x; if (global_intern_tab_initialized) return; /* Add all the predefined strings to the global intern table */ for (i = 0; i < SEE_nstringtab; i++) { h = hash(&SEE_stringtab[i]); x = find(&global_intern_tab, &SEE_stringtab[i], h); if (*x == NULL) *x = make(NULL, &SEE_stringtab[i]); } global_intern_tab_initialized = 1; } /** * Adds an ASCII string into the system-wide intern table if * not already there. * Should not be called after any interpeters are created. */ struct SEE_string * SEE_intern_global(s) const char *s; { struct SEE_string *str; const char *t; SEE_char_t *c; unsigned int h, len; struct intern **x; #ifndef NDEBUG if (global_intern_tab_locked) SEE_ABORT(NULL, "SEE_intern_global: table is now read-only"); #endif global_init(); h = hash_ascii(s, &len); x = find_ascii(&global_intern_tab, s, h); if (*x) return (*x)->string; str = SEE_NEW(NULL, struct SEE_string); str->length = len; str->data = SEE_NEW_STRING_ARRAY(NULL, SEE_char_t, len); for (c = str->data, t = s; *t;) *c++ = *t++; str->interpreter = NULL; str->stringclass = NULL; str->flags = 0; *x = make(NULL, str); return (*x)->string; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/interpreter.c�������������������������������������������������������������0000664�0000000�0000000�00000007340�12660066715�0020055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: interpreter.c 1108 2006-08-01 14:22:09Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <stdlib.h> #endif #include "see_cfunction.h" #include "see_context.h" #include "see_intern.h" #include "see_interpreter.h" #include "see_mem.h" #include "see_native.h" #include "see_system.h" #include "see_init.h" /** * Initialises/reinitializes an interpreter structure * using the default compatibility flags. * The interpreter structure must be initialized at least once * before it can be used. */ void SEE_interpreter_init(interp) struct SEE_interpreter *interp; { SEE_interpreter_init_compat(interp, SEE_system.default_compat_flags); } /** * Initialises/reinitializes an interpreter structure * using the given compatibility flags. * The interpreter structure must be initialized at least once * before it can be used. */ void SEE_interpreter_init_compat(interp, compat_flags) struct SEE_interpreter *interp; int compat_flags; { interp->try_context = NULL; interp->try_location = NULL; interp->compatibility = compat_flags; interp->random_seed = (*SEE_system.random_seed)(); interp->trace = SEE_system.default_trace; interp->traceback = NULL; interp->locale = SEE_system.default_locale; interp->recursion_limit = SEE_system.default_recursion_limit; interp->sec_domain = NULL; /* Allocate object storage first, since dependencies are complex */ SEE_Array_alloc(interp); SEE_Boolean_alloc(interp); SEE_Date_alloc(interp); SEE_Error_alloc(interp); SEE_Function_alloc(interp); SEE_Global_alloc(interp); SEE_Math_alloc(interp); SEE_Number_alloc(interp); SEE_Object_alloc(interp); SEE_RegExp_alloc(interp); SEE_String_alloc(interp); _SEE_module_alloc(interp); /* Initialise the per-interpreter intern table now */ _SEE_intern_init(interp); /* Initialise the objects; order *shouldn't* matter */ SEE_Array_init(interp); SEE_Boolean_init(interp); SEE_Date_init(interp); SEE_Error_init(interp); SEE_Global_init(interp); SEE_Math_init(interp); SEE_Number_init(interp); SEE_Object_init(interp); SEE_RegExp_init(interp); SEE_String_init(interp); SEE_Function_init(interp); /* Call late because of parser use */ _SEE_module_init(interp); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/lex.c���������������������������������������������������������������������0000664�0000000�0000000�00000060324�12660066715�0016303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: lex.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <stdlib.h> #endif #if HAVE_STRING_H # include <string.h> #endif #include "see_type.h" #include "see_string.h" #include "see_value.h" #include "see_object.h" #include "see_input.h" #include "see_try.h" #include "see_intern.h" #include "see_error.h" #include "see_debug.h" #include "see_interpreter.h" #include "see_tokens.h" #include "see_lex.h" #include "see_stringdefs.h" #include "see_unicode.h" #include "see_dtoa.h" #include "see_dprint.h" #include "see_nmath.h" #ifndef NDEBUG int SEE_lex_debug = 0; #endif /* * Lexical analyser. * * This is a lexical analyser for ECMAScript. It uses a 6-character * lookahead input 'filter' (to detect '\u####') and provides an * interface that reveals if the returned token was immediately * preceeded by a line terminator. * * The lexical analyser's behaviour when deciding a slash '/' as * a division or the start of a regular expression is determined by * a flag. The parser is exepected to set it. * * NOTE: Although all strings generated for ECMAscript are UTF-16, * this lexer requires UCS-32 input. */ /* Macros that assume local variable lex */ #define NEXT lex->input->lookahead #define SKIP do { SEE_INPUT_NEXT(lex->input); \ } while (!ATEOF && is_FormatControl(NEXT)) #define UNGET(c) do { lex->la[++lex->lalen]=(c); } while (0) #define ATEOF (lex->input->eof) #define LOOKAHEAD(buf,len) SEE_input_lookahead_copy(lex->input, buf, len) #define CONSUME(ch) \ do { \ if (ATEOF) \ SYNTAX_ERROR(STR(unexpected_eof)); \ if (NEXT != (ch)) \ SYNTAX_ERROR(SEE_string_sprintf( \ lex->input->interpreter, "expected '%c'", (ch))); \ SKIP; \ } while (0) #define SYNTAX_ERROR(s) \ SEE_error_throw_string(lex->input->interpreter, \ lex->input->interpreter->SyntaxError, \ prefix_msg(s, lex)) /* Sign constants */ #define NEGATIVE (-1) #define POSITIVE (1) /* Prototypes */ static struct SEE_string *prefix_msg(struct SEE_string *s, struct lex *lex); static void string_adducs32(struct SEE_string *s, SEE_unicode_t c); static int is_FormatControl(SEE_unicode_t c); static int is_WhiteSpace(SEE_unicode_t c); static int is_LineTerminator(SEE_unicode_t c); static int is_HexDigit(SEE_unicode_t c); static int HexValue(SEE_unicode_t c); static int is_HexEscape(struct lex *lex); static int is_UnicodeEscape(struct lex *lex); static int is_IdentifierStart(struct lex *lex); static int is_IdentifierPart(struct lex *lex); static SEE_unicode_t HexEscape(struct lex *lex); static SEE_unicode_t UnicodeEscape(struct lex *lex); static int DivPunctuator(struct lex *lex); static int SGMLComment(struct lex *lex); static int Punctuator(struct lex *lex); static int StringLiteral(struct lex *lex); static int RegularExpressionLiteral(struct lex *lex, int prev); static int NumericLiteral(struct lex *lex); static int CommentDiv(struct lex *lex); static int Token(struct lex *lex); static int lex0(struct lex *lex); /* Returns ("line " + next_lineno + ": " + s) */ static struct SEE_string * prefix_msg(s, lex) struct SEE_string *s; struct lex *lex; { struct SEE_string *t; struct SEE_interpreter *interp = lex->input->interpreter; t = SEE_string_sprintf(interp, "line %d: ", lex->next_lineno); SEE_string_append(t, s); return t; } /* Adds unicode character c to the string s, using UTF-16 encoding */ static void string_adducs32(s, c) struct SEE_string *s; SEE_unicode_t c; { if (c < 0x10000) SEE_string_addch(s, (SEE_char_t)(c & 0xffff)); else { /* RFC2781: UTF-16 encoding */ c -= 0x10000; SEE_string_addch(s, (SEE_char_t)(0xd800 | (c >> 10 & 0x3ff))); SEE_string_addch(s, (SEE_char_t)(0xdc00 | (c & 0x3ff))); } } static int is_FormatControl(c) SEE_unicode_t c; /* 7.1 */ { return UNICODE_IS_Cf(c); /* category Cf or L or R */ } static int is_WhiteSpace(c) SEE_unicode_t c; /* 7.2 */ { return (c == 0x0009 || c == 0x000B || c == 0x000C || c == 0x0020 || c == 0x00A0 || UNICODE_IS_Zs(c)); } static int is_LineTerminator(c) SEE_unicode_t c; /* 7.3 */ { return (c == 0x000A || c == 0x000D || c == 0x2028 || c == 0x2029); } static int is_HexDigit(c) SEE_unicode_t c; { return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')); } /* Returns the hexadecimal value of a character. Assumes char is a hex digit */ static int HexValue(c) SEE_unicode_t c; { if (c >= '0' && c <= '9') return c - '0'; else if (c >= 'a' && c <= 'f') return c - 'a' + 10; else /* (c >= 'A' && c <= 'F') */ return c - 'A' + 10; } static int is_HexEscape(lex) struct lex *lex; /* 7.6 */ { SEE_unicode_t lookahead[4]; int lookahead_len; lookahead_len = LOOKAHEAD(lookahead, 4); return (lookahead_len >= 4 && lookahead[0] == '\\' && lookahead[1] == 'x' && is_HexDigit(lookahead[2]) && is_HexDigit(lookahead[3])); } static int is_UnicodeEscape(lex) struct lex *lex; /* 7.6 */ { SEE_unicode_t lookahead[6]; int lookahead_len; lookahead_len = LOOKAHEAD(lookahead, 6); return (lookahead_len >= 6 && lookahead[0] == '\\' && lookahead[1] == 'u' && is_HexDigit(lookahead[2]) && is_HexDigit(lookahead[3]) && is_HexDigit(lookahead[4]) && is_HexDigit(lookahead[5])); } static int is_IdentifierStart(lex) struct lex *lex; /* 7.6 */ { SEE_unicode_t c; if (ATEOF) return 0; if (is_UnicodeEscape(lex)) return 1; c = NEXT; return UNICODE_IS_IS(c); } static int is_IdentifierPart(lex) struct lex *lex; /* 7.6 */ { SEE_unicode_t c; if (ATEOF) return 0; if (is_UnicodeEscape(lex)) return 1; c = NEXT; return UNICODE_IS_IP(c); } static SEE_unicode_t HexEscape(lex) struct lex *lex; /* 7.6 la \x */ { int i; SEE_unicode_t r = 0; CONSUME('\\'); CONSUME('x'); for (i = 0; i < 2; i++) { if (ATEOF) SYNTAX_ERROR(STR(unexpected_eof)); r = (r << 4) | HexValue(NEXT); SKIP; } return r; } static SEE_unicode_t UnicodeEscape(lex) struct lex *lex; /* 7.6 la \u */ { int i; SEE_unicode_t r = 0; CONSUME('\\'); CONSUME('u'); for (i = 0; i < 4; i++) { if (ATEOF) SYNTAX_ERROR(STR(unexpected_eof)); r = (r << 4) | HexValue(NEXT); SKIP; } return r; /* * XXX NOTE: the \uxxxx escape can only encode characters * up to 0xffff. To express unicode characters above this * codepoint, you would have to use a UTF-16 surrogate, but * this is problematic. Better would be to augment ECMA-262 * with a \Uxxxxxxxx escape, such as Python provides. * (spec bug?) */ } static int DivPunctuator(lex) struct lex *lex; /* 7.7 la / */ { CONSUME('/'); if (!ATEOF && NEXT == '=') { SKIP; return tDIVEQ; } return tDIV; } static int SGMLComment(lex) struct lex *lex; /* la <!-- */ { /* * Treat SGML comment introducers the same as '//', * i.e. to ignore everything up to the end of the line. * The closing '-->' is assumed to be protected by an * actual '//' comment leader. (Refer to Chapter 9 of * 'Client-Side JavaScript Guide', by Netscape. */ while (!ATEOF && !is_LineTerminator(NEXT)) SKIP; if (ATEOF) return tEND; SKIP; /* line terminator */ return tLINETERMINATOR; } static int Punctuator(lex) struct lex *lex; /* 7.7 */ { SEE_unicode_t op[4]; /* ">>>=" is the longest punctuator */ struct token *t; int j, len, oplen; struct SEE_interpreter *interp = lex->input->interpreter; if (ATEOF) return tEND; oplen = LOOKAHEAD(op, 4); len = SEE_tok_noperators - 1; if (len > oplen) len = oplen; for (; len > 0; len--) for (t = SEE_tok_operators[len]; t->token; t++) { for (j = 0; j < len; j++) if (t->identifier[j] != op[j]) goto out; if (t->token == tSGMLCOMMENT) { if (interp->compatibility & SEE_COMPAT_SGMLCOM) return SGMLComment(lex); else goto out; } for (j = 0; j < len; j++) SKIP; return t->token; out: /* continue */ ; } /* * Throw a descriptive error message */ if (op[0] == SEE_INPUT_BADCHAR) SYNTAX_ERROR(SEE_string_sprintf(interp, "malformed unicode input")); else if (op[0] >= ' ' && op[0] <= '~') SYNTAX_ERROR(SEE_string_sprintf(interp, "unexpected character '%c'", op[0])); else SYNTAX_ERROR(SEE_string_sprintf(interp, "unexpected character '\\u%04x'", op[0])); /* NOTREACHED */ return 0; } static int StringLiteral(lex) struct lex *lex; /* 7.8.4 la ' " */ { SEE_unicode_t quote; SEE_unicode_t c = 0; struct SEE_string *s; struct SEE_interpreter *interp = lex->input->interpreter; s = SEE_string_new(interp, 0); quote = NEXT; SKIP; while (!ATEOF && NEXT != quote) { if (is_LineTerminator(NEXT)) SYNTAX_ERROR(STR(broken_literal)); else if (is_UnicodeEscape(lex)) c = UnicodeEscape(lex); else if (is_HexEscape(lex)) c = HexEscape(lex); else if (NEXT == '\\') { SKIP; if (ATEOF || is_LineTerminator(NEXT)) SYNTAX_ERROR(STR(escaped_lit_nl)); switch (NEXT) { case 'b': c = 0x0008; SKIP; break; case 't': c = 0x0009; SKIP; break; case 'n': c = 0x000a; SKIP; break; case 'v': c = 0x000b; SKIP; break; case 'f': c = 0x000c; SKIP; break; case 'r': c = 0x000d; SKIP; break; case '0': case '1': case '2': case '3': c = NEXT - '0'; SKIP; if (!ATEOF && NEXT >= '0' && NEXT <= '7') { c = (c << 3) | (NEXT - '0'); SKIP; } if (!ATEOF && NEXT >= '0' && NEXT <= '7') { c = (c << 3) | (NEXT - '0'); SKIP; } break; case '4': case '5': case '6': case '7': c = NEXT - '0'; SKIP; if (!ATEOF && NEXT >= '0' && NEXT <= '7') { c = (c << 3) | (NEXT - '0'); SKIP; } break; case 'x': case 'u': if (SEE_GET_JS_COMPAT(interp)) goto literal; /* Strict ECMA: */ if (NEXT == 'x') SYNTAX_ERROR(STR(invalid_esc_x)); else SYNTAX_ERROR(STR(invalid_esc_u)); /* NOTREACHED */ default: literal: c = NEXT; SKIP; break; } } else { c = NEXT; SKIP; } string_adducs32(s, c); } CONSUME(quote); SEE_SET_STRING(&lex->value, s); return tSTRING; } /* * 7.8.5 Scans for a regular expression token. * Assumes prev (immediately previous token) is either tDIV or tDIVEQ. * Returns tREGEX on success or throws an exception on failure. * The string in lex->value is of the form "/regex/flags" */ static int RegularExpressionLiteral(lex, prev) struct lex *lex; int prev; { struct SEE_string *s; int incc = 0; struct SEE_interpreter *interp = lex->input->interpreter; s = SEE_string_new(interp, 0); SEE_string_addch(s, '/'); if (prev == tDIVEQ) SEE_string_addch(s, '='); while (!ATEOF) { if (NEXT == '/' && (!incc || !(SEE_GET_JS_COMPAT(interp)))) /* EXT:15 */ break; if (NEXT == '\\') { SEE_string_addch(s, '\\'); SKIP; if (ATEOF) break; } else { /* Track charclasses for JS_COMPAT */ if (NEXT == '[') incc = 1; if (NEXT == ']') incc = 0; } if (is_LineTerminator(NEXT)) SYNTAX_ERROR(STR(broken_regex)); string_adducs32(s, NEXT); SKIP; } if (ATEOF) SYNTAX_ERROR(STR(eof_in_regex)); CONSUME('/'); SEE_string_addch(s, '/'); while (!ATEOF && is_IdentifierPart(lex)) { string_adducs32(s, NEXT); SKIP; } SEE_SET_STRING(&lex->value, s); return tREGEX; } static int NumericLiteral(lex) struct lex *lex; /* 7.8.3 la [.0-9] */ { SEE_number_t n, e; int seendigit; unsigned int i; struct SEE_string *s; char *numbuf, *endstr; struct SEE_interpreter *interp = lex->input->interpreter; seendigit = 0; n = 0; s = SEE_string_new(interp, 0); if (NEXT == '0') { SKIP; if (!ATEOF && (NEXT == 'x' || NEXT == 'X')) { SKIP; if (ATEOF || !is_HexDigit(NEXT)) SYNTAX_ERROR(STR(hex_literal_detritus)); while (!ATEOF && is_HexDigit(NEXT)) { SEE_string_addch(s, (SEE_char_t)NEXT); SKIP; } if (!ATEOF && is_IdentifierStart(lex)) SYNTAX_ERROR(STR(hex_literal_detritus)); e = 1; for (i = 0; i < s->length; i++) { n += e * HexValue(s->data[s->length - i - 1]); e *= 16; } SEE_SET_NUMBER(&lex->value, n); return tNUMBER; } SEE_string_addch(s, '0'); seendigit = 1; } while (!ATEOF && '0' <= NEXT && NEXT <= '9') { SEE_string_addch(s, (SEE_char_t)NEXT); seendigit = 1; SKIP; } /* Octal integers */ if (SEE_GET_JS_COMPAT(interp) && seendigit && (ATEOF || (NEXT != '.' && NEXT != 'e' && NEXT != 'E')) && s->length > 1 && s->data[0] == '0') { /* Octal integers start with 0 and dont follow with . or e */ n = 0; for (i = 1; i < s->length; i++) { if (s->data[i] > '7') goto not_octal; n = n * 8 + s->data[i] - '0'; } if (!ATEOF && is_IdentifierStart(lex)) goto not_octal; SEE_SET_NUMBER(&lex->value, n); return tNUMBER; } not_octal: if (!ATEOF && NEXT == '.') { SEE_string_addch(s, '.'); SKIP; while (!ATEOF && '0' <= NEXT && NEXT <= '9') { seendigit = 1; SEE_string_addch(s, (SEE_char_t)NEXT); SKIP; } } if (!seendigit) { /* free(s) */ return '.'; /* Actually matched Punctuator! */ } if (!ATEOF && (NEXT == 'e' || NEXT == 'E')) { SEE_string_addch(s, (SEE_char_t)NEXT); SKIP; seendigit = 0; if (!ATEOF && NEXT == '-') { SEE_string_addch(s, '-'); SKIP; } else if (!ATEOF && NEXT == '+') { SEE_string_addch(s, '+'); SKIP; } e = 0; while (!ATEOF && '0' <= NEXT && NEXT <= '9') { seendigit = 1; SEE_string_addch(s, (SEE_char_t)NEXT); SKIP; } if (!seendigit) SYNTAX_ERROR(STR(dec_literal_detritus)); } numbuf = SEE_STRING_ALLOCA(interp, char, s->length + 1); for (i = 0; i < s->length; i++) numbuf[i] = s->data[i] & 0x7f; numbuf[i] = '\0'; endstr = NULL; n = SEE_strtod(numbuf, &endstr); if (!endstr || *endstr) /* impossible condition? */ SYNTAX_ERROR(STR(dec_literal_detritus)); SEE_SET_NUMBER(&lex->value, n); return tNUMBER; } static int CommentDiv(lex) struct lex *lex; /* 7.4 la / */ { SEE_unicode_t lookahead[2]; int lookahead_len; lookahead_len = LOOKAHEAD(lookahead, 2); if (lookahead_len >= 2 && lookahead[0] == '/' && lookahead[1] == '*') { int starprev = 0, contains_newline = 0; SKIP; SKIP; while (!ATEOF) { if (starprev && NEXT == '/') { CONSUME('/'); return contains_newline ? tLINETERMINATOR : tCOMMENT; } if (is_LineTerminator(NEXT)) { lex->next_lineno++; contains_newline = 1; } starprev = (NEXT == '*'); SKIP; } SYNTAX_ERROR(STR(eof_in_c_comment)); } if (lookahead_len >= 2 && lookahead[0] == '/' && lookahead[1] == '/') { while (!ATEOF && !is_LineTerminator(NEXT)) SKIP; if (ATEOF) return tEND; SKIP; /* line terminator */ return tLINETERMINATOR; } /* * NB: This assumes regular expressions not wanted, * and that the rest of the regex can be scanned later * if the parser wants it. */ return DivPunctuator(lex); } static int Token(lex) struct lex *lex; /* 7.5 */ { struct SEE_interpreter *interp = lex->input->interpreter; if (ATEOF) return tEND; if (NEXT == '\'' || NEXT == '\"') return StringLiteral(lex); if ((NEXT >= '0' && NEXT <= '9') || NEXT == '.') return NumericLiteral(lex); if (is_IdentifierStart(lex)) { int hasescape = 0, i; struct SEE_string *s; SEE_unicode_t c; s = SEE_string_new(interp, 0); do { if (is_UnicodeEscape(lex)) { c = UnicodeEscape(lex); hasescape = 1; } else { c = NEXT; SKIP; } string_adducs32(s, c); } while (is_IdentifierPart(lex)); /* match keywords */ if (!hasescape) for (i = 0; i < SEE_tok_nkeywords; i++) if (SEE_tok_keywords[i].str->length == s->length && SEE_string_cmp(SEE_tok_keywords[i].str, s) == 0) { int token = SEE_tok_keywords[i].token; if (token == tRESERVED && /* EXT:3 */ SEE_COMPAT_JS(interp, >=, JS11)) { #ifndef NDEBUG dprintf("Warning: line %d: reserved token '", lex->next_lineno); dprints(s); dprintf("' treated as identifier\n"); #endif break; } return token; } SEE_intern_and_free(interp, &s); SEE_SET_STRING(&lex->value, s); return tIDENT; } return Punctuator(lex); } /* * Scanner grammar goal. Scans lex->input for a token, and returns it. * * May return multiple tLINETERMINATORs, but will never return tCOMMENT. * Scans the InputElementDiv production (never InputElementRegex). * If this function returns tDIV or tDIVEQ, and a regular expression is wanted, * then SEE_lex_regex() should be called immediately. */ static int lex0(lex) struct lex *lex; { int ret; again: while (!ATEOF && is_WhiteSpace(NEXT) && !is_LineTerminator(NEXT)) SKIP; if (ATEOF) return tEND; if (is_LineTerminator(NEXT)) { lex->next_lineno++; SKIP; return tLINETERMINATOR; } switch (NEXT) { case '/': ret = CommentDiv(lex); if (ret == tCOMMENT) goto again; /* Discard tCOMMENTs */ return ret; case '\"': case '\'': return StringLiteral(lex); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return NumericLiteral(lex); case '.': { SEE_unicode_t lookahead[2]; int lookahead_len; lookahead_len = LOOKAHEAD(lookahead, 2); if (lookahead_len >= 2 && lookahead[1] >= '0' && lookahead[1] <= '9') return NumericLiteral(lex); SKIP; return '.'; } default: return Token(lex); } } /*------------------------------------------------------------ * Public API */ /* * Initialises a tokenizer structure */ void SEE_lex_init(lex, inp) struct lex *lex; struct SEE_input *inp; { lex->input = inp; SEE_SET_UNDEFINED(&lex->value); lex->next_lineno = inp->first_lineno; lex->next_filename = inp->filename; (void)SEE_lex_next(lex); } /* * Main interface to the lexical anaylser. * * We keep a one-token lookahead. * Each call to this function generates a new lookahead token * (in lex->next) and returns the previous one, so * the lex flags apply to the scanning of the NEXT token, * and NOT to the token being returned. (ie The caller should * generally refer to the resulting lex->next to make * decisions. The value returned is merely a convenience.) * * On return, this function also sets (or clears) the * lex->next_follows_nl flag when a newline is seen immediately * before lex->next. The parser should use this information to * perform automatic semicolon insertion. Note that the defined * tLINETERMINATOR token is an internal scanner pseudo-token and * is never returned by this function. Use the next_follows_nl flag. * * As a special case, if end-of-file (tEND) does not follow * a line terminator, then this function pretends that it does. * * The lex->next_lineno field reflects the line number of * lex->next. */ int SEE_lex_next(lex) struct lex *lex; { int next, token; lex->next_follows_nl = 0; next = lex->next; again: token = lex0(lex); if (token == tLINETERMINATOR) { lex->next_follows_nl = 1; goto again; } if (token == tEND) lex->next_follows_nl = 1; lex->next = token; #ifndef NDEBUG if (SEE_lex_debug) switch (lex->next) { case tIDENT: dprintf("lex: tIDENT "); dprintv(lex->input->interpreter, &lex->value); dprintf("\n"); break; case tSTRING: dprintf("lex: tSTRING "); dprintv(lex->input->interpreter, &lex->value); dprintf("\n"); break; case tNUMBER: dprintf("lex: tNUMBER "); dprintv(lex->input->interpreter, &lex->value); dprintf("\n"); break; default: dprintf("lex: %s\n", SEE_tokenname(lex->next)); } #endif return next; } /* * Converts the next token (just scanned) into a regular expression, * if possible. */ void SEE_lex_regex(lex) struct lex *lex; { if (lex->next == tDIV || lex->next == tDIVEQ) lex->next = RegularExpressionLiteral(lex, lex->next); } /* * 9.3.1 * Scans a SEE_string to convert it into a number. * On success, sets res to the resulting number and returns non-zero. * * This function is called by SEE_ToNumber(). */ int SEE_lex_number(interp, s, res) struct SEE_interpreter *interp; struct SEE_string *s; struct SEE_value *res; { SEE_number_t n, sign; int seendig, hexok; int len = s->length; int i, pos; int start; char *numbuf, *endstr; /* These work becuase we expect no Unicode surrogates in numbers */ #undef ATEOF #undef NEXT #undef SKIP #define ATEOF (pos >= len) #define NEXT (s->data[pos]) #define SKIP pos++ pos = 0; /* StrWhiteSpace */ while (!ATEOF && (is_WhiteSpace(NEXT) || is_LineTerminator(NEXT))) SKIP; if (ATEOF) { SEE_SET_NUMBER(res, 0); /* +0 */ return 1; } sign = 0; if (NEXT == '-') { sign = NEGATIVE; SKIP; } else if (NEXT == '+') { sign = POSITIVE; SKIP; } /* Strict ECMA262-3 hex strings require no sign. Netscape relaxes this. */ hexok = !sign || SEE_GET_JS_COMPAT(interp); if (ATEOF) goto fail; if (NEXT == 'I') { SKIP; if (ATEOF || NEXT != 'n') goto fail; SKIP; if (ATEOF || NEXT != 'f') goto fail; SKIP; if (ATEOF || NEXT != 'i') goto fail; SKIP; if (ATEOF || NEXT != 'n') goto fail; SKIP; if (ATEOF || NEXT != 'i') goto fail; SKIP; if (ATEOF || NEXT != 't') goto fail; SKIP; if (ATEOF || NEXT != 'y') goto fail; SKIP; n = SEE_Infinity; } else { n = 0; start = pos; /* Hexadecimal */ if (hexok && pos + 1 < len && s->data[pos] == '0' && (s->data[pos+1] == 'x' || s->data[pos+1] == 'X')) { SKIP; SKIP; seendig = 0; while (!ATEOF && is_HexDigit(NEXT)) { seendig = 1; n = 16 * n + HexValue(NEXT); SKIP; } if (!seendig) goto fail; goto out; } #if 0 /* Octal */ if (SEE_COMPAT_JS(interp, >=, JS11) && /* EXT:4 */ !ATEOF && NEXT == '0' && !(pos + 1 < len && (s->data[pos+1] == '.' || s->data[pos+1] == 'e' || s->data[pos+1] == 'E'))) { SKIP; n = 0; while (!ATEOF && NEXT >= '0' && NEXT <= '7') { n = 8 * n + NEXT - '0'; SKIP; } goto out; } #endif /* * After this point, we expect to use strtod, so we * just check for character validity, rather than computing n. */ seendig = 0; while (!ATEOF && NEXT >= '0' && NEXT <= '9') { seendig = 1; SKIP; } if (!ATEOF && NEXT == '.') { SKIP; /* '.' */ while (!ATEOF && NEXT >= '0' && NEXT <= '9') { seendig = 1; SKIP; } } if (!seendig) goto fail; /* a lone dot is illegal */ if (!ATEOF && (NEXT == 'e' || NEXT == 'E')) { SKIP; if (!ATEOF && NEXT == '-') { SKIP; } else if (!ATEOF && NEXT == '+') SKIP; seendig = 0; while (!ATEOF && NEXT >= '0' && NEXT <= '9') { seendig = 1; SKIP; } if (!seendig) goto fail; } numbuf = SEE_STRING_ALLOCA(interp, char, pos - start + 1); for (i = 0; i < pos - start; i++) numbuf[i] = s->data[i + start] & 0x7f; numbuf[i] = '\0'; endstr = NULL; n = SEE_strtod(numbuf, &endstr); if (!endstr || *endstr != '\0') goto fail; } out: if (!sign) sign = POSITIVE; /* trailing StrWhiteSpace */ while (!ATEOF && (is_WhiteSpace(NEXT) || is_LineTerminator(NEXT))) SKIP; if (ATEOF) { SEE_SET_NUMBER(res, NUMBER_copysign(n, sign)); return 1; } fail: return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/mem.c���������������������������������������������������������������������0000664�0000000�0000000�00000012666�12660066715�0016277�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: mem.c 1065 2006-04-19 14:29:27Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_mem.h" #include "see_system.h" #include "see_dprint.h" #ifndef NDEBUG int SEE_mem_debug = 0; #endif #undef SEE_malloc #undef SEE_malloc_finalize #undef SEE_malloc_string #undef SEE_free /*------------------------------------------------------------ * Wrappers around memory allocators that check for failure */ /* * Allocates size bytes of garbage-collected storage. */ void * SEE_malloc(interp, size) struct SEE_interpreter *interp; SEE_size_t size; { void *data; if (size == 0) return NULL; data = (*SEE_system.malloc)(interp, size); if (data == NULL) (*SEE_system.mem_exhausted)(interp); return data; } /* * Allocates size bytes of garbage-collected storage, attaching * a finalizer function that will be called when the storage becomes * unreachable. */ void * SEE_malloc_finalize(interp, size, finalizefn, closure) struct SEE_interpreter *interp; SEE_size_t size; void (*finalizefn)(struct SEE_interpreter *, void *, void *); void *closure; { void *data; if (size == 0) return NULL; data = (*SEE_system.malloc_finalize)(interp, size, finalizefn, closure); if (data == NULL) (*SEE_system.mem_exhausted)(interp); return data; } /* * Allocates size bytes of garbage-collected, string storage. * This function is just like SEE_malloc(), except that the caller * guarantees that no pointers will be stored in the data. This * improves performance with strings. */ void * SEE_malloc_string(interp, size) struct SEE_interpreter *interp; SEE_size_t size; { void *data; if (size == 0) return NULL; data = (*SEE_system.malloc_string)(interp, size); if (data == NULL) (*SEE_system.mem_exhausted)(interp); return data; } /* * Releases memory that the caller *knows* is unreachable. */ void SEE_free(interp, memp) struct SEE_interpreter *interp; void **memp; { if (*memp) { (*SEE_system.free)(interp, *memp); *memp = NULL; } } /* * Forces a garbage collection, or does nothing if unsupported. */ void SEE_gcollect(interp) struct SEE_interpreter *interp; { if (SEE_system.gcollect) (*SEE_system.gcollect)(interp); } /* * The debug variants must not be protected by NDEBUG. * This is for the case when the library is compiled with NDEBUG, * but the library-user application is not. */ void * _SEE_malloc_debug(interp, size, file, line, arg) struct SEE_interpreter *interp; SEE_size_t size; const char *file; int line; const char *arg; { void *data; #ifndef NDEBUG if (SEE_mem_debug) dprintf("malloc %u (%s:%d '%s')", size, file, line, arg); #endif data = SEE_malloc(interp, size); #ifndef NDEBUG if (SEE_mem_debug) dprintf(" -> %p\n", data); #endif return data; } void * _SEE_malloc_finalize_debug(interp, size, finalizefn, closure, file, line, arg) struct SEE_interpreter *interp; SEE_size_t size; void (*finalizefn)(struct SEE_interpreter *, void *, void *); void *closure; const char *file; int line; const char *arg; { void *data; #ifndef NDEBUG if (SEE_mem_debug) dprintf("malloc %u (%s:%d '%s')", size, file, line, arg); #endif data = SEE_malloc_finalize(interp, size, finalizefn, closure); #ifndef NDEBUG if (SEE_mem_debug) dprintf(" -> %p\n", data); #endif return data; } void * _SEE_malloc_string_debug(interp, size, file, line, arg) struct SEE_interpreter *interp; SEE_size_t size; const char *file; int line; const char *arg; { void *data; #ifndef NDEBUG if (SEE_mem_debug) dprintf("malloc_string %u (%s:%d '%s')", size, file, line, arg); #endif data = SEE_malloc_string(interp, size); #ifndef NDEBUG if (SEE_mem_debug) dprintf(" -> %p\n", data); #endif return data; } void _SEE_free_debug(interp, memp, file, line, arg) struct SEE_interpreter *interp; void **memp; const char *file; int line; const char *arg; { #ifndef NDEBUG if (SEE_mem_debug) dprintf("free %p (%s:%d '%s')", *memp, file, line, arg); #endif SEE_free(interp, memp); } ��������������������������������������������������������������������������silverjuke-16.2.3/src/see/module.c������������������������������������������������������������������0000664�0000000�0000000�00000005530�12660066715�0016776�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2006 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id$ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_interpreter.h" #include "see_module.h" #include "see_mem.h" #include "see_init.h" #ifndef MAXMODULES # define MAXMODULES 256 #endif struct SEE_module *_SEE_modules[MAXMODULES]; unsigned int _SEE_nmodules; /* * Calls a modules mod_init, and if it returns 0, adds to the module list. * Returns -1 if out of memory, or the return code of mod_init(). */ int SEE_module_add(module) struct SEE_module *module; { int ret; unsigned int i, index; for (i = 0; i < _SEE_nmodules; i++) if (_SEE_modules[i] == module) return i; if (_SEE_nmodules >= MAXMODULES) return -1; index = _SEE_nmodules++; _SEE_modules[index] = module; module->index = index; ret = (*module->mod_init)(); if (ret != 0) _SEE_nmodules = index; return ret; } /* Calls each module's alloc() */ void _SEE_module_alloc(interp) struct SEE_interpreter *interp; { unsigned int i; interp->module_private = SEE_NEW_ARRAY(interp, void *, _SEE_nmodules); for (i = 0; i < _SEE_nmodules; i++) if (_SEE_modules[i]->alloc) (*_SEE_modules[i]->alloc)(interp); } /* Calls each module's init() */ void _SEE_module_init(interp) struct SEE_interpreter *interp; { unsigned int i; for (i = 0; i < _SEE_nmodules; i++) if (_SEE_modules[i]->init) (*_SEE_modules[i]->init)(interp); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/native.c������������������������������������������������������������������0000664�0000000�0000000�00000031764�12660066715�0017007�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: native.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <string.h> #endif #include "see_native.h" #include "see_string.h" #include "see_intern.h" #include "see_mem.h" #include "see_error.h" #include "see_debug.h" #include "see_interpreter.h" #include "see_stringdefs.h" #include "see_dprint.h" static unsigned int hashfn(struct SEE_string *); static struct SEE_property **find(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static void native_enum_reset(struct SEE_interpreter *, struct SEE_enum *); static struct SEE_string *native_enum_next(struct SEE_interpreter *, struct SEE_enum *, int *); #ifndef NDEBUG int SEE_native_debug = 0; #endif /*------------------------------------------------------------ * Native objects * - maintains a simple hash table of named properties * - cannot be called as functions * - cannot be called as a constructor */ struct SEE_property { struct SEE_property *next; struct SEE_string *name; int attr; struct SEE_value value; }; /* Return a hash value for an interned string, in range [0..HASHLEN) */ static unsigned int hashfn(s) struct SEE_string *s; { return ((((unsigned int)s) >> 4) ^ (unsigned int)s) % SEE_NATIVE_HASHLEN; } /* * Find an object property, if it exists. * Assumes property is interned. * Returns either a pointer to the pointer to the property, * or a pointer to the NULL pointer at the end of a hash list. * (ie never returns NULL); */ static struct SEE_property ** find(interp, o, ip) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *ip; { struct SEE_native *n = (struct SEE_native *)o; struct SEE_property **x; SEE_ASSERT(interp, ip != NULL); SEE_ASSERT(interp, ip->flags & SEE_STRING_FLAG_INTERNED); x = &n->properties[hashfn(ip)]; while (*x && (*x)->name != ip) x = &((*x)->next); return x; } /* [[Get]] 8.6.2.1 */ void SEE_native_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { struct SEE_string *ip; struct SEE_property **x; ip = SEE_intern(interp, p); x = find(interp, o, ip); #ifndef NDEBUG if (SEE_native_debug) { dprintf("native_get: o="); dprinto(interp, o); dprintf(" ip="); dprints(ip); dprintf("(%p)", ip); if (*x) { dprintf(" -> "); dprintv(interp, &(*x)->value); dprintf("\n"); } else dprintf(" -> not found\n"); } #endif if (*x) SEE_VALUE_COPY(res, &(*x)->value); else if (SEE_GET_JS_COMPAT(interp) && ip == STR(__proto__)) { if (o->Prototype) SEE_SET_OBJECT(res, o->Prototype); else SEE_SET_NULL(res); } else { #ifndef NDEBUG if (SEE_native_debug) { dprintf("native_get: o="); dprinto(interp, o); dprintf(" has prototype="); dprinto(interp, o->Prototype); dprintf("\n"); } #endif if (!o->Prototype) SEE_SET_UNDEFINED(res); else SEE_OBJECT_GET(interp, o->Prototype, ip, res); } } /* [[Put]] 8.6.2.2 */ void SEE_native_put(interp, o, p, val, attr) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *val; int attr; { struct SEE_property **x; struct SEE_string *ip = SEE_intern(interp, p); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(val) != SEE_REFERENCE); /* * Note: supply a non-zero attr implies that * the caller knows what they're doing. This means * we can ignore any restrictions on extant * properties! */ if (SEE_GET_JS_COMPAT(interp) && ip == STR(__proto__)) { struct SEE_object *po; if (SEE_VALUE_GET_TYPE(val) == SEE_NULL) { o->Prototype = NULL; return; } if (SEE_VALUE_GET_TYPE(val) != SEE_OBJECT) /* XXX: better error message needed. 'bad proto'? */ SEE_error_throw_string(interp, interp->TypeError, STR(internal_error)); /* Check for recursive prototype */ for (po = val->u.object; po; po = po->Prototype) if (SEE_OBJECT_JOINED(o, po)) SEE_error_throw_string(interp, interp->TypeError, STR(internal_error)); o->Prototype = val->u.object; return; } if (!attr && !SEE_OBJECT_CANPUT(interp, o, ip)) return; x = find(interp, o, ip); if (!*x) { struct SEE_property *prop; prop = SEE_NEW(interp, struct SEE_property); prop->next = NULL; prop->name = ip; prop->attr = attr; *x = prop; } else if (attr) (*x)->attr = attr; SEE_VALUE_COPY(&(*x)->value, val); #ifndef NDEBUG if (SEE_native_debug) { dprintf("native_put: o="); dprinto(interp, o); dprintf(" ip="); dprints(ip); dprintf("(%p)", ip); dprintf(" <- "); dprintv(interp, val); if (attr) { dprintf("{"); if (attr & SEE_ATTR_READONLY) dprintf(" ReadOnly"); if (attr & SEE_ATTR_DONTENUM) dprintf(" DontEnum"); if (attr & SEE_ATTR_DONTDELETE) dprintf(" DontDelete"); if (attr & SEE_ATTR_INTERNAL) dprintf(" Internal"); dprintf(" }"); } dprintf("\n"); } #endif } /* [[CanPut]] 8.6.2.3 */ int SEE_native_canput(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_property **x; x = find(interp, o, p); if (*x) return ((*x)->attr & SEE_ATTR_READONLY) ? 0 : 1; if (!o->Prototype) return 1; return SEE_OBJECT_CANPUT(interp, o->Prototype, p); } /* [[HasProperty]] 8.6.2.4 */ int SEE_native_hasproperty(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { if (SEE_native_hasownproperty(interp, o, p)) return 1; if (!o->Prototype) return 0; return SEE_OBJECT_HASPROPERTY(interp, o->Prototype, p); } /* Test if a property is 'local' (ie not belonging to prototype) */ int SEE_native_hasownproperty(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_property **x; x = find(interp, o, p); #ifndef NDEBUG if (SEE_native_debug) { dprintf("hasownprop: p="); dprints(p); dprintf(" -> %p\n", *x); } #endif return *x ? 1 : 0; } /* Return the attribute of a local property, or 0 */ int SEE_native_getownattr(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_property **x; x = find(interp, o, p); return *x ? (*x)->attr : 0; } /* [[Delete]] 8.6.2.5 */ int SEE_native_delete(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_property **x; x = find(interp, o, p); if (!*x) return 1; if ((*x)->attr & SEE_ATTR_DONTDELETE) return 0; *x = (*x)->next; return 1; } /* [[DefaultValue]] 8.6.2.6 */ void SEE_native_defaultvalue(interp, o, hint, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_value *hint; struct SEE_value *res; { struct SEE_value v; struct SEE_object *effective_hint; if (!hint) effective_hint = interp->Number; else if (SEE_VALUE_GET_TYPE(hint) == SEE_OBJECT && hint->u.object == interp->String) effective_hint = interp->String; else if (SEE_VALUE_GET_TYPE(hint) == SEE_OBJECT && hint->u.object == interp->Number) effective_hint = interp->Number; else if (SEE_VALUE_GET_TYPE(hint) == SEE_OBJECT && hint->u.object == interp->Date) effective_hint = interp->String; else effective_hint = interp->Number; /* XXX */ if (effective_hint == interp->String) { SEE_OBJECT_GET(interp, o, STR(toString), &v); if (SEE_VALUE_GET_TYPE(&v) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(v.u.object)) { SEE_OBJECT_CALL(interp, v.u.object, o, 0, NULL, res); if (SEE_VALUE_GET_TYPE(res) != SEE_OBJECT) return; } SEE_OBJECT_GET(interp, o, STR(valueOf), &v); if (SEE_VALUE_GET_TYPE(&v) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(v.u.object)) { SEE_OBJECT_CALL(interp, v.u.object, o, 0, NULL, res); if (SEE_VALUE_GET_TYPE(res) != SEE_OBJECT) return; } if (SEE_COMPAT_JS(interp, >=, JS11)) /* EXT:5 */ SEE_SET_STRING(res, SEE_string_sprintf(interp, "[object %p]", o)); else SEE_error_throw_string(interp, interp->TypeError, STR(defaultvalue_string_bad)); } else { SEE_OBJECT_GET(interp, o, STR(valueOf), &v); if (SEE_VALUE_GET_TYPE(&v) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(v.u.object)) { SEE_OBJECT_CALL(interp, v.u.object, o, 0, NULL, res); if (SEE_VALUE_GET_TYPE(res) != SEE_OBJECT) return; } SEE_OBJECT_GET(interp, o, STR(toString), &v); if (SEE_VALUE_GET_TYPE(&v) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(v.u.object)) { SEE_OBJECT_CALL(interp, v.u.object, o, 0, NULL, res); if (SEE_VALUE_GET_TYPE(res) != SEE_OBJECT) return; } if (SEE_COMPAT_JS(interp, >=, JS11)) /* EXT:6 */ SEE_SET_STRING(res, SEE_string_sprintf(interp, "[object %p]", o)); else SEE_error_throw_string(interp, interp->TypeError, STR(defaultvalue_number_bad)); } } /* * Enumeration support. * * Object enumerators only reveal the names available * at the local level. Object enumerators do not have to be * insert/delete-safe - i.e. they can assume that no change * to the object is made during enumeration. * Local properties with the DONTENUM flag set are still * enumerated, but the 'dont_enum' out-argument is set to non-zero * when they are encountered. */ struct native_enum { struct SEE_enum base; struct SEE_native *native; int next_column; struct SEE_property *next_prop; }; static void native_enum_reset(interp, e) struct SEE_interpreter *interp; struct SEE_enum *e; { struct native_enum *ne = (struct native_enum *)e; ne->next_column = 0; ne->next_prop = NULL; } static struct SEE_string * native_enum_next(interp, e, dont_enump) struct SEE_interpreter *interp; struct SEE_enum *e; int *dont_enump; { struct native_enum *ne = (struct native_enum *)e; struct SEE_native *n = ne->native; struct SEE_property *p; while (ne->next_prop == NULL) { if (ne->next_column >= SEE_NATIVE_HASHLEN) return NULL; ne->next_prop = n->properties[ne->next_column++]; } p = ne->next_prop; ne->next_prop = p->next; if (dont_enump) *dont_enump = (p->attr & SEE_ATTR_DONTENUM); return p->name; } static struct SEE_enumclass native_enumclass = { 0, native_enum_next }; struct SEE_enum * SEE_native_enumerator(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct SEE_native *n = (struct SEE_native *)o; struct native_enum *ne; ne = SEE_NEW(interp, struct native_enum); ne->native = n; ne->base.enumclass = &native_enumclass; native_enum_reset(interp, (struct SEE_enum *)ne); return (struct SEE_enum *)ne; } /*------------------------------------------------------------ * The 'default' native object. */ static struct SEE_objectclass native_class = { "native", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ NULL, /* Construct */ NULL, /* Call */ NULL, /* HasInstance */ }; /* Return a new, native object */ struct SEE_object * SEE_native_new(interp) struct SEE_interpreter *interp; { struct SEE_native *n; n = SEE_NEW(interp, struct SEE_native); SEE_native_init(n, interp, &native_class, NULL); return (struct SEE_object *)n; } /* Initialise a native object to have no properties */ void SEE_native_init(n, interp, objectclass, prototype) struct SEE_native *n; struct SEE_interpreter *interp; struct SEE_objectclass *objectclass; struct SEE_object *prototype; { int i; n->object.objectclass = objectclass; n->object.Prototype = prototype; for (i = 0; i < SEE_NATIVE_HASHLEN; i++) n->properties[i] = NULL; } ������������silverjuke-16.2.3/src/see/no.c����������������������������������������������������������������������0000664�0000000�0000000�00000007334�12660066715�0016131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: no.c 893 2005-12-21 04:38:29Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_type.h" #include "see_value.h" #include "see_object.h" #include "see_no.h" #include "see_mem.h" #include "see_string.h" #include "see_error.h" #include "see_interpreter.h" #include "see_stringdefs.h" static struct SEE_string *no_enum_next(struct SEE_interpreter *, struct SEE_enum *, int *); /*------------------------------------------------------------ * No-op methods */ void SEE_no_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { SEE_SET_UNDEFINED(res); } void SEE_no_put(interp, o, p, val, attr) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *val; int attr; { } int SEE_no_canput(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { return 0; } int SEE_no_hasproperty(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { return 0; } int SEE_no_delete(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { return 0; } void SEE_no_defaultvalue(interp, o, hint, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_value *hint; struct SEE_value *res; { SEE_error_throw_string(interp, interp->TypeError, (hint && SEE_VALUE_GET_TYPE(hint) == SEE_OBJECT && hint->u.object == interp->String) ? STR(defaultvalue_string_bad) : (hint && SEE_VALUE_GET_TYPE(hint) == SEE_OBJECT && hint->u.object == interp->Number) ? STR(defaultvalue_number_bad) : STR(defaultvalue_no_bad)); } static struct SEE_string * no_enum_next(interp, e, dd) struct SEE_interpreter *interp; struct SEE_enum *e; int *dd; { return NULL; } static struct SEE_enumclass no_enumclass = { 0, no_enum_next }; struct SEE_enum * SEE_no_enumerator(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct SEE_enum *e; e = SEE_NEW(interp, struct SEE_enum); e->enumclass = &no_enumclass; return e; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Array.c���������������������������������������������������������������0000664�0000000�0000000�00000101043�12660066715�0017415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Array.c 1099 2006-07-28 15:24:51Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_mem.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_debug.h" #include "see_intern.h" #include "see_stringdefs.h" #include "see_array.h" #include "see_parse.h" #include "see_init.h" #include "see_nmath.h" /* * The Array object. * 15.4 */ /* structure of array instances */ struct array_object { struct SEE_native native; SEE_uint32_t length; }; /* Prototypes */ static void intstr_p(struct SEE_string *, SEE_uint32_t); static struct SEE_string *intstr(struct SEE_interpreter *, struct SEE_string **, SEE_uint32_t); static struct array_object *toarray(struct SEE_interpreter *, struct SEE_object *); static void check_too_long(struct SEE_interpreter *, SEE_uint32_t, SEE_uint32_t); static void array_init(struct array_object *, struct SEE_interpreter *, unsigned int); static void array_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_toLocaleString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_concat(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_join(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_pop(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_push(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_reverse(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_shift(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_slice(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static int SortCompare(struct SEE_interpreter *, struct SEE_value *, struct SEE_value *, struct SEE_object *); static int qs_partition(struct SEE_interpreter *, struct SEE_object *, SEE_uint32_t, SEE_uint32_t, struct SEE_object *, struct SEE_string **, struct SEE_string **); static void qs_sort(struct SEE_interpreter *, struct SEE_object *, SEE_uint32_t, SEE_uint32_t, struct SEE_object *, struct SEE_string **, struct SEE_string **); static void array_proto_sort(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_splice(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_proto_unshift(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void array_setlength(struct SEE_interpreter *, struct array_object *, struct SEE_value *); static void array_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static void array_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); static int array_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static int array_delete(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); /* object class for Array constructor */ static struct SEE_objectclass array_const_class = { "ArrayConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ array_construct, array_construct, }; /* object class for array instances */ static struct SEE_objectclass array_inst_class = { "Array", /* Class */ array_get, /* Get */ array_put, /* Put */ SEE_native_canput, /* CanPut */ array_hasproperty, /* HasProperty */ array_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; void SEE_Array_alloc(interp) struct SEE_interpreter *interp; { interp->Array = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Array_prototype = (struct SEE_object *)SEE_NEW(interp, struct array_object); } void SEE_Array_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Array; /* struct SEE_native */ struct SEE_object *Array_prototype; /* struct array_object */ struct SEE_value v; Array = interp->Array; Array_prototype = interp->Array_prototype; SEE_native_init((struct SEE_native *)Array, interp, &array_const_class, interp->Function_prototype); /* 15.4.3 Array.length = 1 */ SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, Array, STR(length), &v, SEE_ATTR_LENGTH); /* 15.4.3.1 Array.prototype */ SEE_SET_OBJECT(&v, Array_prototype); SEE_OBJECT_PUT(interp, Array, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.4.4 Array.prototype.length = 0 */ array_init((struct array_object *)Array_prototype, interp, 0); /* 14.4.4 Array.prototype.[[Prototype]] = Object.prototype */ Array_prototype->Prototype = interp->Object_prototype; /* 15.4.4.1 Array.prototype.constructor = Array */ SEE_SET_OBJECT(&v, Array); SEE_OBJECT_PUT(interp, Array_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, array_proto_##name, \ STR(name), len)); \ SEE_OBJECT_PUT(interp, Array_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(toString, 0) /* 15.4.4.2 */ PUTFUNC(toLocaleString, 0) /* 15.4.4.3 */ PUTFUNC(concat, 1) /* 15.4.4.4 */ PUTFUNC(join, 1) /* 15.4.4.5 */ PUTFUNC(pop, 0) /* 15.4.4.6 */ PUTFUNC(push, 1) /* 15.4.4.7 */ PUTFUNC(reverse, 0) /* 15.4.4.8 */ PUTFUNC(shift, 0) /* 15.4.4.9 */ PUTFUNC(slice, 2) /* 15.4.4.10 */ PUTFUNC(sort, 1) /* 15.4.4.11 */ PUTFUNC(splice, 2) /* 15.4.4.12 */ PUTFUNC(unshift, 1) /* 15.4.4.13 */ } #define MAX_ARRAY_INDEX 4294967295 #define MAX_ARRAY_INDEX_DIV_10 429496729 #define MAX_ARRAY_INDEX_MOD_10 5 /* * Helper function that returns true if the string * is an integer property less than 2^32-1 (4294967295), and stores * the integer value in the given pointer. Don't allow leading zeroes. */ int SEE_to_array_index(s, ip) struct SEE_string *s; SEE_uint32_t *ip; { SEE_uint32_t n = 0; unsigned int i, digit; if (s->length == 0) return 0; /* Don't allow leading zeros */ if (s->data[0] == '0' && s->length != 1) return 0; for (i = 0; i < s->length; i++) { if (s->data[i] < '0' || s->data[i] > '9') return 0; digit = s->data[i] - '0'; if (n > (MAX_ARRAY_INDEX_DIV_10) || (n == (MAX_ARRAY_INDEX_DIV_10) && digit >= (MAX_ARRAY_INDEX_MOD_10))) return 0; n = n * 10 + digit; } *ip = n; return 1; } /* * Helper functions for quickly building a string from an integer. * Only called from intstr(). */ static void intstr_p(s, i) struct SEE_string *s; SEE_uint32_t i; { if (i >= 10) intstr_p(s, i / 10); SEE_string_addch(s, '0' + (i % 10)); } /* * If sp is null, allocates a new empty string. * Clears the string *sp and puts unsigned integer i into it. * Returns an intern'd string */ static struct SEE_string * intstr(interp, sp, i) struct SEE_interpreter *interp; struct SEE_string **sp; SEE_uint32_t i; { /* A small set of common, interned integers for speed */ #define NCOMMON 10 static struct SEE_string *common_int[NCOMMON] = { STR(zero_digit), STR(1), STR(2), STR(3), STR(4), STR(5), STR(6), STR(7), STR(8), STR(9) }; if (i < NCOMMON) return common_int[i]; if (!*sp) *sp = SEE_string_new(interp, 9); else (*sp)->length = 0; intstr_p(*sp, i); return SEE_intern(interp, *sp); #undef NCOMMON } /* * Convert the object to a native array, or raise an error */ static struct array_object * toarray(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { if (!SEE_is_Array(o)) SEE_error_throw_string(interp, interp->TypeError, STR(not_array)); return (struct array_object *)o; } /* Throws a RangeError if a + b would exceed the maximum array length */ static void check_too_long(interp, a, b) struct SEE_interpreter *interp; SEE_uint32_t a, b; { if (a + b < a || a + b < b) SEE_error_throw(interp, interp->RangeError, "array too long"); } int SEE_is_Array(o) struct SEE_object *o; { return o && o->objectclass == &array_inst_class; } /* Fast native array push() */ void SEE_Array_push(interp, o, v) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_value *v; { struct array_object *a; struct SEE_string *s = NULL; a = toarray(interp, o); check_too_long(interp, a->length, 1); SEE_native_put(interp, o, intstr(interp, &s, a->length), v, 0); a->length++; } SEE_uint32_t SEE_Array_length(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct array_object *a = toarray(interp, o); return a->length; } /* helper function to build an array instance */ static void array_init(ao, interp, length) struct array_object *ao; struct SEE_interpreter *interp; unsigned int length; { SEE_native_init(&ao->native, interp, &array_inst_class, interp->Array_prototype); ao->length = length; } /* 15.4.4.2 */ static void array_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct array_object *ao; int i; SEE_uint32_t length; struct SEE_string *s = NULL; if (argc == 1 && SEE_VALUE_GET_TYPE(argv[0]) == SEE_NUMBER && !SEE_COMPAT_JS(interp, ==, JS12)) { length = SEE_ToUint32(interp, argv[0]); if (argv[0]->u.number != length) SEE_error_throw_string(interp, interp->RangeError, STR(array_badlen)); ao = SEE_NEW(interp, struct array_object); array_init(ao, interp, length); } else { ao = SEE_NEW(interp, struct array_object); array_init(ao, interp, argc); for (i = 0; i < argc; i++) { SEE_native_put(interp, (struct SEE_object *)&ao->native, intstr(interp, &s, i), argv[i], 0); } } SEE_SET_OBJECT(res, (struct SEE_object *)ao); } /* 15.4.4.2 */ static void array_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { (void)toarray(interp, thisobj); if (SEE_COMPAT_JS(interp, ==, JS12)) { struct SEE_string *s = SEE_string_new(interp, 0); struct SEE_string *n = NULL; int lastundef = 0; SEE_uint32_t length, i; struct SEE_value v, vs; unsigned int j; SEE_string_addch(s, '['); SEE_OBJECT_GET(interp, thisobj, STR(length), &v); length = SEE_ToUint32(interp, &v); for (i = 0; i < length; i++) { if (i) { SEE_string_addch(s, ','); SEE_string_addch(s, ' '); } SEE_OBJECT_GET(interp, thisobj, intstr(interp, &n, i), &v); lastundef = 0; switch (SEE_VALUE_GET_TYPE(&v)) { case SEE_UNDEFINED: lastundef = 1; break; case SEE_STRING: SEE_string_addch(s, '"'); for (j = 0; j < v.u.string->length; j++) { if (v.u.string->data[j] == '\"' || v.u.string->data[j] == '\\') SEE_string_addch(s, '\\'); SEE_string_addch(s, v.u.string->data[j]); } SEE_string_addch(s, '"'); break; default: SEE_ToString(interp, &v, &vs); SEE_string_append(s, vs.u.string); break; } } if (lastundef) { SEE_string_addch(s, ','); SEE_string_addch(s, ' '); } SEE_string_addch(s, ']'); SEE_SET_STRING(res, s); } else array_proto_join(interp, self, thisobj, 0, NULL, res); } /* 15.4.4.3 */ static void array_proto_toLocaleString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v, r6, r7; struct SEE_string *separator, *s, *n = NULL; SEE_uint32_t length, i; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); length = SEE_ToUint32(interp, &v); separator = STR(comma); /* TODO: should be locale-dependent */ if (length == 0) { SEE_SET_STRING(res, STR(empty_string)); return; } s = SEE_string_new(interp, 0); if (length) { for (i = 0; i < length; i++) { if (i) SEE_string_append(s, separator); SEE_OBJECT_GET(interp, thisobj, intstr(interp, &n, i), &r6); if (!(SEE_VALUE_GET_TYPE(&r6) == SEE_UNDEFINED || SEE_VALUE_GET_TYPE(&r6) == SEE_NULL)) { SEE_ToObject(interp, &r6, &r7); SEE_OBJECT_GET(interp, r7.u.object, STR(toLocaleString),&v); if (SEE_VALUE_GET_TYPE(&v) != SEE_OBJECT || !SEE_OBJECT_HAS_CALL(v.u.object)) SEE_error_throw_string(interp, interp->TypeError, STR(toLocaleString_notfunc)); SEE_OBJECT_CALL(interp, v.u.object, r7.u.object, 0, NULL, &v); if (SEE_VALUE_GET_TYPE(&v) != SEE_STRING) SEE_error_throw_string(interp, interp->TypeError, STR(toLocaleString_notstring)); SEE_string_append(s, v.u.string); } } } SEE_SET_STRING(res, s); } /* 15.4.4.4 */ static void array_proto_concat(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v, *E, thisv; struct SEE_object *A; SEE_uint32_t n, k; int i; struct SEE_string *nsbuf = NULL, *ns; SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, 0, NULL, &v); A = v.u.object; n = 0; SEE_SET_OBJECT(&thisv, thisobj); E = &thisv; i = 0; for(;;) { if (SEE_VALUE_GET_TYPE(E) == SEE_OBJECT && SEE_is_Array(E->u.object)) { struct array_object *Ea = (struct array_object *)E->u.object; for (k = 0; k < Ea->length; k++) { check_too_long(interp, n, 1); ns = intstr(interp, &nsbuf, k); if (SEE_OBJECT_HASPROPERTY(interp, E->u.object, ns)) { SEE_OBJECT_GET(interp, E->u.object, ns, &v); SEE_OBJECT_PUT(interp, A, intstr(interp, &nsbuf, n), &v, 0); } n++; } } else { check_too_long(interp, n, 1); SEE_OBJECT_PUT(interp, A, intstr(interp, &nsbuf, n), E, 0); n++; } if (i >= argc) break; E = argv[i++]; } SEE_SET_NUMBER(&v, n); SEE_OBJECT_PUT(interp, A, STR(length), &v, 0); SEE_SET_OBJECT(res, A); } /* 15.4.4.5 */ static void array_proto_join(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v, r6, r7; struct SEE_string *separator, *s, *n = NULL; SEE_uint32_t length, i; int use_comma; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); length = SEE_ToUint32(interp, &v); /* XXX fixme if (interp->compatibility & SEE_COMPAT_ARRAYJOIN1) EXT:16 use_comma = (argc == 0); else */ /* strict E262-3 behaviour: */ use_comma = (argc == 0 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED); if (use_comma) separator = STR(comma); else { SEE_ToString(interp, argv[0], &v); separator = v.u.string; } s = SEE_string_new(interp, 0); if (length) { for (i = 0; i < length; i++) { if (i) SEE_string_append(s, separator); SEE_OBJECT_GET(interp, thisobj, intstr(interp, &n, i), &r6); if (!(SEE_VALUE_GET_TYPE(&r6) == SEE_UNDEFINED || SEE_VALUE_GET_TYPE(&r6) == SEE_NULL)) { SEE_ToString(interp, &r6, &r7); SEE_string_append(s, r7.u.string); } } } SEE_SET_STRING(res, s); } /* 15.4.4.6 */ static void array_proto_pop(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; SEE_uint32_t i; struct SEE_string *s = NULL, *si; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); i = SEE_ToUint32(interp, &v); if (i == 0) { SEE_SET_NUMBER(&v, i); SEE_OBJECT_PUT(interp, thisobj, STR(length), &v, 0); SEE_SET_UNDEFINED(res); return; } si = intstr(interp, &s, i - 1); SEE_OBJECT_GET(interp, thisobj, si, res); SEE_OBJECT_DELETE(interp, thisobj, si); SEE_SET_NUMBER(&v, i - 1); SEE_OBJECT_PUT(interp, thisobj, STR(length), &v, 0); } /* 15.4.4.7 */ static void array_proto_push(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { int i; SEE_uint32_t n; struct SEE_value v; struct SEE_string *np = NULL; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); n = SEE_ToUint32(interp, &v); for (i = 0; i < argc; i++) { check_too_long(interp, n, 1); SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &np, n), argv[i], 0); n++; } SEE_SET_NUMBER(res, n); SEE_OBJECT_PUT(interp, thisobj, STR(length), res, 0); } /* 15.4.4.8 */ static void array_proto_reverse(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v, r9, r10; struct SEE_string *r7, *r7s = NULL, *r8, *r8s = NULL; SEE_uint32_t k, r2, r3, r6; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); r2 = SEE_ToUint32(interp, &v); r3 = r2 / 2; /* NB implicit floor() from integer div */ for (k = 0; k < r3; k++) { r6 = r2 - k - 1; r7 = intstr(interp, &r7s, k); r8 = intstr(interp, &r8s, r6); SEE_OBJECT_GET(interp, thisobj, r7, &r9); SEE_OBJECT_GET(interp, thisobj, r8, &r10); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, r8)) { if (SEE_OBJECT_HASPROPERTY(interp, thisobj, r7)) { SEE_OBJECT_PUT(interp, thisobj, r7, &r10, 0); SEE_OBJECT_PUT(interp, thisobj, r8, &r9, 0); } else { SEE_OBJECT_PUT(interp, thisobj, r7, &r10, 0); SEE_OBJECT_DELETE(interp, thisobj, r8); } } else if (SEE_OBJECT_HASPROPERTY(interp, thisobj, r7)) { SEE_OBJECT_DELETE(interp, thisobj, r7); SEE_OBJECT_PUT(interp, thisobj, r8, &r9, 0); } else { SEE_OBJECT_DELETE(interp, thisobj, r7); SEE_OBJECT_DELETE(interp, thisobj, r8); } } SEE_SET_OBJECT(res, thisobj); } /* 15.4.4.9 */ static void array_proto_shift(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_string *s = NULL, *p; SEE_uint32_t k, r2; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); r2 = SEE_ToUint32(interp, &v); if (r2 == 0) { SEE_SET_NUMBER(&v, r2); SEE_OBJECT_PUT(interp, thisobj, STR(length), &v, 0); SEE_SET_UNDEFINED(res); return; } SEE_OBJECT_GET(interp, thisobj, STR(zero_digit), res); for (k = 1; k < r2; k++) { p = intstr(interp, &s, k); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, p)) { SEE_OBJECT_GET(interp, thisobj, p, &v); SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &s, k - 1), &v, 0); } else { SEE_OBJECT_DELETE(interp, thisobj, intstr(interp, &s, k - 1)); } } SEE_OBJECT_DELETE(interp, thisobj, intstr(interp, &s, r2 - 1)); SEE_SET_NUMBER(&v, r2 - 1); SEE_OBJECT_PUT(interp, thisobj, STR(length), &v, 0); } /* 15.4.4.10 */ static void array_proto_slice(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_object *A; SEE_uint32_t r3, r5, r8, k, n; struct SEE_string *s = NULL, *p; struct SEE_value v; if (argc < 1) { SEE_SET_UNDEFINED(res); return; } SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, 0, NULL, &v); A = v.u.object; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); r3 = SEE_ToUint32(interp, &v); SEE_ToInteger(interp, argv[0], &v); r5 = -v.u.number > r3 ? 0 : v.u.number < 0 ? (SEE_uint32_t)(r3 + v.u.number) : v.u.number < r3 ? (SEE_uint32_t)v.u.number : r3; if (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED) r8 = r3; else { SEE_ToInteger(interp, argv[1], &v); r8 = -v.u.number > r3 ? 0 : v.u.number < 0 ? (SEE_uint32_t)(r3 + v.u.number) : v.u.number < r3 ? (SEE_uint32_t)v.u.number : r3; } for (k = r5, n = 0; k < r8; k++, n++) { p = intstr(interp, &s, k); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, p)) { SEE_OBJECT_GET(interp, thisobj, p, &v); SEE_OBJECT_PUT(interp, A, intstr(interp, &s, n), &v, 0); } } SEE_SET_NUMBER(&v, n); SEE_OBJECT_PUT(interp, A, STR(length), &v, 0); SEE_SET_OBJECT(res, A); } /* * A sort comparison function similar to that in 15.4.4.11, * except that our quicksort has already used get/put/hasproperty * on the array, and we represent this with pointers x and y. * If the pointers are NULL, then the elements don't exist in the * array, and should be sorted higher than anything else. If the * pointers point to undefined, then they should be sorted second-highest. */ static int SortCompare(interp, x, y, cmpfn) struct SEE_interpreter *interp; struct SEE_value *x, *y; struct SEE_object *cmpfn; { if (!x && !y) return 0; if (!x) return 1; if (!y) return -1; if (SEE_VALUE_GET_TYPE(x) == SEE_UNDEFINED && SEE_VALUE_GET_TYPE(y) == SEE_UNDEFINED) return 0; if (SEE_VALUE_GET_TYPE(x) == SEE_UNDEFINED) return 1; if (SEE_VALUE_GET_TYPE(y) == SEE_UNDEFINED) return -1; if (cmpfn) { struct SEE_value vn, *arg[2]; arg[0] = x; arg[1] = y; SEE_OBJECT_CALL(interp, cmpfn, cmpfn, 2, arg, &vn); if (SEE_VALUE_GET_TYPE(&vn) != SEE_NUMBER || SEE_NUMBER_ISNAN(&vn)) SEE_error_throw_string(interp, interp->TypeError, STR(array_sort_error)); if (vn.u.number < 0) return -1; if (vn.u.number > 0) return 1; return 0; } else { struct SEE_value xs, ys; SEE_ToString(interp, x, &xs); SEE_ToString(interp, y, &ys); return SEE_string_cmp(xs.u.string, ys.u.string); } } /** * Quicksort partition: partitions the given segment into numbers * smaller, then larger than the first element, using swaps. * Returns the index of the pivot point. */ static int qs_partition(interp, thisobj, lo, hi, cmpfn, s1, s2) struct SEE_interpreter *interp; struct SEE_object *thisobj; SEE_uint32_t lo, hi; struct SEE_object *cmpfn; struct SEE_string **s1, **s2; { struct SEE_value xv, iv, jv; struct SEE_value *xvp = NULL, *ivp = NULL, *jvp = NULL; struct SEE_string *s1p, *s2p = NULL; SEE_uint32_t i = lo - 1; SEE_uint32_t j = hi + 1; s1p = intstr(interp, s1, lo - 1); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, s1p)) { SEE_OBJECT_GET(interp, thisobj, s1p, &xv); xvp = &xv; } else xvp = NULL; for (;;) { do { if (j == lo) break; j--; s2p = intstr(interp, s2, j - 1); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, s2p)) { SEE_OBJECT_GET(interp, thisobj, s2p, &jv); jvp = &jv; } else jvp = NULL; } while (SortCompare(interp, xvp, jvp, cmpfn) < 0); do { if (i == hi) break; i++; s1p = intstr(interp, s1, i - 1); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, s1p)) { SEE_OBJECT_GET(interp, thisobj, s1p, &iv); ivp = &iv; } else ivp = NULL; } while (SortCompare(interp, ivp, xvp, cmpfn) < 0); if (i < j) { /* * At this stage, s1p will always be "i" and s2p will * always be "j". */ if (ivp) SEE_OBJECT_PUT(interp, thisobj, s2p, ivp, 0); else SEE_OBJECT_DELETE(interp, thisobj, s2p); if (jvp) SEE_OBJECT_PUT(interp, thisobj, s1p, &jv, 0); else SEE_OBJECT_DELETE(interp, thisobj, s1p); } else return j; } } /** * Sorts the array segment by partitioning, and then sorting the * partitions. ("Quicksort", Cormen et al "Introduction to Algorithms"). */ static void qs_sort(interp, thisobj, lo, hi, cmpfn, s1, s2) struct SEE_interpreter *interp; struct SEE_object *thisobj; SEE_uint32_t lo, hi; struct SEE_object *cmpfn; struct SEE_string **s1, **s2; { SEE_uint32_t q; if (lo < hi) { q = qs_partition(interp, thisobj, lo, hi, cmpfn, s1, s2); qs_sort(interp, thisobj, lo, q, cmpfn, s1, s2); qs_sort(interp, thisobj, q + 1, hi, cmpfn, s1, s2); } } /* 15.4.4.11 */ static void array_proto_sort(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s1 = NULL, *s2 = NULL; SEE_uint32_t length; struct SEE_value v; struct SEE_object *cmpfn; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); length = SEE_ToUint32(interp, &v); if (argc < 1 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED) cmpfn = NULL; else if (SEE_VALUE_GET_TYPE(argv[0]) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(argv[0]->u.object)) cmpfn = argv[0]->u.object; else SEE_error_throw_string(interp, interp->TypeError, STR(bad_arg)); qs_sort(interp, thisobj, 1, length, cmpfn, &s1, &s2); /* * NOTE: the standard does not say that the length * of the array should be updated after sorting. * i.e., even as all the non-existent entries get moved * to the end of the array, the length property will remain * unchanged. This remains consistent with 15.4.5.2. */ SEE_SET_OBJECT(res, thisobj); } /* 15.4.4.12 */ static void array_proto_splice(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_object *A; SEE_uint32_t r3, r5, r6, r17, k; struct SEE_string *s = NULL, *s9, *s11, *s22, *s33, *s39; /*1*/ SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, 0, NULL, &v); A = v.u.object; /*2*/ SEE_OBJECT_GET(interp, thisobj, STR(length), &v); /*3*/ r3 = SEE_ToUint32(interp, &v); /*4*/ if (argc < 1) SEE_SET_NUMBER(&v, 0); else SEE_ToInteger(interp, argv[0], &v); /*5*/ r5 = -v.u.number > r3 ? 0 : v.u.number < 0 ? (SEE_uint32_t)(r3 + v.u.number) : v.u.number < r3 ? (SEE_uint32_t)v.u.number : r3; /*6*/ if (argc < 2) SEE_SET_NUMBER(&v, 0); else SEE_ToInteger(interp, argv[1], &v); r6 = MIN(v.u.number < 0 ? 0 : (SEE_uint32_t)v.u.number, r3 - r5); /*7*/ for (k = 0; k < r6; k++) { /*9*/ s9 = intstr(interp, &s, r5 + k); /*10*/ if (SEE_OBJECT_HASPROPERTY(interp, thisobj, s9)) { /*12*/ SEE_OBJECT_GET(interp, thisobj, s9, &v); /*11*/ s11 = intstr(interp, &s, k); /*13*/ SEE_OBJECT_PUT(interp, A, s11, &v, 0); } } /*16*/ SEE_SET_NUMBER(&v, r6); SEE_OBJECT_PUT(interp, A, STR(length), &v, 0); /*17*/ r17 = argc < 2 ? 0 : argc - 2; /*18*/ if (r17 != r6) { /*19*/ if (r17 <= r6) { /*20*/ for (k = r5; k < r3 - r6; k++) { /*22*/ s22 = intstr(interp, &s, k + r6); /*23*/ if (SEE_OBJECT_HASPROPERTY(interp, thisobj, s22)) { /*25*/ SEE_OBJECT_GET(interp, thisobj, s22, &v); /*26*/ SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &s, k + r17), &v, 0); } else { /*28*/ SEE_OBJECT_DELETE(interp, thisobj, intstr(interp, &s, k + r17)); } } /*31*/ for (k = r3; k > r3-r6+r17; k--) { /*33*/ s33 = intstr(interp, &s, k - 1); /*34*/ SEE_OBJECT_DELETE(interp, thisobj, s33); } } else /*37*/ for (k = r3 - r6; k > r5; k--) { /*39*/ s39 = intstr(interp, &s, k + r6 - 1); /*41*/ if (SEE_OBJECT_HASPROPERTY(interp, thisobj, s39)) { /*43*/ SEE_OBJECT_GET(interp, thisobj, s39, &v); /*44*/ SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &s, k + r17 - 1), &v, 0); } else { /*45*/ SEE_OBJECT_DELETE(interp, thisobj, intstr(interp, &s, k + r17 - 1)); } } } /*48*/ for (k = 2; k < (unsigned int)argc; k++) { /*50*/ SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &s, k - 2 + r5), argv[k], 0); } /*53*/ SEE_SET_NUMBER(&v, r3-r6+r17); SEE_OBJECT_PUT(interp, thisobj, STR(length), &v, 0); /*54*/ SEE_SET_OBJECT(res, A); } /* 15.4.4.13 */ static void array_proto_unshift(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { SEE_uint32_t r2, r3, k; struct SEE_value v; struct SEE_string *s = NULL, *p; SEE_OBJECT_GET(interp, thisobj, STR(length), &v); r2 = SEE_ToUint32(interp, &v); r3 = argc; check_too_long(interp, r2, r3); for (k = r2; k > 0; k--) { p = intstr(interp, &s, k - 1); if (SEE_OBJECT_HASPROPERTY(interp, thisobj, p)) { SEE_OBJECT_GET(interp, thisobj, p, &v); SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &s, k + r3 - 1), &v, 0); } else { SEE_OBJECT_DELETE(interp, thisobj, intstr(interp, &s, k + r3 - 1)); } } for (k = 0; k < r3; k++) { SEE_OBJECT_PUT(interp, thisobj, intstr(interp, &s, k), argv[k], 0); } SEE_SET_NUMBER(res, r2 + r3); SEE_OBJECT_PUT(interp, thisobj, STR(length), res, 0); } /*------------------------------------------------------------ * Array methods */ /* * Modify the length of the array. * NB: this can be slow if the length is suddenly set * from 4,294,967,295 to 0 (because deletes occur). */ static void array_setlength(interp, ao, val) struct SEE_interpreter *interp; struct array_object *ao; struct SEE_value *val; { SEE_uint32_t i, newlen; struct SEE_string *s; struct name { struct SEE_string *s; struct name *next; } *name, *names = NULL; struct SEE_enum *e; int flags; newlen = SEE_ToUint32(interp, val); if (ao->length > newlen) { e = SEE_OBJECT_ENUMERATOR(interp, (struct SEE_object *)&ao->native); while ((s = SEE_ENUM_NEXT(interp, e, &flags))) if (SEE_to_array_index(s, &i) && i >= newlen) { name = SEE_NEW(interp, struct name); name->s = s; name->next = names; names = name; } for (name = names; name; name = name->next) SEE_native_delete(interp, (struct SEE_object *)&ao->native, name->s); } ao->length = newlen; } static void array_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { struct array_object *ao = (struct array_object *)o; if (SEE_string_cmp(p, STR(length)) == 0) SEE_SET_NUMBER(res, ao->length); else SEE_native_get(interp, o, p, res); } static void array_put(interp, o, p, val, attr) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *val; int attr; { struct array_object *ao = (struct array_object *)o; SEE_uint32_t i; if (SEE_string_cmp(p, STR(length)) == 0) array_setlength(interp, ao, val); else { SEE_native_put(interp, o, p, val, attr); if (SEE_to_array_index(p, &i)) if (i >= ao->length) ao->length = i + 1; } } static int array_hasproperty(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { if (SEE_string_cmp(p, STR(length)) == 0) return 1; else return SEE_native_hasproperty(interp, o, p); } static int array_delete(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { if (SEE_string_cmp(p, STR(length)) == 0) return 0; else return SEE_native_delete(interp, o, p); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Boolean.c�������������������������������������������������������������0000664�0000000�0000000�00000015632�12660066715�0017726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Boolean.c 1021 2006-02-08 15:40:35Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_mem.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_stringdefs.h" #include "see_init.h" /* * 15.6 The Boolean object. */ /* structure of boolean instances */ struct boolean_object { struct SEE_native native; SEE_boolean_t boolean; /* Value */ }; static struct boolean_object *toboolean(struct SEE_interpreter *, struct SEE_object *); static void boolean_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void boolean_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void boolean_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void boolean_proto_valueOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); /* object class for Boolean constructor */ static struct SEE_objectclass boolean_const_class = { "BooleanConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ boolean_construct, /* Construct */ boolean_call /* Call */ }; /* object class for Boolean.prototype and number instances */ struct SEE_objectclass _SEE_boolean_inst_class = { "Boolean", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; void SEE_Boolean_alloc(interp) struct SEE_interpreter *interp; { interp->Boolean = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Boolean_prototype = (struct SEE_object *)SEE_NEW(interp, struct boolean_object); } void SEE_Boolean_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Boolean; /* struct SEE_native */ struct SEE_object *Boolean_prototype; /* struct boolean_object */ struct SEE_value v; Boolean = interp->Boolean; SEE_native_init((struct SEE_native *)Boolean, interp, &boolean_const_class, interp->Function_prototype); Boolean_prototype = interp->Boolean_prototype; /* 15.6.3 Boolean.length = 1 */ SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, Boolean, STR(length), &v, SEE_ATTR_LENGTH); /* 15.6.3.1 Boolean.prototype */ SEE_SET_OBJECT(&v, Boolean_prototype); SEE_OBJECT_PUT(interp, Boolean, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); SEE_native_init((struct SEE_native *)Boolean_prototype, interp, &_SEE_boolean_inst_class, interp->Object_prototype); /* 15.6.4 */ ((struct boolean_object *)Boolean_prototype)->boolean = 0; /* 15.6.4 */ /* 15.6.4.1 Boolean.prototype.constructor */ SEE_SET_OBJECT(&v, Boolean); SEE_OBJECT_PUT(interp, Boolean_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, boolean_proto_##name, \ STR(name), len)); \ SEE_OBJECT_PUT(interp, Boolean_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(toString, 0) PUTFUNC(valueOf, 0) } static struct boolean_object * toboolean(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { if (o->objectclass != &_SEE_boolean_inst_class) SEE_error_throw_string(interp, interp->TypeError, STR(not_boolean)); return (struct boolean_object *)o; } /* 15.6.2.1 */ static void boolean_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct boolean_object *bo; struct SEE_value v; if (argc == 0) SEE_SET_BOOLEAN(&v, 0); else SEE_ToBoolean(interp, argv[0], &v); bo = SEE_NEW(interp, struct boolean_object); SEE_native_init(&bo->native, interp, &_SEE_boolean_inst_class, interp->Boolean_prototype); bo->boolean = v.u.boolean; SEE_SET_OBJECT(res, (struct SEE_object *)bo); } /* 15.6.1.1 */ static void boolean_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { if (argc == 0) SEE_SET_BOOLEAN(res, 0); else SEE_ToBoolean(interp, argv[0], res); } /* 15.6.4.2 Boolean.prototype.toString() */ static void boolean_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct boolean_object *bo; bo = toboolean(interp, thisobj); SEE_SET_STRING(res, bo->boolean ? STR(true) : STR(false)); } /* 15.6.4.3 Boolean.prototype.valueOf() */ static void boolean_proto_valueOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct boolean_object *bo; bo = toboolean(interp, thisobj); SEE_SET_BOOLEAN(res, bo->boolean); } ������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Date.c����������������������������������������������������������������0000664�0000000�0000000�00000156374�12660066715�0017235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Date.c 1078 2006-05-07 04:43:54Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <string.h> #endif #include "see_mem.h" #include "see_type.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_stringdefs.h" #include "see_init.h" #include "see_dprint.h" #include "see_nmath.h" #include "see_platform.h" /* * 15.9 The Date object. */ /* structure of date instances */ struct date_object { struct SEE_native native; SEE_number_t t; /* time value with 53 bit precision */ }; #define SGN(x) ((x) < 0 ? -1 : 1) #define ABS(x) ((x) < 0 ? -(x) : (x)) /* The number of milliseconds from midnight 1 Jan 0000 to 1 Jan 1970 */ #define msPerY1 (365 * msPerDay) #define msPerY4 (4 * msPerY1 + msPerDay) #define msPerY100 (25 * msPerY4 - msPerDay) #define msPerY400 (4 * msPerY100 + msPerDay) /* 1970 = 1600+300+68+2 */ #define T1970 (4 * msPerY400 + \ 3 * msPerY100 + \ 17 * msPerY4 + \ 2 * msPerY1) #define maxTime (msPerDay * 100000000) #define minTime (-maxTime) #define msPerDay (86400000.0) /* 15.9.1.2 */ #define Day(t) NUMBER_floor((t) / msPerDay)/* 15.9.1.2 */ #define TimeWithinDay(t) modulo(t, msPerDay) /* 15.9.1.2 */ #define DaysInYear(y) /* 15.9.1.3 */ \ ((y) % 4) ? 365 : ((y) % 100) ? 366 : ((y) % 400) ? 365 : 366 static SEE_number_t DayFromYear(SEE_number_t); /* 15.9.1.3 */ #define TimeFromYear(y) /* 15.9.1.3 */ \ (msPerDay * DayFromYear(y)) static SEE_number_t YearFromTime(SEE_number_t); /* 15.9.1.3 */ #define InLeapYear(t) isleapyear(YearFromTime(t)) /* 15.9.1.3 */ static int isleapyear(SEE_number_t); #define DayWithinYear(t) \ (Day(t) - DayFromYear(YearFromTime(t))) static SEE_number_t MonthFromTime(SEE_number_t); /* 15.9.1.4 */ static SEE_number_t DateFromTime(SEE_number_t); /* 15.9.1.5 */ #define WeekDay(t) modulo(Day(t) + 4, 7.0) /* 15.9.1.6 */ #define LocalTZA(i) _SEE_platform_tza(i) /* 15.9.1.7(8) */ static SEE_number_t DaylightSavingTA(struct SEE_interpreter *, SEE_number_t); static SEE_number_t UTC(struct SEE_interpreter *, SEE_number_t); static SEE_number_t LocalTime(struct SEE_interpreter *, SEE_number_t); /* 15.9.1.10 */ #define HourFromTime(t) modulo(NUMBER_floor((t) / msPerHour), HoursPerDay) #define MinFromTime(t) modulo(NUMBER_floor((t) / msPerMinute), MinutesPerHour) #define SecFromTime(t) modulo(NUMBER_floor((t) / msPerSecond), \ SecondsPerMinute) #define msFromTime(t) modulo(t, msPerSecond) #define HoursPerDay 24.0 #define MinutesPerHour 60.0 #define SecondsPerMinute 60.0 #define msPerSecond 1000.0 #define msPerMinute (msPerSecond * SecondsPerMinute) #define msPerHour (msPerMinute * MinutesPerHour) static SEE_number_t modulo(SEE_number_t, SEE_number_t); static SEE_number_t MakeTime(SEE_number_t, SEE_number_t, /* 15.9.1.11 */ SEE_number_t, SEE_number_t); static SEE_number_t MakeDay(SEE_number_t, SEE_number_t, /* 15.9.1.12 */ SEE_number_t); static SEE_number_t MakeDate(SEE_number_t, SEE_number_t); /* 15.9.1.13 */ static SEE_number_t TimeClip(SEE_number_t); /* 15.9.1.14 */ static SEE_number_t now(struct SEE_interpreter *); static SEE_number_t parsetime(struct SEE_interpreter *, struct SEE_string *); static SEE_number_t parse_netscape_time(struct SEE_interpreter *, struct SEE_string *); static struct SEE_string *reprtime(struct SEE_interpreter *, SEE_number_t); static struct date_object *todate(struct SEE_interpreter *, struct SEE_object *); static void date_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_defaultvalue(struct SEE_interpreter *, struct SEE_object *, struct SEE_value *, struct SEE_value *); static void date_parse(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_UTC(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toDateString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toTimeString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toLocaleString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toLocaleDateString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toLocaleTimeString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_valueOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getTime(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getFullYear(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCFullYear(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getMonth(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCMonth(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getDate(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCDate(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getDay(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCDay(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getHours(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCHours(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getMinutes(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCMinutes(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getSeconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCSeconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getMilliseconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getUTCMilliseconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getTimezoneOffset(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setTime(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setMilliseconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCMilliseconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setSeconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCSeconds(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setMinutes(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCMinutes(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setHours(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCHours(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setDate(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCDate(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setMonth(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCMonth(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setFullYear(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setUTCFullYear(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_toUTCString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_getYear(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void date_proto_setYear(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); /* object class for Date constructor */ static struct SEE_objectclass date_const_class = { "DateConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ date_construct, /* Construct */ date_call /* Call */ }; /* object class for Date.prototype and date instances */ static struct SEE_objectclass date_inst_class = { "Date", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ date_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; static SEE_number_t modulo(a, b) SEE_number_t a, b; { SEE_number_t r; r = NUMBER_fmod(a, b); if (r < 0) r += b; return r; } /* 15.9.1.9 */ static SEE_number_t UTC(interp, t) struct SEE_interpreter *interp; SEE_number_t t; { return t - LocalTZA(interp) - DaylightSavingTA(interp, t - LocalTZA(interp)); } /* 15.9.1.9 */ static SEE_number_t LocalTime(interp, t) struct SEE_interpreter *interp; SEE_number_t t; { return t + LocalTZA(interp) + DaylightSavingTA(interp, t); } /* * Can only use the following four properties for computing DST: * ysec - time since beginning of year * InLeapYear(t) * weekday of beginning of year * geographic location * 15.9.1.8(9) */ static SEE_number_t DaylightSavingTA(interp, t) struct SEE_interpreter *interp; SEE_number_t t; { SEE_number_t ysec = t - TimeFromYear(YearFromTime(t)); int ily = InLeapYear(t); int wstart = WeekDay(TimeFromYear(YearFromTime(t))); return _SEE_platform_dst(interp, ysec, ily, wstart); } void SEE_Date_alloc(interp) struct SEE_interpreter *interp; { interp->Date = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Date_prototype = (struct SEE_object *)SEE_NEW(interp, struct date_object); } void SEE_Date_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Date; /* struct SEE_native */ struct SEE_object *Date_prototype; /* struct date_object */ struct SEE_value v; Date = interp->Date; Date_prototype = interp->Date_prototype; SEE_native_init((struct SEE_native *)Date, interp, &date_const_class, interp->Function_prototype); /* 15.9.4.1 Date.prototype */ SEE_SET_OBJECT(&v, Date_prototype); SEE_OBJECT_PUT(interp, Date, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.9.5.4 Date.length = 7 */ SEE_SET_NUMBER(&v, 7); SEE_OBJECT_PUT(interp, Date, STR(length), &v, SEE_ATTR_LENGTH); #define PUTCFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, date_##name, \ STR(name), len)); \ SEE_OBJECT_PUT(interp, Date, STR(name), &v, SEE_ATTR_DEFAULT); PUTCFUNC(parse, 1) /* 15.9.4.2 */ PUTCFUNC(UTC, 7) /* 15.9.4.3 */ /* 15.9.5 */ SEE_native_init((struct SEE_native *)Date_prototype, interp, &date_inst_class, interp->Object_prototype); ((struct date_object *)Date_prototype)->t = SEE_NaN; /* 15.9.5.1 Date.prototype.constructor */ SEE_SET_OBJECT(&v, Date); SEE_OBJECT_PUT(interp, Date_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, \ date_proto_##name, STR(name), len)); \ SEE_OBJECT_PUT(interp, Date_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(toString, 0) PUTFUNC(toDateString, 0) PUTFUNC(toTimeString, 0) PUTFUNC(toLocaleString, 0) PUTFUNC(toLocaleDateString, 0) PUTFUNC(toLocaleTimeString, 0) PUTFUNC(valueOf, 0) PUTFUNC(getTime, 0) PUTFUNC(getFullYear, 0) PUTFUNC(getUTCFullYear, 0) PUTFUNC(getMonth, 0) PUTFUNC(getUTCMonth, 0) PUTFUNC(getDate, 0) PUTFUNC(getUTCDate, 0) PUTFUNC(getDay, 0) PUTFUNC(getUTCDay, 0) PUTFUNC(getHours, 0) PUTFUNC(getUTCHours, 0) PUTFUNC(getMinutes, 0) PUTFUNC(getUTCMinutes, 0) PUTFUNC(getSeconds, 0) PUTFUNC(getUTCSeconds, 0) PUTFUNC(getMilliseconds, 0) PUTFUNC(getUTCMilliseconds, 0) PUTFUNC(getTimezoneOffset, 0) PUTFUNC(setTime, 1) PUTFUNC(setMilliseconds, 1) PUTFUNC(setUTCMilliseconds, 1) PUTFUNC(setSeconds, 2) PUTFUNC(setUTCSeconds, 2) PUTFUNC(setMinutes, 3) PUTFUNC(setUTCMinutes, 3) PUTFUNC(setHours, 4) PUTFUNC(setUTCHours, 4) PUTFUNC(setDate, 1) PUTFUNC(setUTCDate, 1) PUTFUNC(setMonth, 2) PUTFUNC(setUTCMonth, 2) PUTFUNC(setFullYear, 3) PUTFUNC(setUTCFullYear, 3) PUTFUNC(toUTCString, 0) if (interp->compatibility & SEE_COMPAT_262_3B) { /* toGMTString() == toUTCString() */ SEE_OBJECT_PUT(interp, Date_prototype, STR(toGMTString), &v, SEE_ATTR_DEFAULT); PUTFUNC(getYear, 0) PUTFUNC(setYear, 1) } } /* 15.9.1.3 */ static SEE_number_t DayFromYear(y) SEE_number_t y; { return 365.0 * (y-1970) + NUMBER_floor((y-1969)/4) - NUMBER_floor((y-1901)/100) + NUMBER_floor((y-1601)/400); } /* 15.9.1.3 */ static SEE_number_t YearFromTime(t0) SEE_number_t t0; { /* * "return the largest integer y (closest to +Inf) such * that TimeFromYear(y) <= t" */ SEE_number_t y, t; y = 0; t = t0 + T1970; y += 400 * NUMBER_floor(t / msPerY400); t = modulo(t, msPerY400); y += 100 * NUMBER_floor(t / msPerY100); t = modulo(t, msPerY100); y += 4 * NUMBER_floor(t / msPerY4); t = modulo(t, msPerY4); y += 1 * NUMBER_floor(t / msPerY1); t = modulo(t, msPerY1); #ifndef NDEBUG #define AS(x) do {if (!(x)) \ dprintf("%s:%d: FAILURE: '%s'; y=%g t0=%g\n", \ __FILE__, __LINE__, #x, y, t0); } while(0) AS(TimeFromYear(y) <= t0); AS(TimeFromYear(y + 1) > t0); #undef AS #endif return y; } /* 15.9.1.3 */ static int isleapyear(y) SEE_number_t y; { if (modulo(y, 4.0) != 0) return 0; if (modulo(y, 100.0) != 0) return 1; if (modulo(y, 400.0) != 0) return 0; return 1; } /* 15.9.1.4 */ static SEE_number_t MonthFromTime(t) SEE_number_t t; { SEE_number_t dwy = DayWithinYear(t); SEE_number_t ily = InLeapYear(t); if (dwy < 31) return 0; if (dwy < 59+ily) return 1; if (dwy < 90+ily) return 2; if (dwy < 120+ily) return 3; if (dwy < 151+ily) return 4; if (dwy < 181+ily) return 5; if (dwy < 212+ily) return 6; if (dwy < 243+ily) return 7; if (dwy < 273+ily) return 8; if (dwy < 304+ily) return 9; if (dwy < 334+ily) return 10; if (dwy < 365+ily) return 11; return -1; } /* 15.9.1.5 */ static SEE_number_t DateFromTime(t) SEE_number_t t; { SEE_number_t dwy = DayWithinYear(t); int ily = InLeapYear(t); switch ((int)MonthFromTime(t)) { case 0: return dwy + 1; case 1: return dwy - 30; case 2: return dwy - 58 - ily; case 3: return dwy - 89 - ily; case 4: return dwy - 119 - ily; case 5: return dwy - 150 - ily; case 6: return dwy - 180 - ily; case 7: return dwy - 211 - ily; case 8: return dwy - 242 - ily; case 9: return dwy - 272 - ily; case 10: return dwy - 303 - ily; case 11: return dwy - 333 - ily; default: return -1; } } /* see 9.4 - this version works directly on numbers */ static SEE_number_t ToInteger(n) SEE_number_t n; { if (SEE_ISNAN(n)) return 0; if (SEE_ISINF(n)) return n; return SGN(n) * NUMBER_floor(ABS(n)); } /* 15.9.1.11 */ static SEE_number_t MakeTime(hour, min, sec, ms) SEE_number_t hour, min, sec, ms; { if (!SEE_ISFINITE(hour) || !SEE_ISFINITE(min) || !SEE_ISFINITE(sec) || !SEE_ISFINITE(ms)) return SEE_NaN; return ToInteger(hour) * msPerHour + ToInteger(min) * msPerMinute + ToInteger(sec) * msPerSecond + ToInteger(ms); } /* Julian date of the 1st of each month. */ static unsigned int julian[] = { 1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }, julian_ly[] = { 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336 }; /* 15.9.1.12 */ static SEE_number_t MakeDay(year, month, date) SEE_number_t year, month, date; { SEE_number_t r2, r3, r4, y, m, t, day; int ily; if (SEE_ISNAN(year) || SEE_ISNAN(month) || SEE_ISNAN(date)) return SEE_NaN; r2 = ToInteger(year); r3 = ToInteger(month); r4 = ToInteger(date); y = r2 + NUMBER_floor(r3 / 12); m = modulo(r3, 12.0); if (DayFromYear(y) < -100000000 || DayFromYear(y) > 100000000) return SEE_NaN; ily = isleapyear(NUMBER_rint(y)); t = (DayFromYear(y) + (ily ? julian_ly:julian)[(int)m] - 1) * msPerDay; #ifndef NDEBUG #define AS(x,y) do { SEE_number_t __x = (x); if (__x!=(y)) \ dprintf("%s:%d: FAILURE: %s = %g; expected %g (%g/%g/%g:%d)\n",\ __FILE__, __LINE__, #x, __x, (SEE_number_t)(y), \ year,month,date,ily); } while(0) AS(YearFromTime(t), y); AS(MonthFromTime(t), m); AS(DateFromTime(t), 1); #undef AS #endif day = Day(t) + r4 - 1; return (day < -100000000 || day > 100000000) ? SEE_NaN : day; } /* 15.9.1.13 */ static SEE_number_t MakeDate(day, time) SEE_number_t day, time; { if (!SEE_ISFINITE(day) || !SEE_ISFINITE(time)) return SEE_NaN; return day * msPerDay + time; } /* 15.9.1.14 */ static SEE_number_t TimeClip(t) SEE_number_t t; { if (!SEE_ISFINITE(t)) return SEE_NaN; if (t > 8.64e15 || t < -8.64e15) return SEE_NaN; /* * spec bug: TimeClip definition refers to Result(1) and Result(2), * which are meaningless. Only meaningful interpretation is to * treat them as references to 'time' (which is variable 't' in this * implementation) */ return ToInteger(t); } /* Return the time right now in milliseconds since Jan 1 1970 UTC 0:00 */ static SEE_number_t now(interp) struct SEE_interpreter *interp; { return TimeClip(_SEE_platform_time(interp)); } #define ISWHITE(c) (s[i] == ' ' || s[i] == '\t') #define ISLETTER(c) (((c) >= 'A' && (c) <= 'Z') || \ ((c) >= 'a' && (c) <= 'z')) #define ISDIGIT(c) ((c) >= '0' && (c) <= '9') #define TOLOWER(c) (((c) >= 'A' && (c) <= 'Z') ? (c) - 'A' + 'a' : (c)) /* ref. 15.9.4.2 */ static SEE_number_t parsetime(interp, str) struct SEE_interpreter *interp; struct SEE_string *str; { /* * The standard does not specify how dates should be * formatted, or what formats are parseable. Here, I * simply have times of the fixed format * "wkd, dd Mmm yyyy hh:mm:ss GMT" * "Sun, 12 Oct 2003 07:19:24 GMT" * This corresponds with RFC ????, with extended years, although a * deficiency is that the milliseconds component is lost. * NaN is returned if the date wasn't parseable. * * (Yes, "GMT" and not "UTC") * * If the GMT suffix is missing, the date is assumed to be * in the local timezone. * "wkd, dd Mmm yyyy hh:mm:ss" - assume local timezone * "wkd, dd Mmm yyyy hh:mm" - assume local tz ss=00 * "wkd, dd Mmm yyyy" - assume local tz 00:00:00 * * Also, the day and month may be swapped around: * "wkd Mmm dd yyyy hh:mm:ss" - Netscape-style * * The "GMT" can be followed by an offset */ int i, d, m, y, yneg, hr, min, sec, wd; int len = str->length; SEE_char_t *s = str->data; static char mname[] = "janfebmaraprmayjunjulaugsepoctnovdec"; static char wname[] = "sunmontuewedthufrisat"; SEE_number_t t; i = 0; while (i < len && ISWHITE(s[i])) i++; if (i + 2 < len && ISLETTER(s[i]) && ISLETTER(s[i+1]) && ISLETTER(s[i+2])) { for (wd = 0; wd < 7; wd++) if (wname[wd*3] == TOLOWER(s[i]) && wname[wd*3+1] == TOLOWER(s[i+1]) && wname[wd*3+2] == TOLOWER(s[i+2])) break; if (wd < 7) { i += 3; /* Wkday */ if (i < len && s[i] == ',') i++; /* ','? */ while (i < len && ISWHITE(s[i])) i++; /* space? */ } } if (i < len && ISDIGIT(s[i])) { for (d = 0; i < len && ISDIGIT(s[i]); i++) /* day */ d = 10 * d + s[i] - '0'; if (!(i < len && ISWHITE(s[i]))) return SEE_NaN; /* space */ while (i < len && ISWHITE(s[i])) i++; if (!(i + 3 < len)) return SEE_NaN; /* month */ for (m = 0; m < 12; m++) if (mname[m*3] == TOLOWER(s[i]) && mname[m*3+1] == TOLOWER(s[i+1]) && mname[m*3+2] == TOLOWER(s[i+2])) break; i += 3; } else { if (!(i + 3 < len)) return SEE_NaN; /* month */ for (m = 0; m < 12; m++) if (mname[m*3] == TOLOWER(s[i]) && mname[m*3+1] == TOLOWER(s[i+1]) && mname[m*3+2] == TOLOWER(s[i+2])) break; i += 3; if (!(i < len && ISWHITE(s[i]))) return SEE_NaN; /* space */ while (i < len && ISWHITE(s[i])) i++; if (!(i < len && ISDIGIT(s[i]))) return SEE_NaN; /* day */ for (d = 0; i < len && ISDIGIT(s[i]); i++) d = 10 * d + s[i] - '0'; } if (d < 1 || d > 31) return SEE_NaN; if (m >= 12) return SEE_NaN; if (!(i < len && ISWHITE(s[i]))) return SEE_NaN; /* space */ while (i < len && ISWHITE(s[i])) i++; if (i < len && s[i] == '-') { /* -? */ yneg = 1; i++; } else { yneg = 0; } if (!(i < len && ISDIGIT(s[i]))) return SEE_NaN; /* year */ for (y = 0; i < len && ISDIGIT(s[i]); i++) y = 10 * y + s[i] - '0'; if (yneg) y = -y; hr = min = sec = 0; if (i < len && ISWHITE(s[i])) { while (i < len && ISWHITE(s[i])) i++; /* space+ */ if (i + 4 < len && /* hh:mm? */ ISDIGIT(s[i+0]) && ISDIGIT(s[i+1]) && s[i+2] == ':' && ISDIGIT(s[i+3]) && ISDIGIT(s[i+4])) { hr = (s[i+0]-'0') * 10 + (s[i+1]-'0'); min = (s[i+3]-'0') * 10 + (s[i+4]-'0'); i += 5; if (i + 2 < len && /* :ss? */ s[i+0] == ':' && ISDIGIT(s[i+1]) && ISDIGIT(s[i+2])) { sec = (s[i+1]-'0') * 10 + (s[i+2]-'0'); i += 3; } } } if (hr >= 24 || min >= 60 || sec >= 60) return SEE_NaN; t = MakeDate( MakeDay((SEE_number_t)y, (SEE_number_t)m, (SEE_number_t)d), MakeTime((SEE_number_t)hr, (SEE_number_t)min, (SEE_number_t)sec, 0.0)); /* * If the next few characters are "GMT", then it is already UTC, * otherwise assume date is in local timezone and convert to UTC. */ while (i < len && ISWHITE(s[i])) i++; /* space */ if (i + 2 < len && s[i] == 'G' && s[i+1] == 'M' && s[i+2] == 'T') { i += 3; if (i + 4 < len && (s[i+0] == '-' || s[i+0] == '+') && ISDIGIT(s[i+1]) && ISDIGIT(s[i+2]) && s[i+3] == '0' && s[i+4] == '0') { int gmtoff = (s[i+1]-'0') * 10 + (s[i+2]-'0'); if (s[i+0] == '-') gmtoff = -gmtoff; t -= msPerHour * gmtoff; i += 5; } } else t = UTC(interp, t); /* XXX extra text is ignored */ return TimeClip(t); } static SEE_number_t parse_netscape_time(interp, str) struct SEE_interpreter *interp; struct SEE_string *str; { /* * Netscape's javascript engine generates * strings of the form '1/1/1999 12:30 AM' */ int i, d, m, y, hr=0, min=0, sec=0; int n[3], j; int len = str->length; SEE_char_t *s = str->data; SEE_number_t t; i = 0; while (i < len && ISWHITE(s[i])) i++; for (j = 0; j < 3; j++) { int isneg; if (j) { while (i < len && ISWHITE(s[i])) i++; if (!(i < len && s[i] == '/')) goto fail; i++; while (i < len && ISWHITE(s[i])) i++; } n[j] = 0; if (i < len && s[i] == '-') { i++; isneg = 1; } else isneg = 0; if (!(i < len && ISDIGIT(s[i]))) goto fail; for (n[j] = 0; i < len && ISDIGIT(s[i]); i++) n[j] = n[j] * 10 + s[i] - '0'; if (isneg) n[j] = -n[j]; } if (n[0] >= 70 && n[1] >= 70) goto fail; if (n[0] >= 70) { y = n[0] + 1900; m = n[1]; d = n[2]; } else { m = n[0]; d = n[1]; y = n[2]; if (y < 100) y += 1900; } hr = min = sec = 0; if (!(i < len && ISWHITE(s[i]))) goto done; while (i < len && ISWHITE(s[i])) i++; if (!(i < len && ISDIGIT(s[i]))) goto done; for (hr = 0; i < len && ISDIGIT(s[i]); i++) hr = hr * 10 + s[i] - '0'; while (i < len && ISWHITE(s[i])) i++; if (!(i < len && s[i] == ':')) goto done; i++; while (i < len && ISWHITE(s[i])) i++; if (!(i < len && ISDIGIT(s[i]))) goto fail; for (min = 0; i < len && ISDIGIT(s[i]); i++) min = min * 10 + s[i] - '0'; while (i < len && ISWHITE(s[i])) i++; if (!(i < len && s[i] == ':')) goto ampm; i++; while (i < len && ISWHITE(s[i])) i++; if (!(i < len && ISDIGIT(s[i]))) goto fail; for (sec = 0; i < len && ISDIGIT(s[i]); i++) sec = sec * 10 + s[i] - '0'; while (i < len && ISWHITE(s[i])) i++; ampm: if (i+1 < len && (s[i+1] == 'm' || s[i+1] == 'M')) { if (s[i] == 'p' || s[i] == 'P') { if (hr > 12 || hr < 1) goto fail; hr = (hr % 12) + 12; } else if (s[i] == 'a' || s[i] == 'A') { if (hr > 12 || hr < 1) goto fail; hr = (hr % 12); } else goto fail; i += 2; while (i < len && ISWHITE(s[i])) i++; } done: /* if (hr > 24 || min >= 60 || sec >= 60) goto fail; if (m < 1 || m > 12 || d < 1 || d > 31) goto fail; */ t = MakeDate( MakeDay((SEE_number_t)y, (SEE_number_t)(m - 1), (SEE_number_t)d), MakeTime((SEE_number_t)hr, (SEE_number_t)min, (SEE_number_t)sec, 0.0)); return TimeClip(UTC(interp, t)); fail: return SEE_NaN; } #undef ISWHITE #undef ISLETTER #undef ISDIGIT #undef TOLOWER static char wkdayname[] = "SunMonTueWedThuFriSat"; static char monthname[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; static struct SEE_string * repr_baddate(interp) struct SEE_interpreter *interp; { if (SEE_GET_JS_COMPAT(interp)) return SEE_string_sprintf(interp, "Invalid Date"); else return STR(NaN); } /* ref 15.9.5.2 */ static struct SEE_string * reprdatetime(interp, t, utc) struct SEE_interpreter *interp; SEE_number_t t; int utc; { SEE_int32_t wkday, day, month, year, hour, min, sec; int gmtoff; if (SEE_ISNAN(t)) return repr_baddate(interp); if (!utc) { t = LocalTime(interp, t); gmtoff = (int)((t - LocalTime(interp, t)) / msPerMinute); } else gmtoff = 0; wkday = WeekDay(t); day = DateFromTime(t); month = MonthFromTime(t); year = YearFromTime(t); hour = HourFromTime(t); min = MinFromTime(t); sec = SecFromTime(t); if (SEE_GET_JS_COMPAT(interp)) { if (utc) return SEE_string_sprintf(interp, "%.3s, %02d %.3s %04d %02d:%02d:%02d GMT", &wkdayname[wkday * 3], day, &monthname[month * 3], year, hour, min, sec); return SEE_string_sprintf(interp, "%.3s %.3s %02d %04d %02d:%02d:%02d GMT%+03d00", &wkdayname[wkday * 3], &monthname[month * 3], day, year, hour, min, sec, -gmtoff / 60); } /* "Sun, 12 Oct 2003 07:19:24" */ return SEE_string_sprintf(interp, "%.3s, %2d %.3s %4d %02d:%02d:%02d%s", &wkdayname[wkday * 3], day, &monthname[month * 3], year, hour, min, sec, utc ? " GMT" : ""); } static struct SEE_string * reprdate(interp, t) struct SEE_interpreter *interp; SEE_number_t t; { SEE_int32_t wkday, day, month, year; if (SEE_ISNAN(t)) return repr_baddate(interp); wkday = WeekDay(t); day = (SEE_int32_t)DateFromTime(t); month = (SEE_int32_t)MonthFromTime(t); year = (SEE_int32_t)YearFromTime(t); return SEE_string_sprintf(interp, "%.3s, %2d %.3s %d", &wkdayname[wkday * 3], day, &monthname[month * 3], year); } static struct SEE_string * reprtime(interp, t) struct SEE_interpreter *interp; SEE_number_t t; { SEE_int32_t hour, min, sec10; SEE_number_t secms; if (SEE_ISNAN(t)) return repr_baddate(interp); hour = HourFromTime(t); min = MinFromTime(t); secms = modulo(t / msPerSecond, SecondsPerMinute); sec10 = NUMBER_floor(secms / 10); secms = NUMBER_fmod(secms, 10.0); return SEE_string_sprintf(interp, "%02d:%02d:%02d", hour, min, sec10, NUMBER_floor(secms)); } /* Return a date object or raise a type error */ static struct date_object * todate(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { if (o->objectclass != &date_inst_class) SEE_error_throw_string(interp, interp->TypeError, STR(not_date)); return (struct date_object *)o; } /* 15.9.2.1 */ static void date_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { /* Ignore arguments; equiavlent to (new Date()).toString() */ SEE_SET_STRING(res, reprdatetime(interp, now(interp), 0)); } /* 15.9.3.1 */ static void date_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct date_object *d; struct SEE_value v, w, hint; SEE_number_t year, month, date, hours, minutes, seconds, ms; SEE_number_t t; if (argc == 0) t = now(interp); else if (argc == 1) { SEE_SET_OBJECT(&hint, interp->Number); SEE_ToPrimitive(interp, argv[0], &hint, &v); if (SEE_VALUE_GET_TYPE(&v) != SEE_STRING) { SEE_ToNumber(interp, &v, &w); t = TimeClip(w.u.number); } else { t = parsetime(interp, v.u.string); if (SEE_GET_JS_COMPAT(interp) && SEE_ISNAN(t)) t = parse_netscape_time(interp, v.u.string); } } else { SEE_ToNumber(interp, argv[0], &v); year = v.u.number; if (!SEE_NUMBER_ISNAN(&v)) { SEE_int32_t year_int = ToInteger(year); if (0 <= year_int && year_int <= 99) year += 1900; } SEE_ToNumber(interp, argv[1], &v); month = v.u.number; if (argc > 2) { SEE_ToNumber(interp, argv[2], &v); date = v.u.number; } else date = 1; if (argc > 3) { SEE_ToNumber(interp, argv[3], &v); hours = v.u.number; } else hours = 0; if (argc > 4) { SEE_ToNumber(interp, argv[4], &v); minutes = v.u.number; } else minutes = 0; if (argc > 5) { SEE_ToNumber(interp, argv[5], &v); seconds = v.u.number; } else seconds = 0; if (argc > 6) { SEE_ToNumber(interp, argv[6], &v); ms = v.u.number; } else ms = 0; t = TimeClip(UTC(interp, MakeDate(MakeDay(year, month, date), MakeTime(hours, minutes, seconds, ms)))); } d = SEE_NEW(interp, struct date_object); SEE_native_init(&d->native, interp, &date_inst_class, interp->Date_prototype); d->t = t; SEE_SET_OBJECT(res, (struct SEE_object *)d); } /* See NOTE at 11.6.1 */ static void date_defaultvalue(interp, obj, hint, res) struct SEE_interpreter *interp; struct SEE_object *obj; struct SEE_value *hint; struct SEE_value *res; { struct SEE_value string_hint; if (hint == NULL) { SEE_SET_OBJECT(&string_hint, interp->String); hint = &string_hint; } SEE_native_defaultvalue(interp, obj, hint, res); } /* 15.9.4.2 */ static void date_parse(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_string *s; if (argc) { SEE_ToString(interp, argv[0], &v); s = v.u.string; } else s = STR(empty_string); SEE_SET_NUMBER(res, parsetime(interp, s)); } /* 15.9.4.3 */ static void date_UTC(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; SEE_number_t year, month, date, hours, minutes, seconds, ms; if (argc < 2) SEE_error_throw_string(interp, interp->RangeError, STR(implementation_dependent)); SEE_ToNumber(interp, argv[0], &v); year = v.u.number; if (!SEE_NUMBER_ISNAN(&v)) { SEE_int32_t year_int = ToInteger(year); if (0 <= year_int && year_int <= 99) year += 1900; } SEE_ToNumber(interp, argv[1], &v); month = v.u.number; if (argc > 2) { SEE_ToNumber(interp, argv[2], &v); date = v.u.number; } else date = 1; if (argc > 3) { SEE_ToNumber(interp, argv[3], &v); hours = v.u.number; } else hours = 0; if (argc > 4) { SEE_ToNumber(interp, argv[4], &v); minutes = v.u.number; } else minutes = 0; if (argc > 5) { SEE_ToNumber(interp, argv[5], &v); seconds = v.u.number; } else seconds = 0; if (argc > 6) { SEE_ToNumber(interp, argv[6], &v); ms = v.u.number; } else ms = 0; SEE_SET_NUMBER(res, TimeClip(MakeDate(MakeDay(year, month, date), MakeTime(hours, minutes, seconds, ms)))); } /* 15.9.5.2 */ static void date_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); SEE_SET_STRING(res, reprdatetime(interp, d->t, 0)); } /* 15.9.5.3 */ static void date_proto_toDateString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); SEE_SET_STRING(res, reprdate(interp, d->t)); } /* 15.9.5.4 */ static void date_proto_toTimeString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); SEE_SET_STRING(res, reprtime(interp, d->t)); } /* 15.9.5.5 */ static void date_proto_toLocaleString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { date_proto_toString(interp, self, thisobj, argc, argv, res); } /* 15.9.5.6 */ static void date_proto_toLocaleDateString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { date_proto_toDateString(interp, self, thisobj, argc, argv, res); } /* 15.9.5.7 */ static void date_proto_toLocaleTimeString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { date_proto_toTimeString(interp, self, thisobj, argc, argv, res); } /* 15.9.5.8 */ static void date_proto_valueOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); SEE_SET_NUMBER(res, d->t); } /* 15.9.5.9 */ static void date_proto_getTime(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); SEE_SET_NUMBER(res, d->t); } /* 15.9.5.10 */ static void date_proto_getFullYear(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, YearFromTime(LocalTime(interp, d->t))); } /* 15.9.5.11 */ static void date_proto_getUTCFullYear(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, YearFromTime(d->t)); } /* 15.9.5.12 */ static void date_proto_getMonth(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, MonthFromTime(LocalTime(interp, d->t))); } /* 15.9.5.13 */ static void date_proto_getUTCMonth(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, MonthFromTime(d->t)); } /* 15.9.5.14 */ static void date_proto_getDate(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, DateFromTime(LocalTime(interp, d->t))); } /* 15.9.5.15 */ static void date_proto_getUTCDate(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, DateFromTime(d->t)); } /* 15.9.5.16 */ static void date_proto_getDay(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, WeekDay(LocalTime(interp, d->t))); } /* 15.9.5.17 */ static void date_proto_getUTCDay(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, WeekDay(d->t)); } /* 15.9.5.18 */ static void date_proto_getHours(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, HourFromTime(LocalTime(interp, d->t))); } /* 15.9.5.19 */ static void date_proto_getUTCHours(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, HourFromTime(d->t)); } /* 15.9.5.20 */ static void date_proto_getMinutes(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, MinFromTime(LocalTime(interp, d->t))); } /* 15.9.5.21 */ static void date_proto_getUTCMinutes(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, MinFromTime(d->t)); } /* 15.9.5.22 */ static void date_proto_getSeconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, SecFromTime(LocalTime(interp, d->t))); } /* 15.9.5.23 */ static void date_proto_getUTCSeconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, SecFromTime(d->t)); } /* 15.9.5.24 */ static void date_proto_getMilliseconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, msFromTime(LocalTime(interp, d->t))); } /* 15.9.5.25 */ static void date_proto_getUTCMilliseconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, msFromTime(d->t)); } /* 15.9.5.26 */ static void date_proto_getTimezoneOffset(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, (d->t - LocalTime(interp, d->t)) / msPerMinute); } /* 15.9.5.27 */ static void date_proto_setTime(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; if (argc < 1) d->t = SEE_NaN; else { SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(v.u.number); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.28 */ static void date_proto_setMilliseconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), v.u.number)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.29 */ static void date_proto_setUTCMilliseconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( ( MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), v.u.number)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.30 */ static void date_proto_setSeconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t ms; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) ms = msFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); ms = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), v.u.number, ms)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.31 */ static void date_proto_setUTCSeconds(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t ms; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) ms = msFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); ms = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( ( MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), v.u.number, ms)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.32 */ static void date_proto_setMinutes(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t sec, ms; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) sec = SecFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); sec = v.u.number; } if (argc < 3) ms = msFromTime(t); else { SEE_ToNumber(interp, argv[2], &v); ms = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(Day(t), MakeTime(HourFromTime(t), v.u.number, sec, ms)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.33 */ static void date_proto_setUTCMinutes(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t sec, ms; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) sec = SecFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); sec = v.u.number; } if (argc < 3) ms = msFromTime(t); else { SEE_ToNumber(interp, argv[2], &v); ms = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( ( MakeDate(Day(t), MakeTime(HourFromTime(t), v.u.number, sec, ms)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.34 */ static void date_proto_setHours(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t min, sec, ms; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) min = MinFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); min = v.u.number; } if (argc < 3) sec = SecFromTime(t); else { SEE_ToNumber(interp, argv[2], &v); sec = v.u.number; } if (argc < 4) ms = msFromTime(t); else { SEE_ToNumber(interp, argv[3], &v); ms = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(Day(t), MakeTime(v.u.number, min, sec, ms)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.35 */ static void date_proto_setUTCHours(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t min, sec, ms; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) min = MinFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); min = v.u.number; } if (argc < 3) sec = SecFromTime(t); else { SEE_ToNumber(interp, argv[2], &v); sec = v.u.number; } if (argc < 4) ms = msFromTime(t); else { SEE_ToNumber(interp, argv[3], &v); ms = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( ( MakeDate(Day(t), MakeTime(v.u.number, min, sec, ms)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.36 */ static void date_proto_setDate(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(MakeDay( YearFromTime(t), MonthFromTime(t), v.u.number), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.37 */ static void date_proto_setUTCDate(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( (MakeDate(MakeDay( YearFromTime(t), MonthFromTime(t), v.u.number), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.38 */ static void date_proto_setMonth(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t date; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) { date = DateFromTime(t); if (date < 0) date = SEE_NaN; } else { SEE_ToNumber(interp, argv[1], &v); date = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(MakeDay( YearFromTime(t), v.u.number, date), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.39 */ static void date_proto_setUTCMonth(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t date; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) { date = DateFromTime(t); if (date < 0) date = SEE_NaN; } else { SEE_ToNumber(interp, argv[1], &v); date = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( (MakeDate(MakeDay( YearFromTime(t), v.u.number, date), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.40 */ static void date_proto_setFullYear(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t date, month; SEE_number_t t = LocalTime(interp, d->t); if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) month = MonthFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); month = v.u.number; } if (argc < 3) { date = DateFromTime(t); if (date < 0) date = SEE_NaN; } else { SEE_ToNumber(interp, argv[2], &v); date = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip(UTC(interp, MakeDate(MakeDay(v.u.number, month, date), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.41 */ static void date_proto_setUTCFullYear(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t date, month; SEE_number_t t = d->t; if (argc < 1) d->t = SEE_NaN; else { if (argc < 2) month = MonthFromTime(t); else { SEE_ToNumber(interp, argv[1], &v); month = v.u.number; } if (argc < 3) { date = DateFromTime(t); if (date < 0) date = SEE_NaN; } else { SEE_ToNumber(interp, argv[2], &v); date = v.u.number; } SEE_ToNumber(interp, argv[0], &v); d->t = TimeClip( (MakeDate(MakeDay(v.u.number, month, date), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } /* 15.9.5.2 */ static void date_proto_toUTCString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); SEE_SET_STRING(res, reprdatetime(interp, d->t, 1)); } /* B.2.4 */ static void date_proto_getYear(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); if (SEE_ISNAN(d->t)) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, (YearFromTime(LocalTime(interp, d->t)) - 1900)); } /* B.2.5 */ static void date_proto_setYear(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct date_object *d = todate(interp, thisobj); struct SEE_value v; SEE_number_t year; SEE_number_t t = LocalTime(interp, d->t); if (SEE_ISNAN(t)) t = 0; if (argc < 1) year = SEE_NaN; else { SEE_ToNumber(interp, argv[0], &v); year = v.u.number; } if (SEE_ISNAN(year)) { d->t = SEE_NaN; } else { if (0 <= year && year <= 99) year += 1900; d->t = TimeClip(UTC(interp, MakeDate(MakeDay( year, MonthFromTime(t), DateFromTime(t)), TimeWithinDay(t)) )); } SEE_SET_NUMBER(res, d->t); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Error.c���������������������������������������������������������������0000664�0000000�0000000�00000023745�12660066715�0017444�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Error.c 991 2006-01-31 01:53:46Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> # include <stdarg.h> #endif #include "see_value.h" #include "see_object.h" #include "see_cfunction.h" #include "see_native.h" #include "see_string.h" #include "see_mem.h" #include "see_debug.h" #include "see_interpreter.h" #include "see_error.h" #include "see_stringdefs.h" #include "see_init.h" #include "see_dprint.h" #ifndef NDEBUG int SEE_Error_debug = 0; #endif /* * Error objects * * These objects are thrown by the runtime system in the event of * errors. User programs also use these as prototypes for their * own errors. * * -- 15.11 */ /* Prototypes */ static struct SEE_object *init_error(struct SEE_interpreter *, struct SEE_string *, struct SEE_object *, struct SEE_object *); static void error_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void error_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); /* object class for Error constructors */ static struct SEE_objectclass error_const_class = { "ErrorConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ error_construct, /* Call */ error_construct, /* Construct */ }; /* object class for Error.prototype */ static struct SEE_objectclass error_inst_class = { "Error", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ }; /* * helper function to initialise the standard Error and * NativeError objects */ static struct SEE_object * init_error(interp, name, constructor, proto_proto) struct SEE_interpreter *interp; struct SEE_string *name; struct SEE_object *constructor; struct SEE_object *proto_proto; { struct SEE_value v; struct SEE_object *proto; /* Construct the prototype object */ proto = SEE_native_new(interp); proto->objectclass = &error_inst_class; proto->Prototype = proto_proto; /* 15.11.4 */ /* 15.11.4.1 Error.prototype.constructor = Error */ /* 15.11.7.8 NativeError.prototype.constructor = Error */ SEE_SET_OBJECT(&v, constructor); SEE_OBJECT_PUT(interp, proto, STR(constructor), &v, SEE_ATTR_DEFAULT); /* 15.11.4.2 Error.prototype.name = "Error" */ /* 15.11.7.9 NativeError.prototype.name = "NativeError" */ SEE_SET_STRING(&v, name); SEE_OBJECT_PUT(interp, proto, STR(name), &v, SEE_ATTR_DEFAULT); /* 15.11.4.3 Error.prototype.message = "Error" */ /* 15.11.7.10 NativeError.prototype.message = "NativeError" */ SEE_SET_STRING(&v, name); SEE_OBJECT_PUT(interp, proto, STR(message), &v, SEE_ATTR_DEFAULT); /* 15.11.7.7 and 15.11.3 */ SEE_native_init((struct SEE_native *)constructor, interp, &error_const_class, interp->Function_prototype); /* 15.11.3 Error.length = 1 */ SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, constructor, STR(length), &v, SEE_ATTR_LENGTH); /* 15.11.3.1 Error.prototype */ /* 15.11.7.6 NativeError.prototype */ SEE_SET_OBJECT(&v, proto); SEE_OBJECT_PUT(interp, constructor, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); return proto; } void SEE_Error_alloc(interp) struct SEE_interpreter *interp; { interp->Error = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->EvalError = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->RangeError = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->ReferenceError = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->SyntaxError = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->TypeError = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->URIError = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); } void SEE_Error_init(interp) struct SEE_interpreter *interp; { struct SEE_value v; struct SEE_object *Error_prototype; Error_prototype = init_error(interp, STR(Error), interp->Error, interp->Object_prototype); /* 15.11.4.4 Error.prototype.toString */ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, error_proto_toString, STR(toString), 0)); SEE_OBJECT_PUT(interp, Error_prototype, STR(toString), &v, SEE_ATTR_DEFAULT); init_error(interp, STR(EvalError), interp->EvalError, Error_prototype); /* 15.1.6.1 */ init_error(interp, STR(RangeError), interp->RangeError, Error_prototype); /* 15.1.6.2 */ init_error(interp, STR(ReferenceError), interp->ReferenceError, Error_prototype); /* 15.1.6.3 */ init_error(interp, STR(SyntaxError), interp->SyntaxError, Error_prototype); /* 15.1.6.4 */ init_error(interp, STR(TypeError), interp->TypeError, Error_prototype); /* 15.1.6.5 */ init_error(interp, STR(URIError), interp->URIError, Error_prototype); /* 15.1.6.6 */ } /* * Host error constructor maker */ struct SEE_object * SEE_Error_make(interp, name) struct SEE_interpreter *interp; struct SEE_string *name; { struct SEE_object *Error_prototype; struct SEE_value v; struct SEE_object *new_error; SEE_OBJECT_GET(interp, interp->Error, STR(prototype), &v); Error_prototype = v.u.object; new_error = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); init_error(interp, name, new_error, Error_prototype); return new_error; } /* * Return the string form of an error object. * -- 15.11.4.4 * This implementation returns the error' class name, * followed by a colon and the message text (or just the class name * if there is no message text). */ static void error_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value name, message; struct SEE_string *s; SEE_OBJECT_GET(interp, thisobj, STR(name), &name); SEE_OBJECT_GET(interp, thisobj, STR(message), &message); #ifndef NDEBUG if (SEE_Error_debug) { dprintf("Error.prototype.toString: self=%p this=%p name=", self,thisobj); dprintv(interp, &name); dprintf(", message="); dprintv(interp, &message); dprintf("\n"); } #endif s = SEE_string_new(interp, 0); if (SEE_VALUE_GET_TYPE(&name) == SEE_STRING) SEE_string_append(s, name.u.string); else SEE_string_append(s, STR(Error)); if (SEE_VALUE_GET_TYPE(&message) == SEE_STRING && message.u.string->length > 0) { SEE_string_addch(s, ':'); SEE_string_addch(s, ' '); SEE_string_append(s, message.u.string); } SEE_SET_STRING(res, s); } /* * Construct an error object. * This implementation creates a new native object, * setting its [[Prototype]] to the self's 'prototype' * property. It then sets the message property of the new * object to the message text. * Extra arguments are ignored. * * -- 15.11.2, 15.11.7 */ static void error_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value msg, protov; struct SEE_object *proto; struct SEE_native *obj; SEE_OBJECT_GET(interp, self, STR(prototype), &protov); #ifndef NDEBUG if (SEE_Error_debug) { dprintf("error_construct: this.prototype="); dprintv(interp, &protov); dprintf("\n"); } #endif if (SEE_VALUE_GET_TYPE(&protov) == SEE_OBJECT) proto = protov.u.object; else proto = NULL; /* XXX should abort? */ obj = SEE_NEW(interp, struct SEE_native); SEE_native_init(obj, interp, &error_inst_class, proto); if (argc > 0 && SEE_VALUE_GET_TYPE(argv[0]) != SEE_UNDEFINED) { SEE_ToString(interp, argv[0], &msg); SEE_OBJECT_PUT(interp, (struct SEE_object *)obj, STR(message), &msg, SEE_ATTR_DEFAULT); #ifndef NDEBUG if (SEE_Error_debug) { dprintf("error_construct: put obj.message="); dprintv(interp, &msg); dprintf("\n"); SEE_OBJECT_GET(interp, (struct SEE_object *)obj, STR(message), &msg); dprintf("error_construct: get obj.message="); dprintv(interp, &msg); dprintf("\n"); dprintf("error_construct: self=%p this=%p result=%p\n", self, thisobj, obj); } #endif } SEE_SET_OBJECT(res, (struct SEE_object *)obj); } ���������������������������silverjuke-16.2.3/src/see/obj_Function.c������������������������������������������������������������0000664�0000000�0000000�00000100707�12660066715�0020132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Function.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #if HAVE_STRING_H # include <string.h> #endif #include "see_mem.h" #include "see_value.h" #include "see_native.h" #include "see_no.h" #include "see_cfunction.h" #include "see_string.h" #include "see_input.h" #include "see_error.h" #include "see_interpreter.h" #include "see_try.h" #include "see_context.h" #include "see_intern.h" #include "see_array.h" #include "see_cfunction_private.h" #include "see_function.h" #include "see_parse.h" #include "see_stringdefs.h" #include "see_scope.h" #include "see_init.h" #include "see_nmath.h" /* * Function objects. * * This module declares four object classess: * - the 'Function constructor' (a.k.a Function) * - the 'Function prototype' (a.k.a. Function.prototype) * - the 'function instance' (what FunctionDeclarations generate) * - the 'arguments object' (translates indicies into local vars) */ /* structure of function instances (13.1.2) */ struct function_inst { struct SEE_object object; struct function *function; struct SEE_scope *scope; }; struct arguments; /* structure of the 'activation' objects */ struct activation { struct SEE_native native; struct function *function; int argc; /* length of actual parameters */ struct SEE_value *argv; struct SEE_object *arguments; /* only needed for Netscape compat */ }; /* structure of the 'arguments' objects */ struct arguments { struct SEE_native native; struct function *function; struct activation *activation; SEE_boolean_t *deleted; }; /* Prototypes */ static struct function_inst *tofunction(struct SEE_interpreter *, struct SEE_object *); static void function_inst_init(struct function_inst *, struct SEE_interpreter *, struct function *, struct SEE_scope *); static void function_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static int function_inst_hasinstance(struct SEE_interpreter *, struct SEE_object *, struct SEE_value *); static void function_inst_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void function_inst_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void * function_inst_get_sec_domain(struct SEE_interpreter *, struct SEE_object *); static void function_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void function_proto_apply(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void function_proto_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static struct SEE_object *activation_create(struct SEE_interpreter *, struct SEE_object *, struct function *, int, struct SEE_value **); static int activation_find_index(struct activation *, struct SEE_string *); static void activation_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static void activation_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); static int argument_index(struct arguments *, struct SEE_string *); static void arguments_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static void arguments_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); static int arguments_delete(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static void arguments_defaultvalue(struct SEE_interpreter *, struct SEE_object *, struct SEE_value *, struct SEE_value *); static struct SEE_object *arguments_create(struct SEE_interpreter *, struct activation *, struct SEE_object *); static void function_inst_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static void function_inst_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); static int function_inst_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static int function_inst_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static int function_inst_delete(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static struct SEE_enum *function_inst_enumerator(struct SEE_interpreter *, struct SEE_object *); /* object class for Function constructor */ static struct SEE_objectclass function_const_class = { "FunctionConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* Enumerator */ function_construct, /* Construct */ function_construct /* Call */ }; /* object class for function delegate instances */ static struct SEE_objectclass function_inst_class = { "Function", /* Class */ function_inst_get, /* Get */ function_inst_put, /* Put */ function_inst_canput, /* CanPut */ function_inst_hasproperty, /* HasProperty */ function_inst_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ function_inst_enumerator, /* enumerator */ function_inst_construct, /* Construct */ function_inst_call, /* Call */ function_inst_hasinstance, /* HasInstance */ function_inst_get_sec_domain /* get_sec_domain */ }; /* object class for 'arguments' instances */ static struct SEE_objectclass arguments_class = { "Arguments", /* Class */ arguments_get, /* Get */ arguments_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ arguments_delete, /* Delete */ arguments_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; /* object class for objects created by instance constructs (13.2.2) */ static struct SEE_objectclass inst_inst_class = { "Object", /* Class 13.2.2(2) */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* Enumerator */ }; /* object class for activation objects (10.2.3) */ struct SEE_objectclass SEE_activation_class = { "Activation", /* Class */ activation_get, /* Get */ activation_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_no_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* Enumerator */ }; void SEE_Function_alloc(interp) struct SEE_interpreter *interp; { interp->Function = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Function_prototype = (struct SEE_object *)SEE_NEW(interp, struct function_inst); } void SEE_Function_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Function; struct SEE_object *Function_prototype; struct SEE_value v; struct function *f; Function = interp->Function; Function_prototype = interp->Function_prototype; /* Function.prototype is itself a function instance! (15.3.4) */ f = SEE_parse_function(interp, NULL, NULL, NULL); function_inst_init((struct function_inst *)Function_prototype, interp, f, interp->Global_scope); Function_prototype->Prototype = interp->Object_prototype; /* 15.3.4 */ f->common->Prototype = interp->Object_prototype; /* 15.3.4 */ if (SEE_COMPAT_JS(interp, >=, JS11)) { /* EXT:9 */ /* * Delete the "prototype" property of Function.prototype. */ SEE_SET_UNDEFINED(&v); SEE_OBJECT_PUT(interp, (struct SEE_object *)f->common, STR(prototype), &v, SEE_ATTR_READONLY); SEE_OBJECT_DELETE(interp, (struct SEE_object *)f->common, STR(prototype)); } #define PUTFUNC(name, len)\ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, \ function_proto_##name, STR(name), len)); \ SEE_OBJECT_PUT(interp, Function_prototype, STR(name), \ &v, SEE_ATTR_DEFAULT); PUTFUNC(toString, 1) /* 15.3.4.2 */ PUTFUNC(apply, 1) /* 15.3.4.3 */ PUTFUNC(call, 1) /* 15.3.4.4 */ /* Function.prototype.constructor = Function */ SEE_SET_OBJECT(&v, Function); SEE_OBJECT_PUT(interp, Function_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); /* 15.3.4.1 */ SEE_native_init((struct SEE_native *)Function, interp, /* 15.3.3 */ &function_const_class, Function_prototype); SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, Function, STR(length), &v, SEE_ATTR_LENGTH); /* 15.3.3 */ SEE_SET_OBJECT(&v, Function_prototype); SEE_OBJECT_PUT(interp, Function, STR(prototype), &v, /* 15.3.3.1 */ SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); } /* Convert an object to a function instance, or raise a TypeError */ static struct function_inst * tofunction(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { if (!o || o->objectclass != &function_inst_class) SEE_error_throw_string(interp, interp->TypeError, STR(not_function)); SEE_ASSERT(interp, ((struct function_inst *)o)->function != NULL); return (struct function_inst *)o; } static void function_inst_init(fi, interp, f, scope) struct function_inst *fi; struct SEE_interpreter *interp; struct function *f; struct SEE_scope *scope; { if (f->common == NULL) { f->common = SEE_native_new(interp); /* 13.2(2) */ f->common->Prototype = interp->Function_prototype; } /* 13.2(3&5&6|15&17&18): */ fi->object.objectclass = &function_inst_class; fi->object.Prototype = interp->Function_prototype; /* 13.2(4|16) */ fi->function = f; fi->scope = scope; /* 13.2(7|19) */ } /* 13.2 create (or pull from cache) a function instance with given scope */ struct SEE_object * SEE_function_inst_create(interp, f, scope) struct SEE_interpreter *interp; struct function *f; struct SEE_scope *scope; { struct function_inst *fi; /* * We cache the first created function instance around a * function structure, and return it if the scopes are * observationally equivalent. This can save lots of memory. * Even on cache misses, the common object will still * be shared, so the cache is trivially small. */ if (f->cache) { /* Does the cached instance have the same scope? */ fi = (struct function_inst *)f->cache; if (SEE_scope_eq(fi->scope, scope)) return f->cache; } fi = SEE_NEW(interp, struct function_inst); function_inst_init(fi, interp, f, scope); if (!f->cache) f->cache = (struct SEE_object *)fi; return (struct SEE_object *)fi; } /* * Helper function for the SEE_OBJECT_JOINED() macro. * Returns true iff * - the two objects are both function instances; AND * - they are both 'joined' together (share the same body+common). * * See 13.1.2, 11.9.3 (step 13) and 11.9.6 (step 13) */ int SEE_function_is_joined(a, b) struct SEE_object *a, *b; { struct function_inst *fa = (struct function_inst *)a; struct function_inst *fb = (struct function_inst *)b; return a->objectclass == &function_inst_class && b->objectclass == &function_inst_class && fa->function == fb->function; } /* 15.3.2.1 new Function(...) */ static void function_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *P, *body; struct SEE_value r9, r13; struct SEE_input *paraminp, *bodyinp; int k; P = SEE_string_new(interp, 0); for (k = 0; k < argc - 1; k++) { if (k) SEE_string_addch(P, ','); SEE_ToString(interp, argv[k], &r9); SEE_string_append(P, r9.u.string); } if (argc) { SEE_ToString(interp, argv[argc - 1], &r13); body = r13.u.string; } else body = STR(empty_string); paraminp = SEE_input_string(interp, P); bodyinp = SEE_input_string(interp, body); SEE_SET_OBJECT(res, SEE_Function_new(interp, NULL, paraminp, bodyinp)); SEE_INPUT_CLOSE(bodyinp); SEE_INPUT_CLOSE(paraminp); } struct SEE_object * SEE_Function_new(interp, name, paraminp, bodyinp) struct SEE_interpreter *interp; struct SEE_string *name; struct SEE_input *paraminp, *bodyinp; { struct function *f; f = SEE_parse_function(interp, name, paraminp, bodyinp); return SEE_function_inst_create(interp, f, interp->Global_scope); } /* Returns the name of the function. NB May return NULL. */ struct SEE_string * SEE_function_getname(interp, o) struct SEE_interpreter * interp; struct SEE_object *o; { struct function_inst *fi; extern struct SEE_objectclass SEE_cfunction_class; if (!o) return NULL; if (o->objectclass == &SEE_cfunction_class) return SEE_cfunction_getname(interp, o); if (o->objectclass != &function_inst_class) return NULL; fi = tofunction(interp, o); return fi->function->name; } /* 15.3.5.3 */ static int function_inst_hasinstance(interp, f, vval) struct SEE_interpreter *interp; struct SEE_object *f; struct SEE_value *vval; { struct SEE_object *v, *o; struct SEE_value oval; if (SEE_VALUE_GET_TYPE(vval) != SEE_OBJECT) return 0; v = vval->u.object; SEE_OBJECT_GET(interp, f, STR(prototype), &oval); if (SEE_VALUE_GET_TYPE(&oval) != SEE_OBJECT) SEE_error_throw_string(interp, interp->TypeError, STR(internal_error)); /* XXX prototype not an object */ o = oval.u.object; for (;;) { v = v->Prototype; if (!v) return 0; if (SEE_OBJECT_JOINED(v, o)) return 1; } } /* 13.2.1 call a function */ static void function_inst_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_context context; struct function_inst *fi; struct SEE_object *activation; struct SEE_value v; struct SEE_scope *innerscope; SEE_try_context_t ctxt; struct SEE_value old_arguments; int old_arguments_saved = 0; int old_arguments_attr = 0; fi = tofunction(interp, self); /* Bypass empty functions (simple optimisation) */ if (fi->function->is_empty) { SEE_SET_UNDEFINED(res); return; } /* 10.1.6 Create an activation object */ activation = activation_create(interp, self, fi->function, argc, argv); /* 10.2.3 build the right scope chain now */ innerscope = SEE_NEW(interp, struct SEE_scope); innerscope->obj = activation; innerscope->next = fi->scope; /* 10.2 enter a new execution context */ context.interpreter = interp; context.activation = activation; context.variable = activation; /* see 10.2.3 */ context.varattr = SEE_ATTR_DONTDELETE; context.thisobj = thisobj ? thisobj : interp->Global; context.scope = innerscope; /* * Compatibility: set f.arguments to the arguments object too, * saving the old value (It gets restored later) */ if (SEE_COMPAT_JS(interp, >=, JS11)) { /* EXT:11 */ struct SEE_object *common = (struct SEE_object *)fi->function->common; if (SEE_OBJECT_HASPROPERTY(interp, common, STR(arguments))) { SEE_OBJECT_GET(interp, common, STR(arguments), &old_arguments); old_arguments_attr = SEE_native_getownattr(interp, common, STR(arguments)); old_arguments_saved = 1; } SEE_SET_OBJECT(&v, ((struct activation *)activation)->arguments); SEE_OBJECT_PUT(interp, common, STR(arguments), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); } /* Run it (adds vars and func decls to context.variable) */ SEE_TRY(interp, ctxt) { SEE_eval_functionbody(fi->function, &context, &v); } /* Restore f.arguments */ if (SEE_COMPAT_JS(interp, >=, JS11)) { /* EXT:12 */ struct SEE_object *common = (struct SEE_object *)fi->function->common; if (old_arguments_saved) SEE_OBJECT_PUT(interp, common, STR(arguments), &old_arguments, old_arguments_attr); else { /* XXX kludge to allow us to delete old arguments */ SEE_SET_UNDEFINED(&v); SEE_OBJECT_PUT(interp, common, STR(arguments), &v, SEE_ATTR_READONLY); SEE_OBJECT_DELETE(interp, common, STR(arguments)); } } SEE_DEFAULT_CATCH(interp, ctxt); if (v.u.completion.type == SEE_COMPLETION_NORMAL) SEE_SET_UNDEFINED(res); else if (v.u.completion.type == SEE_COMPLETION_RETURN) SEE_VALUE_COPY(res, v.u.completion.value); else SEE_error_throw_string(interp, interp->Error, STR(internal_error)); } /* 13.2.2 */ static void function_inst_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_object *r1; struct SEE_value r3; r1 = SEE_native_new(interp); r1->objectclass = &inst_inst_class; SEE_OBJECT_GET(interp, self, STR(prototype), &r3); if (SEE_VALUE_GET_TYPE(&r3) == SEE_OBJECT) r1->Prototype = r3.u.object; else r1->Prototype = interp->Object_prototype; SEE_OBJECT_CALL(interp, self, r1, argc, argv, res); if (SEE_VALUE_GET_TYPE(res) != SEE_OBJECT) SEE_SET_OBJECT(res, r1); } /* Returns the security domain active when the function was defined */ static void * function_inst_get_sec_domain(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct function_inst *fi = (struct function_inst *)o; return fi->function->sec_domain; } /* Function.prototype.toString (15.3.4.2) */ static void function_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct function_inst *fi; struct function *f; struct SEE_string *s; int i; if (SEE_COMPAT_JS(interp, >=, JS11)) { /* EXT:13 */ /* * spec bug: built-in-functions really should supply their own * toString() method for representation, but the standard * makes Function.prototype.toString() have to handle it. * It is allowed to return an "implementation-dependent" * string, BUT it has to have the syntax of a FunctionDeclaration! * i.e. a built-in function must be expressible in the language! * My solution is to return a void function that has a comment * inside it, explaining. */ extern struct SEE_objectclass SEE_cfunction_class; if (thisobj && thisobj->objectclass == &SEE_cfunction_class) { SEE_cfunction_toString(interp, self, thisobj, argc, argv, res); return; } /* * Built-in constructors have a similar representation problem. * (This is pretty unsatisfactory.) */ if (thisobj && thisobj->objectclass != &function_inst_class && thisobj->objectclass->Construct != NULL) { s = SEE_string_sprintf(interp, "function () { /* constructor %s */ }", thisobj->objectclass->Class ? thisobj->objectclass->Class : "?"); SEE_SET_STRING(res, s); return; } } fi = tofunction(interp, thisobj); f = fi->function; s = SEE_string_new(interp, 0); SEE_string_append(s, STR(function)); SEE_string_addch(s, ' '); if (f->name) SEE_string_append(s, f->name); SEE_string_addch(s, '('); for (i = 0; i < f->nparams; i++) { if (i) { SEE_string_addch(s, ','); SEE_string_addch(s, ' '); } SEE_string_append(s, f->params[i]); } SEE_string_addch(s, ')'); SEE_string_addch(s, ' '); SEE_string_addch(s, '{'); SEE_string_append(s, SEE_functionbody_string(interp, f)); SEE_string_addch(s, '\n'); SEE_string_addch(s, '}'); SEE_string_addch(s, '\n'); SEE_SET_STRING(res, s); } /* Function.prototype.apply (15.3.4.3) */ static void function_proto_apply(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value **the_argv, *the_args, v; struct SEE_object *thisarg; struct SEE_string *s = NULL; int i, the_argc; if (!SEE_OBJECT_HAS_CALL(thisobj)) SEE_error_throw_string(interp, interp->TypeError, STR(not_callable)); if (argc < 1 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED || SEE_VALUE_GET_TYPE(argv[0]) == SEE_NULL) thisarg = interp->Global; else { SEE_ToObject(interp, argv[0], &v); thisarg = v.u.object; } if (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED || SEE_VALUE_GET_TYPE(argv[1]) == SEE_NULL) { the_argc = 0; the_args = NULL; } else if (SEE_VALUE_GET_TYPE(argv[1]) == SEE_OBJECT && (argv[1]->u.object->objectclass == &arguments_class || SEE_is_Array(argv[1]->u.object))) { struct SEE_object *a = argv[1]->u.object; SEE_OBJECT_GET(interp, a, STR(length), &v); the_argc = SEE_ToUint32(interp, &v); the_args = SEE_ALLOCA(interp, struct SEE_value, the_argc); for (i = 0; i < the_argc; i++) { if (i == 0) s = SEE_string_new(interp, 0); s->length = 0; SEE_string_append_int(s, i); SEE_OBJECT_GET(interp, (struct SEE_object *)a, s, &the_args[i]); } } else SEE_error_throw_string(interp, interp->TypeError, STR(apply_not_array)); the_argv = SEE_ALLOCA(interp, struct SEE_value *, the_argc); for (i = 0; i < the_argc; i++) the_argv[i] = &the_args[i]; SEE_OBJECT_CALL(interp, thisobj, thisarg, the_argc, the_argv, res); } /* Function.prototype.call (15.3.4.4) */ static void function_proto_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value thisv; if (!SEE_OBJECT_HAS_CALL(thisobj)) SEE_error_throw_string(interp, interp->TypeError, STR(bad_arg)); if (argc < 1 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_NULL || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED) SEE_SET_OBJECT(&thisv, interp->Global); else SEE_ToObject(interp, argv[0], &thisv); SEE_OBJECT_CALL(interp, thisobj, thisv.u.object, argc == 0 ? 0 : argc - 1, argc == 0 ? NULL : argv + 1, res); } /*------------------------------------------------------------ * The activation object * * This is just like a native object, used for holding the * 'local' variables. However, we keep the actual argument variables * in a separate array so that the arguments object can address them * directly. This is necessary because it is legal to have multiple * arguments of the same name. Extraneous arguments are also kept in * this array, but they are inaccessible through [[Get]] (because * they have no name). * * 10.1.6 */ static struct SEE_object * activation_create(interp, callee, function, argc, argv) struct SEE_interpreter *interp; struct SEE_object *callee; struct function *function; int argc; struct SEE_value **argv; { struct activation *activation; int i; struct SEE_value v, undef; activation = SEE_NEW(interp, struct activation); SEE_native_init(&activation->native, interp, &SEE_activation_class, NULL); activation->function = function; activation->argc = argc; activation->argv = SEE_NEW_ARRAY(interp, struct SEE_value, MAX(function->nparams, argc)); for (i = 0; i < argc; i++) SEE_VALUE_COPY(&activation->argv[i], argv[i]); for (; i < function->nparams; i++) SEE_SET_UNDEFINED(&activation->argv[i]); /* 10.1.6 Initialize with an 'arguments' property */ activation->arguments = arguments_create(interp, activation, callee); SEE_SET_OBJECT(&v, activation->arguments); SEE_native_put(interp, (struct SEE_object *)&activation->native, STR(arguments), &v, SEE_ATTR_DONTDELETE); /* Initialise all the formal parameters to undef */ SEE_SET_UNDEFINED(&undef); for (i = 0; i < function->nparams; i++) SEE_native_put(interp, (struct SEE_object *)&activation->native, function->params[i], &undef, SEE_ATTR_DONTDELETE); return (struct SEE_object *)activation; } static int activation_find_index(activation, p) struct activation *activation; struct SEE_string *p; { int i; for (i = activation->function->nparams - 1; i >= 0; i--) if (p == activation->function->params[i]) break; return i; } static void activation_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { struct SEE_string *ip = SEE_intern(interp, p); struct activation *activation = (struct activation *)o; int i = activation_find_index(activation, ip); if (i >= 0) SEE_VALUE_COPY(res, &activation->argv[i]); else SEE_native_get(interp, (struct SEE_object *)&activation->native, ip, res); } static void activation_put(interp, o, p, val, attr) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *val; int attr; { struct SEE_string *ip = SEE_intern(interp, p); struct activation *activation = (struct activation *)o; int i = activation_find_index(activation, ip); if (i >= 0) SEE_VALUE_COPY(&activation->argv[i], val); else SEE_native_put(interp, (struct SEE_object *)&activation->native, ip, val, attr); } /*------------------------------------------------------------ * The arguments object * 10.1.8 */ /* * Helper function that converts an integer name into an * integer index. Returns -1 if not an integer less than argc; */ static int argument_index(a, s) struct arguments *a; struct SEE_string *s; { int value; unsigned int i; if (s->length == 0) return 0; value = 0; for (i = 0; i < s->length; i++) { if (s->data[i] >= '0' && s->data[i] <= '9') value = 10 * value + s->data[i] - '0'; else return -1; } if (value >= a->activation->argc) return -1; if (a->deleted[value]) return -1; return value; } static int arguments_delete(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct arguments *a = (struct arguments *)o; int i = argument_index(a, p); if (i != -1) a->deleted[i] = 1; return SEE_native_delete(interp, o, p); } static void arguments_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { struct arguments *a = (struct arguments *)o; int i = argument_index(a, p); if (i != -1) SEE_VALUE_COPY(res, &a->activation->argv[i]); else SEE_native_get(interp, o, p, res); } static void arguments_put(interp, o, p, val, attr) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *val; int attr; { struct arguments *a = (struct arguments *)o; int i = argument_index(a, p); if (i != -1) SEE_VALUE_COPY(&a->activation->argv[i], val); else SEE_native_put(interp, o, p, val, attr); } static void arguments_defaultvalue(interp, o, hint, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_value *hint; struct SEE_value *res; { struct arguments *a = (struct arguments *)o; struct SEE_string *s = SEE_string_new(interp, 0); struct SEE_string *snum = NULL; struct SEE_value vs; int i; if (SEE_COMPAT_JS(interp, >=, JS11)) { /* EXT:14 */ SEE_string_addch(s, '['); for (i = 0; i < a->activation->argc; i++) { if (i) { SEE_string_addch(s, ','); SEE_string_addch(s, ' '); } if (!snum) snum = SEE_string_new(interp, 0); snum->length = 0; SEE_string_append_int(snum, i); SEE_string_append(s, snum); SEE_string_addch(s, '='); SEE_ToString(interp, &a->activation->argv[i], &vs); SEE_string_append(s, vs.u.string); } SEE_string_addch(s, ']'); SEE_SET_STRING(res, s); } else SEE_no_defaultvalue(interp, o, hint, res); } /* 10.1.8 Create an arguments structure */ static struct SEE_object * arguments_create(interp, activation, callee) struct SEE_interpreter *interp; struct activation *activation; struct SEE_object *callee; { struct arguments *arguments; struct SEE_value v, undef; struct SEE_string *s; int i; arguments = SEE_NEW(interp, struct arguments); SEE_native_init(&arguments->native, interp, &arguments_class, interp->Object_prototype); arguments->activation = activation; SEE_SET_OBJECT(&v, callee); SEE_OBJECT_PUT(interp, (struct SEE_object *)arguments, STR(callee), &v, SEE_ATTR_DONTENUM); SEE_SET_NUMBER(&v, activation->argc); SEE_OBJECT_PUT(interp, (struct SEE_object *)arguments, STR(length), &v, SEE_ATTR_DONTENUM); arguments->deleted = SEE_NEW_ARRAY(interp, SEE_boolean_t, activation->argc); if (activation->argc) { s = SEE_string_new(interp, 4); SEE_SET_UNDEFINED(&undef); for (i = 0; i < activation->argc; i++) { arguments->deleted[i] = 0; s->length = 0; SEE_string_append_int(s, i); SEE_native_put(interp, (struct SEE_object *)&arguments->native, s, &v, SEE_ATTR_DONTENUM); } } /* * spec bug in 10.1.8: What happens when you delete * one of the numbered arguments properties, and then * put it back? The spec isn't clear on this. * * This implementation follows the implication that * a new property without special linkage can be created by * a [[Delete]]+[[Put]] sequence. */ return (struct SEE_object *)arguments; } /*------------------------------------------------------------ * function instance methods * - these simply pass the operations down to the 'common' object */ /* * NOTE: since these are always calls to SEE_native_*, we could * change the macros to direct calls, and save one pointer lookup. * However, it seems pretty rare to make changes to function objects * and this interface separation improves modularity. */ static void function_inst_get(interp, o, p, res) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *res; { struct SEE_object *common; common = (struct SEE_object *)tofunction(interp, o)->function->common; SEE_OBJECT_GET(interp, common, p, res); } static void function_inst_put(interp, o, p, val, attr) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; struct SEE_value *val; int attr; { struct SEE_object *common; /* XXX setting __proto__ will ruin things */ common = (struct SEE_object *)tofunction(interp, o)->function->common; SEE_OBJECT_PUT(interp, common, p, val, attr); } static int function_inst_canput(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_object *common; common = (struct SEE_object *)tofunction(interp, o)->function->common; return SEE_OBJECT_CANPUT(interp, common, p); } static int function_inst_hasproperty(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_object *common; common = (struct SEE_object *)tofunction(interp, o)->function->common; return SEE_OBJECT_HASPROPERTY(interp, common, p); } static int function_inst_delete(interp, o, p) struct SEE_interpreter *interp; struct SEE_object *o; struct SEE_string *p; { struct SEE_object *common; common = (struct SEE_object *)tofunction(interp, o)->function->common; return SEE_OBJECT_DELETE(interp, common, p); } static struct SEE_enum * function_inst_enumerator(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct SEE_object *common; common = (struct SEE_object *)tofunction(interp, o)->function->common; return SEE_OBJECT_ENUMERATOR(interp, common); } ���������������������������������������������������������silverjuke-16.2.3/src/see/obj_Global.c��������������������������������������������������������������0000664�0000000�0000000�00000064315�12660066715�0017551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Global.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <stdlib.h> # include <string.h> #endif #include "see_mem.h" #include "see_type.h" #include "see_string.h" #include "see_value.h" #include "see_try.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_debug.h" #include "see_context.h" #include "see_stringdefs.h" #include "see_parse.h" #include "see_scope.h" #include "see_function.h" #include "see_unicode.h" #include "see_dtoa.h" #include "see_init.h" #include "see_dprint.h" #include "see_nmath.h" #define POSITIVE (1) #define NEGATIVE (-1) /* * The Global object. * * This object is always at the end of the scope chain. * (Host objects should be inserted into it at startup * to be reachable.) */ static void global_eval(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_parseInt(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_parseFloat(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_isNaN(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_isFinite(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_decodeURI(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_decodeURIComponent(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_encodeURI(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_encodeURIComponent(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_escape(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_unescape(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); #ifndef NDEBUG static void global_write(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void global_writeval(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); #endif static int is_StrWhiteSpace(SEE_char_t); static void AddEscape(struct SEE_interpreter *, struct SEE_string *, unsigned int); static struct SEE_string *Encode(struct SEE_interpreter *, struct SEE_string *, const unsigned char *); static SEE_char_t urihexval(struct SEE_interpreter *, unsigned int, unsigned int); static struct SEE_string *Decode(struct SEE_interpreter *, struct SEE_string *, const unsigned char *); /* Note: [[Class]] is not "Global" but "global" for mozilla compatibility */ static struct SEE_objectclass global_class = { "global", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL /* Call */ }; void SEE_Global_alloc(interp) struct SEE_interpreter *interp; { interp->Global = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Global_scope = SEE_NEW(interp, struct SEE_scope); /* XXX should properly check that this is never referenced */ interp->Global_eval = (struct SEE_object *)1; } void SEE_Global_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Global; /* struct SEE_native */ struct SEE_value v; Global = interp->Global; interp->Global_scope->next = NULL; interp->Global_scope->obj = Global; SEE_native_init((struct SEE_native *)Global, interp, &global_class, (SEE_COMPAT_JS(interp, >=, JS11)) /* EXT:17 */ ? interp->Object_prototype : NULL); /* NaN - 15.1.1.1 */ SEE_SET_NUMBER(&v, SEE_NaN); SEE_OBJECT_PUT(interp, Global, STR(NaN), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE); /* Infinity - 15.1.1.2 */ SEE_SET_NUMBER(&v, SEE_Infinity); SEE_OBJECT_PUT(interp, Global, STR(Infinity), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE); /* undefined - 15.1.1.3 */ SEE_SET_UNDEFINED(&v); SEE_OBJECT_PUT(interp, Global, STR(undefined), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE); #define PUTFUNC(name,len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, global_##name, \ STR(name), len)); \ SEE_OBJECT_PUT(interp, Global, STR(name), &v, SEE_ATTR_DEFAULT); PUTFUNC(eval, 1) /* 15.1.2.1 */ interp->Global_eval = v.u.object; PUTFUNC(parseInt, 2) /* 15.1.2.2 */ PUTFUNC(parseFloat, 1) /* 15.1.2.3 */ PUTFUNC(isNaN, 1) /* 15.1.2.4 */ PUTFUNC(isFinite, 1) /* 15.1.2.5 */ PUTFUNC(decodeURI, 1) /* 15.1.3.1 */ PUTFUNC(decodeURIComponent, 1) /* 15.1.3.2 */ PUTFUNC(encodeURI, 1) /* 15.1.3.3 */ PUTFUNC(encodeURIComponent, 1) /* 15.1.3.4 */ if (interp->compatibility & SEE_COMPAT_262_3B) { PUTFUNC(escape, 1) PUTFUNC(unescape, 1) } #ifndef NDEBUG /* Nonstandard methods */ PUTFUNC(write, 1) PUTFUNC(writeval, 1) #endif #define PUTOBJ(name) \ SEE_SET_OBJECT(&v, interp->name); \ SEE_OBJECT_PUT(interp, Global, STR(name), &v, SEE_ATTR_DEFAULT); PUTOBJ(Object) /* 15.1.4.1 */ PUTOBJ(Function) /* 15.1.4.2 */ PUTOBJ(Array) /* 15.1.4.3 */ PUTOBJ(String) /* 15.1.4.4 */ PUTOBJ(Boolean) /* 15.1.4.5 */ PUTOBJ(Number) /* 15.1.4.6 */ PUTOBJ(Date) /* 15.1.4.7 */ PUTOBJ(RegExp) /* 15.1.4.8 */ PUTOBJ(Error) /* 15.1.4.9 */ PUTOBJ(EvalError) /* 15.1.4.10 */ PUTOBJ(RangeError) /* 15.1.4.11 */ PUTOBJ(ReferenceError) /* 15.1.4.12 */ PUTOBJ(SyntaxError) /* 15.1.4.13 */ PUTOBJ(TypeError) /* 15.1.4.14 */ PUTOBJ(URIError) /* 15.1.4.15 */ PUTOBJ(Math) /* 15.1.5.1 */ } /* Global.eval (15.1.2.1) */ static void global_eval(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { /* * This function should never be called. * * Invocation of the Global.eval() function object is special: * parse.c checks for it and calls the C function eval() * there directly. The only way we could get here is if the host * application has tried to call it directly, which is naughty! */ SEE_error_throw_string(interp, interp->EvalError, STR(internal_error)); } static int is_StrWhiteSpace(ch) SEE_char_t ch; { #if WITH_UNICODE_TABLES int i; #endif if (ch == 0x0009 || /* TAB */ ch == 0x0020 || /* SP */ ch == 0x000c || /* FF */ ch == 0x000b || /* VT */ ch == 0x000d || /* CR */ ch == 0x000a) /* LF */ return 1; #if WITH_UNICODE_TABLES if (ch == 0x00a0 || /* NBSP */ ch == 0x2028 || /* LS */ ch == 0x2029) /* PS */ return 1; for (i = 0; i < SEE_unicode_Zscodeslen; i++) if (ch == SEE_unicode_Zscodes[i]) return 1; #endif return 0; } /* Global.parseInt (15.1.2.2) */ static void global_parseInt(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { unsigned int j, i, start; SEE_int32_t R; struct SEE_value v; struct SEE_string *s; SEE_number_t n, sign; if (argc < 1) { SEE_SET_NUMBER(res, SEE_NaN); return; } SEE_ToString(interp, argv[0], &v); s = v.u.string; i = 0; while (i < s->length && is_StrWhiteSpace(s->data[i])) i++; sign = POSITIVE; if (i < s->length && s->data[i] == '-') sign = NEGATIVE; if (i < s->length && (s->data[i] == '-' || s->data[i] == '+')) i++; if (argc < 2) R = 0; else R = SEE_ToInt32(interp, argv[1]); if (R != 0 && (R < 2 || R > 36)) { SEE_SET_NUMBER(res, SEE_NaN); return; } if ((R == 0 || R == 16) && i + 1 < s->length && s->data[i] == '0' && (s->data[i + 1] == 'x' || s->data[i + 1] == 'X')) { i += 2; R = 16; } else if (SEE_COMPAT_JS(interp, >=, JS11) && /* EXT:18 */ R == 0 && i < s->length && s->data[i] == '0') { R = 8; } if (R == 0) R = 10; start = i; while (i < s->length) { SEE_char_t ch; int digit; ch = s->data[i]; if (ch >= '0' && ch <= '9') digit = ch - '0'; else if (ch >= 'a' && ch <= 'z') digit = ch - 'a' + 10; else if (ch >= 'A' && ch <= 'Z') digit = ch - 'A' + 10; else break; if (digit >= R) break; i++; } if (i == start) { SEE_SET_NUMBER(res, SEE_NaN); return; } n = 0; for (j = 0; j < i - start; j++) { SEE_number_t factor = NUMBER_pow((SEE_number_t)R, (SEE_number_t)j); SEE_char_t ch; int digit; if (SEE_ISINF(factor)) { n = factor; break; } ch = s->data[i - j - 1]; if (ch >= '0' && ch <= '9') digit = ch - '0'; else if (ch >= 'a' && ch <= 'z') digit = ch - 'a' + 10; else /* if (ch >= 'A' && ch <= 'Z') */ digit = ch - 'A' + 10; n += factor * digit; } SEE_SET_NUMBER(res, NUMBER_copysign(n, sign)); } /* Global.parseFloat (15.1.2.3) */ static void global_parseFloat(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { /* * StrDecimalLiteral: * [+-]? * ( Infinity | ( Digits | . Digits | Digits . ) * ( [Ee] [+-]? Digits ) ? ) * Digits: * [0-9]+ */ struct SEE_value v; struct SEE_string *s, *Inf; SEE_number_t n, sign; unsigned int i, hasdigits; if (argc < 1) { SEE_SET_NUMBER(res, SEE_NaN); return; } SEE_ToString(interp, argv[0], &v); s = v.u.string; i = 0; while (i < s->length && is_StrWhiteSpace(s->data[i])) i++; sign = POSITIVE; if (i < s->length && (s->data[i] == '-' || s->data[i] == '+')) { if (s->data[i] == '-') sign = NEGATIVE; i++; } Inf = STR(Infinity); if (i + Inf->length <= s->length && memcmp(&s->data[i], Inf->data, Inf->length * sizeof Inf->data[0]) == 0) { n = SEE_Infinity; i += Inf->length; } else { char *numbuf, *endstr; int start = i; int upto = i; hasdigits = 0; while (i < s->length && (s->data[i] >= '0' && s->data[i] <= '9')) { hasdigits = 1; i++; } if (i < s->length && s->data[i] == '.') { i++; while (i < s->length && (s->data[i] >= '0' && s->data[i] <= '9')) { hasdigits = 1; i++; } } if (!hasdigits) { SEE_SET_NUMBER(res, SEE_NaN); return; } upto = i; if (i < s->length && (s->data[i] == 'e' || s->data[i] == 'E')) { i++; if (i < s->length && (s->data[i] == '+' || s->data[i] == '-')) i++; hasdigits = 0; while (i < s->length && (s->data[i] >= '0' && s->data[i] <= '9')) { hasdigits = 1; i++; } /* * Note: even if the exponent is corrupt, the mantissa still * makes a valid number. */ if (hasdigits) upto = i; } numbuf = SEE_STRING_ALLOCA(interp, char, upto - start + 1); for (i = start; i < upto; i++) numbuf[i - start] = s->data[i] & 0x7f; numbuf[i - start] = '\0'; endstr = NULL; n = SEE_strtod(numbuf, &endstr); if (!endstr) { SEE_SET_NUMBER(res, SEE_NaN); return; } } SEE_SET_NUMBER(res, NUMBER_copysign(n, sign)); } /* Global.isNaN (15.1.2.4) */ static void global_isNaN(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc < 1) SEE_SET_BOOLEAN(res, 1); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_BOOLEAN(res, SEE_NUMBER_ISNAN(&v)); } } /* Global.isFinite (15.1.2.5) */ static void global_isFinite(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc < 1) SEE_SET_BOOLEAN(res, 0); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_BOOLEAN(res, SEE_NUMBER_ISFINITE(&v)); } } static void AddEscape(interp, R, i) struct SEE_interpreter *interp; struct SEE_string *R; unsigned int i; /* promoted unsigned char */ { char *hexstr = SEE_hexstr_uppercase; SEE_string_addch(R, '%'); SEE_string_addch(R, hexstr[(i >> 4) & 0xf]); SEE_string_addch(R, hexstr[i & 0xf]); } /* 15.1.3 */ static struct SEE_string * Encode(interp, s, unesc) struct SEE_interpreter *interp; struct SEE_string *s; const unsigned char *unesc; { struct SEE_string *R; int k; SEE_unicode_t C; R = SEE_string_new(interp, 0); k = 0; while (k < s->length) { /* * XXX we decode UTF-16 surrogates much earlier than the * expository definition of Encode in the standard does. */ if ((s->data[k] & 0xfc00) == 0xdc00) /* 2nd surrogate */ SEE_error_throw_string(interp, interp->URIError, STR(bad_utf16_string)); if ((s->data[k] & 0xfc00) == 0xd800) { C = (s->data[k++] & 0x3ff) << 10; if (k < s->length && (s->data[k] & 0xfc00) == 0xdc00) C = (C | (s->data[k++] & 0x3ff)) + 0x10000; else SEE_error_throw_string(interp, interp->URIError, STR(bad_utf16_string)); } else C = s->data[k++]; if (C < 0x80) { if (unesc[(C & 0x7f) >> 3] & (1 << (C & 0x7))) SEE_string_addch(R, C); else AddEscape(interp, R, (unsigned char)(C & 0x7f)); } else if (C < 0x800) { AddEscape(interp, R, (unsigned char)(0xc0 | (C >> 6 & 0x1f))); AddEscape(interp, R, (unsigned char)(0x80 | (C >> 0 & 0x3f))); /* 0x3f, nicht 0x2f: UTF-8 ist fr den Bereich 0x80-7FF "% 110xxxxx 10xxxxxx", s. http://www.silverjuke.net/forum/topic-3234.html */ } else if (C < 0x10000) { AddEscape(interp, R, (unsigned char)(0xe0 | (C >> 12 & 0x0f))); AddEscape(interp, R, (unsigned char)(0x80 | (C >> 6 & 0x3f))); /* 0x3f, nicht 0x2f ... */ AddEscape(interp, R, (unsigned char)(0x80 | (C >> 0 & 0x3f))); /* 0x3f, nicht 0x2f ... */ } else /* if (C < 0x200000) */ { AddEscape(interp, R, (unsigned char)(0xf0 | (C >> 18 & 0x07))); AddEscape(interp, R, (unsigned char)(0x80 | (C >> 12 & 0x3f))); /* 0x3f, nicht 0x2f ... */ AddEscape(interp, R, (unsigned char)(0x80 | (C >> 6 & 0x3f))); /* 0x3f, nicht 0x2f ... */ AddEscape(interp, R, (unsigned char)(0x80 | (C >> 0 & 0x3f))); /* 0x3f, nicht 0x2f ... */ } } return R; } static unsigned char hexbitmap[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, /* [0-9a-fA-F] */ 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, }; #define ishex(c) ((c) < 0x80 && (hexbitmap[(c)>>3] & (1 << ((c)&7)))) #define hexval(c) ((c) <= '9' ? (c) - '0' : \ (c) <= 'F' ? (c) - 'A' + 10 : (c) - 'a' + 10) /* Return a decoded hex character, or throw a URIError */ static SEE_char_t urihexval(interp, c1, c2) struct SEE_interpreter *interp; unsigned int c1, c2; /* promoted SEE_char_t */ { if (ishex(c1) && ishex(c2)) return (hexval(c1) << 4) | hexval(c2); else SEE_error_throw_string(interp, interp->URIError, STR(uri_badhex)); /* NOTREACHED */ return 0; } /* 15.1.3 */ static struct SEE_string * Decode(interp, s, resv) struct SEE_interpreter *interp; struct SEE_string *s; const unsigned char *resv; { struct SEE_string *R; int k, i, j, start; SEE_unicode_t C; SEE_char_t D; static unsigned char mask[] = { 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe }; R = SEE_string_new(interp, 0); k = 0; while (k < s->length) { /* * Decode %-encoded, UTF-8-encoded but leave * encoded strings alone if they would decode into the reserved * set! */ start = k; if ((s->data[k] & 0xfc00) == 0xdc00) /* 2nd surrogate */ SEE_error_throw_string(interp, interp->URIError, STR(bad_utf16_string)); if ((s->data[k] & 0xfc00) == 0xd800) { C = (s->data[k++] & 0x3ff) << 10; if (k < s->length && (s->data[k] & 0xfc00) == 0xdc00) C = (C | (s->data[k++] & 0x3ff)) + 0x10000; else SEE_error_throw_string(interp, interp->URIError, STR(bad_utf16_string)); } else C = s->data[k++]; if (C == '%') { /* Next two characters must be hex digits */ if (k + 1 >= s->length) SEE_error_throw_string(interp, interp->URIError, STR(uri_badhex)); C = urihexval(interp, s->data[k], s->data[k + 1]); k += 2; if (C & 0x80) { for (i = 1; i < 6; i++) if ((C & mask[i]) == mask[i - 1]) break; if (i >= 6) SEE_error_throw_string(interp, interp->URIError, STR(bad_utf8)); C &= ~mask[i]; for (j = 0; i--; j++) { if (!(k + 2 < s->length && s->data[k] == '%')) SEE_error_throw_string(interp, interp->URIError, STR(bad_utf8)); D = urihexval(interp, s->data[k + 1], s->data[k + 2]); k += 3; if ((D & ~0x3f) != 0x80) SEE_error_throw_string(interp, interp->URIError, STR(bad_utf8)); C = (C << 6) | (D & 0x3f); } } } /* Encode into UTF-16 unless it is in the reserved set */ if (C < 0x10000) { if (C < 0x80 && (resv[(C & 0x7f) >> 3] & (1 << (C & 0x7)))) while (start < k) { SEE_string_addch(R, s->data[start]); start++; } else SEE_string_addch(R, (SEE_char_t)C); } else if (C < 0x110000) { C -= 0x10000; SEE_string_addch(R, (SEE_char_t)(0xd800 | (C >> 10 & 0x3ff))); SEE_string_addch(R, (SEE_char_t)(0xdc00 | (C & 0x3ff))); } else { SEE_error_throw_string(interp, interp->URIError, STR(bad_unicode)); } } return R; } /* Global.decodeURI (15.1.3.1) */ static void global_decodeURI(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_string *r; static unsigned char uriResrved_plus_hash[] = { 0x00,0x00,0x00,0x00,0x58,0x98,0x00,0xac, /* [;/?:@&=+$,#] */ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; if (argc < 1) SEE_SET_UNDEFINED(res); else { SEE_ToString(interp, argv[0], &v); r = Decode(interp, v.u.string, uriResrved_plus_hash); SEE_SET_STRING(res, r); } } /* Global.decodeURIComponent (15.1.3.2) */ static void global_decodeURIComponent(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_string *r; static unsigned char empty[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* empty */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; if (argc < 1) SEE_SET_UNDEFINED(res); else { SEE_ToString(interp, argv[0], &v); r = Decode(interp, v.u.string, empty); SEE_SET_STRING(res, r); } } /* Global.encodeURI (15.1.3.3) */ static void global_encodeURI(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_string *r; static unsigned char uriReserved_plus_uriUnescaped_plus_hash[] = { 0x00,0x00,0x00,0x00,0xda,0xff,0xff,0xaf, 0xff,0xff,0xff,0x87,0xfe,0xff,0xff,0x47 }; /* [-_.!~*'();/?:@&=+$,#a-zA-Z0-9] */ if (argc < 1) SEE_SET_UNDEFINED(res); else { SEE_ToString(interp, argv[0], &v); r = Encode(interp, v.u.string, uriReserved_plus_uriUnescaped_plus_hash); SEE_SET_STRING(res, r); } } /* Global.encodeURIComponent (15.1.3.4) */ static void global_encodeURIComponent(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; struct SEE_string *r; static unsigned char uriUnescaped[] = { 0x00,0x00,0x00,0x00,0x82,0x67,0xff,0x03, 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x47 }; /* [-_.!~*'()a-zA-Z0-9] */ if (argc < 1) SEE_SET_UNDEFINED(res); else { SEE_ToString(interp, argv[0], &v); r = Encode(interp, v.u.string, uriUnescaped); SEE_SET_STRING(res, r); } } /* Global.escape - (B.2.1) */ static void global_escape(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; SEE_char_t c; struct SEE_string *s, *r; int i; static unsigned char ok[] = { 0x00,0x00,0x00,0x00,0x00,0xec,0xff,0x03, /* [A-Za-z0-9@*_+\-./] */ 0xff,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, }; char *hexstr = SEE_COMPAT_JS(interp, >=, JS11) /* EXT:19 */ ? SEE_hexstr_uppercase : SEE_hexstr_lowercase; if (argc < 1) { SEE_SET_STRING(res, STR(undefined)); return; } SEE_ToString(interp, argv[0], &v); s = v.u.string; r = SEE_string_new(interp, 0); for (i = 0; i < s->length; i++) { c = s->data[i]; if (c < 0x80 && (ok[c >> 3] & (1 << (c & 7)))) SEE_string_addch(r, c); else if (c < 0x100) { SEE_string_addch(r, '%'); SEE_string_addch(r, hexstr[(c >> 4) & 0xf]); SEE_string_addch(r, hexstr[c & 0xf]); } else { SEE_string_addch(r, '%'); SEE_string_addch(r, 'u'); SEE_string_addch(r, hexstr[(c >> 12) & 0xf]); SEE_string_addch(r, hexstr[(c >> 8) & 0xf]); SEE_string_addch(r, hexstr[(c >> 4) & 0xf]); SEE_string_addch(r, hexstr[c & 0xf]); } } SEE_SET_STRING(res, r); } /* Global.unescape - (B.2.2) */ static void global_unescape(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; SEE_char_t c; struct SEE_string *s, *r; int i; if (argc < 1) { SEE_SET_STRING(res, STR(undefined)); return; } SEE_ToString(interp, argv[0], &v); s = v.u.string; r = SEE_string_new(interp, 0); i = 0; while (i < s->length) { c = s->data[i++]; if (c == '%' && i + 4 < s->length && s->data[i] == 'u' && ishex(s->data[i + 1]) && ishex(s->data[i + 2]) && ishex(s->data[i + 3]) && ishex(s->data[i + 4])) { c = (hexval(s->data[i + 1]) << 12) | (hexval(s->data[i + 2]) << 8) | (hexval(s->data[i + 3]) << 4) | (hexval(s->data[i + 4]) << 0); i += 5; } else if (c == '%' && i + 1 < s->length && ishex(s->data[i]) && ishex(s->data[i + 1])) { c = (hexval(s->data[i + 0]) << 4) | (hexval(s->data[i + 1]) << 0); i += 2; } else { /* leave character alone */ } SEE_string_addch(r, c); } SEE_SET_STRING(res, r); } #ifndef NDEBUG /* Global.write(v) */ static void global_write(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc) { SEE_ToString(interp, argv[0], &v); SEE_string_fputs(v.u.string, stdout); } SEE_SET_UNDEFINED(res); } #endif #ifndef NDEBUG /* Global.writeval(v...) */ static void global_writeval(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { int i; for (i = 0; i < argc; i++) { dprintf("argv[%d] = ", i); dprintv(interp, argv[i]); dprintf("\n"); } SEE_SET_UNDEFINED(res); } #endif /*------------------------------------------------------------ * Public API to execute something in the Global context. * Does not close the input. * Returns the last value result of the last statement * executed, or undefined if none. */ void SEE_Global_eval(interp, inp, res) struct SEE_interpreter *interp; struct SEE_input *inp; struct SEE_value *res; { struct function *f; struct SEE_context context; struct SEE_value cres, *v; struct SEE_traceback *old_traceback; old_traceback = interp->traceback; interp->traceback = NULL; f = SEE_parse_program(interp, inp); context.interpreter = interp; context.activation = SEE_Object_new(interp); context.scope = interp->Global_scope; context.variable = interp->Global; context.varattr = SEE_ATTR_DONTDELETE; context.thisobj = interp->Global; SEE_SET_UNDEFINED(&cres); SEE_eval_functionbody(f, &context, &cres); if (SEE_VALUE_GET_TYPE(&cres) != SEE_COMPLETION) SEE_error_throw_string(interp, interp->Error, STR(internal_error)); if (cres.u.completion.type != SEE_COMPLETION_NORMAL) SEE_error_throw_string(interp, interp->Error, STR(internal_error)); v = cres.u.completion.value; if (res) { if (!v) SEE_SET_UNDEFINED(res); else if (SEE_VALUE_GET_TYPE(v) == SEE_REFERENCE) { /* GetValue */ if (v->u.reference.base == NULL) SEE_SET_UNDEFINED(res); else SEE_OBJECT_GET(interp, v->u.reference.base, v->u.reference.property, res); } else SEE_VALUE_COPY(res, cres.u.completion.value); } interp->traceback = old_traceback; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Math.c����������������������������������������������������������������0000664�0000000�0000000�00000036002�12660066715�0017232�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Math.c 936 2006-01-21 03:51:30Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdlib.h> #endif #include "see_mem.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_stringdefs.h" #include "see_init.h" #include "see_nmath.h" /* * 15.8 The Math object. */ #define SET_NO_RESULT(res) SEE_SET_NUMBER(res, SEE_NaN) #define IS_NEGZERO(n) ((n) == 0 && NUMBER_copysign(1.0,n) < 0) #define IS_POSZERO(n) ((n) == 0 && NUMBER_copysign(1.0,n) > 0) static void math_abs(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_acos(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_asin(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_atan(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_atan2(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_ceil(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_cos(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_exp(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_floor(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_log(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_max(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_min(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_pow(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_random(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_round(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_sin(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_sqrt(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void math_tan(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); /* Math is a normal native object */ static struct SEE_objectclass math_class = { "Math", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL /* Call */ }; void SEE_Math_alloc(interp) struct SEE_interpreter *interp; { interp->Math = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); } void SEE_Math_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Math; /* struct SEE_native */ struct SEE_value v; Math = interp->Math; SEE_native_init((struct SEE_native *)Math, interp, &math_class, interp->Object_prototype); #define PUTVAL(name, val) \ SEE_SET_NUMBER(&v, val); \ SEE_OBJECT_PUT(interp, Math, STR(name), &v, \ SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | \ SEE_ATTR_READONLY); PUTVAL(E, M_E) /* 15.8.1.1 */ PUTVAL(LN10, M_LN10) /* 15.8.1.2 */ PUTVAL(LN2, M_LN2) /* 15.8.1.3 */ PUTVAL(LOG2E, M_LOG2E) /* 15.8.1.4 */ PUTVAL(LOG10E, M_LOG10E) /* 15.8.1.5 */ PUTVAL(PI, M_PI) /* 15.8.1.6 */ PUTVAL(SQRT1_2, M_SQRT1_2) /* 15.8.1.7 */ PUTVAL(SQRT2, M_SQRT2) /* 15.8.1.8 */ #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, math_##name, \ STR(name), len)); \ SEE_OBJECT_PUT(interp, Math, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(abs, 1) /* 15.8.2.1 */ PUTFUNC(acos, 1) /* 15.8.2.2 */ PUTFUNC(asin, 1) /* 15.8.2.3 */ PUTFUNC(atan, 1) /* 15.8.2.4 */ PUTFUNC(atan2, 2) /* 15.8.2.5 */ PUTFUNC(ceil, 1) /* 15.8.2.6 */ PUTFUNC(cos, 1) /* 15.8.2.7 */ PUTFUNC(exp, 1) /* 15.8.2.8 */ PUTFUNC(floor, 1) /* 15.8.2.9 */ PUTFUNC(log, 1) /* 15.8.2.10 */ PUTFUNC(max, 2) /* 15.8.2.11 */ PUTFUNC(min, 2) /* 15.8.2.12 */ PUTFUNC(pow, 2) /* 15.8.2.13 */ PUTFUNC(random, 0) /* 15.8.2.14 */ PUTFUNC(round, 1) /* 15.8.2.15 */ PUTFUNC(sin, 1) /* 15.8.2.16 */ PUTFUNC(sqrt, 1) /* 15.8.2.17 */ PUTFUNC(tan, 1) /* 15.8.2.18 */ } /* 15.8.2.1 Math.abs() */ static void math_abs(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], res); if (!SEE_NUMBER_ISNAN(res)) res->u.number = NUMBER_copysign(res->u.number, 1.0); } } /* 15.8.2.2 Math.acos() */ static void math_acos(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], res); if (SEE_NUMBER_ISNAN(res)) ; else if (res->u.number < -1 || res->u.number > 1) SEE_SET_NUMBER(res, SEE_NaN); else if (res->u.number == 1) SEE_SET_NUMBER(res, 0); else SEE_SET_NUMBER(res, NUMBER_acos(res->u.number)); } } /* 15.8.2.3 Math.asin() */ static void math_asin(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], res); if (SEE_NUMBER_ISNAN(res)) ; else if (res->u.number < -1 || res->u.number > 1) SEE_SET_NUMBER(res, SEE_NaN); else if (res->u.number == 0) ; else SEE_SET_NUMBER(res, NUMBER_asin(res->u.number)); } } /* 15.8.2.4 Math.atan() */ static void math_atan(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); if (v.u.number == 0) SEE_SET_NUMBER(res, v.u.number); else SEE_SET_NUMBER(res, NUMBER_atan(v.u.number)); } } /* 15.8.2.5 Math.atan2() */ static void math_atan2(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v1, v2; if (argc < 2) SET_NO_RESULT(res); else { SEE_number_t x, y; SEE_ToNumber(interp, argv[0], &v1); SEE_ToNumber(interp, argv[1], &v2); y = v1.u.number; x = v2.u.number; /* * XXX: on my system, atan2() only differs in * the case where x is -0 */ if (IS_POSZERO(y) && IS_NEGZERO(x)) SEE_SET_NUMBER(res, M_PI); else if (IS_NEGZERO(y) && IS_NEGZERO(x)) SEE_SET_NUMBER(res, -M_PI); else SEE_SET_NUMBER(res, NUMBER_atan2(y, x)); } } /* 15.8.2.6 Math.ceil() */ static void math_ceil(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_NUMBER(res, NUMBER_ceil(v.u.number)); } } /* 15.8.2.7 Math.cos() */ static void math_cos(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_NUMBER(res, NUMBER_cos(v.u.number)); } } /* 15.8.2.8 Math.exp() */ static void math_exp(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); if (SEE_NUMBER_ISINF(&v)) SEE_SET_NUMBER(res, v.u.number < 0 ? 0 : SEE_Infinity); else SEE_SET_NUMBER(res, NUMBER_exp(v.u.number)); } } /* 15.8.2.9 Math.floor() */ static void math_floor(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_NUMBER(res, NUMBER_floor(v.u.number)); } } /* 15.8.2.10 Math.log() */ static void math_log(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); if (v.u.number < 0) SEE_SET_NUMBER(res, SEE_NaN); else SEE_SET_NUMBER(res, NUMBER_log(v.u.number)); } } /* 15.8.2.11 Math.max() */ static void math_max(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { SEE_number_t maxnum = -SEE_Infinity; int i; for (i = 0; i < argc; i++) { SEE_ToNumber(interp, argv[i], res); if (SEE_NUMBER_ISNAN(res)) return; if (i == 0 || res->u.number > maxnum || (res->u.number == 0 && IS_NEGZERO(maxnum))) maxnum = res->u.number; } SEE_SET_NUMBER(res, maxnum); } /* 15.8.2.12 Math.min() */ static void math_min(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { SEE_number_t minnum = SEE_Infinity; int i; for (i = 0; i < argc; i++) { SEE_ToNumber(interp, argv[i], res); if (SEE_NUMBER_ISNAN(res)) return; if (i == 0 || res->u.number < minnum || (minnum == 0 && IS_NEGZERO(res->u.number))) minnum = res->u.number; } SEE_SET_NUMBER(res, minnum); } /* 15.8.2.13 Math.pow() */ static void math_pow(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v1, v2; if (argc < 2) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v1); SEE_ToNumber(interp, argv[1], &v2); if (IS_NEGZERO(v1.u.number) && v2.u.number < 0) SEE_SET_NUMBER(res, NUMBER_copysign( NUMBER_fmod(v2.u.number, 2.0), 1.0) == 1 ? -SEE_Infinity : SEE_Infinity); else if (v1.u.number == 0 && v2.u.number < 0) SEE_SET_NUMBER(res, NUMBER_copysign(SEE_Infinity,v1.u.number)); else SEE_SET_NUMBER(res, NUMBER_pow(v1.u.number, v2.u.number)); } } /* 15.8.2.14 Math.random() */ static void math_random(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { unsigned int rval; #if HAVE_RAND_R rval = rand_r(&interp->random_seed); #else /* XXX this is not thread safe */ static int srand_initialised = 0; if (!srand_initialised) { srand_initialised++; srand(interp->random_seed); } rval = rand(); #endif SEE_SET_NUMBER(res, (SEE_number_t)rval / RAND_MAX); } /* 15.8.2.15 Math.round() */ static void math_round(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; SEE_number_t x; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); x = v.u.number; if (IS_NEGZERO(x) || (x >= -0.5 && x < 0)) SEE_SET_NUMBER(res, -0.0); else SEE_SET_NUMBER(res, NUMBER_floor(v.u.number + 0.5)); } } /* 15.8.2.16 Math.sin() */ static void math_sin(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_NUMBER(res, NUMBER_sin(v.u.number)); } } /* 15.8.2.17 Math.sqrt() */ static void math_sqrt(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_NUMBER(res, NUMBER_sqrt(v.u.number)); } } /* 15.8.2.18 Math.tan() */ static void math_tan(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v; if (argc == 0) SET_NO_RESULT(res); else { SEE_ToNumber(interp, argv[0], &v); SEE_SET_NUMBER(res, NUMBER_tan(v.u.number)); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Number.c��������������������������������������������������������������0000664�0000000�0000000�00000040674�12660066715�0017603�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Number.c 1125 2006-08-03 14:28:56Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_mem.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_stringdefs.h" #include "see_dtoa.h" #include "see_init.h" #include "see_nmath.h" #include "see_array.h" /* * 15.7 The Number object. */ /* structure of number instances */ struct number_object { struct SEE_native native; SEE_number_t number; /* Value */ }; /* Prototypes */ static void radix_tostring(struct SEE_string *, SEE_number_t, int); static struct number_object *tonumber(struct SEE_interpreter *, struct SEE_object *); static void number_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_proto_toLocaleString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_proto_valueOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_proto_toFixed(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_proto_toExponential(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void number_proto_toPrecision(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); /* object class for Number constructor */ static struct SEE_objectclass number_const_class = { "NumberConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ number_construct, /* Construct */ number_call /* Call */ }; /* object class for Number.prototype and number instances */ static struct SEE_objectclass number_inst_class = { "Number", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; void SEE_Number_alloc(interp) struct SEE_interpreter *interp; { interp->Number = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Number_prototype = (struct SEE_object *)SEE_NEW(interp, struct number_object); } void SEE_Number_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Number; /* struct SEE_native */ struct SEE_object *Number_prototype; /* struct number_object */ struct SEE_value v; Number = interp->Number; SEE_native_init((struct SEE_native *)Number, interp, &number_const_class, interp->Function_prototype); Number_prototype = interp->Number_prototype; /* 15.7.3 Number.length = 1 */ SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, Number, STR(length), &v, SEE_ATTR_LENGTH); /* 15.7.3.1 Number.prototype */ SEE_SET_OBJECT(&v, Number_prototype); SEE_OBJECT_PUT(interp, Number, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.7.3.2 Number.MAX_VALUE */ SEE_SET_NUMBER(&v, SEE_MaxNumber); SEE_OBJECT_PUT(interp, Number, STR(MAX_VALUE), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.7.3.3 Number.MIN_VALUE */ SEE_SET_NUMBER(&v, SEE_MinNumber); SEE_OBJECT_PUT(interp, Number, STR(MIN_VALUE), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.7.3.4 Number.NaN */ SEE_SET_NUMBER(&v, SEE_NaN); SEE_OBJECT_PUT(interp, Number, STR(NaN), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.7.3.5 Number.NEGATIVE_INFINITY */ SEE_SET_NUMBER(&v, -SEE_Infinity); SEE_OBJECT_PUT(interp, Number, STR(NEGATIVE_INFINITY), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.7.3.6 Number.POSITIVE_INFINITY */ SEE_SET_NUMBER(&v, SEE_Infinity); SEE_OBJECT_PUT(interp, Number, STR(POSITIVE_INFINITY), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); SEE_native_init((struct SEE_native *)Number_prototype, interp, &number_inst_class, interp->Object_prototype); /* 15.7.4 */ ((struct number_object *)Number_prototype)->number = 0; /* 15.7.4 */ /* 15.7.4.1 Number.prototype.constructor */ SEE_SET_OBJECT(&v, Number); SEE_OBJECT_PUT(interp, Number_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, \ number_proto_##name, STR(name), len)); \ SEE_OBJECT_PUT(interp, Number_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(toString, 1) PUTFUNC(toLocaleString, 0) PUTFUNC(valueOf, 0) PUTFUNC(toFixed, 1) PUTFUNC(toExponential, 1) PUTFUNC(toPrecision, 1) } static struct number_object * tonumber(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { if (o->objectclass != &number_inst_class) SEE_error_throw_string(interp, interp->TypeError, STR(not_number)); return (struct number_object *)o; } /* 15.7.2.1 */ static void number_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct number_object *no; struct SEE_value v; if (argc == 0) SEE_SET_NUMBER(&v, 0); else SEE_ToNumber(interp, argv[0], &v); no = SEE_NEW(interp, struct number_object); SEE_native_init(&no->native, interp, &number_inst_class, interp->Number_prototype); no->number = v.u.number; SEE_SET_OBJECT(res, (struct SEE_object *)no); } /* 15.7.1.1 */ static void number_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { if (argc < 1) SEE_SET_NUMBER(res, 0); else if (SEE_COMPAT_JS(interp, ==, JS12) && SEE_VALUE_GET_TYPE(argv[0]) == SEE_OBJECT && SEE_is_Array(argv[0]->u.object)) SEE_SET_NUMBER(res, SEE_Array_length(interp, argv[0]->u.object)); else SEE_ToNumber(interp, argv[0], res); } static void radix_tostring(s, n, radix) struct SEE_string *s; SEE_number_t n; int radix; { int d; if (n >= radix) { radix_tostring(s, n / radix, radix); n = fmod(n, (SEE_number_t)radix); } d = floor(n); if (d < 10) SEE_string_addch(s, '0' + d); else SEE_string_addch(s, 'a' + d - 10); } /* 15.7.4.2 Number.prototype.toString() */ static void number_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct number_object *no; SEE_int32_t radix; struct SEE_value v; no = tonumber(interp, thisobj); if (argc == 0) radix = 10; else radix = SEE_ToInt32(interp, argv[0]); if (radix == 10) { SEE_SET_NUMBER(&v, no->number); SEE_ToString(interp, &v, res); } else if (radix >= 2 && radix <= 36) { /* * The specs say to do something "implementation dependent", * but here I try and convert the number into the desired * representation. Numbers bigger than 10^20 or smaller than * 10^-6 are printed in p-notation (with the exponent being * expressed in base 10) */ struct SEE_string *s; SEE_number_t n = no->number, ni, nf; int expon; if (SEE_ISNAN(n)) { SEE_SET_STRING(res, STR(NaN)); return; } if (n == 0) { SEE_SET_STRING(res, STR(zero_digit)); /* "0" */ return; } s = SEE_string_new(interp, 0); if (n < 0) { SEE_string_addch(s, '-'); n = -n; } if (!SEE_ISFINITE(n)) { SEE_string_append(s, STR(Infinity)); SEE_SET_STRING(res, s); return; } if (n > 1e20 || n < 1e-6) { expon = NUMBER_floor(NUMBER_log(n) / NUMBER_log((SEE_number_t)radix)); n /= NUMBER_pow((SEE_number_t)radix, (SEE_number_t)expon); if (n == 0) { /* e.g.: Number(MAX_VALUE).toString(16) */ SEE_string_append(s, STR(Infinity)); SEE_SET_STRING(res, s); return; } if (!SEE_ISFINITE(n)) { /* e.g.: Number(MIN_VALUE).toString(16) */ SEE_SET_STRING(res, STR(zero_digit)); return; } } else expon = 0; ni = floor(n); nf = n - ni; radix_tostring(s, ni, radix); if (nf > 0) { int i; #define MAXPREC 20 SEE_string_addch(s, '.'); for (i = 0; i < MAXPREC && nf; i++) { SEE_number_t d; nf *= radix; if (i == MAXPREC - 1) { #if HAVE_RINT d = rint(nf); #else /* !HAVE_RINT */ d = floor(nf + 0.5); #endif /* !HAVE_RINT */ } else { d = floor(nf); nf -= d; } if (d < 10) SEE_string_addch(s, '0' + (int)d); else SEE_string_addch(s, 'a' + (int)d - 10); }; } if (expon) { SEE_string_addch(s, 'p'); if (expon < 0) { expon = -expon; SEE_string_addch(s, '-'); } radix_tostring(s, (SEE_number_t)expon, 10); } SEE_SET_STRING(res, s); } else SEE_error_throw_string(interp, interp->RangeError, STR(bad_radix)); } /* 15.7.4.3 Number.prototype.toLocaleString() */ static void number_proto_toLocaleString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct number_object *no; no = tonumber(interp, thisobj); /* XXX - really should use localeconv() */ number_proto_toString(interp, self, thisobj, 0, NULL, res); } /* 15.7.4.4 Number.prototype.valueOf() */ static void number_proto_valueOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct number_object *no; no = tonumber(interp, thisobj); SEE_SET_NUMBER(res, no->number); } /* 15.7.4.5 Number.prototype.toFixed() */ static void number_proto_toFixed(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct number_object *no; struct SEE_value v; struct SEE_string *m; SEE_number_t x; char *ms, *endstr; int f, sign, n, i, k; if (argc > 0 && SEE_VALUE_GET_TYPE(argv[0]) != SEE_UNDEFINED) { SEE_ToInteger(interp, argv[0], &v); if (v.u.number < 0 || v.u.number > 20 || SEE_NUMBER_ISNAN(&v)) SEE_error_throw(interp, interp->RangeError, "%f", v.u.number); f = v.u.number; } else f = 0; no = tonumber(interp, thisobj); x = no->number; if (!SEE_ISFINITE(x) || x <= -1e21 || x >= 1e21) { SEE_SET_NUMBER(&v, x); SEE_ToString(interp, &v, res); return; } ms = SEE_dtoa(x, DTOA_MODE_FCVT, f, &n, &sign, &endstr); k = endstr - ms; m = SEE_string_new(interp, 0); if (x < 0) SEE_string_addch(m, '-'); if (n <= 0) SEE_string_addch(m, '0'); if (n < 0) { SEE_string_addch(m, '.'); for (i = 0; i < -n; i++) SEE_string_addch(m, '0'); } for (i = 0; i < k; i++) { if (i == n) SEE_string_addch(m, '.'); SEE_string_addch(m, ms[i]); } for (i = k; i < f + n; i++) { if (i == n) SEE_string_addch(m, '.'); SEE_string_addch(m, '0'); } SEE_freedtoa(ms); SEE_SET_STRING(res, m); } /* 15.7.4.6 Number.prototype.toExponential() */ static void number_proto_toExponential(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct number_object *no; struct SEE_value v; struct SEE_string *s; SEE_number_t x; char *ms, *endstr; int e, f, n, i, k, sign; if (argc > 0 && SEE_VALUE_GET_TYPE(argv[0]) != SEE_UNDEFINED) { SEE_ToInteger(interp, argv[0], &v); if (v.u.number < 0 || v.u.number > 20 || SEE_NUMBER_ISNAN(&v)) SEE_error_throw(interp, interp->RangeError, "%f", v.u.number); f = v.u.number; } else f = 0; no = tonumber(interp, thisobj); x = no->number; SEE_SET_NUMBER(&v, x); if (!SEE_NUMBER_ISFINITE(&v)) { SEE_ToString(interp, &v, res); return; } if (f) ms = SEE_dtoa(x, DTOA_MODE_ECVT, f, &n, &sign, &endstr); else ms = SEE_dtoa(x, DTOA_MODE_SHORT_SW, 31, &n, &sign, &endstr); k = endstr - ms; if (x) e = n - 1; else e = 0; s = SEE_string_new(interp, 0); if (x < 0) SEE_string_addch(s, '-'); if (k == 0) SEE_string_addch(s, '0'); else SEE_string_addch(s, ms[0]); if (k > 1 || f) { SEE_string_addch(s, '.'); for (i = 1; i < k; i++) SEE_string_addch(s, ms[i]); for (; i < f + 1; i++) SEE_string_addch(s, '0'); } SEE_string_addch(s, 'e'); if (e >= 0) SEE_string_addch(s, '+'); SEE_string_append_int(s, e); SEE_freedtoa(ms); SEE_SET_STRING(res, s); } /* 15.7.4.7 Number.prototype.toPrecision() */ static void number_proto_toPrecision(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct number_object *no; struct SEE_value v; struct SEE_string *s; SEE_number_t x; char *ms, *endstr; int p, n, k, e, i, sign; no = tonumber(interp, thisobj); x = no->number; SEE_SET_NUMBER(&v, x); if (argc < 1 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED || !SEE_NUMBER_ISFINITE(&v)) { SEE_ToString(interp, &v, res); return; } SEE_ToInteger(interp, argv[0], &v); if (v.u.number < 1 || v.u.number > 21 || SEE_NUMBER_ISNAN(&v)) SEE_error_throw(interp, interp->RangeError, "%f", v.u.number); p = v.u.number; s = SEE_string_new(interp, 0); if (x < 0) SEE_string_addch(s, '-'); ms = SEE_dtoa(x, DTOA_MODE_ECVT, p, &n, &sign, &endstr); k = endstr - ms; if (x) e = n - 1; else { e = 0; goto fixed; } if (e < -6 || e >= p) { if (k == 0) SEE_string_addch(s, '0'); else SEE_string_addch(s, ms[0]); if (p > 1) { SEE_string_addch(s, '.'); for (i = 1; i < k; i++) SEE_string_addch(s, ms[i]); for (; i < p - 1; i++) SEE_string_addch(s, '0'); } SEE_string_addch(s, 'e'); if (e >= 0) SEE_string_addch(s, '+'); SEE_string_append_int(s, e); } else { fixed: if (n <= 0) SEE_string_addch(s, '0'); if (n < 0) { SEE_string_addch(s, '.'); for (i = 0; i < -n; i++) SEE_string_addch(s, '0'); } for (i = 0; i < k; i++) { if (i == n) SEE_string_addch(s, '.'); SEE_string_addch(s, ms[i]); } for (i = k; i < p; i++) { if (i == n) SEE_string_addch(s, '.'); SEE_string_addch(s, '0'); } } SEE_freedtoa(ms); SEE_SET_STRING(res, s); } ��������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_Object.c��������������������������������������������������������������0000664�0000000�0000000�00000026622�12660066715�0017556�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_Object.c 1092 2006-06-21 14:46:28Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_mem.h" #include "see_native.h" #include "see_string.h" #include "see_intern.h" #include "see_cfunction.h" #include "see_interpreter.h" #include "see_stringdefs.h" #include "see_init.h" /* * Object objects. * * This module declares two objects: * - the 'object constructor object' (a.k.a Object) * - the 'object prototype object' (a.k.a. Object.prototype) * * 'new Object(o)' returns new objects, whose prototype is * set to Object.prototype. Note that 'Object' can be called * either as a function, or as a constructor with the same * result. */ extern struct SEE_native SEE_obj_Function_prototype; extern struct SEE_native SEE_obj_Object; /* Prototypes */ static void object_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void object_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void object_proto_toLocaleString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void object_proto_valueOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void object_proto_hasOwnProperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void object_proto_isPrototypeOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void object_proto_propertyIsEnumerable(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static struct SEE_objectclass object_const_class = { "ObjectConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ object_construct, /* Construct */ object_construct, /* Call */ }; static struct SEE_objectclass object_inst_class = { "Object", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ }; void SEE_Object_alloc(interp) struct SEE_interpreter *interp; { interp->Object = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->Object_prototype = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); } void SEE_Object_init(interp) struct SEE_interpreter *interp; { struct SEE_object *Object; /* struct SEE_native */ struct SEE_object *Object_prototype; /* struct SEE_native */ struct SEE_value v; Object = interp->Object; Object_prototype = interp->Object_prototype; SEE_native_init((struct SEE_native *)Object, interp, &object_const_class, interp->Function_prototype); SEE_native_init((struct SEE_native *)Object_prototype, interp, &object_inst_class, NULL); /* Object.prototype.constructor */ SEE_SET_OBJECT(&v, Object); SEE_OBJECT_PUT(interp, Object_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, object_proto_##name, \ STR(name), len)); \ SEE_OBJECT_PUT(interp, Object_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(toString, 0) PUTFUNC(toLocaleString, 0) PUTFUNC(valueOf, 0) PUTFUNC(hasOwnProperty, 1) PUTFUNC(isPrototypeOf, 1) PUTFUNC(propertyIsEnumerable, 1) /* 15.2.3.1 Object.prototype */ SEE_SET_OBJECT(&v, Object_prototype); SEE_OBJECT_PUT(interp, Object, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* Object.length */ SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, Object, STR(length), &v, SEE_ATTR_LENGTH); } /* Convenience routine to simulare 'new Object()' */ struct SEE_object * SEE_Object_new(interp) struct SEE_interpreter *interp; { struct SEE_value v; SEE_OBJECT_CONSTRUCT(interp, interp->Object, interp->Object, 0, NULL, &v); return v.u.object; } /* new Object (15.2.2.1) */ static void object_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct SEE_object *obj; if (argc) { if (SEE_VALUE_GET_TYPE(argv[0]) == SEE_OBJECT) { /* * TODO optional step 4 - handling host objects. * Should we add a hook into the objectclass structure * to allow hosts to trap this new Object(hostobj) * situation? Is it really that important?? Hmm. */ SEE_SET_OBJECT(res, argv[0]->u.object); return; } if (SEE_VALUE_GET_TYPE(argv[0]) == SEE_STRING || SEE_VALUE_GET_TYPE(argv[0]) == SEE_BOOLEAN || SEE_VALUE_GET_TYPE(argv[0]) == SEE_NUMBER) { SEE_ToObject(interp, argv[0], res); return; } } obj = SEE_native_new(interp); obj->objectclass = &object_inst_class; obj->Prototype = interp->Object_prototype; SEE_SET_OBJECT(res, obj); } /* Object.prototype.toString (15.2.4.2) */ static void object_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct SEE_string *s; if (SEE_COMPAT_JS(interp, ==, JS12)) { struct SEE_string *s = SEE_string_new(interp, 0); struct SEE_string *prop; struct SEE_value v, vs; unsigned int j; int flag; int first = 1; struct SEE_enum *e = NULL; SEE_string_addch(s, '{'); if (SEE_OBJECT_HAS_ENUMERATOR(thisobj)) { e = SEE_OBJECT_ENUMERATOR(interp, thisobj); while ((prop = SEE_ENUM_NEXT(interp, e, &flag)) != NULL) { SEE_OBJECT_GET(interp, thisobj, prop, &v); if (SEE_VALUE_GET_TYPE(&v) == SEE_UNDEFINED) continue; if (!first) { SEE_string_addch(s, ','); SEE_string_addch(s, ' '); } else first = 0; SEE_string_append(s, prop); SEE_string_addch(s, ':'); switch (SEE_VALUE_GET_TYPE(&v)) { case SEE_STRING: SEE_string_addch(s, '"'); for (j = 0; j < v.u.string->length; j++) { if (v.u.string->data[j] == '\"' || v.u.string->data[j] == '\\') SEE_string_addch(s, '\\'); SEE_string_addch(s, v.u.string->data[j]); } SEE_string_addch(s, '"'); break; default: SEE_ToString(interp, &v, &vs); SEE_string_append(s, vs.u.string); break; } } } SEE_string_addch(s, '}'); SEE_SET_STRING(res, s); } else { s = SEE_string_sprintf(interp, "[object %s]", (thisobj && thisobj->objectclass && thisobj->objectclass->Class) ? thisobj->objectclass->Class : "(null)"); SEE_SET_STRING(res, s); } } /* Object.prototype.toLocaleString (15.2.4.3) */ static void object_proto_toLocaleString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct SEE_value v1, v2; /* "return the result of calling toString()" */ SEE_OBJECT_GET(interp, thisobj, STR(toString), &v1); SEE_ToObject(interp, &v1, &v2); SEE_OBJECT_CALL(interp, v2.u.object, thisobj, argc, argv, res); } /* Object.prototype.valueOf (15.2.4.4) */ static void object_proto_valueOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { if (!thisobj) SEE_SET_NULL(res); else SEE_SET_OBJECT(res, thisobj); } /* Object.prototype.hasOwnProperty (15.2.4.5) */ static void object_proto_hasOwnProperty(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct SEE_value v; struct SEE_string *is; int hasit; /* XXX - should be a nicer way of determining how to do this: */ if (argc > 0 && thisobj->objectclass->HasProperty == SEE_native_hasproperty) { SEE_ToString(interp, argv[0], &v); is = SEE_intern(interp, v.u.string); hasit = SEE_native_hasownproperty(interp, thisobj, is); } else hasit = 0; SEE_SET_BOOLEAN(res, hasit); } /* Object.prototype.isPrototypeOf (15.2.4.6) Pp97 */ static void object_proto_isPrototypeOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct SEE_object *v; if (argc == 0 || SEE_VALUE_GET_TYPE(argv[0]) != SEE_OBJECT) { SEE_SET_BOOLEAN(res, 0); return; } v = argv[0]->u.object->Prototype; if (v == NULL) SEE_SET_BOOLEAN(res, 0); else if (SEE_OBJECT_JOINED(thisobj, v)) SEE_SET_BOOLEAN(res, 1); else SEE_SET_BOOLEAN(res, 0); } /* Object.prototype.propertyIsEnumerable (15.2.4.7) */ static void object_proto_propertyIsEnumerable(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct SEE_value v; struct SEE_string *is; int isenum = 0; if (argc > 0 && thisobj->objectclass->HasProperty == SEE_native_hasproperty) { SEE_ToString(interp, argv[0], &v); is = SEE_intern(interp, v.u.string); isenum = SEE_native_hasownproperty(interp, thisobj, is) && (SEE_native_getownattr(interp, thisobj, is) & SEE_ATTR_DONTENUM) == 0; } SEE_SET_BOOLEAN(res, isenum); } ��������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_RegExp.c��������������������������������������������������������������0000664�0000000�0000000�00000047663�12660066715�0017552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_RegExp.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if HAVE_STRING_H # include <string.h> #endif #include "see_mem.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_regex.h" #include "see_stringdefs.h" #include "see_init.h" #include "see_nmath.h" #include "see_parse.h" /* * 15.10 The RegExp object. */ /* structure of regexp instances */ struct regexp_object { struct SEE_native native; struct SEE_string *source; unsigned char flags; struct regex *regex; }; /* Prototypes */ static struct regexp_object *toregexp(struct SEE_interpreter *, struct SEE_object *); static void regexp_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void regexp_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void regexp_JS_inst_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static int regexp_hasinstance(struct SEE_interpreter *, struct SEE_object *, struct SEE_value *); static void regexp_proto_exec(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void regexp_proto_test(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void regexp_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void regexp_set_static(struct SEE_interpreter *, struct SEE_string *, struct regex *, struct capture *, struct SEE_string *); /* object class for RegExp constructor */ static struct SEE_objectclass regexp_const_class = { "RegExpConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ regexp_construct, /* Construct */ regexp_call, /* Call */ regexp_hasinstance /* HasInstance */ }; /* object class for RegExp.prototype */ static struct SEE_objectclass regexp_proto_class = { "Object", /* Class 15.10.6 */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; /* object class for regexp instances */ static struct SEE_objectclass regexp_inst_class = { "RegExp", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for regexp instances */ static struct SEE_objectclass regexp_JS_inst_class = { "RegExp", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* enumerator */ NULL, /* Construct */ regexp_JS_inst_call, /* Call */ NULL /* HasInstance */ }; void SEE_RegExp_alloc(interp) struct SEE_interpreter *interp; { interp->RegExp = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->RegExp_prototype = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); } void SEE_RegExp_init(interp) struct SEE_interpreter *interp; { struct SEE_object *RegExp; /* struct SEE_native */ struct SEE_object *RegExp_prototype; /* struct SEE_native */ struct SEE_value v; RegExp = interp->RegExp; RegExp_prototype = interp->RegExp_prototype; SEE_native_init((struct SEE_native *)RegExp, interp, ®exp_const_class, interp->Function_prototype); SEE_SET_NUMBER(&v, 2); SEE_OBJECT_PUT(interp, RegExp, STR(length), &v, /* 15.10.5 */ SEE_ATTR_LENGTH); /* 15.10.6 RegExp.prototype */ SEE_native_init((struct SEE_native *)RegExp_prototype, interp, ®exp_proto_class, interp->Object_prototype); /* XXX Netscape: RegExp.prototype is the regexp instance /(?:)/ */ SEE_SET_OBJECT(&v, RegExp_prototype); /* 15.10.5.1 */ SEE_OBJECT_PUT(interp, RegExp, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.10.6.1 RegExp.prototype.constructor */ SEE_SET_OBJECT(&v, RegExp); SEE_OBJECT_PUT(interp, RegExp_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, \ regexp_proto_##name, STR(name), len)); \ SEE_OBJECT_PUT(interp, RegExp_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(exec, 1) /* 15.10.6.2 */ PUTFUNC(test, 1) /* 15.10.6.3 */ PUTFUNC(toString, 0) /* 15.10.6.4 */ } static struct regexp_object * toregexp(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { if (!SEE_is_RegExp(o)) SEE_error_throw_string(interp, interp->TypeError, STR(not_regexp)); return (struct regexp_object *)o; } /* 15.10.4.1 */ static void regexp_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct regexp_object *ro; struct SEE_value v; int i; ro = SEE_NEW(interp, struct regexp_object); if (SEE_COMPAT_JS(interp, >=, JS11)) SEE_native_init(&ro->native, interp, ®exp_JS_inst_class, interp->RegExp_prototype); else /* ECMA: */ SEE_native_init(&ro->native, interp, ®exp_inst_class, interp->RegExp_prototype); if (argc > 0 && SEE_VALUE_GET_TYPE(argv[0]) == SEE_OBJECT && SEE_is_RegExp(argv[0]->u.object)) { struct regexp_object *rs = (struct regexp_object *)argv[0]->u.object; if (argc > 1 && SEE_VALUE_GET_TYPE(argv[1]) != SEE_UNDEFINED) SEE_error_throw_string(interp, interp->TypeError, STR(regexp_bad_string)); ro->source = rs->source; ro->flags = rs->flags; } else { if (argc < 1 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED) ro->source = STR(empty_string); else { SEE_ToString(interp, argv[0], &v); ro->source = v.u.string; } ro->flags = 0; if (argc > 1) { SEE_ToString(interp, argv[1], &v); for (i = 0; i < v.u.string->length; i++) switch (v.u.string->data[i]) { case 'g': if (ro->flags & FLAG_GLOBAL) goto badflag; ro->flags |= FLAG_GLOBAL; break; case 'i': if (ro->flags & FLAG_IGNORECASE) goto badflag; ro->flags |= FLAG_IGNORECASE; break; case 'm': if (ro->flags & FLAG_MULTILINE) goto badflag; ro->flags |= FLAG_MULTILINE; break; default: badflag: SEE_error_throw_string(interp, interp->SyntaxError, STR(regexp_bad_flag)); } } } ro->regex = SEE_regex_parse(interp, ro->source, ro->flags); /* 15.10.7.1 */ SEE_SET_STRING(&v, ro->source); SEE_OBJECT_PUT(interp, (struct SEE_object *)ro, STR(source), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); /* 15.10.7.2 */ SEE_SET_BOOLEAN(&v, ro->flags & FLAG_GLOBAL); SEE_OBJECT_PUT(interp, (struct SEE_object *)ro, STR(global), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); /* 15.10.7.3 */ SEE_SET_BOOLEAN(&v, ro->flags & FLAG_IGNORECASE); SEE_OBJECT_PUT(interp, (struct SEE_object *)ro, STR(ignoreCase), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); /* 15.10.7.4 */ SEE_SET_BOOLEAN(&v, ro->flags & FLAG_MULTILINE); SEE_OBJECT_PUT(interp, (struct SEE_object *)ro, STR(multiline), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY | SEE_ATTR_DONTENUM); /* 15.10.7.5 */ SEE_SET_NUMBER(&v, 0); /* 15.10.4.1 lastIndex = 0 */ SEE_OBJECT_PUT(interp, (struct SEE_object *)ro, STR(lastIndex), &v, SEE_ATTR_DONTDELETE | SEE_ATTR_DONTENUM); SEE_SET_OBJECT(res, (struct SEE_object *)ro); } /* 15.10.3.1 */ static void regexp_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { if (argc > 0 && SEE_VALUE_GET_TYPE(argv[0]) == SEE_OBJECT && SEE_is_RegExp(argv[0]->u.object) && (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED)) SEE_VALUE_COPY(res, argv[0]); else SEE_OBJECT_CONSTRUCT(interp, self, thisobj, argc, argv, res); } /* JavaScript compatibility: calling a regexp as a function */ static void regexp_JS_inst_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { regexp_proto_exec(interp, NULL, self, argc, argv, res); } static int regexp_hasinstance(interp, self, value) struct SEE_interpreter *interp; struct SEE_object *self; struct SEE_value *value; { if (SEE_COMPAT_JS(interp, >=, JS11)) /* EXT:20 */ return SEE_VALUE_GET_TYPE(value) == SEE_OBJECT && SEE_is_RegExp(value->u.object); else SEE_error_throw_string(interp, interp->TypeError, STR(no_hasinstance)); return 0; } /* 15.10.6.2 RegExp.prototype.exec() */ static void regexp_proto_exec(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct regexp_object *ro; struct SEE_string *S; struct SEE_value v, iv, **elv, *el; unsigned int i, ncaptures; struct capture *captures; struct SEE_object *a; ro = toregexp(interp, thisobj); if (argc < 1) SEE_error_throw_string(interp, interp->RangeError, STR(bad_argc)); SEE_ToString(interp, argv[0], &v); S = v.u.string; SEE_OBJECT_GET(interp, thisobj, STR(lastIndex), &v); SEE_ToNumber(interp, &v, &iv); if (!(ro->flags & FLAG_GLOBAL)) SEE_SET_NUMBER(&iv, 0); if (SEE_NUMBER_ISINF(&iv) || iv.u.number < 0 || iv.u.number > S->length) { SEE_SET_NUMBER(&v, 0); SEE_OBJECT_PUT(interp, thisobj, STR(lastIndex), &v, 0); SEE_SET_NULL(res); return; } i = iv.u.number; ncaptures = SEE_regex_count_captures(ro->regex); SEE_ASSERT(interp, ncaptures > 0); captures = SEE_STRING_ALLOCA(interp, struct capture, ncaptures); while (!SEE_regex_match(interp, ro->regex, S, i, captures)) { i++; if (i > S->length) { SEE_SET_NUMBER(&v, 0); SEE_OBJECT_PUT(interp, thisobj, STR(lastIndex), &v, 0); SEE_SET_NULL(res); for (i = 0; i < ncaptures; i++) captures[i].end = -1; regexp_set_static(interp, S, ro->regex, captures, ro->source); return; } } regexp_set_static(interp, S, ro->regex, captures, ro->source); if ((ro->flags & FLAG_GLOBAL)) { SEE_SET_NUMBER(&v, captures[0].end); SEE_OBJECT_PUT(interp, thisobj, STR(lastIndex), &v, 0); } el = SEE_ALLOCA(interp, struct SEE_value, ncaptures); elv = SEE_ALLOCA(interp, struct SEE_value *, ncaptures); for (i = 0; i < ncaptures; i++) { if (CAPTURE_IS_UNDEFINED(captures[i])) SEE_SET_UNDEFINED(&el[i]); else SEE_SET_STRING(&el[i], SEE_string_substr(interp, S, captures[i].start, captures[i].end - captures[i].start)); elv[i] = &el[i]; } SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, ncaptures, elv, &v); a = v.u.object; SEE_SET_NUMBER(&v, captures[0].start); SEE_OBJECT_PUT(interp, a, STR(index), &v, 0); SEE_SET_STRING(&v, S); SEE_OBJECT_PUT(interp, a, STR(input), &v, 0); SEE_SET_OBJECT(res, a); } int SEE_is_RegExp(o) struct SEE_object *o; { return o->objectclass == ®exp_inst_class || o->objectclass == ®exp_JS_inst_class; } int SEE_RegExp_count_captures(interp, obj) struct SEE_interpreter *interp; struct SEE_object *obj; { struct regexp_object *ro; ro = toregexp(interp, obj); return SEE_regex_count_captures(ro->regex); } int SEE_RegExp_match(interp, obj, text, start, captures) struct SEE_interpreter *interp; struct SEE_object *obj; struct SEE_string *text; unsigned int start; struct capture *captures; { struct regexp_object *ro; int success; unsigned int ncaptures, i; ro = toregexp(interp, obj); ncaptures = SEE_regex_count_captures(ro->regex); success = SEE_regex_match(interp, ro->regex, text, start, captures); if (!success) for (i = 0; i < ncaptures; i++) captures[i].end = -1; regexp_set_static(interp, text, ro->regex, captures, ro->source); return success; } /* 15.10.6.3 RegExp.prototype.test() */ static void regexp_proto_test(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v, exec, a, undef, *exec_argv[1], null; if (argc == 0) { SEE_SET_UNDEFINED(&undef); exec_argv[0] = &undef; } else exec_argv[0] = argv[0]; SEE_OBJECT_GET(interp, interp->RegExp_prototype, STR(exec), &v); SEE_ToObject(interp, &v, &exec); if (!SEE_OBJECT_HAS_CALL(exec.u.object)) SEE_error_throw_string(interp, interp->TypeError, STR(not_callable)); SEE_OBJECT_CALL(interp, exec.u.object, thisobj, 1, exec_argv, &a); SEE_SET_NULL(&null); SEE_SET_BOOLEAN(res, SEE_compare(interp, &a, &null) != 0); } /* 15.10.6.4 RegExp.prototype.toString() */ static void regexp_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct regexp_object *ro; struct SEE_string *s; int i; /* * XXX (spec bug?) 15.10.6 says RegExp.prototype's [[Class]] is * "Object", and that methods where thisobj's [[Class]] is not "RegExp", * it has to throw a TypeError. */ if (SEE_GET_JS_COMPAT(interp) && (thisobj == interp->RegExp_prototype)) { /* * Sadly, mozilla's test cases often want to print the * RegExp.prototype. This special case is handled here. * FIXME - make RegExp.prototype a regexp_inst when compat JS1.1 */ s = SEE_string_new(interp, 0); SEE_string_append(s, STR(RegExp)); SEE_string_addch(s, '.'); SEE_string_append(s, STR(prototype)); SEE_SET_STRING(res, s); return; } ro = toregexp(interp, thisobj); s = SEE_string_new(interp, 0); SEE_string_addch(s, '/'); for (i = 0; i < ro->source->length; i++) { SEE_char_t c = ro->source->data[i]; if (c == '/') SEE_string_addch(s, '\\'); /* escape all forward slashes */ if (c == '\\') { SEE_string_addch(s, '\\'); /* leave escaped chars alone */ if (++i < ro->source->length) c = ro->source->data[i]; else break; /* regex ends with an escape? */ } SEE_string_addch(s, c); } SEE_string_addch(s, '/'); if (ro->flags & FLAG_GLOBAL) SEE_string_addch(s, 'g'); if (ro->flags & FLAG_IGNORECASE) SEE_string_addch(s, 'i'); if (ro->flags & FLAG_MULTILINE) SEE_string_addch(s, 'm'); SEE_SET_STRING(res, s); } /* * Sets the static "$" variables of RegExp: * $1...$9,$_,$*,$+,$`,$',global,ignoreCase,input,lastIndex, * lastMatch,lastParen,leftContext,multiline,rightContext,source */ static void regexp_set_static(interp, S, regex, captures, source) struct SEE_interpreter *interp; struct SEE_string *S; struct regex *regex; struct capture *captures; struct SEE_string *source; { static struct SEE_string * property[] = { STR(dollar_ampersand), STR(dollar_1), STR(dollar_2), STR(dollar_3), STR(dollar_4), STR(dollar_5), STR(dollar_6), STR(dollar_7), STR(dollar_8), STR(dollar_9), }; int i, flags; struct SEE_value v; unsigned int ncaptures; struct SEE_object *RegExp; struct SEE_string *lastParen; /* Only do all this for Netscape compatibility */ if (!SEE_COMPAT_JS(interp, >=, JS11)) /* EXT:21 */ return; RegExp = interp->RegExp; lastParen = STR(empty_string); ncaptures = SEE_regex_count_captures(regex); flags = SEE_regex_get_flags(regex); for (i = 0; i < 10; i++) { if (i < ncaptures && !CAPTURE_IS_UNDEFINED(captures[i])) SEE_SET_STRING(&v, SEE_string_substr(interp, S, captures[i].start, captures[i].end - captures[i].start)); else SEE_SET_STRING(&v, STR(empty_string)); if (i > 0 && i < ncaptures) lastParen = v.u.string; SEE_OBJECT_PUT(interp, RegExp, property[i], &v, SEE_ATTR_DEFAULT); if (property[i] == STR(dollar_ampersand)) /* $&, lastMatch */ SEE_OBJECT_PUT(interp, RegExp, STR(lastMatch), &v, SEE_ATTR_DEFAULT); } /* $*, multiline */ SEE_SET_BOOLEAN(&v, flags & FLAG_MULTILINE); SEE_OBJECT_PUT(interp, RegExp, STR(dollar_star), &v, SEE_ATTR_DEFAULT); SEE_OBJECT_PUT(interp, RegExp, STR(multiline), &v, SEE_ATTR_DEFAULT); /* $_, input */ SEE_SET_STRING(&v, S); SEE_OBJECT_PUT(interp, RegExp, STR(dollar_underscore), &v, SEE_ATTR_DEFAULT); SEE_OBJECT_PUT(interp, RegExp, STR(input), &v, SEE_ATTR_DEFAULT); /* $+, lastParen */ SEE_SET_STRING(&v, lastParen); SEE_OBJECT_PUT(interp, RegExp, STR(dollar_plus), &v, SEE_ATTR_DEFAULT); SEE_OBJECT_PUT(interp, RegExp, STR(lastParen), &v, SEE_ATTR_DEFAULT); /* $`, leftContext */ if (ncaptures && !CAPTURE_IS_UNDEFINED(captures[0])) SEE_SET_STRING(&v, SEE_string_substr(interp, S, 0, captures[0].start)); else SEE_SET_STRING(&v, STR(empty_string)); SEE_OBJECT_PUT(interp, RegExp, STR(dollar_backquote), &v, SEE_ATTR_DEFAULT); SEE_OBJECT_PUT(interp, RegExp, STR(leftContext), &v, SEE_ATTR_DEFAULT); /* $', rightContext */ if (ncaptures && !CAPTURE_IS_UNDEFINED(captures[0])) SEE_SET_STRING(&v, SEE_string_substr(interp, S, captures[0].end, S->length - captures[0].end)); else SEE_SET_STRING(&v, STR(empty_string)); SEE_OBJECT_PUT(interp, RegExp, STR(dollar_quote), &v, SEE_ATTR_DEFAULT); SEE_OBJECT_PUT(interp, RegExp, STR(rightContext), &v, SEE_ATTR_DEFAULT); /* global */ SEE_SET_BOOLEAN(&v, flags & FLAG_GLOBAL); SEE_OBJECT_PUT(interp, RegExp, STR(global), &v, SEE_ATTR_DEFAULT); /* ignoreCase */ SEE_SET_BOOLEAN(&v, flags & FLAG_IGNORECASE); SEE_OBJECT_PUT(interp, RegExp, STR(ignoreCase), &v, SEE_ATTR_DEFAULT); /* lastIndex */ SEE_SET_NUMBER(&v, ncaptures && !(flags & FLAG_GLOBAL) ? captures[0].end : 0); SEE_OBJECT_PUT(interp, RegExp, STR(lastIndex), &v, SEE_ATTR_DEFAULT); /* source */ SEE_SET_STRING(&v, source); SEE_OBJECT_PUT(interp, RegExp, STR(source), &v, SEE_ATTR_DEFAULT); } �����������������������������������������������������������������������������silverjuke-16.2.3/src/see/obj_String.c��������������������������������������������������������������0000664�0000000�0000000�00000104156�12660066715�0017615�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: obj_String.c 1083 2006-05-07 08:24:13Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <string.h> #endif #include "see_mem.h" #include "see_type.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_error.h" #include "see_interpreter.h" #include "see_debug.h" #include "see_stringdefs.h" #include "see_unicode.h" #include "see_array.h" #include "see_regex.h" #include "see_init.h" #include "see_nmath.h" /* * The String object. * 15.5 */ static void string_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_fromCharCode(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_charAt(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_charCodeAt(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_concat(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_indexOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_lastIndexOf(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_localeCompare(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_match(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_replace(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_search(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_slice(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_split(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_substring(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_substr(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_toLowerCase(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_toLocaleLowerCase(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_toUpperCase(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto_toLocaleUpperCase(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void string_proto__ns_nop(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static struct SEE_string *object_to_string(struct SEE_interpreter *, struct SEE_object *); /* object class for String constructor */ static struct SEE_objectclass string_const_class = { "StringConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ string_construct, /* Construct */ string_call /* Call */ }; /* object class for String.prototype and string instances */ static struct SEE_objectclass string_inst_class = { "String", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator /* enumerator */ }; /* structure of string instances */ struct string_object { struct SEE_native native; struct SEE_string *string; /* Value */ }; void SEE_String_alloc(interp) struct SEE_interpreter *interp; { interp->String = (struct SEE_object *)SEE_NEW(interp, struct SEE_native); interp->String_prototype = (struct SEE_object *)SEE_NEW(interp, struct string_object); } void SEE_String_init(interp) struct SEE_interpreter *interp; { struct SEE_object *String; /* struct SEE_native */ struct SEE_object *String_prototype; /* struct string_object */ struct SEE_value v; String = interp->String; SEE_native_init((struct SEE_native *)String, interp, &string_const_class, interp->Function_prototype); String_prototype = interp->String_prototype; SEE_native_init((struct SEE_native *)String_prototype, interp, &string_inst_class, interp->Object_prototype); /* 15.5.4 */ ((struct string_object *)String_prototype)->string = STR(empty_string); /* 15.5.4 */ /* 15.5.3 String.length = 1 */ SEE_SET_NUMBER(&v, 1); SEE_OBJECT_PUT(interp, String, STR(length), &v, SEE_ATTR_LENGTH); /* 15.5.3.1 String.prototype */ SEE_SET_OBJECT(&v, String_prototype); SEE_OBJECT_PUT(interp, String, STR(prototype), &v, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /* 15.5.5.1 String.prototype.length */ SEE_SET_NUMBER(&v, 0); SEE_OBJECT_PUT(interp, String_prototype, STR(length), &v, SEE_ATTR_LENGTH); /* 15.5.3.2 String.fromCharCode */ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, string_fromCharCode, STR(fromCharCode), 1)); SEE_OBJECT_PUT(interp, String, STR(fromCharCode), &v, SEE_ATTR_DEFAULT); /* 15.5.4.1 String.prototype.constructor */ SEE_SET_OBJECT(&v, String); SEE_OBJECT_PUT(interp, String_prototype, STR(constructor), &v, SEE_ATTR_DEFAULT); #define PUTFUNC(name, len) \ SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, \ string_proto_##name, STR(name), len)); \ SEE_OBJECT_PUT(interp, String_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); PUTFUNC(toString, 0) SEE_OBJECT_PUT(interp, String_prototype, STR(valueOf), &v, SEE_ATTR_DEFAULT); /* NB: .valueOf === .toString */ PUTFUNC(charAt, 1) PUTFUNC(charCodeAt, 1) PUTFUNC(concat, 1) PUTFUNC(indexOf, 1) PUTFUNC(lastIndexOf, 1) PUTFUNC(localeCompare, 1) PUTFUNC(match, 1) PUTFUNC(replace, 1) PUTFUNC(search, 1) PUTFUNC(slice, 2) PUTFUNC(split, 2) PUTFUNC(substring, 2) PUTFUNC(toLowerCase, 0) PUTFUNC(toLocaleLowerCase, 0) PUTFUNC(toUpperCase, 0) PUTFUNC(toLocaleUpperCase, 0) if (interp->compatibility & SEE_COMPAT_262_3B || SEE_COMPAT_JS(interp, >= ,JS11)) { PUTFUNC(substr, 2) } if (SEE_COMPAT_JS(interp, >= ,JS11)) { #define PUTNOPFUNC(name, len_IGNORED) \ SEE_OBJECT_PUT(interp, String_prototype, STR(name), &v, \ SEE_ATTR_DEFAULT); SEE_SET_OBJECT(&v, SEE_cfunction_make(interp, string_proto__ns_nop, STR(_ns_nop), 0)); PUTNOPFUNC(anchor, 1) PUTNOPFUNC(big, 0) PUTNOPFUNC(blink, 0) PUTNOPFUNC(bold, 0) PUTNOPFUNC(fixed, 0) PUTNOPFUNC(fontcolor, 1) PUTNOPFUNC(fontsize, 1) PUTNOPFUNC(italics, 0) PUTNOPFUNC(link, 1) PUTNOPFUNC(small, 0) PUTNOPFUNC(strike, 0) PUTNOPFUNC(sub, 0) PUTNOPFUNC(sup, 0) } } /* 15.5.2.1 */ static void string_construct(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { struct string_object *so; struct SEE_value strv, lenv; if (argc == 0) SEE_SET_STRING(&strv, STR(empty_string)); else SEE_ToString(interp, argv[0], &strv); so = SEE_NEW(interp, struct string_object); SEE_native_init(&so->native, interp, &string_inst_class, interp->String_prototype); so->string = strv.u.string; /* 15.5.5.1 length */ SEE_SET_NUMBER(&lenv, so->string->length); SEE_OBJECT_PUT(interp, (struct SEE_object *)so, STR(length), &lenv, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); SEE_SET_OBJECT(res, (struct SEE_object *)so); } /* 15.5.1.1 */ static void string_call(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { if (argc == 0) SEE_SET_STRING(res, STR(empty_string)); else SEE_ToString(interp, argv[0], res); } /* 15.5.3.2 */ static void string_fromCharCode(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { int i; struct SEE_string *s; SEE_char_t ch; s = SEE_string_new(interp, 0); for (i = 0; i < argc; i++) { ch = SEE_ToUint16(interp, argv[i]); SEE_string_addch(s, ch); } SEE_SET_STRING(res, s); } /* 15.5.4.2 String.prototype.toString() */ /* 15.5.4.3 String.prototype.valueOf() */ static void string_proto_toString(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct string_object *so; if (thisobj->objectclass != &string_inst_class) SEE_error_throw_string(interp, interp->TypeError, STR(not_string)); so = (struct string_object *)thisobj; SEE_SET_STRING(res, so->string); } static struct SEE_string * object_to_string(interp, o) struct SEE_interpreter *interp; struct SEE_object *o; { struct SEE_value ov, sv; if (o == NULL) SEE_SET_NULL(&ov); else SEE_SET_OBJECT(&ov, o); SEE_ToString(interp, &ov, &sv); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&sv) == SEE_STRING); return sv.u.string; } /* 15.5.4.4 String.prototype.charAt() */ static void string_proto_charAt(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value vi; struct SEE_string *s; s = object_to_string(interp, thisobj); SEE_ToInteger(interp, argv[0], &vi); if (SEE_NUMBER_ISFINITE(&vi) && vi.u.number >= 0 && vi.u.number < s->length) SEE_SET_STRING(res, SEE_string_substr(interp, s, (unsigned int)vi.u.number, 1)); else SEE_SET_STRING(res, STR(empty_string)); } /* 15.5.4.5 String.prototype.charCodeAt() */ static void string_proto_charCodeAt(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value vi; struct SEE_string *s; s = object_to_string(interp, thisobj); SEE_ToInteger(interp, argv[0], &vi); if (SEE_NUMBER_ISFINITE(&vi) && vi.u.number >= 0 && vi.u.number < s->length) { unsigned int pos = (unsigned int)vi.u.number; SEE_SET_NUMBER(res, s->data[pos]); } else SEE_SET_NUMBER(res, SEE_NaN); } /* 15.5.4.6 String.prototype.concat() */ static void string_proto_concat(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; int i; struct SEE_value v; s = SEE_string_dup(interp, object_to_string(interp, thisobj)); for (i = 0; i < argc; i++) { SEE_ToString(interp, argv[i], &v); SEE_string_append(s, v.u.string); } SEE_SET_STRING(res, s); } /* 15.5.4.7 String.prototype.indexOf() */ static void string_proto_indexOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; struct SEE_value vss, vi; int position; unsigned int k, sslen, slen; s = object_to_string(interp, thisobj); slen = s->length; if (argc < 1) SEE_SET_STRING(&vss, STR(undefined)); else SEE_ToString(interp, argv[0], &vss); sslen = vss.u.string->length; if (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED) position = 0; else { SEE_ToInteger(interp, argv[1], &vi); position = (int)vi.u.number; } if (position < 0) position = 0; if (position > slen) position = slen; if (slen >= sslen) for (k = (unsigned int)position; k <= slen - sslen; k++) if (memcmp(&s->data[k], vss.u.string->data, sslen * sizeof vss.u.string->data[0]) == 0) { SEE_SET_NUMBER(res, k); return; } SEE_SET_NUMBER(res, -1); } /* 15.5.4.8 String.prototype.lastIndexOf() */ static void string_proto_lastIndexOf(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *r1s, *r2s; struct SEE_value r3v, r2v, r4v; int k; unsigned int r5, r6, r7; /*1*/ r1s = object_to_string(interp, thisobj); /*2*/ if (argc > 0) SEE_ToString(interp, argv[0], &r2v); else SEE_SET_STRING(&r2v, STR(undefined)); r2s = r2v.u.string; /*3*/ if (argc > 1 && SEE_VALUE_GET_TYPE(argv[1]) != SEE_UNDEFINED) SEE_ToNumber(interp, argv[1], &r3v); else SEE_SET_NUMBER(&r3v, SEE_NaN); /*4*/ if (SEE_ISNAN(r3v.u.number)) SEE_SET_NUMBER(&r4v, SEE_Infinity); else SEE_ToInteger(interp, &r3v, &r4v); /*5*/ r5 = r1s->length; /*6*/ r6 = (unsigned int)MIN(MAX(r4v.u.number, 0), r5); /*7*/ r7 = r2s->length; /*8*/ if (r5 < r7) { SEE_SET_NUMBER(res, -1); return; } for (k = MIN(r6, r5 - r7); k >= 0; k--) if (memcmp(r1s->data + k, r2s->data, r7 * sizeof (SEE_char_t)) == 0) { SEE_SET_NUMBER(res, k); return; } SEE_SET_NUMBER(res, -1); } /* 15.5.4.9 String.prototype.localeCompare() */ static void string_proto_localeCompare(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { /* * XXX TODO properly: * this function should do some unicode canonicalisation. */ struct SEE_string *s1, *s2; struct SEE_value v2; s1 = object_to_string(interp, thisobj); if (argc < 1) SEE_SET_STRING(&v2, STR(undefined)); else SEE_ToString(interp, argv[1], &v2); s2 = v2.u.string; SEE_SET_NUMBER(res, SEE_string_cmp(s1, s2)); } /* Convert an argument into a RegExp if it isn't already */ static struct SEE_object * regexp_arg(interp, vp) struct SEE_interpreter *interp; struct SEE_value *vp; { struct SEE_value *args[1], v; if (vp == NULL) { SEE_OBJECT_CONSTRUCT(interp, interp->RegExp, interp->RegExp, 0, NULL, &v); return v.u.object; } else if (SEE_VALUE_GET_TYPE(vp) == SEE_OBJECT && SEE_is_RegExp(vp->u.object)) return vp->u.object; else { args[0] = vp; SEE_OBJECT_CONSTRUCT(interp, interp->RegExp, interp->RegExp, 1, args, &v); return v.u.object; } } /* 15.5.4.10 String.prototype.match() */ static void string_proto_match(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_object *regexp, *reexec, *a; struct SEE_value v, *vp, *vpv[1]; struct SEE_string *s, *nstr; SEE_boolean_t global; int n; regexp = regexp_arg(interp, argc < 1 ? NULL : argv[0]); /* fetch the regexp's exec method */ SEE_OBJECT_GET(interp, regexp, STR(exec), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_OBJECT); reexec = v.u.object; /* fetch its global property */ SEE_OBJECT_GET(interp, regexp, STR(global), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_BOOLEAN); global = v.u.boolean; /* s = String(this) */ s = object_to_string(interp, thisobj); if (!global) { SEE_SET_STRING(&v, s); vp = &v; vpv[0] = vp; SEE_OBJECT_CALL(interp, reexec, regexp, 1, vpv, res); } else { /* regexp.lastIndex = 0 */ SEE_SET_NUMBER(&v, 0); SEE_OBJECT_PUT(interp, regexp, STR(lastIndex), &v, 0); /* a = new Array() */ SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, 0, NULL, &v); a = v.u.object; nstr = SEE_string_new(interp, 0); for (n = 0; ; n++) { struct SEE_value vres; /* Call regexp.exec(s) -> array of strings */ SEE_SET_STRING(&v, s); vp = &v; vpv[0] = vp; SEE_OBJECT_CALL(interp, reexec, regexp, 1, vpv, &vres); if (SEE_VALUE_GET_TYPE(&vres) == SEE_NULL) break; SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&vres) == SEE_OBJECT && SEE_is_Array(vres.u.object)); SEE_OBJECT_GET(interp, vres.u.object, STR(zero_digit), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_STRING); /* a[n] = result string */ nstr->length = 0; SEE_string_append_int(nstr, n); /* nstr = String(n) */ SEE_OBJECT_PUT(interp, a, nstr, &v, 0); if (v.u.string->length == 0) { /* Increment the index by one if it matched empty */ SEE_OBJECT_GET(interp, regexp, STR(lastIndex), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_NUMBER); v.u.number += 1; SEE_OBJECT_PUT(interp, regexp, STR(lastIndex), &v, 0); } } SEE_SET_OBJECT(res, a); } } /* Expand replace using array a, appending to out. Updates *previndexp */ static void replace_helper(interp, previndexp, out, a, source, replacev, ncaps) struct SEE_interpreter *interp; unsigned int *previndexp; struct SEE_object *a; struct SEE_string *out, *source; struct SEE_value *replacev; int ncaps; { struct SEE_value v, v2; int n; unsigned int index, i, j, k; struct SEE_string *ns = NULL; struct SEE_string *ms = NULL; struct SEE_string *replace; /* get the index of the match string */ SEE_OBJECT_GET(interp, a, STR(index), &v); index = SEE_ToUint32(interp, &v); /* get the match string */ SEE_OBJECT_GET(interp, a, STR(zero_digit), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_STRING); ms = v.u.string; /* Copy the intermediate characters we missed */ for (i = *previndexp; i < index; i++) SEE_string_addch(out, source->data[i]); *previndexp = index + ms->length; if (SEE_VALUE_GET_TYPE(replacev) == SEE_OBJECT) { struct SEE_value **av, *vp; av = SEE_ALLOCA(interp, struct SEE_value *, ncaps + 2); vp = SEE_ALLOCA(interp, struct SEE_value, ncaps + 2); for (i = 0; i < ncaps + 2; i++) av[i] = &vp[i]; SEE_OBJECT_GET(interp, a, STR(zero_digit), &vp[0]); for (i = 1; i < ncaps; i++) { if (ns == NULL) ns = SEE_string_new(interp, 0); ns->length = 0; SEE_string_append_int(ns, i); SEE_OBJECT_GET(interp, a, ns, &vp[i]); } SEE_SET_NUMBER(&vp[ncaps], index); SEE_SET_STRING(&vp[ncaps + 1], source); SEE_OBJECT_CALL(interp, replacev->u.object, replacev->u.object, ncaps + 2, av, &v); SEE_ToString(interp, &v, &v2); SEE_string_append(out, v2.u.string); return; } SEE_ToString(interp, replacev, &v); replace = v.u.string; /* Expand the replace text */ i = 0; while (i < replace->length) if (replace->data[i] == '$' && i + 1 < replace->length) { i++; switch (replace->data[i]) { case '$': SEE_string_addch(out, '$'); i++; continue; case '`': for (k = 0; k < index; k++) SEE_string_addch(out, source->data[k]); i++; continue; case '\'': for (k = *previndexp; k < source->length; k++) SEE_string_addch(out, source->data[k]); i++; continue; case '&': SEE_string_append(out, ms); i++; continue; } j = i; n = 0; while (j < replace->length && replace->data[j] >= '0' && replace->data[j] <= '9') n = n * 10 + replace->data[j++] - '0'; if (j == i) { /* Didn't see any digits */ SEE_string_addch(out, '$'); continue; } /* Build up an index into the capture array */ if (ns == NULL) ns = SEE_string_new(interp, 0); ns->length = 0; SEE_string_append_int(ns, n); /* fetch the captured substring */ SEE_OBJECT_GET(interp, a, ns, &v); if (SEE_VALUE_GET_TYPE(&v) != SEE_UNDEFINED) { SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_STRING); SEE_string_append(out, v.u.string); } i = j; } else { SEE_string_addch(out, replace->data[i]); i++; } } /* 15.5.4.11 String.prototype.replace() */ static void string_proto_replace(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_object *regexp, *reexec; struct SEE_value v, *vp, *vpv[1], v2, *replacev, replv; struct SEE_string *s, *out = NULL; SEE_boolean_t global; int ncaps; unsigned int previndex = 0; regexp = regexp_arg(interp, argc < 1 ? NULL : argv[0]); ncaps = SEE_RegExp_count_captures(interp, regexp); /* Convert the replace arg to a string or callable function */ if (argc < 2) { SEE_SET_STRING(&replv, STR(empty_string)); replacev = &replv; } else if (SEE_VALUE_GET_TYPE(argv[1]) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(argv[1]->u.object)) replacev = argv[1]; else { SEE_ToString(interp, argv[1], &replv); replacev = &replv; } /* fetch the regexp's exec method */ SEE_OBJECT_GET(interp, regexp, STR(exec), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_OBJECT); reexec = v.u.object; /* fetch its global property */ SEE_OBJECT_GET(interp, regexp, STR(global), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_BOOLEAN); global = v.u.boolean; /* s = String(this) */ s = object_to_string(interp, thisobj); if (!global) { SEE_SET_STRING(&v, s); vp = &v; vpv[0] = vp; SEE_OBJECT_CALL(interp, reexec, regexp, 1, vpv, &v2); if (SEE_VALUE_GET_TYPE(&v2) != SEE_NULL) { SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v2) == SEE_OBJECT && SEE_is_Array(v2.u.object)); out = SEE_string_new(interp, 0); replace_helper(interp, &previndex, out, v2.u.object, s, replacev, ncaps); } } else { /* regexp.lastIndex = 0 */ SEE_SET_NUMBER(&v, 0); SEE_OBJECT_PUT(interp, regexp, STR(lastIndex), &v, 0); for (;;) { struct SEE_value vres; /* Call regexp.exec(s) -> array of strings */ SEE_SET_STRING(&v, s); vp = &v; vpv[0] = vp; SEE_OBJECT_CALL(interp, reexec, regexp, 1, vpv, &vres); if (SEE_VALUE_GET_TYPE(&vres) == SEE_NULL) break; SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&vres) == SEE_OBJECT && SEE_is_Array(vres.u.object)); SEE_OBJECT_GET(interp, vres.u.object, STR(zero_digit), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_STRING); if (v.u.string->length != 0) { if (out == NULL) out = SEE_string_new(interp, 0); replace_helper(interp, &previndex, out, vres.u.object, s, replacev, ncaps); } else { /* Increment the index by one if it matched empty */ SEE_OBJECT_GET(interp, regexp, STR(lastIndex), &v); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&v) == SEE_NUMBER); v.u.number += 1; SEE_OBJECT_PUT(interp, regexp, STR(lastIndex), &v, 0); } } } if (out) /* Copy rest of source text */ while (previndex < s->length) SEE_string_addch(out, s->data[previndex++]); else out = s; SEE_SET_STRING(res, out); } /* 15.5.4.12 String.prototype.search() */ static void string_proto_search(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; struct SEE_object *regexp; int ncaps; struct capture *captures; int index; s = object_to_string(interp, thisobj); regexp = regexp_arg(interp, argc < 1 ? NULL : argv[0]); ncaps = SEE_RegExp_count_captures(interp, regexp); captures = SEE_STRING_ALLOCA(interp, struct capture, ncaps); /* * As this function is not supposed to touch the regexp object's * lastIndex property , and ignore its global property, * it is a perfect candidate for calling the regex * engine (nearly) directly. */ for (index = 0; index < s->length; index++) if (SEE_RegExp_match(interp, regexp, s, index, captures)) { SEE_SET_NUMBER(res, captures[0].start); return; } SEE_SET_NUMBER(res, -1); } /* 15.5.4.13 String.prototype.slice() */ static void string_proto_slice(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; struct SEE_value vs, ve; int start, end, len; s = object_to_string(interp, thisobj); if (argc < 1) SEE_SET_NUMBER(&vs, 0); else SEE_ToInteger(interp, argv[0], &vs); if (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED) SEE_SET_NUMBER(&ve, s->length); else SEE_ToInteger(interp, argv[1], &ve); if (vs.u.number < 0) start = MAX(s->length + vs.u.number, 0); else start = MIN(vs.u.number, s->length); if (ve.u.number < 0) end = MAX(s->length + ve.u.number, 0); else end = MIN(ve.u.number, s->length); len = MAX(end - start, 0); if (len == 0) SEE_SET_STRING(res, STR(empty_string)); else SEE_SET_STRING(res, SEE_string_substr(interp, s, start, len)); } /* * Helper function for String.prototype.split(). * spec bug: SplitMatch takes parameters in the order (R,S,q), not (S,q,R). */ static int SplitMatch(interp, R, S, q, captures) struct SEE_interpreter *interp; struct SEE_value *R; struct SEE_string *S; int q; struct capture *captures; { int r, s, i; if (SEE_VALUE_GET_TYPE(R) != SEE_OBJECT) { r = R->u.string->length; s = S->length; if (q + r > s) return 0; for (i = 0; i < r; i++) if (S->data[q+i] != R->u.string->data[i]) return 0; captures[0].start = q; /* NB: ncap == 1 */ captures[0].end = q+r; return 1; } else return SEE_RegExp_match(interp, R->u.object, S, q, captures); } /* 15.5.4.14 String.prototype.split() */ static void string_proto_split(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_value v, separatorv, *R; struct SEE_object *A; struct SEE_string *S, *T; SEE_uint32_t lim; int p, s, ncap, z, e, q, i; struct capture *captures = NULL; /*1*/ S = object_to_string(interp, thisobj); /*2*/ SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, 0, NULL, res); A = res->u.object; /*3*/ if (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED) lim = 0xffffffff; else lim = SEE_ToUint32(interp, argv[1]); /*4*/ s = S->length; if (s == 0 && SEE_COMPAT_JS(interp, == ,JS12)) return; /*5*/ p = 0; /*6*/ if (argc < 1 || SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED) { SEE_SET_STRING(&separatorv, STR(undefined)); R = &separatorv; ncap = 1; } else if (SEE_VALUE_GET_TYPE(argv[0]) == SEE_OBJECT && SEE_is_RegExp(argv[0]->u.object)) { R = argv[0]; ncap = SEE_RegExp_count_captures(interp, R->u.object); } else { SEE_ToString(interp, argv[0], &separatorv); if (SEE_COMPAT_JS(interp, == ,JS12) && separatorv.u.string->length == 1 && separatorv.u.string->data[0] == ' ') { struct SEE_value a, *av[1]; struct SEE_string *wss = SEE_string_new(interp, 3); SEE_string_addch(wss, '\\'); SEE_string_addch(wss, 's'); SEE_string_addch(wss, '+'); SEE_SET_STRING(&a, wss); av[0] = &a; SEE_OBJECT_CONSTRUCT(interp, interp->RegExp, interp->Global, 1, av, &separatorv); while (p < s && UNICODE_IS_Zs(S->data[p])) p++; } R = &separatorv; ncap = 1; } if (ncap) captures = SEE_STRING_ALLOCA(interp, struct capture, ncap); /*7*/ if (lim == 0) return; /*8*/ if (argc < 1 || (SEE_VALUE_GET_TYPE(argv[0]) == SEE_UNDEFINED && !SEE_GET_JS_COMPAT(interp))) goto step33; /*9*/ if (s == 0) goto step31; step10: q = p; step11: if (q == s) goto step28; /*12*/ z = SplitMatch(interp, R, S, q, captures); /*13*/ if (!z) goto step26; /*14*/ e = captures[0].end; /*15*/ if (e == p) goto step26; /*16*/ T = SEE_string_substr(interp, S, p, q-p); /*17*/ SEE_SET_STRING(&v, T); SEE_Array_push(interp, A, &v); /*18*/ if (SEE_Array_length(interp, A) == lim) return; /*19*/ p = e; /*20*/ i = 0; step21: if (i == ncap - 1) goto step10; /*22*/ i++; /*23*/ if (CAPTURE_IS_UNDEFINED(captures[i])) SEE_SET_UNDEFINED(&v); else SEE_SET_STRING(&v, SEE_string_substr(interp, S, captures[i].start, captures[i].end - captures[i].start)); SEE_Array_push(interp, A, &v); /*24*/ if (SEE_Array_length(interp, A) == lim) return; /*25*/ goto step21; step26: q++; /*27*/ goto step11; step28: T = SEE_string_substr(interp, S, p, s-p); /*29*/ SEE_SET_STRING(&v, T); SEE_Array_push(interp, A, &v); /*30*/ return; step31: z = SplitMatch(interp, R, S, 0, captures); /*32*/ if (z) return; step33: SEE_SET_STRING(&v, S); SEE_Array_push(interp, A, &v); /*34*/ return; } /* String("A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/)) */ /* 15.5.4.15 String.prototype.substring() */ static void string_proto_substring(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; int a, b, start, end, len; struct SEE_value v; s = object_to_string(interp, thisobj); if (argc < 1) a = 0; else { SEE_ToInteger(interp, argv[0], &v); if (SEE_NUMBER_ISNAN(&v)) a = 0; else a = MIN(MAX(v.u.number, 0), s->length); } if (argc < 2) b = s->length; else if (SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED) b = s->length; else { SEE_ToInteger(interp, argv[1], &v); if (SEE_NUMBER_ISNAN(&v)) b = 0; else b = MIN(MAX(v.u.number, 0), s->length); } start = MIN(a,b); end = MAX(a,b); len = end - start; if (len == 0) SEE_SET_STRING(res, STR(empty_string)); else SEE_SET_STRING(res, SEE_string_substr(interp, s, start, len)); } /* B.2.3 String.prototype.substr() */ static void string_proto_substr(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s; int start, len; struct SEE_value v; s = object_to_string(interp, thisobj); if (argc < 1) SEE_SET_NUMBER(&v, 0); else SEE_ToInteger(interp, argv[0], &v); if (v.u.number < 0) start = MAX(s->length + v.u.number, 0); else start = MIN(v.u.number, s->length); if (argc < 2 || SEE_VALUE_GET_TYPE(argv[1]) == SEE_UNDEFINED) len = s->length - start; else { SEE_ToInteger(interp, argv[1], &v); len = MIN(v.u.number, s->length - start); } if (len == 0) SEE_SET_STRING(res, STR(empty_string)); else SEE_SET_STRING(res, SEE_string_substr(interp, s, start, len)); } /* 15.5.4.16 String.prototype.toLowerCase() */ static void string_proto_toLowerCase(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s, *rs; int i; s = object_to_string(interp, thisobj); if (s->length == 0) { SEE_SET_STRING(res, STR(empty_string)); return; } rs = SEE_string_new(interp, s->length); for (i = 0; i < s->length; i++) { SEE_char_t c = UNICODE_TOLOWER(s->data[i]); SEE_string_addch(rs, c); } SEE_SET_STRING(res, rs); } /* 15.5.4.17 String.prototype.toLocaleLowerCase() */ static void string_proto_toLocaleLowerCase(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { /* XXX TODO properly */ string_proto_toLowerCase(interp, self, thisobj, argc, argv, res); } /* 15.5.4.18 String.prototype.toUpperCase() */ static void string_proto_toUpperCase(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_string *s, *rs; int i; s = object_to_string(interp, thisobj); if (s->length == 0) { SEE_SET_STRING(res, STR(empty_string)); return; } rs = SEE_string_new(interp, s->length); for (i = 0; i < s->length; i++) { SEE_char_t c = UNICODE_TOUPPER(s->data[i]); SEE_string_addch(rs, c); } SEE_SET_STRING(res, rs); } /* 15.5.4.19 String.prototype.toLocaleUpperCase() */ static void string_proto_toLocaleUpperCase(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { /* XXX TODO properly */ string_proto_toUpperCase(interp, self, thisobj, argc, argv, res); } static void string_proto__ns_nop(interp, self, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *self, *thisobj; int argc; struct SEE_value **argv, *res; { string_proto_toString(interp, NULL, thisobj, 0, NULL, res); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/object.c������������������������������������������������������������������0000664�0000000�0000000�00000010121�12660066715�0016747�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2004 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: object.c 1108 2006-08-01 14:22:09Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if HAVE_STRING_H # include <string.h> #endif #include "see_value.h" #include "see_object.h" #include "see_interpreter.h" #include "see_try.h" #include "see_error.h" #include "see_string.h" #include "see_system.h" #include "see_stringdefs.h" static void transit_sec_domain(struct SEE_interpreter *, struct SEE_object *); /* * Transits a security domain. */ static void transit_sec_domain(interp, obj) struct SEE_interpreter *interp; struct SEE_object *obj; { void *sec_domain; if (SEE_system.transit_sec_domain && SEE_OBJECT_HAS_GET_SEC_DOMAIN(obj)) { sec_domain = SEE_OBJECT_GET_SEC_DOMAIN(interp, obj); if (interp->sec_domain != sec_domain) SEE_system.transit_sec_domain(interp, sec_domain); } } /* * Calls the object method, after checking that any recursion * limit has not been reached. */ void SEE_object_call(interp, obj, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *obj; struct SEE_object *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { SEE_try_context_t c; int saved_recursion_limit = interp->recursion_limit; void *saved_sec_domain = interp->sec_domain; if (interp->recursion_limit == 0) SEE_error_throw_string(interp, interp->Error, STR(recursion_limit_reached)); else if (interp->recursion_limit > 0) interp->recursion_limit--; transit_sec_domain(interp, obj); SEE_TRY(interp, c) { _SEE_OBJECT_CALL(interp, obj, thisobj, argc, argv, res); } interp->sec_domain = saved_sec_domain; interp->recursion_limit = saved_recursion_limit; SEE_DEFAULT_CATCH(interp, c); } /* * Calls the object constructor, after checking that any recursion * limit has not been reached. */ void SEE_object_construct(interp, obj, thisobj, argc, argv, res) struct SEE_interpreter *interp; struct SEE_object *obj; struct SEE_object *thisobj; int argc; struct SEE_value **argv; struct SEE_value *res; { SEE_try_context_t c; int saved_recursion_limit = interp->recursion_limit; void *saved_sec_domain = interp->sec_domain; if (interp->recursion_limit == 1) { interp->recursion_limit = 0; SEE_error_throw_string(interp, interp->Error, STR(recursion_limit_reached)); } else if (interp->recursion_limit > 0) interp->recursion_limit--; transit_sec_domain(interp, obj); SEE_TRY(interp, c) { _SEE_OBJECT_CONSTRUCT(interp, obj, thisobj, argc, argv, res); } interp->sec_domain = saved_sec_domain; interp->recursion_limit = saved_recursion_limit; SEE_DEFAULT_CATCH(interp, c); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/parse.c�������������������������������������������������������������������0000664�0000000�0000000�00000745270�12660066715�0016637�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: parse.c 1126 2006-08-05 12:48:25Z d $ */ /* * Combined parser and evaluator. * * This file contains two threads (storylines): the LL(2) recursive * descent parser thread, and the semantic functions thread. The parsing and * semantics stages are grouped together by their common productions in the * grammar, to facilitate reference to the ECMA-262 standard. * * The input to the parser is an instance of the lexical analyser. * The output of the parser is an abstract syntax tree (AST). The input to * the evaluator is the AST, and the output of the evaluator is a SEE_value. * * For each production PROD in the grammar, the function PROD_parse() * allocates and populates a 'node' structure, representing the root * of the syntax tree that represents the parsed production. Each node * holds a 'nodeclass' pointer to semantics information as well as * production-specific information. * * Names of structures and functions have been chosen to correspond * with the production names from the standard's grammar. * * The semantic functions in each node class are the following: * * - PROD_eval() functions are called at runtime to implement * the behaviour of the program. They "evaluate" the program. * * - PROD_fproc() functions are called at execution time to generate * the name/value bindings between container objects and included * function objects. (It finds functions and assigns them to properties.) * They provide a parallel, but independent, recusive semantic operation * described in the standard as "process[ing] for function * declarations". * * - PROD_print() functions are used to print the abstract syntax tree * to stdout during debugging. * * TODO This file is far too big; need to split it up. * TODO Compact/bytecode intermediate form * */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> # include <stdlib.h> #endif #include "see_mem.h" #include "see_string.h" #include "see_value.h" #include "see_intern.h" #include "see_object.h" #include "see_cfunction.h" #include "see_input.h" #include "see_eval.h" #include "see_try.h" #include "see_error.h" #include "see_debug.h" #include "see_interpreter.h" #include "see_context.h" #include "see_system.h" #include "see_lex.h" #include "see_parse.h" #include "see_scope.h" #include "see_function.h" #include "see_enumerate.h" #include "see_tokens.h" #include "see_stringdefs.h" #include "see_dtoa.h" #include "see_dprint.h" #ifndef NDEBUG int SEE_parse_debug = 0; int SEE_eval_debug = 0; #endif /*------------------------------------------------------------ * structure types */ /* * Abstract syntax tree basic structure */ struct node; #if WITH_PARSER_PRINT struct printer; #endif #if WITH_PARSER_VISIT typedef void (*visitor_fn_t)(struct node *, void *); #endif struct nodeclass { #ifndef NDEBUG const char *decl_file; int decl_line; struct nodeclass *superclass; # define SUPERCLASS(cls) __FILE__, __LINE__, &cls##_nodeclass, # define BASECLASS __FILE__, __LINE__, NULL, #else # define SUPERCLASS(cls) # define BASECLASS #endif void (*eval)(struct node *, struct SEE_context *, struct SEE_value *); void (*fproc)(struct node *, struct SEE_context *); #if WITH_PARSER_PRINT void (*print)(struct node *, struct printer *); #endif #if WITH_PARSER_VISIT void (*visit)(struct node *, visitor_fn_t, void *); #endif int (*isconst)(struct node *, struct SEE_interpreter *); }; #if WITH_PARSER_PRINT # define PARSER_PRINT(fn) fn, #else # define PARSER_PRINT(fn) /* empty */ #endif #if WITH_PARSER_VISIT # define PARSER_VISIT(fn) fn, #else # define PARSER_VISIT(fn) /* empty */ #endif struct node { struct nodeclass *nodeclass; struct SEE_throw_location location; int isconst_valid : 1; /* true if isconst is valid */ int isconst : 1; /* true if node is a constant eval */ }; struct label { struct SEE_string *name; /* interned */ struct SEE_string *labelset; struct SEE_throw_location location; struct label *next; int continuable; /* can be target of continue */ }; #define COPY_LABELSET(dst, src) labelset_copy(dst, src); #define UNGET_MAX 3 struct parser { struct SEE_interpreter *interpreter; struct lex *lex; int unget, unget_end; struct SEE_value unget_val[UNGET_MAX]; int unget_tok[UNGET_MAX]; int unget_lin[UNGET_MAX]; SEE_boolean_t unget_fnl[UNGET_MAX]; int noin; /* ignore 'in' in RelationalExpression */ int is_lhs; /* derived LeftHandSideExpression */ int funcdepth; struct SEE_string*current_labelset; struct label *labels; struct var **vars; /* list of declared variables */ }; #if WITH_PARSER_PRINT struct printerclass { void (*print_string)(struct printer *, struct SEE_string *); void (*print_char)(struct printer *, int); void (*print_newline)(struct printer *, int); void (*print_node)(struct printer *, struct node *); }; struct printer { struct printerclass *printerclass; struct SEE_interpreter *interpreter; int indent; int bol; }; #endif struct Targetable_node { struct node node; void *target; }; /*------------------------------------------------------------ * function prototypes */ struct Arguments_node; struct ArrayLiteral_node; struct AssignmentExpression_node; struct Binary_node; struct BreakStatement_node; struct CallExpression_node; struct ConditionalExpression_node; struct ContinueStatement_node; struct Function_node; struct IfStatement_node; struct IterationStatement_for_node; struct IterationStatement_forin_node; struct IterationStatement_while_node; struct Literal_node; struct MemberExpression_bracket_node; struct MemberExpression_dot_node; struct MemberExpression_new_node; struct ObjectLiteral_node; struct PrimaryExpression_ident_node; struct RegularExpressionLiteral_node; struct ReturnStatement_node; struct SourceElements_node; struct StringLiteral_node; struct SwitchStatement_node; struct TryStatement_node; struct Unary_node; struct VariableDeclaration_node; static struct nodeclass Unary_nodeclass, Binary_nodeclass, Literal_nodeclass, StringLiteral_nodeclass, RegularExpressionLiteral_nodeclass, PrimaryExpression_this_nodeclass, PrimaryExpression_ident_nodeclass, ArrayLiteral_nodeclass, ObjectLiteral_nodeclass, Arguments_nodeclass, MemberExpression_new_nodeclass, MemberExpression_dot_nodeclass, MemberExpression_bracket_nodeclass, CallExpression_nodeclass, PostfixExpression_inc_nodeclass, PostfixExpression_dec_nodeclass, UnaryExpression_delete_nodeclass, UnaryExpression_void_nodeclass, UnaryExpression_typeof_nodeclass, UnaryExpression_preinc_nodeclass, UnaryExpression_predec_nodeclass, UnaryExpression_plus_nodeclass, UnaryExpression_minus_nodeclass, UnaryExpression_inv_nodeclass, UnaryExpression_not_nodeclass, MultiplicativeExpression_mul_nodeclass, MultiplicativeExpression_div_nodeclass, MultiplicativeExpression_mod_nodeclass, AdditiveExpression_add_nodeclass, AdditiveExpression_sub_nodeclass, ShiftExpression_lshift_nodeclass, ShiftExpression_rshift_nodeclass, ShiftExpression_urshift_nodeclass, RelationalExpression_lt_nodeclass, RelationalExpression_gt_nodeclass, RelationalExpression_le_nodeclass, RelationalExpression_ge_nodeclass, RelationalExpression_instanceof_nodeclass, RelationalExpression_in_nodeclass, EqualityExpression_eq_nodeclass, EqualityExpression_ne_nodeclass, EqualityExpression_seq_nodeclass, EqualityExpression_sne_nodeclass, BitwiseANDExpression_nodeclass, BitwiseXORExpression_nodeclass, BitwiseORExpression_nodeclass, LogicalANDExpression_nodeclass, LogicalORExpression_nodeclass, ConditionalExpression_nodeclass, AssignmentExpression_nodeclass, AssignmentExpression_simple_nodeclass, AssignmentExpression_muleq_nodeclass, AssignmentExpression_diveq_nodeclass, AssignmentExpression_modeq_nodeclass, AssignmentExpression_addeq_nodeclass, AssignmentExpression_subeq_nodeclass, AssignmentExpression_lshifteq_nodeclass, AssignmentExpression_rshifteq_nodeclass, AssignmentExpression_urshifteq_nodeclass, AssignmentExpression_andeq_nodeclass, AssignmentExpression_xoreq_nodeclass, AssignmentExpression_oreq_nodeclass, Expression_comma_nodeclass, Block_empty_nodeclass, StatementList_nodeclass, VariableStatement_nodeclass, VariableDeclarationList_nodeclass, VariableDeclaration_nodeclass, EmptyStatement_nodeclass, ExpressionStatement_nodeclass, IfStatement_nodeclass, IterationStatement_dowhile_nodeclass, IterationStatement_while_nodeclass, IterationStatement_for_nodeclass, IterationStatement_forvar_nodeclass, IterationStatement_forin_nodeclass, IterationStatement_forvarin_nodeclass, ContinueStatement_nodeclass, BreakStatement_nodeclass, ReturnStatement_nodeclass, ReturnStatement_undef_nodeclass, WithStatement_nodeclass, SwitchStatement_nodeclass, LabelledStatement_nodeclass, ThrowStatement_nodeclass, TryStatement_nodeclass, TryStatement_catch_nodeclass, TryStatement_finally_nodeclass, TryStatement_catchfinally_nodeclass, Function_nodeclass, FunctionDeclaration_nodeclass, FunctionExpression_nodeclass, FunctionBody_nodeclass, SourceElements_nodeclass; static struct node *new_node(struct parser *parser, int sz, struct nodeclass *nc, const char *dbg_nc); static struct node *cast_node(struct node *na, struct nodeclass *nc, const char *cname, const char *file, int line); static void parser_init(struct parser *parser, struct SEE_interpreter *interp, struct lex *lex); static void label_push(struct parser *parser, struct SEE_string *name, struct SEE_string *labelset, int continuable); static void label_pop(struct parser *parser); static void label_set_continuable(struct parser *parser, struct SEE_string *labelset); static struct label *label_lookup(struct parser *parser, struct SEE_string *name, int kind); static int lookahead(struct parser *parser, int n); static void trace_event(struct SEE_context *ctxt, enum SEE_trace_event); static struct SEE_traceback *traceback_enter(struct SEE_interpreter *interp, struct SEE_object *callee, struct SEE_throw_location *loc, int call_type); static void traceback_leave(struct SEE_interpreter *interp, struct SEE_traceback *old_tb); static void GetValue(struct SEE_context *context, struct SEE_value *v, struct SEE_value *res); static void PutValue(struct SEE_context *context, struct SEE_value *v, struct SEE_value *w); static struct SEE_string *error_at(struct parser *parser, const char *fmt, ...); static int Always_isconst(struct node *na, struct SEE_interpreter *interp); static void Literal_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *Literal_parse(struct parser *parser); static struct node *NumericLiteral_parse(struct parser *parser); static void StringLiteral_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *StringLiteral_parse(struct parser *parser); static void RegularExpressionLiteral_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *RegularExpressionLiteral_parse(struct parser *parser); static void PrimaryExpression_this_eval(struct node *n, struct SEE_context *context, struct SEE_value *res); static void PrimaryExpression_ident_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *PrimaryExpression_parse(struct parser *parser); static void ArrayLiteral_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ArrayLiteral_parse(struct parser *parser); static void ObjectLiteral_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ObjectLiteral_parse(struct parser *parser); static void Arguments_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int Arguments_isconst(struct node *na, struct SEE_interpreter *interp); static struct Arguments_node *Arguments_parse(struct parser *parser); static void MemberExpression_new_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void MemberExpression_dot_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void MemberExpression_bracket_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *MemberExpression_parse(struct parser *parser); static void CallExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *LeftHandSideExpression_parse(struct parser *parser); static int Unary_isconst(struct node *na, struct SEE_interpreter *interp); static void PostfixExpression_inc_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void PostfixExpression_dec_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *PostfixExpression_parse(struct parser *parser); static void UnaryExpression_delete_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_void_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_typeof_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_preinc_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_predec_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_plus_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_minus_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_inv_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void UnaryExpression_not_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *UnaryExpression_parse(struct parser *parser); static int Binary_isconst(struct node *na, struct SEE_interpreter *interp); static void MultiplicativeExpression_mul_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void MultiplicativeExpression_mul_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void MultiplicativeExpression_div_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void MultiplicativeExpression_div_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void MultiplicativeExpression_mod_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void MultiplicativeExpression_mod_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *MultiplicativeExpression_parse(struct parser *parser); static void AdditiveExpression_add_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void AdditiveExpression_add_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AdditiveExpression_sub_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void AdditiveExpression_sub_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *AdditiveExpression_parse(struct parser *parser); static void ShiftExpression_lshift_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void ShiftExpression_lshift_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void ShiftExpression_rshift_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void ShiftExpression_rshift_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void ShiftExpression_urshift_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void ShiftExpression_urshift_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ShiftExpression_parse(struct parser *parser); static void RelationalExpression_sub(struct SEE_interpreter *interp, struct SEE_value *x, struct SEE_value *y, struct SEE_value *res); static void RelationalExpression_lt_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void RelationalExpression_gt_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void RelationalExpression_le_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void RelationalExpression_ge_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void RelationalExpression_instanceof_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void RelationalExpression_in_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *RelationalExpression_parse(struct parser *parser); static void EqualityExpression_eq(struct SEE_interpreter *interp, struct SEE_value *x, struct SEE_value *y, struct SEE_value *res); static void EqualityExpression_seq(struct SEE_context *context, struct SEE_value *x, struct SEE_value *y, struct SEE_value *res); static void EqualityExpression_eq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void EqualityExpression_ne_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void EqualityExpression_seq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void EqualityExpression_sne_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *EqualityExpression_parse(struct parser *parser); static void BitwiseANDExpression_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void BitwiseANDExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *BitwiseANDExpression_parse(struct parser *parser); static void BitwiseXORExpression_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void BitwiseXORExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *BitwiseXORExpression_parse(struct parser *parser); static void BitwiseORExpression_common(struct SEE_value *r2, struct node *bn, struct SEE_context *context, struct SEE_value *res); static void BitwiseORExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *BitwiseORExpression_parse(struct parser *parser); static void LogicalANDExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int LogicalANDExpression_isconst(struct node *na, struct SEE_interpreter *interp); static struct node *LogicalANDExpression_parse(struct parser *parser); static void LogicalORExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int LogicalORExpression_isconst(struct node *na, struct SEE_interpreter *interp); static struct node *LogicalORExpression_parse(struct parser *parser); static void ConditionalExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int ConditionalExpression_isconst(struct node *na, struct SEE_interpreter *interp); static struct node *ConditionalExpression_parse(struct parser *parser); static void AssignmentExpression_simple_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_muleq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_diveq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_modeq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_addeq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_subeq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_lshifteq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_rshifteq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_urshifteq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_andeq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_xoreq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void AssignmentExpression_oreq_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *AssignmentExpression_parse(struct parser *parser); static void Expression_comma_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *Expression_parse(struct parser *parser); static struct node *Statement_parse(struct parser *parser); static void Block_empty_eval(struct node *n, struct SEE_context *context, struct SEE_value *res); static struct node *Block_parse(struct parser *parser); static void StatementList_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *StatementList_parse(struct parser *parser); static void VariableStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *VariableStatement_parse(struct parser *parser); static void VariableDeclarationList_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *VariableDeclarationList_parse(struct parser *parser); static void VariableDeclaration_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *VariableDeclaration_parse(struct parser *parser); static void EmptyStatement_eval(struct node *n, struct SEE_context *context, struct SEE_value *res); static struct node *EmptyStatement_parse(struct parser *parser); static void ExpressionStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ExpressionStatement_parse(struct parser *parser); static void IfStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int IfStatement_isconst(struct node *na, struct SEE_interpreter *interp); static struct node *IfStatement_parse(struct parser *parser); static void IterationStatement_dowhile_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int IterationStatement_dowhile_isconst(struct node *na, struct SEE_interpreter *interp); static void IterationStatement_while_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int IterationStatement_while_isconst(struct node *na, struct SEE_interpreter *interp); static void IterationStatement_for_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static int IterationStatement_for_isconst(struct node *na, struct SEE_interpreter *interp); static void IterationStatement_forvar_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void IterationStatement_forin_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void IterationStatement_forvarin_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *IterationStatement_parse(struct parser *parser); static void ContinueStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ContinueStatement_parse(struct parser *parser); static void BreakStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *BreakStatement_parse(struct parser *parser); static void ReturnStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void ReturnStatement_undef_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ReturnStatement_parse(struct parser *parser); static void WithStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *WithStatement_parse(struct parser *parser); static void SwitchStatement_caseblock(struct SwitchStatement_node *n, struct SEE_context *context, struct SEE_value *input, struct SEE_value *res); static void SwitchStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *SwitchStatement_parse(struct parser *parser); static void LabelledStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *LabelledStatement_parse(struct parser *parser); static void ThrowStatement_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *ThrowStatement_parse(struct parser *parser); static void TryStatement_catch(struct TryStatement_node *n, struct SEE_context *context, struct SEE_value *C, struct SEE_value *res); static void TryStatement_catch_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void TryStatement_finally_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void TryStatement_catchfinally_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *TryStatement_parse(struct parser *parser); static void FunctionDeclaration_fproc(struct node *na, struct SEE_context *context); static struct node *FunctionDeclaration_parse(struct parser *parser); static void FunctionExpression_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *FunctionExpression_parse(struct parser *parser); static struct var *FormalParameterList_parse(struct parser *parser); static void FunctionBody_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static struct node *FunctionBody_parse(struct parser *parser); static struct node *FunctionStatement_parse(struct parser *parser); static struct function *Program_parse(struct parser *parser); static void SourceElements_eval(struct node *na, struct SEE_context *context, struct SEE_value *res); static void SourceElements_fproc(struct node *na, struct SEE_context *context); static struct node *SourceElements_parse(struct parser *parser); static int FunctionBody_isempty(struct SEE_interpreter *interp, struct node *body); static void eval(struct SEE_context *context, struct SEE_object *thisobj, int argc, struct SEE_value **argv, struct SEE_value *res); #if WITH_PARSER_PRINT static void Literal_print(struct node *na, struct printer *printer); static void StringLiteral_print(struct node *na, struct printer *printer); static void RegularExpressionLiteral_print(struct node *na, struct printer *printer); static void PrimaryExpression_this_print(struct node *n, struct printer *printer); static void PrimaryExpression_ident_print(struct node *na, struct printer *printer); static void ArrayLiteral_print(struct node *na, struct printer *printer); static void ObjectLiteral_print(struct node *na, struct printer *printer); static void Arguments_print(struct node *na, struct printer *printer); static void MemberExpression_new_print(struct node *na, struct printer *printer); static void MemberExpression_dot_print(struct node *na, struct printer *printer); static void MemberExpression_bracket_print(struct node *na, struct printer *printer); static void CallExpression_print(struct node *na, struct printer *printer); static void Unary_print(struct node *na, struct printer *printer); static void PostfixExpression_inc_print(struct node *na, struct printer *printer); static void PostfixExpression_dec_print(struct node *na, struct printer *printer); static void UnaryExpression_delete_print(struct node *na, struct printer *printer); static void UnaryExpression_void_print(struct node *na, struct printer *printer); static void UnaryExpression_typeof_print(struct node *na, struct printer *printer); static void UnaryExpression_preinc_print(struct node *na, struct printer *printer); static void UnaryExpression_predec_print(struct node *na, struct printer *printer); static void UnaryExpression_plus_print(struct node *na, struct printer *printer); static void UnaryExpression_minus_print(struct node *na, struct printer *printer); static void UnaryExpression_inv_print(struct node *na, struct printer *printer); static void UnaryExpression_not_print(struct node *na, struct printer *printer); static void Binary_print(struct node *na, struct printer *printer); static void MultiplicativeExpression_mul_print(struct node *na, struct printer *printer); static void MultiplicativeExpression_div_print(struct node *na, struct printer *printer); static void MultiplicativeExpression_mod_print(struct node *na, struct printer *printer); static void AdditiveExpression_add_print(struct node *na, struct printer *printer); static void AdditiveExpression_sub_print(struct node *na, struct printer *printer); static void ShiftExpression_lshift_print(struct node *na, struct printer *printer); static void ShiftExpression_rshift_print(struct node *na, struct printer *printer); static void ShiftExpression_urshift_print(struct node *na, struct printer *printer); static void RelationalExpression_lt_print(struct node *na, struct printer *printer); static void RelationalExpression_gt_print(struct node *na, struct printer *printer); static void RelationalExpression_le_print(struct node *na, struct printer *printer); static void RelationalExpression_ge_print(struct node *na, struct printer *printer); static void RelationalExpression_instanceof_print(struct node *na, struct printer *printer); static void RelationalExpression_in_print(struct node *na, struct printer *printer); static void EqualityExpression_eq_print(struct node *na, struct printer *printer); static void EqualityExpression_ne_print(struct node *na, struct printer *printer); static void EqualityExpression_seq_print(struct node *na, struct printer *printer); static void EqualityExpression_sne_print(struct node *na, struct printer *printer); static void BitwiseANDExpression_print(struct node *na, struct printer *printer); static void BitwiseXORExpression_print(struct node *na, struct printer *printer); static void BitwiseORExpression_print(struct node *na, struct printer *printer); static void LogicalANDExpression_print(struct node *na, struct printer *printer); static void LogicalORExpression_print(struct node *na, struct printer *printer); static void ConditionalExpression_print(struct node *na, struct printer *printer); static void AssignmentExpression_simple_print(struct node *na, struct printer *printer); static void AssignmentExpression_muleq_print(struct node *na, struct printer *printer); static void AssignmentExpression_diveq_print(struct node *na, struct printer *printer); static void AssignmentExpression_modeq_print(struct node *na, struct printer *printer); static void AssignmentExpression_addeq_print(struct node *na, struct printer *printer); static void AssignmentExpression_subeq_print(struct node *na, struct printer *printer); static void AssignmentExpression_lshifteq_print(struct node *na, struct printer *printer); static void AssignmentExpression_rshifteq_print(struct node *na, struct printer *printer); static void AssignmentExpression_urshifteq_print(struct node *na, struct printer *printer); static void AssignmentExpression_andeq_print(struct node *na, struct printer *printer); static void AssignmentExpression_xoreq_print(struct node *na, struct printer *printer); static void AssignmentExpression_oreq_print(struct node *na, struct printer *printer); static void Expression_comma_print(struct node *na, struct printer *printer); static void Block_empty_print(struct node *n, struct printer *printer); static void VariableStatement_print(struct node *na, struct printer *printer); static void VariableDeclarationList_print(struct node *na, struct printer *printer); static void VariableDeclaration_print(struct node *na, struct printer *printer); static void EmptyStatement_print(struct node *n, struct printer *printer); static void ExpressionStatement_print(struct node *na, struct printer *printer); static void IfStatement_print(struct node *na, struct printer *printer); static void IterationStatement_dowhile_print(struct node *na, struct printer *printer); static void IterationStatement_while_print(struct node *na, struct printer *printer); static void IterationStatement_for_print(struct node *na, struct printer *printer); static void IterationStatement_forvar_print(struct node *na, struct printer *printer); static void IterationStatement_forin_print(struct node *na, struct printer *printer); static void IterationStatement_forvarin_print(struct node *na, struct printer *printer); static void ContinueStatement_print(struct node *na, struct printer *printer); static void BreakStatement_print(struct node *na, struct printer *printer); static void ReturnStatement_print(struct node *na, struct printer *printer); static void ReturnStatement_undef_print(struct node *na, struct printer *printer); static void WithStatement_print(struct node *na, struct printer *printer); static void SwitchStatement_print(struct node *na, struct printer *printer); static void LabelledStatement_print(struct node *na, struct printer *printer); static void ThrowStatement_print(struct node *na, struct printer *printer); static void TryStatement_catch_print(struct node *na, struct printer *printer); static void TryStatement_finally_print(struct node *na, struct printer *printer); static void TryStatement_catchfinally_print(struct node *na, struct printer *printer); static void Function_print(struct node *na, struct printer *printer); static void SourceElements_print(struct node *na, struct printer *printer); static void printer_init(struct printer *printer, struct SEE_interpreter *interp, struct printerclass *printerclass); static void printer_atbol(struct printer *printer); static void printer_print_newline(struct printer *printer, int indent); static void printer_print_node(struct printer *printer, struct node *n); static void print_hex(struct printer *printer, int i); static void stdio_print_string(struct printer *printer, struct SEE_string *s); static void stdio_print_char(struct printer *printer, int c); static void stdio_print_node(struct printer *printer, struct node *n); static struct printer *stdio_printer_new(struct SEE_interpreter *interp, FILE *output); static void string_print_string(struct printer *printer, struct SEE_string *s); static void string_print_char(struct printer *printer, int c); static struct printer *string_printer_new(struct SEE_interpreter *interp, struct SEE_string *string); static void print_functionbody(struct SEE_interpreter *interp, struct function *f, FILE *fp); #endif #if WITH_PARSER_VISIT static void ArrayLiteral_visit(struct node *na, visitor_fn_t v, void *va); static void ObjectLiteral_visit(struct node *na, visitor_fn_t v, void *va); static void Arguments_visit(struct node *na, visitor_fn_t v, void *va); static void MemberExpression_new_visit(struct node *na, visitor_fn_t v, void *va); static void MemberExpression_dot_visit(struct node *na, visitor_fn_t v, void *va); static void MemberExpression_bracket_visit(struct node *na, visitor_fn_t v, void *va); static void CallExpression_visit(struct node *na, visitor_fn_t v, void *va); static void Unary_visit(struct node *na, visitor_fn_t v, void *va); static void Binary_visit(struct node *na, visitor_fn_t v, void *va); static void ConditionalExpression_visit(struct node *na, visitor_fn_t v, void *va); static void AssignmentExpression_visit(struct node *na, visitor_fn_t v, void *va); static void VariableDeclaration_visit(struct node *na, visitor_fn_t v, void *va); static void IfStatement_visit(struct node *na, visitor_fn_t v, void *va); static void IterationStatement_while_visit(struct node *na, visitor_fn_t v, void *va); static void IterationStatement_for_visit(struct node *na, visitor_fn_t v, void *va); static void IterationStatement_forin_visit(struct node *na, visitor_fn_t v, void *va); static void ReturnStatement_visit(struct node *na, visitor_fn_t v, void *va); static void SwitchStatement_visit(struct node *na, visitor_fn_t v, void *va); static void TryStatement_catch_visit(struct node *na, visitor_fn_t v, void *va); static void TryStatement_finally_visit(struct node *na, visitor_fn_t v, void *va); static void TryStatement_catchfinally_visit(struct node *na, visitor_fn_t v, void *va); static void Function_visit(struct node *na, visitor_fn_t v, void *va); static void SourceElements_visit(struct node *na, visitor_fn_t v, void *va); #endif #define CONTINUABLE 1 static int target_matches(struct Targetable_node *, void *); static void target_init(struct Targetable_node *, struct parser *, int); /*------------------------------------------------------------ * macros */ /* * Macros for accessing the tokeniser, with lookahead */ #define NEXT \ (parser->unget != parser->unget_end \ ? parser->unget_tok[parser->unget] \ : parser->lex->next) #define NEXT_VALUE \ (parser->unget != parser->unget_end \ ? &parser->unget_val[parser->unget] \ : &parser->lex->value) #define NEXT_LINENO \ (parser->unget != parser->unget_end \ ? parser->unget_lin[parser->unget] \ : parser->lex->next_lineno) #define NEXT_FILENAME \ parser->lex->next_filename #define NEXT_FOLLOWS_NL \ (parser->unget != parser->unget_end \ ? parser->unget_fnl[parser->unget] \ : parser->lex->next_follows_nl) #define SKIP \ do { \ if (parser->unget == parser->unget_end) \ SEE_lex_next(parser->lex); \ else \ parser->unget = \ (parser->unget + 1) % UNGET_MAX; \ SKIP_DEBUG \ } while (0) #ifndef NDEBUG # define SKIP_DEBUG \ if (SEE_parse_debug) \ dprintf("SKIP: next = %s\n", SEE_tokenname(NEXT)); #else # define SKIP_DEBUG #endif /* Handy macros for describing syntax errors */ #define EXPECT(c) EXPECTX(c, SEE_tokenname(c)) #define EXPECTX(c, tokstr) \ do { \ EXPECTX_NOSKIP(c, tokstr); \ SKIP; \ } while (0) #define EXPECT_NOSKIP(c) EXPECTX_NOSKIP(c, SEE_tokenname(c)) #define EXPECTX_NOSKIP(c, tokstr) \ do { \ if (NEXT != (c)) \ EXPECTED(tokstr); \ } while (0) #define EXPECTED(tokstr) \ do { \ char nexttok[30]; \ SEE_tokenname_buf(NEXT, nexttok, \ sizeof nexttok); \ SEE_error_throw_string( \ parser->interpreter, \ parser->interpreter->SyntaxError, \ error_at(parser, \ "expected %s but got %s", \ tokstr, \ nexttok)); \ } while (0) #define EMPTY_LABEL ((struct SEE_string *)NULL) /* * Automatic semicolon insertion macros. * * Using these instead of NEXT/SKIP allows synthesis of * semicolons where they are permitted by the standard. */ #define NEXT_IS_SEMICOLON \ (NEXT == ';' || NEXT == '}' || NEXT_FOLLOWS_NL) #define EXPECT_SEMICOLON \ do { \ if (NEXT == ';') \ SKIP; \ else if ((NEXT == '}' || NEXT_FOLLOWS_NL)) { \ /* automatic semicolon insertion */ \ } else \ EXPECTX(';', "';', '}' or newline"); \ } while (0) /* Traces a statement-level event, or an eval() */ #define TRACE(node, ctxt, event) \ do { \ if (ctxt) { \ if (SEE_system.periodic) \ (*SEE_system.periodic)((ctxt)->interpreter); \ (ctxt)->interpreter->try_location = \ &(node)->location; \ trace_event(ctxt, event); \ } \ } while (0) /* * Macros for accessing the abstract syntax tree */ #ifndef NDEBUG # if !HAVE___FUNCTION__ /* Some trickery to stringize the __LINE__ macro */ # define X_STR2(s) #s # define X_STR(s) X_STR2(s) # define __FUNCTION__ __FILE__ ":" X_STR(__LINE__) # endif # define EVAL_DEBUG_ENTER(node) \ if (SEE_eval_debug) \ dprintf("eval: %s enter %p\n", \ __FUNCTION__, node); # define EVAL_DEBUG_LEAVE(node, ctxt, res) \ if (SEE_eval_debug && (ctxt)) { \ dprintf("eval: %s leave %p -> %p = ", \ __FUNCTION__, node, (void *)(res)); \ dprintv((ctxt)->interpreter, res); \ dprintf("\n"); \ } #else /* NDEBUG */ # define EVAL_DEBUG_ENTER(node) # define EVAL_DEBUG_LEAVE(node, ctxt, res) #endif /* NDEBUG */ # define EVAL(node, ctxt, res) \ do { \ struct SEE_throw_location * _loc_save = NULL; \ EVAL_DEBUG_ENTER(node) \ if (ctxt) { \ _loc_save = (ctxt)->interpreter->try_location;\ (ctxt)->interpreter->try_location = \ &(node)->location; \ } \ (*(node)->nodeclass->eval)(node, ctxt, res); \ EVAL_DEBUG_LEAVE(node, ctxt, res) \ } while (0) /* * Note: there is no need to restore the _loc_save in * a try-finally block */ #define FPROC(node, ctxt) \ do { \ if ((node)->nodeclass->fproc) \ (*(node)->nodeclass->fproc)((node), ctxt); \ } while (0) #ifndef NDEBUG #define NEW_NODE(t, nc) \ ((t *)new_node(parser, sizeof (t), nc, #nc)) #else #define NEW_NODE(t, nc) \ ((t *)new_node(parser, sizeof (t), nc, NULL)) #endif #ifdef NDEBUG #define CAST_NODE(na, cls) \ ((struct cls##_node *)(na)) #else #define CAST_NODE(na, cls) \ ((struct cls##_node *)cast_node(na, \ &cls##_nodeclass, #cls, __FILE__, __LINE__)) static struct node *cast_node(struct node *, struct nodeclass *, const char *, const char *, int); #endif #ifndef NDEBUG #define PARSE(prod) \ ((void)(SEE_parse_debug ? \ dprintf("parse %s next=%s\n", #prod, \ SEE_tokenname(NEXT)) : (void)0), \ prod##_parse(parser)) #else #define PARSE(prod) \ prod##_parse(parser) #endif /* Generates a generic parse error */ #define ERROR \ SEE_error_throw_string( \ parser->interpreter, \ parser->interpreter->SyntaxError, \ error_at(parser, "parse error before %s", \ SEE_tokenname(NEXT))) /* Generates a specific parse error */ #define ERRORm(m) \ SEE_error_throw_string( \ parser->interpreter, \ parser->interpreter->SyntaxError, \ error_at(parser, "%s, near %s", \ m, SEE_tokenname(NEXT))) #if WITH_PARSER_PRINT /* * Printer macros */ # define PRINT(n) (*printer->printerclass->print_node)(printer, n) # define PRINT_STRING(s) (*printer->printerclass->print_string)(printer, s) # define PRINT_CSTRING(s)(*printer->printerclass->print_cstring)(printer, s) # define PRINT_CHAR(c) (*printer->printerclass->print_char)(printer, c) # define PRINT_NEWLINE(i)(*printer->printerclass->print_newline)(printer, i) # define PRINTP(n) do { \ PRINT_CHAR('('); \ PRINT(n); \ PRINT_CHAR(')'); \ } while (0) #endif #if WITH_PARSER_VISIT /* * Visitor macro */ # define VISIT(n, v, va) do { \ if ((n)->nodeclass->visit) \ (*(n)->nodeclass->visit)(n, v, va); \ (*(v))(n, va); \ } while (0) #endif /* Returns true if the node returns a constant expression */ #define ISCONST(n, interp) \ ((n)->isconst_valid ? (n)->isconst : \ ((n)->isconst_valid = 1, \ (n)->isconst = \ ((n)->nodeclass->isconst \ ? (*(n)->nodeclass->isconst)(n, interp) \ : 0))) /*------------------------------------------------------------ * Allocators and initialisers */ /* * Creates a new AST node, initialising it with the * given node class nc, and recording the current * line number as reported by the parser. */ static struct node * new_node(parser, sz, nc, dbg_nc) struct parser *parser; int sz; struct nodeclass *nc; const char *dbg_nc; { struct node *n; n = (struct node *)SEE_malloc(parser->interpreter, sz); n->nodeclass = nc; n->location.filename = NEXT_FILENAME; n->location.lineno = NEXT_LINENO; #ifndef NDEBUG if (SEE_parse_debug) dprintf("parse: %p %s (next=%s)\n", n, dbg_nc, SEE_tokenname(NEXT)); #endif return n; } #ifndef NDEBUG /* * Checks that the node pointer na has node class nc in its class chain. * Used by the CAST_NODE() macro to runtime check casts. */ static struct node * cast_node(na, nc, cname, file, line) struct node *na; struct nodeclass *nc; const char *cname; const char *file; int line; { if (na) { struct nodeclass *nac = na->nodeclass; while (nac && nac != nc) nac = nac->superclass; if (!nac) { dprintf("%s:%d: internal error: cast to %s failed (source class from %s:%d) [vers %s]\n", file, line, cname, na->nodeclass->decl_file, na->nodeclass->decl_line, SEE_SJ_PACKAGE_VERSION); abort(); } } return na; } #endif /* * Initialises a parser state. */ static void parser_init(parser, interp, lex) struct parser *parser; struct SEE_interpreter *interp; struct lex *lex; { parser->interpreter = interp; parser->lex = lex; parser->unget = 0; parser->unget_end = 0; parser->noin = 0; parser->is_lhs = 0; parser->labels = NULL; parser->vars = NULL; parser->funcdepth = 0; } /*------------------------------------------------------------ * Labels * * LabelledStatements that appear consecutively are converted * into a 'label set' named by the first label. Each successive * label becomes an alias for the first. * * Only Iteration/SwitchStatements that are immediately parented by * a LabelledStatement are passed a 'current label set' consisting of * either NULL or the first label. The Iteration/SwitchStatement then * translates break/continues to that labelset into the equivalent * break/continues with an empty label. (All other statements ignore * their 'current label set', which is typically empty anyway.) * * During parse, the stack of currently active labels, is available * in parser->labels. This is used to check for duplicates, and * also to map identifier targets of 'break' and 'continue' to the * first label of a labelset. */ /* * Pushes a label onto the current label stack. * Checks for duplicate labels already in the current label * stack. */ static void label_push(parser, name, labelset, continuable) struct parser *parser; struct SEE_string *name; struct SEE_string *labelset; int continuable; { struct label *l; struct SEE_string *msg; struct SEE_throw_location location; location.lineno = NEXT_LINENO; location.filename = NEXT_FILENAME; /* check for duplicate labels */ if (name) for (l = parser->labels; l; l = l->next) if (l->name == name) { msg = SEE_location_string(parser->interpreter, &location); SEE_string_append(msg, STR(duplicate_label)); SEE_string_append(msg, name); SEE_string_addch(msg, '\''); SEE_string_addch(msg, ';'); SEE_string_addch(msg, ' '); SEE_string_append(msg, SEE_location_string(parser->interpreter, &l->location)); SEE_string_append(msg, STR(previous_definition)); SEE_error_throw_string(parser->interpreter, parser->interpreter->SyntaxError, msg); } l = SEE_NEW(parser->interpreter, struct label); l->name = name; l->labelset = labelset; l->next = parser->labels; l->location.lineno = location.lineno; l->location.filename = location.filename; l->continuable = continuable; parser->labels = l; } /* * Pops the last pushed label from the current label stack. */ static void label_pop(parser) struct parser *parser; { struct label *l; if (!parser->labels) SEE_error_throw_string(parser->interpreter, parser->interpreter->SyntaxError, STR(internal_error)); l = parser->labels; parser->labels = l->next; l->next = NULL; SEE_free(parser->interpreter, (void **)&l); } /* * Marks a label as being a valid target for the continue statement. */ static void label_set_continuable(parser, labelset) struct parser *parser; struct SEE_string *labelset; { struct label *l; for (l = parser->labels; l; l = l->next) if (l->labelset == labelset) break; SEE_ASSERT(parser->interpreter, l != NULL); l->continuable = 1; } /* * Looks for the given label name (or implied name), raising a * SyntaxError if it isn't found. Kind is a token indicates the kind of * statement using the label (tBREAK or tCONTINUE). */ static struct label * label_lookup(parser, name, kind) struct parser *parser; struct SEE_string *name; int kind; { struct SEE_string *msg; struct label *l; SEE_ASSERT(parser->interpreter, kind == tBREAK || kind == tCONTINUE); #ifndef NDEBUG if (SEE_parse_debug) { dprintf("label_find: searching for '"); if (name == EMPTY_LABEL) dprintf("EMPTY_LABEL"); else dprints(name); dprintf("\n"); } #endif for (l = parser->labels; l; l = l->next) if (l->name == name) { if (kind == tCONTINUE && !l->continuable) { if (name == NULL) continue; msg = error_at(parser, "label '"); SEE_string_append(msg, name); SEE_string_append(msg, SEE_string_sprintf(parser->interpreter, "' not suitable for continue")); SEE_error_throw_string(parser->interpreter, parser->interpreter->SyntaxError, msg); } return l; } if (name) { msg = error_at(parser, "label '"); SEE_string_append(msg, name); SEE_string_append(msg, SEE_string_sprintf(parser->interpreter, "' not defined, or not reachable")); } else if (kind == tCONTINUE) msg = error_at(parser, "continue statement not within a loop"); else /* kind == tBREAK */ msg = error_at(parser, "break statement not within loop or switch"); SEE_error_throw_string(parser->interpreter, parser->interpreter->SyntaxError, msg); /* NOTREACHED */ return 0; } /* * Returns the labelset associated with a label. * The label argument may be NULL, in which case NULL is returned. */ static void * label_get_target(label) struct label *label; { return label ? label->labelset : NULL; } /* * Returns true if the node is a valid target of the labelset target. */ static int target_matches(itn, ls_target) struct Targetable_node *itn; void *ls_target; { return ls_target == NULL || ls_target == itn->target; } /* * Initialises a targetable node with the current label set, * and optionally modifies the labelset to be continuable. */ static void target_init(itn, parser, continuable) struct Targetable_node *itn; struct parser *parser; int continuable; { itn->target = (void *)parser->current_labelset; if (continuable && parser->current_labelset) label_set_continuable(parser, parser->current_labelset); } /*------------------------------------------------------------ * LL(2) lookahead implementation */ /* * Returns the token that is n tokens ahead. (0 is the next token.) */ static int lookahead(parser, n) struct parser *parser; int n; { int token; SEE_ASSERT(parser->interpreter, n < (UNGET_MAX - 1)); while ((UNGET_MAX + parser->unget_end - parser->unget) % UNGET_MAX < n) { SEE_VALUE_COPY(&parser->unget_val[parser->unget_end], &parser->lex->value); parser->unget_tok[parser->unget_end] = parser->lex->next; parser->unget_lin[parser->unget_end] = parser->lex->next_lineno; parser->unget_fnl[parser->unget_end] = parser->lex->next_follows_nl; SEE_lex_next(parser->lex); parser->unget_end = (parser->unget_end + 1) % UNGET_MAX; } if ((parser->unget + n) % UNGET_MAX == parser->unget_end) token = parser->lex->next; else token = parser->unget_tok[(parser->unget + n) % UNGET_MAX]; #ifndef NDEBUG if (SEE_parse_debug) dprintf("lookahead(%d) -> %s\n", n, SEE_tokenname(token)); #endif return token; } /* * Generates a trace event, giving the host application an opportunity to * step or trace execution. */ static void trace_event(ctxt, event) struct SEE_context *ctxt; enum SEE_trace_event event; { if (ctxt->interpreter->trace) (*ctxt->interpreter->trace)(ctxt->interpreter, ctxt->interpreter->try_location, ctxt, event); } /* * Pushes a new call context entry onto the traceback stack. * Returns the old traceback stack. */ static struct SEE_traceback * traceback_enter(interp, callee, loc, call_type) struct SEE_interpreter *interp; struct SEE_object *callee; struct SEE_throw_location *loc; int call_type; { struct SEE_traceback *old_tb, *tb; old_tb = interp->traceback; tb = SEE_NEW(interp, struct SEE_traceback); tb->call_location = loc; tb->callee = callee; tb->call_type = call_type; tb->prev = old_tb; interp->traceback = tb; return old_tb; } /* * Restores the traceback list before a call context was entered. */ static void traceback_leave(interp, old_tb) struct SEE_interpreter *interp; struct SEE_traceback *old_tb; { interp->traceback = old_tb; } /*------------------------------------------------------------ * GetValue/SetValue */ /* 8.7.1 */ static void GetValue(context, v, res) struct SEE_context *context; struct SEE_value *v; struct SEE_value *res; { struct SEE_interpreter *interp = context->interpreter; if (SEE_VALUE_GET_TYPE(v) != SEE_REFERENCE) { if (v != res) SEE_VALUE_COPY(res, v); return; } if (v->u.reference.base == NULL) SEE_error_throw_string(interp, interp->ReferenceError, v->u.reference.property); else SEE_OBJECT_GET(interp, v->u.reference.base, v->u.reference.property, res); } /* 8.7.2 */ static void PutValue(context, v, w) struct SEE_context *context; struct SEE_value *v; struct SEE_value *w; { struct SEE_interpreter *interp = context->interpreter; struct SEE_object *target; if (SEE_VALUE_GET_TYPE(v) != SEE_REFERENCE) SEE_error_throw_string(interp, interp->ReferenceError, STR(bad_lvalue)); target = v->u.reference.base; if (target == NULL) target = interp->Global; SEE_OBJECT_PUT(interp, target, v->u.reference.property, w, 0); } /*------------------------------------------------------------ * Error handling */ /* * Generates an error string prefixed with the filename and * line number of the next token. e.g. "foo.js:23: blah blah". * This is useful for error messages. */ static struct SEE_string * error_at(struct parser *parser, const char *fmt, ...) { va_list ap; struct SEE_throw_location here; struct SEE_string *msg; struct SEE_interpreter *interp = parser->interpreter; here.lineno = NEXT_LINENO; here.filename = NEXT_FILENAME; va_start(ap, fmt); msg = SEE_string_vsprintf(interp, fmt, ap); va_end(ap); return SEE_string_concat(interp, SEE_location_string(interp, &here), msg); } /*------------------------------------------------------------ * Constant subexpression reduction * * A subtree is 'constant' iff it * - has no side-effects; and * - yields the same result independent of context * It follows then that a constant subtree can be evaluated using * a NULL context. We can perform that eval, and then replace the * subtree with a node that generates that expression statically. */ /* Always returns true to indicate this class of node is always constant. */ static int Always_isconst(na, interp) struct node *na; struct SEE_interpreter *interp; { return 1; } /*------------------------------------------------------------ * Parser * * Each group of grammar productions is ordered: * - production summary as a comment * - node structure * - evaluator function * - function processor * - node printer * - recursive-descent parser */ /* -- 7.8 * Literal: * NullLiteral * BooleanLiteral * NumericLiteral * StringLiteral * * NullLiteral: * tNULL -- 7.8.1 * * BooleanLiteral: * tTRUE -- 7.8.2 * tFALSE -- 7.8.2 */ struct Literal_node { struct node node; struct SEE_value value; }; static void Literal_eval(na, context, res) struct node *na; /* (struct Literal_node) */ struct SEE_context *context; struct SEE_value *res; { struct Literal_node *n = CAST_NODE(na, Literal); SEE_VALUE_COPY(res, &n->value); } #if WITH_PARSER_PRINT static void Literal_print(na, printer) struct node *na; /* (struct Literal_node) */ struct printer *printer; { struct Literal_node *n = CAST_NODE(na, Literal); struct SEE_value str; switch (SEE_VALUE_GET_TYPE(&n->value)) { case SEE_BOOLEAN: PRINT_STRING(n->value.u.boolean ? STR(true) : STR(false)); break; case SEE_NUMBER: SEE_ToString(printer->interpreter, &n->value, &str); PRINT_STRING(str.u.string); break; case SEE_NULL: PRINT_STRING(STR(null)); break; default: PRINT_CHAR('?'); } PRINT_CHAR(' '); } #endif static struct nodeclass Literal_nodeclass = { BASECLASS Literal_eval, 0, PARSER_PRINT(Literal_print) PARSER_VISIT(0) Always_isconst }; static struct node * Literal_parse(parser) struct parser *parser; { struct Literal_node *n; /* * Convert the next token into a regular expression * if possible */ switch (NEXT) { case tNULL: n = NEW_NODE(struct Literal_node, &Literal_nodeclass); SEE_SET_NULL(&n->value); SKIP; return (struct node *)n; case tTRUE: case tFALSE: n = NEW_NODE(struct Literal_node, &Literal_nodeclass); SEE_SET_BOOLEAN(&n->value, (NEXT == tTRUE)); SKIP; return (struct node *)n; case tNUMBER: return PARSE(NumericLiteral); case tSTRING: return PARSE(StringLiteral); case tDIV: case tDIVEQ: SEE_lex_regex(parser->lex); return PARSE(RegularExpressionLiteral); default: EXPECTED("null, true, false, number, string, or regex"); } /* NOTREACHED */ return 0; } /* * NumericLiteral: * tNUMBER -- 7.8.3 */ static struct node * NumericLiteral_parse(parser) struct parser *parser; { struct Literal_node *n; EXPECT_NOSKIP(tNUMBER); n = NEW_NODE(struct Literal_node, &Literal_nodeclass); SEE_VALUE_COPY(&n->value, NEXT_VALUE); SKIP; return (struct node *)n; } /* * StringLiteral: * tSTRING -- 7.8.4 */ struct StringLiteral_node { struct node node; struct SEE_string *string; }; static void StringLiteral_eval(na, context, res) struct node *na; /* (struct StringLiteral_node) */ struct SEE_context *context; struct SEE_value *res; { struct StringLiteral_node *n = CAST_NODE(na, StringLiteral); SEE_SET_STRING(res, n->string); } #if WITH_PARSER_PRINT static void StringLiteral_print(na, printer) struct node *na; /* (struct StringLiteral_node) */ struct printer *printer; { struct StringLiteral_node *n = CAST_NODE(na, StringLiteral); unsigned int i; PRINT_CHAR('"'); for (i = 0; i < n->string->length; i ++) { SEE_char_t c = n->string->data[i]; if (c == '\\' || c == '\"') { PRINT_CHAR('\\'); PRINT_CHAR(c & 0x7f); } else if (c >= ' ' && c <= '~') PRINT_CHAR(c & 0x7f); else if (c < 0x100) { PRINT_CHAR('\\'); PRINT_CHAR('x'); PRINT_CHAR(SEE_hexstr_lowercase[ (c >> 4) & 0xf ]); PRINT_CHAR(SEE_hexstr_lowercase[ (c >> 0) & 0xf ]); } else { PRINT_CHAR('\\'); PRINT_CHAR('u'); PRINT_CHAR(SEE_hexstr_lowercase[ (c >>12) & 0xf ]); PRINT_CHAR(SEE_hexstr_lowercase[ (c >> 8) & 0xf ]); PRINT_CHAR(SEE_hexstr_lowercase[ (c >> 4) & 0xf ]); PRINT_CHAR(SEE_hexstr_lowercase[ (c >> 0) & 0xf ]); } } PRINT_CHAR('"'); PRINT_CHAR(' '); } #endif static struct nodeclass StringLiteral_nodeclass = { BASECLASS StringLiteral_eval, 0, PARSER_PRINT(StringLiteral_print) PARSER_VISIT(0) Always_isconst }; static struct node * StringLiteral_parse(parser) struct parser *parser; { struct StringLiteral_node *n; EXPECT_NOSKIP(tSTRING); n = NEW_NODE(struct StringLiteral_node, &StringLiteral_nodeclass); n->string = NEXT_VALUE->u.string; SKIP; return (struct node *)n; } /* * RegularExpressionLiteral: * tREGEX -- 7.8.5 */ struct RegularExpressionLiteral_node { struct node node; struct SEE_value pattern; struct SEE_value flags; struct SEE_value *argv[2]; }; static void RegularExpressionLiteral_eval(na, context, res) struct node *na; /* (struct RegularExpressionLiteral_node) */ struct SEE_context *context; struct SEE_value *res; { struct RegularExpressionLiteral_node *n = CAST_NODE(na, RegularExpressionLiteral); struct SEE_interpreter *interp = context->interpreter; struct SEE_traceback *tb; tb = traceback_enter(interp, interp->RegExp, &n->node.location, SEE_CALLTYPE_CONSTRUCT); TRACE(na, context, SEE_TRACE_CALL); SEE_OBJECT_CONSTRUCT(interp, interp->RegExp, interp->RegExp, 2, n->argv, res); TRACE(na, context, SEE_TRACE_RETURN); traceback_leave(interp, tb); } #if WITH_PARSER_PRINT static void RegularExpressionLiteral_print(na, printer) struct node *na; /* (struct RegularExpressionLiteral_node) */ struct printer *printer; { struct RegularExpressionLiteral_node *n = CAST_NODE(na, RegularExpressionLiteral); PRINT_CHAR('/'); PRINT_STRING(n->pattern.u.string); PRINT_CHAR('/'); PRINT_STRING(n->flags.u.string); PRINT_CHAR(' '); } #endif static struct nodeclass RegularExpressionLiteral_nodeclass = { BASECLASS RegularExpressionLiteral_eval, 0, PARSER_PRINT(RegularExpressionLiteral_print) PARSER_VISIT(0) 0 }; static struct node * RegularExpressionLiteral_parse(parser) struct parser *parser; { struct RegularExpressionLiteral_node *n = NULL; struct SEE_string *s, *pattern, *flags; int p; if (NEXT == tREGEX) { /* * Find the position after the regexp's closing '/'. * i.e. the position of the regexp flags. */ s = NEXT_VALUE->u.string; for (p = s->length; p > 0; p--) if (s->data[p-1] == '/') break; SEE_ASSERT(parser->interpreter, p > 1); pattern = SEE_string_substr(parser->interpreter, s, 1, p - 2); flags = SEE_string_substr(parser->interpreter, s, p, s->length - p); n = NEW_NODE(struct RegularExpressionLiteral_node, &RegularExpressionLiteral_nodeclass); SEE_SET_STRING(&n->pattern, pattern); SEE_SET_STRING(&n->flags, flags); n->argv[0] = &n->pattern; n->argv[1] = &n->flags; } EXPECT(tREGEX); return (struct node *)n; } /*------------------------------------------------------------ * -- 11.1 * * PrimaryExpression * : tTHIS -- 11.1.1 * | tIDENT -- 11.1.2 * | Literal -- 11.1.3 * | ArrayLiteral * | ObjectLiteral * | '(' Expression ')' -- 11.1.6 * ; */ /* 11.1.1 */ static void PrimaryExpression_this_eval(n, context, res) struct node *n; struct SEE_context *context; struct SEE_value *res; { SEE_SET_OBJECT(res, context->thisobj); } #if WITH_PARSER_PRINT static void PrimaryExpression_this_print(n, printer) struct printer *printer; struct node *n; { PRINT_STRING(STR(this)); PRINT_CHAR(' '); } #endif static struct nodeclass PrimaryExpression_this_nodeclass = { BASECLASS PrimaryExpression_this_eval, 0, PARSER_PRINT(PrimaryExpression_this_print) PARSER_VISIT(0) 0 }; struct PrimaryExpression_ident_node { struct node node; struct SEE_string *string; }; /* 11.1.2 */ static void PrimaryExpression_ident_eval(na, context, res) struct node *na; /* (struct PrimaryExpression_ident_node) */ struct SEE_context *context; struct SEE_value *res; { struct PrimaryExpression_ident_node *n = CAST_NODE(na, PrimaryExpression_ident); SEE_scope_lookup(context->interpreter, context->scope, n->string, res); } #if WITH_PARSER_PRINT static void PrimaryExpression_ident_print(na, printer) struct node *na; /* (struct PrimaryExpression_ident_node) */ struct printer *printer; { struct PrimaryExpression_ident_node *n = CAST_NODE(na, PrimaryExpression_ident); PRINT_STRING(n->string); PRINT_CHAR(' '); } #endif static struct nodeclass PrimaryExpression_ident_nodeclass = { BASECLASS PrimaryExpression_ident_eval, 0, PARSER_PRINT(PrimaryExpression_ident_print) PARSER_VISIT(0) 0 }; static struct node * PrimaryExpression_parse(parser) struct parser *parser; { struct node *n; struct PrimaryExpression_ident_node *i; switch (NEXT) { case tTHIS: n = NEW_NODE(struct node, &PrimaryExpression_this_nodeclass); SKIP; return n; case tIDENT: i = NEW_NODE(struct PrimaryExpression_ident_node, &PrimaryExpression_ident_nodeclass); i->string = NEXT_VALUE->u.string; SKIP; return (struct node *)i; case '[': return PARSE(ArrayLiteral); case '{': return PARSE(ObjectLiteral); case '(': SKIP; n = PARSE(Expression); EXPECT(')'); return n; default: return PARSE(Literal); } } /* * ArrayLiteral -- 11.1.4 * : '[' ']' * | '[' Elision ']' * | '[' ElementList ']' * | '[' ElementList ',' ']' * | '[' ElementList ',' Elision ']' * ; * * ElementList * : Elision AssignmentExpression * | AssignmentExpression * | ElementList ',' Elision AssignmentExpression * | ElementList ',' AssignmentExpression * ; * * Elision * : ',' * | Elision ',' * ; * * NB: I ignore the above elision nonsense and just build a list of * (index,expr) nodes with an overall length. It is equivalent * to that in the standard. */ struct ArrayLiteral_node { struct node node; int length; struct ArrayLiteral_element { int index; struct node *expr; struct ArrayLiteral_element *next; } *first; }; /* 11.1.4 */ static void ArrayLiteral_eval(na, context, res) struct node *na; /* (struct ArrayLiteral_node) */ struct SEE_context *context; struct SEE_value *res; { struct ArrayLiteral_node *n = CAST_NODE(na, ArrayLiteral); struct ArrayLiteral_element *element; struct SEE_value expv, elv; struct SEE_string *ind; struct SEE_interpreter *interp = context->interpreter; struct SEE_traceback *tb; ind = SEE_string_new(interp, 16); tb = traceback_enter(interp, interp->Array, &n->node.location, SEE_CALLTYPE_CONSTRUCT); TRACE(na, context, SEE_TRACE_CALL); SEE_OBJECT_CONSTRUCT(interp, interp->Array, interp->Array, 0, NULL, res); TRACE(na, context, SEE_TRACE_RETURN); traceback_leave(interp, tb); for (element = n->first; element; element = element->next) { EVAL(element->expr, context, &expv); GetValue(context, &expv, &elv); ind->length = 0; SEE_string_append_int(ind, element->index); SEE_OBJECT_PUT(interp, res->u.object, SEE_intern(interp, ind), &elv, 0); } SEE_SET_NUMBER(&elv, n->length); SEE_OBJECT_PUT(interp, res->u.object, STR(length), &elv, 0); } #if WITH_PARSER_PRINT static void ArrayLiteral_print(na, printer) struct node *na; /* (struct ArrayLiteral_node) */ struct printer *printer; { struct ArrayLiteral_node *n = CAST_NODE(na, ArrayLiteral); struct ArrayLiteral_element *element; int pos; PRINT_CHAR('['); PRINT_CHAR(' '); for (pos = 0, element = n->first; element; element = element->next) { while (pos < element->index) { PRINT_CHAR(','); PRINT_CHAR(' '); pos++; } PRINT(element->expr); } while (pos < n->length) { PRINT_CHAR(','); PRINT_CHAR(' '); pos++; } PRINT_CHAR(']'); } #endif #if WITH_PARSER_VISIT static void ArrayLiteral_visit(na, v, va) struct node *na; /* (struct ArrayLiteral_node) */ visitor_fn_t v; void *va; { struct ArrayLiteral_node *n = CAST_NODE(na, ArrayLiteral); struct ArrayLiteral_element *element; for (element = n->first; element; element = element->next) VISIT(element->expr, v, va); } #endif static struct nodeclass ArrayLiteral_nodeclass = { BASECLASS ArrayLiteral_eval, 0, PARSER_PRINT(ArrayLiteral_print) PARSER_VISIT(ArrayLiteral_visit) 0 }; static struct node * ArrayLiteral_parse(parser) struct parser *parser; { struct ArrayLiteral_node *n; struct ArrayLiteral_element **elp; int index; n = NEW_NODE(struct ArrayLiteral_node, &ArrayLiteral_nodeclass); elp = &n->first; EXPECT('['); index = 0; while (NEXT != ']') if (NEXT == ',') { index++; SKIP; } else { *elp = SEE_NEW(parser->interpreter, struct ArrayLiteral_element); (*elp)->index = index; (*elp)->expr = PARSE(AssignmentExpression); elp = &(*elp)->next; index++; if (NEXT != ']') EXPECTX(',', "',' or ']'"); } n->length = index; *elp = NULL; EXPECT(']'); return (struct node *)n; } /* * ObjectLiteral -- 11.1.5 * : '{' '}' * | '{' PropertyNameAndValueList '}' * ; * * PropertyNameAndValueList * : PropertyName ':' AssignmentExpression * | PropertyNameAndValueList ',' PropertyName ':' * AssignmentExpression * ; * * PropertyName * : tIDENT * | StringLiteral * | NumericLiteral * ; */ struct ObjectLiteral_node { struct node node; struct ObjectLiteral_pair { struct node *value; struct ObjectLiteral_pair *next; struct SEE_string *name; } *first; }; /* 11.1.5 */ static void ObjectLiteral_eval(na, context, res) struct node *na; /* (struct ObjectLiteral_node) */ struct SEE_context *context; struct SEE_value *res; { struct ObjectLiteral_node *n = CAST_NODE(na, ObjectLiteral); struct SEE_value valuev, v; struct SEE_object *o; struct ObjectLiteral_pair *pair; struct SEE_interpreter *interp = context->interpreter; o = SEE_Object_new(interp); for (pair = n->first; pair; pair = pair->next) { EVAL(pair->value, context, &valuev); GetValue(context, &valuev, &v); SEE_OBJECT_PUT(interp, o, pair->name, &v, 0); } SEE_SET_OBJECT(res, o); } #if WITH_PARSER_PRINT static void ObjectLiteral_print(na, printer) struct node *na; /* (struct ObjectLiteral_node) */ struct printer *printer; { struct ObjectLiteral_node *n = CAST_NODE(na, ObjectLiteral); struct ObjectLiteral_pair *pair; PRINT_CHAR('{'); PRINT_CHAR(' '); for (pair = n->first; pair; pair = pair->next) { if (pair != n->first) { PRINT_CHAR(','); PRINT_CHAR(' '); } PRINT_STRING(pair->name); PRINT_CHAR(':'); PRINT_CHAR(' '); PRINT(pair->value); } PRINT_CHAR('}'); } #endif #if WITH_PARSER_VISIT static void ObjectLiteral_visit(na, v, va) struct node *na; /* (struct ObjectLiteral_node) */ visitor_fn_t v; void *va; { struct ObjectLiteral_node *n = CAST_NODE(na, ObjectLiteral); struct ObjectLiteral_pair *pair; for (pair = n->first; pair; pair = pair->next) VISIT(pair->value, v, va); } #endif static struct nodeclass ObjectLiteral_nodeclass = { BASECLASS ObjectLiteral_eval, 0, PARSER_PRINT(ObjectLiteral_print) PARSER_VISIT(ObjectLiteral_visit) 0 }; static struct node * ObjectLiteral_parse(parser) struct parser *parser; { struct ObjectLiteral_node *n; struct ObjectLiteral_pair **pairp; struct SEE_value sv; n = NEW_NODE(struct ObjectLiteral_node, &ObjectLiteral_nodeclass); pairp = &n->first; EXPECT('{'); while (NEXT != '}') { *pairp = SEE_NEW(parser->interpreter, struct ObjectLiteral_pair); switch (NEXT) { case tIDENT: case tSTRING: (*pairp)->name = NEXT_VALUE->u.string; SKIP; break; case tNUMBER: SEE_ToString(parser->interpreter, NEXT_VALUE, &sv); (*pairp)->name = sv.u.string; SKIP; break; default: EXPECTED("string, identifier or number"); } EXPECT(':'); (*pairp)->value = PARSE(AssignmentExpression); if (NEXT != '}') { /* XXX permits trailing comma e.g. {a:b,} */ EXPECTX(',', "',' or '}'"); } pairp = &(*pairp)->next; } *pairp = NULL; EXPECT('}'); return (struct node *)n; } /* * -- 11.2 * * MemberExpression * : PrimaryExpression * | FunctionExpression -- 11.2.5 * | MemberExpression '[' Expression ']' -- 11.2.1 * | MemberExpression '.' tIDENT -- 11.2.1 * | tNEW MemberExpression Arguments -- 11.2.2 * ; * * NewExpression * : MemberExpression * | tNEW NewExpression -- 11.2.2 * ; * * CallExpression * : MemberExpression Arguments -- 11.2.3 * | CallExpression Arguments -- 11.2.3 * | CallExpression '[' Expression ']' -- 11.2.1 * | CallExpression '.' tIDENT -- 11.2.1 * ; * * Arguments * : '(' ')' -- 11.2.4 * | '(' ArgumentList ')' -- 11.2.4 * ; * * ArgumentList * : AssignmentExpression -- 11.2.4 * | ArgumentList ',' AssignmentExpression -- 11.2.4 * ; * * LeftHandSideExpression * : NewExpression * | CallExpression * ; * * NOTE: The standard grammar is complicated in order to resolve an * ambiguity in parsing 'new expr ( args )' as either * '(new expr)(args)' or as 'new (expr(args))'. In fact, 'new' * is acting as both a unary and a binary operator. Yucky. * * Since recursive descent is single-token lookahead, we * can rewrite the above as the following equivalent grammar: * * MemberExpression * : PrimaryExpression * | FunctionExpression -- lookahead == tFUNCTION * | MemberExpression '[' Expression ']' * | MemberExpression '.' tIDENT * | tNEW MemberExpression Arguments -- lookahead == tNEW * | tNEW MemberExpression -- lookahead == tNEW * * LeftHandSideExpression * : PrimaryExpression * | FunctionExpression -- lookahead == tFUNCTION * | LeftHandSideExpression '[' Expression ']' * | LeftHandSideExpression '.' tIDENT * | LeftHandSideExpression Arguments * | MemberExpression -- lookahead == tNEW * */ struct Arguments_node { /* declare for early use */ struct node node; int argc; struct Arguments_arg { struct node *expr; struct Arguments_arg *next; } *first; }; /* 11.2.4 */ static void Arguments_eval(na, context, res) struct node *na; /* (struct Arguments_node) */ struct SEE_context *context; struct SEE_value *res; /* Assumed pointer to array */ { struct Arguments_node *n = CAST_NODE(na, Arguments); struct Arguments_arg *arg; struct SEE_value v; for (arg = n->first; arg; arg = arg->next) { EVAL(arg->expr, context, &v); GetValue(context, &v, res); res++; } } #if WITH_PARSER_VISIT static void Arguments_visit(na, v, va) struct node *na; /* (struct Arguments_node) */ visitor_fn_t v; void *va; { struct Arguments_node *n = CAST_NODE(na, Arguments); struct Arguments_arg *arg; for (arg = n->first; arg; arg = arg->next) VISIT(arg->expr, v, va); } #endif static int Arguments_isconst(na, interp) struct node *na; /* (struct Arguments_node) */ struct SEE_interpreter *interp; { struct Arguments_node *n = CAST_NODE(na, Arguments); struct Arguments_arg *arg; for (arg = n->first; arg; arg = arg->next) if (!ISCONST(arg->expr, interp)) return 0; return 1; } #if WITH_PARSER_PRINT static void Arguments_print(na, printer) struct node *na; /* (struct Arguments_node) */ struct printer *printer; { struct Arguments_node *n = CAST_NODE(na, Arguments); struct Arguments_arg *arg; PRINT_CHAR('('); for (arg = n->first; arg; arg = arg->next) { if (arg != n->first) { PRINT_CHAR(','); PRINT_CHAR(' '); } PRINTP(arg->expr); } PRINT_CHAR(')'); } #endif static struct nodeclass Arguments_nodeclass = { BASECLASS Arguments_eval, 0, PARSER_PRINT(Arguments_print) PARSER_VISIT(Arguments_visit) Arguments_isconst }; static struct Arguments_node * Arguments_parse(parser) struct parser *parser; { struct Arguments_node *n; struct Arguments_arg **argp; n = NEW_NODE(struct Arguments_node, &Arguments_nodeclass); argp = &n->first; n->argc = 0; EXPECT('('); while (NEXT != ')') { n->argc++; *argp = SEE_NEW(parser->interpreter, struct Arguments_arg); (*argp)->expr = PARSE(AssignmentExpression); argp = &(*argp)->next; if (NEXT != ')') EXPECTX(',', "',' or ')'"); } *argp = NULL; EXPECT(')'); return n; } struct MemberExpression_new_node { struct node node; struct node *mexp; struct Arguments_node *args; }; /* 11.2.2 */ static void MemberExpression_new_eval(na, context, res) struct node *na; /* (struct MemberExpression_new_node) */ struct SEE_context *context; struct SEE_value *res; { struct MemberExpression_new_node *n = CAST_NODE(na, MemberExpression_new); struct SEE_value r1, r2, *args, **argv; struct SEE_interpreter *interp = context->interpreter; int argc, i; struct SEE_traceback *tb; EVAL(n->mexp, context, &r1); GetValue(context, &r1, &r2); if (n->args) { argc = n->args->argc; args = SEE_ALLOCA(interp, struct SEE_value, argc); argv = SEE_ALLOCA(interp, struct SEE_value *, argc); Arguments_eval((struct node *)n->args, context, args); for (i = 0; i < argc; i++) argv[i] = &args[i]; } else { argc = 0; argv = NULL; } if (SEE_VALUE_GET_TYPE(&r2) != SEE_OBJECT) SEE_error_throw_string(interp, interp->TypeError, STR(new_not_an_object)); if (!SEE_OBJECT_HAS_CONSTRUCT(r2.u.object)) SEE_error_throw_string(interp, interp->TypeError, STR(not_a_constructor)); tb = traceback_enter(interp, r2.u.object, &n->node.location, SEE_CALLTYPE_CONSTRUCT); TRACE(na, context, SEE_TRACE_CALL); SEE_OBJECT_CONSTRUCT(interp, r2.u.object, r2.u.object, argc, argv, res); TRACE(na, context, SEE_TRACE_RETURN); traceback_leave(interp, tb); } #if WITH_PARSER_PRINT static void MemberExpression_new_print(na, printer) struct node *na; /* (struct MemberExpression_new_node) */ struct printer *printer; { struct MemberExpression_new_node *n = CAST_NODE(na, MemberExpression_new); PRINT_STRING(STR(new)); PRINT_CHAR(' '); PRINTP(n->mexp); if (n->args) PRINT((struct node *)n->args); } #endif #if WITH_PARSER_VISIT static void MemberExpression_new_visit(na, v, va) struct node *na; /* (struct MemberExpression_new_node) */ visitor_fn_t v; void *va; { struct MemberExpression_new_node *n = CAST_NODE(na, MemberExpression_new); VISIT(n->mexp, v, va); if (n->args) VISIT((struct node *)n->args, v, va); } #endif static struct nodeclass MemberExpression_new_nodeclass = { BASECLASS MemberExpression_new_eval, 0, PARSER_PRINT(MemberExpression_new_print) PARSER_VISIT(MemberExpression_new_visit) 0 }; struct MemberExpression_dot_node { struct node node; struct node *mexp; struct SEE_string *name; }; /* 11.2.1 */ static void MemberExpression_dot_eval(na, context, res) struct node *na; /* (struct MemberExpression_dot_node) */ struct SEE_context *context; struct SEE_value *res; { struct MemberExpression_dot_node *n = CAST_NODE(na, MemberExpression_dot); struct SEE_value r1, r2, r5; struct SEE_interpreter *interp = context->interpreter; EVAL(n->mexp, context, &r1); GetValue(context, &r1, &r2); SEE_ToObject(interp, &r2, &r5); _SEE_SET_REFERENCE(res, r5.u.object, n->name); } #if WITH_PARSER_PRINT static void MemberExpression_dot_print(na, printer) struct node *na; /* (struct MemberExpression_dot_node) */ struct printer *printer; { struct MemberExpression_dot_node *n = CAST_NODE(na, MemberExpression_dot); PRINTP(n->mexp); PRINT_CHAR('.'); PRINT_STRING(n->name); PRINT_CHAR(' '); } #endif #if WITH_PARSER_VISIT static void MemberExpression_dot_visit(na, v, va) struct node *na; /* (struct MemberExpression_dot_node) */ visitor_fn_t v; void *va; { struct MemberExpression_dot_node *n = CAST_NODE(na, MemberExpression_dot); VISIT(n->mexp, v, va); } #endif static struct nodeclass MemberExpression_dot_nodeclass = { BASECLASS MemberExpression_dot_eval, 0, PARSER_PRINT(MemberExpression_dot_print) PARSER_VISIT(MemberExpression_dot_visit) 0 }; struct MemberExpression_bracket_node { struct node node; struct node *mexp, *name; }; /* 11.2.1 */ static void MemberExpression_bracket_eval(na, context, res) struct node *na; /* (struct MemberExpression_bracket_node) */ struct SEE_context *context; struct SEE_value *res; { struct MemberExpression_bracket_node *n = CAST_NODE(na, MemberExpression_bracket); struct SEE_value r1, r2, r3, r4, r5, r6; struct SEE_interpreter *interp = context->interpreter; EVAL(n->mexp, context, &r1); GetValue(context, &r1, &r2); EVAL(n->name, context, &r3); GetValue(context, &r3, &r4); SEE_ToObject(interp, &r2, &r5); SEE_ToString(interp, &r4, &r6); _SEE_SET_REFERENCE(res, r5.u.object, r6.u.string); } #if WITH_PARSER_PRINT static void MemberExpression_bracket_print(na, printer) struct node *na; /* (struct MemberExpression_bracket_node) */ struct printer *printer; { struct MemberExpression_bracket_node *n = CAST_NODE(na, MemberExpression_bracket); PRINTP(n->mexp); PRINT_CHAR('['); PRINT(n->name); PRINT_CHAR(']'); } #endif #if WITH_PARSER_VISIT static void MemberExpression_bracket_visit(na, v, va) struct node *na; /* (struct MemberExpression_bracket_node) */ visitor_fn_t v; void *va; { struct MemberExpression_bracket_node *n = CAST_NODE(na, MemberExpression_bracket); VISIT(n->mexp, v, va); VISIT(n->name, v, va); } #endif static struct nodeclass MemberExpression_bracket_nodeclass = { BASECLASS MemberExpression_bracket_eval, 0, PARSER_PRINT(MemberExpression_bracket_print) PARSER_VISIT(MemberExpression_bracket_visit) 0 }; static struct node * MemberExpression_parse(parser) struct parser *parser; { struct node *n; struct MemberExpression_new_node *m; struct MemberExpression_dot_node *dn; struct MemberExpression_bracket_node *bn; switch (NEXT) { case tFUNCTION: n = PARSE(FunctionExpression); break; case tNEW: m = NEW_NODE(struct MemberExpression_new_node, &MemberExpression_new_nodeclass); SKIP; m->mexp = PARSE(MemberExpression); if (NEXT == '(') m->args = PARSE(Arguments); else m->args = NULL; n = (struct node *)m; break; default: n = PARSE(PrimaryExpression); } for (;;) switch (NEXT) { case '.': dn = NEW_NODE(struct MemberExpression_dot_node, &MemberExpression_dot_nodeclass); SKIP; if (NEXT == tIDENT) { dn->mexp = n; dn->name = NEXT_VALUE->u.string; n = (struct node *)dn; } EXPECT(tIDENT); break; case '[': bn = NEW_NODE(struct MemberExpression_bracket_node, &MemberExpression_bracket_nodeclass); SKIP; bn->mexp = n; bn->name = PARSE(Expression); n = (struct node *)bn; EXPECT(']'); break; default: return n; } } struct CallExpression_node { struct node node; struct node *exp; struct Arguments_node *args; }; /* 11.2.3 */ static void CallExpression_eval(na, context, res) struct node *na; /* (struct CallExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct CallExpression_node *n = CAST_NODE(na, CallExpression); struct SEE_interpreter *interp = context->interpreter; struct SEE_value r1, r3, *args, **argv; struct SEE_object *r6, *r7; struct SEE_traceback *tb; int argc, i; EVAL(n->exp, context, &r1); argc = n->args->argc; if (argc) { args = SEE_ALLOCA(interp, struct SEE_value, argc); argv = SEE_ALLOCA(interp, struct SEE_value *, argc); Arguments_eval((struct node *)n->args, context, args); for (i = 0; i < argc; i++) argv[i] = &args[i]; } else argv = NULL; GetValue(context, &r1, &r3); if (SEE_VALUE_GET_TYPE(&r3) == SEE_UNDEFINED) /* nonstandard */ SEE_error_throw_string(interp, interp->TypeError, STR(no_such_function)); if (SEE_VALUE_GET_TYPE(&r3) != SEE_OBJECT) SEE_error_throw_string(interp, interp->TypeError, STR(not_a_function)); if (!SEE_OBJECT_HAS_CALL(r3.u.object)) SEE_error_throw_string(interp, interp->TypeError, STR(not_callable)); if (SEE_VALUE_GET_TYPE(&r1) == SEE_REFERENCE) r6 = r1.u.reference.base; else r6 = NULL; if (r6 != NULL && IS_ACTIVATION_OBJECT(r6)) r7 = NULL; else r7 = r6; tb = traceback_enter(interp, r3.u.object, &n->node.location, SEE_CALLTYPE_CALL); TRACE(na, context, SEE_TRACE_CALL); if (r3.u.object == interp->Global_eval) { /* The special 'eval' function' */ eval(context, r7, argc, argv, res); } else { #ifndef NDEBUG SEE_SET_STRING(res, STR(internal_error)); #endif SEE_OBJECT_CALL(interp, r3.u.object, r7, argc, argv, res); } TRACE(na, context, SEE_TRACE_RETURN); traceback_leave(interp, tb); } #if WITH_PARSER_PRINT static void CallExpression_print(na, printer) struct node *na; /* (struct CallExpression_node) */ struct printer *printer; { struct CallExpression_node *n = CAST_NODE(na, CallExpression); PRINTP(n->exp); PRINT((struct node *)n->args); } #endif #if WITH_PARSER_VISIT static void CallExpression_visit(na, v, va) struct node *na; /* (struct CallExpression_node) */ visitor_fn_t v; void *va; { struct CallExpression_node *n = CAST_NODE(na, CallExpression); VISIT(n->exp, v, va); VISIT((struct node *)n->args, v, va); } #endif static struct nodeclass CallExpression_nodeclass = { BASECLASS CallExpression_eval, 0, PARSER_PRINT(CallExpression_print) PARSER_VISIT(CallExpression_visit) 0 }; static struct node * LeftHandSideExpression_parse(parser) struct parser *parser; { struct node *n; struct CallExpression_node *cn; struct MemberExpression_dot_node *dn; struct MemberExpression_bracket_node *bn; switch (NEXT) { case tFUNCTION: n = PARSE(FunctionExpression); /* 11.2.5 */ break; case tNEW: n = PARSE(MemberExpression); break; default: n = PARSE(PrimaryExpression); } for (;;) { #ifndef NDEBUG if (SEE_parse_debug) dprintf("LeftHandSideExpression: islhs = %d next is %s\n", parser->is_lhs, SEE_tokenname(NEXT)); #endif switch (NEXT) { case '.': dn = NEW_NODE(struct MemberExpression_dot_node, &MemberExpression_dot_nodeclass); SKIP; if (NEXT == tIDENT) { dn->mexp = n; dn->name = NEXT_VALUE->u.string; n = (struct node *)dn; } EXPECT(tIDENT); break; case '[': bn = NEW_NODE(struct MemberExpression_bracket_node, &MemberExpression_bracket_nodeclass); SKIP; bn->mexp = n; bn->name = PARSE(Expression); n = (struct node *)bn; EXPECT(']'); break; case '(': cn = NEW_NODE(struct CallExpression_node, &CallExpression_nodeclass); cn->exp = n; cn->args = PARSE(Arguments); n = (struct node *)cn; break; default: /* Eventually we leave via this clause */ parser->is_lhs = 1; return n; } } } /* * -- 11.3 * * PostfixExpression * : LeftHandSideExpression * | LeftHandSideExpression { NOLINETERM; } tPLUSPLUS -- 11.3.1 * | LeftHandSideExpression { NOLINETERM; } tMINUSMINUS -- 11.3.2 * ; */ struct Unary_node { struct node node; struct node *a; }; #if WITH_PARSER_VISIT static void Unary_visit(na, v, va) struct node *na; /* (struct Unary_node) */ visitor_fn_t v; void *va; { struct Unary_node *n = CAST_NODE(na, Unary); VISIT(n->a, v, va); } #endif #if WITH_PARSER_PRINT static void Unary_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT(n->a); } #endif static int Unary_isconst(na, interp) struct node *na; /* (struct Unary_node) */ struct SEE_interpreter *interp; { struct Unary_node *n = CAST_NODE(na, Unary); return ISCONST(n->a, interp); } static struct nodeclass Unary_nodeclass = { BASECLASS 0, 0, PARSER_PRINT(Unary_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.3.1 */ static void PostfixExpression_inc_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2, r3; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToNumber(context->interpreter, &r2, res); SEE_SET_NUMBER(&r3, res->u.number + 1); PutValue(context, &r1, &r3); } #if WITH_PARSER_PRINT static void PostfixExpression_inc_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINTP(n->a); PRINT_CHAR('+'); PRINT_CHAR('+'); PRINT_CHAR(' '); } #endif static struct nodeclass PostfixExpression_inc_nodeclass = { SUPERCLASS(Unary) PostfixExpression_inc_eval, 0, PARSER_PRINT(PostfixExpression_inc_print) PARSER_VISIT(Unary_visit) 0 }; /* 11.3.2 */ static void PostfixExpression_dec_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2, r3; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToNumber(context->interpreter, &r2, res); SEE_SET_NUMBER(&r3, res->u.number - 1); PutValue(context, &r1, &r3); } #if WITH_PARSER_PRINT static void PostfixExpression_dec_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINTP(n->a); PRINT_CHAR('-'); PRINT_CHAR('-'); PRINT_CHAR(' '); } #endif static struct nodeclass PostfixExpression_dec_nodeclass = { SUPERCLASS(Unary) PostfixExpression_dec_eval, 0, PARSER_PRINT(PostfixExpression_dec_print) PARSER_VISIT(Unary_visit) 0 }; static struct node * PostfixExpression_parse(parser) struct parser *parser; { struct node *n; struct Unary_node *pen; n = PARSE(LeftHandSideExpression); if (!NEXT_FOLLOWS_NL && (NEXT == tPLUSPLUS || NEXT == tMINUSMINUS)) { pen = NEW_NODE(struct Unary_node, NEXT == tPLUSPLUS ? &PostfixExpression_inc_nodeclass : &PostfixExpression_dec_nodeclass); pen->a = n; n = (struct node *)pen; SKIP; parser->is_lhs = 0; } return n; } /* * -- 11.4 * * UnaryExpression * : PostfixExpression * | tDELETE UnaryExpression -- 11.4.1 * | tVOID UnaryExpression -- 11.4.2 * | tTYPEOF UnaryExpression -- 11.4.3 * | tPLUSPLUS UnaryExpression -- 11.4.4 * | tMINUSMINUS UnaryExpression -- 11.4.5 * | '+' UnaryExpression -- 11.4.6 * | '-' UnaryExpression -- 11.4.7 * | '~' UnaryExpression -- 11.4.8 * | '!' UnaryExpression -- 11.4.9 * ; */ /* 11.4.1 */ static void UnaryExpression_delete_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1; struct SEE_interpreter *interp = context->interpreter; EVAL(n->a, context, &r1); if (SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE) { SEE_SET_BOOLEAN(res, 0); return; } /* * spec bug: if the base is null, it isn't clear what is meant * to happen. We return true as if the fictitous property * owner existed. */ if (!r1.u.reference.base || SEE_OBJECT_DELETE(interp, r1.u.reference.base, r1.u.reference.property)) SEE_SET_BOOLEAN(res, 1); else SEE_SET_BOOLEAN(res, 0); } #if WITH_PARSER_PRINT static void UnaryExpression_delete_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_STRING(STR(delete)); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_delete_nodeclass = { SUPERCLASS(Unary) UnaryExpression_delete_eval, 0, PARSER_PRINT(UnaryExpression_delete_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.4.2 */ static void UnaryExpression_void_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_SET_UNDEFINED(res); } #if WITH_PARSER_PRINT static void UnaryExpression_void_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_STRING(STR(void)); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_void_nodeclass = { SUPERCLASS(Unary) UnaryExpression_void_eval, 0, PARSER_PRINT(UnaryExpression_void_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.4.3 */ static void UnaryExpression_typeof_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r4; struct SEE_string *s; EVAL(n->a, context, &r1); if (SEE_VALUE_GET_TYPE(&r1) == SEE_REFERENCE && r1.u.reference.base == NULL) { SEE_SET_STRING(res, STR(undefined)); return; } GetValue(context, &r1, &r4); switch (SEE_VALUE_GET_TYPE(&r4)) { case SEE_UNDEFINED: s = STR(undefined); break; case SEE_NULL: s = STR(object); break; case SEE_BOOLEAN: s = STR(boolean); break; case SEE_NUMBER: s = STR(number); break; case SEE_STRING: s = STR(string); break; case SEE_OBJECT: s = SEE_OBJECT_HAS_CALL(r4.u.object) ? STR(function) : STR(object); break; default: s = STR(unknown); } SEE_SET_STRING(res, s); } #if WITH_PARSER_PRINT static void UnaryExpression_typeof_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_STRING(STR(typeof)); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_typeof_nodeclass = { SUPERCLASS(Unary) UnaryExpression_typeof_eval, 0, PARSER_PRINT(UnaryExpression_typeof_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.4.4 */ static void UnaryExpression_preinc_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToNumber(context->interpreter, &r2, res); res->u.number++; PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void UnaryExpression_preinc_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_CHAR('+'); PRINT_CHAR('+'); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_preinc_nodeclass = { SUPERCLASS(Unary) UnaryExpression_preinc_eval, 0, PARSER_PRINT(UnaryExpression_preinc_print) PARSER_VISIT(Unary_visit) 0 }; /* 11.4.5 */ static void UnaryExpression_predec_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToNumber(context->interpreter, &r2, res); res->u.number--; PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void UnaryExpression_predec_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_CHAR('-'); PRINT_CHAR('-'); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_predec_nodeclass = { SUPERCLASS(Unary) UnaryExpression_predec_eval, 0, PARSER_PRINT(UnaryExpression_predec_print) PARSER_VISIT(Unary_visit) 0 }; /* 11.4.6 */ static void UnaryExpression_plus_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToNumber(context->interpreter, &r2, res); } #if WITH_PARSER_PRINT static void UnaryExpression_plus_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_CHAR('+'); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_plus_nodeclass = { SUPERCLASS(Unary) UnaryExpression_plus_eval, 0, PARSER_PRINT(UnaryExpression_plus_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.4.7 */ static void UnaryExpression_minus_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToNumber(context->interpreter, &r2, res); res->u.number = -(res->u.number); } #if WITH_PARSER_PRINT static void UnaryExpression_minus_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_CHAR('-'); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_minus_nodeclass = { SUPERCLASS(Unary) UnaryExpression_minus_eval, 0, PARSER_PRINT(UnaryExpression_minus_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.4.8 */ static void UnaryExpression_inv_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; SEE_int32_t r3; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); r3 = SEE_ToInt32(context->interpreter, &r2); SEE_SET_NUMBER(res, ~r3); } #if WITH_PARSER_PRINT static void UnaryExpression_inv_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_CHAR('~'); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_inv_nodeclass = { SUPERCLASS(Unary) UnaryExpression_inv_eval, 0, PARSER_PRINT(UnaryExpression_inv_print) PARSER_VISIT(Unary_visit) Unary_isconst }; /* 11.4.9 */ static void UnaryExpression_not_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2, r3; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToBoolean(context->interpreter, &r2, &r3); SEE_SET_BOOLEAN(res, !r3.u.boolean); } #if WITH_PARSER_PRINT static void UnaryExpression_not_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_CHAR('!'); PRINT_CHAR(' '); PRINTP(n->a); } #endif static struct nodeclass UnaryExpression_not_nodeclass = { SUPERCLASS(Unary) UnaryExpression_not_eval, 0, PARSER_PRINT(UnaryExpression_not_print) PARSER_VISIT(Unary_visit) Unary_isconst }; static struct node * UnaryExpression_parse(parser) struct parser *parser; { struct Unary_node *n; struct nodeclass *nc; switch (NEXT) { case tDELETE: nc = &UnaryExpression_delete_nodeclass; break; case tVOID: nc = &UnaryExpression_void_nodeclass; break; case tTYPEOF: nc = &UnaryExpression_typeof_nodeclass; break; case tPLUSPLUS: nc = &UnaryExpression_preinc_nodeclass; break; case tMINUSMINUS: nc = &UnaryExpression_predec_nodeclass; break; case '+': nc = &UnaryExpression_plus_nodeclass; break; case '-': nc = &UnaryExpression_minus_nodeclass; break; case '~': nc = &UnaryExpression_inv_nodeclass; break; case '!': nc = &UnaryExpression_not_nodeclass; break; default: return PARSE(PostfixExpression); } n = NEW_NODE(struct Unary_node, nc); SKIP; n->a = PARSE(UnaryExpression); parser->is_lhs = 0; return (struct node *)n; } /* * -- 11.5 * * MultiplicativeExpression * : UnaryExpression * | MultiplicativeExpression '*' UnaryExpression -- 11.5.1 * | MultiplicativeExpression '/' UnaryExpression -- 11.5.2 * | MultiplicativeExpression '%' UnaryExpression -- 11.5.3 * ; */ struct Binary_node { struct node node; struct node *a, *b; }; #if WITH_PARSER_VISIT static void Binary_visit(na, v, va) struct node *na; /* (struct Binary_node) */ visitor_fn_t v; void *va; { struct Binary_node *n = CAST_NODE(na, Binary); VISIT(n->a, v, va); VISIT(n->b, v, va); } #endif #if WITH_PARSER_PRINT static void Binary_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINT(n->a); PRINT(n->b); } #endif static int Binary_isconst(na, interp) struct node *na; /* (struct Binary_node) */ struct SEE_interpreter *interp; { struct Binary_node *n = CAST_NODE(na, Binary); return ISCONST(n->a, interp) && ISCONST(n->b, interp); } static struct nodeclass Binary_nodeclass = { BASECLASS 0, 0, PARSER_PRINT(Binary_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.5.1 */ static void MultiplicativeExpression_mul_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4, r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); SEE_ToNumber(context->interpreter, r2, &r5); SEE_ToNumber(context->interpreter, &r4, &r6); SEE_SET_NUMBER(res, r5.u.number * r6.u.number); } static void MultiplicativeExpression_mul_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); MultiplicativeExpression_mul_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void MultiplicativeExpression_mul_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('*'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass MultiplicativeExpression_mul_nodeclass = { SUPERCLASS(Binary) MultiplicativeExpression_mul_eval, 0, PARSER_PRINT(MultiplicativeExpression_mul_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.5.2 */ static void MultiplicativeExpression_div_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4, r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); SEE_ToNumber(context->interpreter, r2, &r5); SEE_ToNumber(context->interpreter, &r4, &r6); SEE_SET_NUMBER(res, r5.u.number / r6.u.number); } static void MultiplicativeExpression_div_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); MultiplicativeExpression_div_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void MultiplicativeExpression_div_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('/'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass MultiplicativeExpression_div_nodeclass = { SUPERCLASS(Binary) MultiplicativeExpression_div_eval, 0, PARSER_PRINT(MultiplicativeExpression_div_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.5.3 */ static void MultiplicativeExpression_mod_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4, r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); SEE_ToNumber(context->interpreter, r2, &r5); SEE_ToNumber(context->interpreter, &r4, &r6); SEE_SET_NUMBER(res, fmod(r5.u.number, r6.u.number)); } static void MultiplicativeExpression_mod_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); MultiplicativeExpression_mod_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void MultiplicativeExpression_mod_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('%'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass MultiplicativeExpression_mod_nodeclass = { SUPERCLASS(Binary) MultiplicativeExpression_mod_eval, 0, PARSER_PRINT(MultiplicativeExpression_mod_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * MultiplicativeExpression_parse(parser) struct parser *parser; { struct node *n; struct nodeclass *nc; struct Binary_node *m; n = PARSE(UnaryExpression); for (;;) { /* Left-to-right associative */ switch (NEXT) { case '*': nc = &MultiplicativeExpression_mul_nodeclass; break; case '/': nc = &MultiplicativeExpression_div_nodeclass; break; case '%': nc = &MultiplicativeExpression_mod_nodeclass; break; default: return n; } SKIP; m = NEW_NODE(struct Binary_node, nc); m->a = n; m->b = PARSE(UnaryExpression); parser->is_lhs = 0; n = (struct node *)m; } } /* * -- 11.6 * * AdditiveExpression * : MultiplicativeExpression * | AdditiveExpression '+' MultiplicativeExpression -- 11.6.1 * | AdditiveExpression '-' MultiplicativeExpression -- 11.6.2 * ; */ /* 11.6.1 */ static void AdditiveExpression_add_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4, r5, r6, r8, r9, r12, r13; struct SEE_string *s; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); SEE_ToPrimitive(context->interpreter, r2, NULL, &r5); SEE_ToPrimitive(context->interpreter, &r4, NULL, &r6); if (!(SEE_VALUE_GET_TYPE(&r5) == SEE_STRING || SEE_VALUE_GET_TYPE(&r6) == SEE_STRING)) { SEE_ToNumber(context->interpreter, &r5, &r8); SEE_ToNumber(context->interpreter, &r6, &r9); SEE_SET_NUMBER(res, r8.u.number + r9.u.number); } else { SEE_ToString(context->interpreter, &r5, &r12); SEE_ToString(context->interpreter, &r6, &r13); s = SEE_string_concat(context->interpreter, r12.u.string, r13.u.string); SEE_SET_STRING(res, s); } } static void AdditiveExpression_add_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); AdditiveExpression_add_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void AdditiveExpression_add_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('+'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass AdditiveExpression_add_nodeclass = { SUPERCLASS(Binary) AdditiveExpression_add_eval, 0, PARSER_PRINT(AdditiveExpression_add_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.6.2 */ static void AdditiveExpression_sub_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4, r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); SEE_ToNumber(context->interpreter, r2, &r5); SEE_ToNumber(context->interpreter, &r4, &r6); SEE_SET_NUMBER(res, r5.u.number - r6.u.number); } static void AdditiveExpression_sub_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); AdditiveExpression_sub_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void AdditiveExpression_sub_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('-'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass AdditiveExpression_sub_nodeclass = { SUPERCLASS(Binary) AdditiveExpression_sub_eval, 0, PARSER_PRINT(AdditiveExpression_sub_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * AdditiveExpression_parse(parser) struct parser *parser; { struct node *n; struct nodeclass *nc; struct Binary_node *m; n = PARSE(MultiplicativeExpression); for (;;) { switch (NEXT) { case '+': nc = &AdditiveExpression_add_nodeclass; break; case '-': nc = &AdditiveExpression_sub_nodeclass; break; default: return n; } parser->is_lhs = 0; SKIP; m = NEW_NODE(struct Binary_node, nc); m->a = n; m->b = PARSE(MultiplicativeExpression); n = (struct node *)m; } return n; } /* * -- 11.7 * * ShiftExpression * : AdditiveExpression * | ShiftExpression tLSHIFT AdditiveExpression -- 11.7.1 * | ShiftExpression tRSHIFT AdditiveExpression -- 11.7.2 * | ShiftExpression tURSHIFT AdditiveExpression -- 11.7.3 * ; */ /* 11.7.1 */ static void ShiftExpression_lshift_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4; SEE_int32_t r5; SEE_uint32_t r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); r5 = SEE_ToInt32(context->interpreter, r2); r6 = SEE_ToUint32(context->interpreter, &r4); SEE_SET_NUMBER(res, r5 << (r6 & 0x1f)); } static void ShiftExpression_lshift_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); ShiftExpression_lshift_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void ShiftExpression_lshift_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('<'); PRINT_CHAR('<'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass ShiftExpression_lshift_nodeclass = { SUPERCLASS(Binary) ShiftExpression_lshift_eval, 0, PARSER_PRINT(ShiftExpression_lshift_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.7.2 */ static void ShiftExpression_rshift_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4; SEE_int32_t r5; SEE_uint32_t r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); r5 = SEE_ToInt32(context->interpreter, r2); r6 = SEE_ToUint32(context->interpreter, &r4); SEE_SET_NUMBER(res, r5 >> (r6 & 0x1f)); } static void ShiftExpression_rshift_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); ShiftExpression_rshift_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void ShiftExpression_rshift_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('>'); PRINT_CHAR('>'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass ShiftExpression_rshift_nodeclass = { SUPERCLASS(Binary) ShiftExpression_rshift_eval, 0, PARSER_PRINT(ShiftExpression_rshift_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.7.3 */ static void ShiftExpression_urshift_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4; SEE_uint32_t r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); r5 = SEE_ToUint32(context->interpreter, r2); r6 = SEE_ToUint32(context->interpreter, &r4); SEE_SET_NUMBER(res, r5 >> (r6 & 0x1f)); } static void ShiftExpression_urshift_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); ShiftExpression_urshift_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void ShiftExpression_urshift_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('>'); PRINT_CHAR('>'); PRINT_CHAR('>'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass ShiftExpression_urshift_nodeclass = { SUPERCLASS(Binary) ShiftExpression_urshift_eval, 0, PARSER_PRINT(ShiftExpression_urshift_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * ShiftExpression_parse(parser) struct parser *parser; { struct node *n; struct nodeclass *nc; struct Binary_node *sn; n = PARSE(AdditiveExpression); for (;;) { /* Left associative */ switch (NEXT) { case tLSHIFT: nc = &ShiftExpression_lshift_nodeclass; break; case tRSHIFT: nc = &ShiftExpression_rshift_nodeclass; break; case tURSHIFT: nc = &ShiftExpression_urshift_nodeclass; break; default: return n; } sn = NEW_NODE(struct Binary_node, nc); SKIP; sn->a = n; sn->b = PARSE(AdditiveExpression); parser->is_lhs = 0; n = (struct node *)sn; } } /* * -- 11.8 * * RelationalExpression * : ShiftExpression * | RelationalExpression '<' ShiftExpression -- 11.8.1 * | RelationalExpression '>' ShiftExpression -- 11.8.2 * | RelationalExpression tLE ShiftExpression -- 11.8.3 * | RelationalExpression tGT ShiftExpression -- 11.8.4 * | RelationalExpression tINSTANCEOF ShiftExpression -- 11.8.6 * | RelationalExpression tIN ShiftExpression -- 11.8.7 * ; * * RelationalExpressionNoIn * : ShiftExpression * | RelationalExpressionNoIn '<' ShiftExpression -- 11.8.1 * | RelationalExpressionNoIn '>' ShiftExpression -- 11.8.2 * | RelationalExpressionNoIn tLE ShiftExpression -- 11.8.3 * | RelationalExpressionNoIn tGT ShiftExpression -- 11.8.4 * | RelationalExpressionNoIn tINSTANCEOF ShiftExpression -- 11.8.6 * ; * * The *NoIn productions are implemented by the 'noin' boolean field * in the parser state. */ /* * 11.8.5 Abstract relational comparison function. */ static void RelationalExpression_sub(interp, x, y, res) struct SEE_interpreter *interp; struct SEE_value *x, *y, *res; { struct SEE_value r1, r2, r4, r5; struct SEE_value hint; int k; SEE_SET_OBJECT(&hint, interp->Number); SEE_ToPrimitive(interp, x, &hint, &r1); SEE_ToPrimitive(interp, y, &hint, &r2); if (!(SEE_VALUE_GET_TYPE(&r1) == SEE_STRING && SEE_VALUE_GET_TYPE(&r2) == SEE_STRING)) { SEE_ToNumber(interp, &r1, &r4); SEE_ToNumber(interp, &r2, &r5); if (SEE_NUMBER_ISNAN(&r4) || SEE_NUMBER_ISNAN(&r5)) SEE_SET_UNDEFINED(res); else if (r4.u.number == r5.u.number) SEE_SET_BOOLEAN(res, 0); else if (SEE_NUMBER_ISPINF(&r4)) SEE_SET_BOOLEAN(res, 0); else if (SEE_NUMBER_ISPINF(&r5)) SEE_SET_BOOLEAN(res, 1); else if (SEE_NUMBER_ISNINF(&r5)) SEE_SET_BOOLEAN(res, 0); else if (SEE_NUMBER_ISNINF(&r4)) SEE_SET_BOOLEAN(res, 1); else SEE_SET_BOOLEAN(res, r4.u.number < r5.u.number); } else { for (k = 0; k < r1.u.string->length && k < r2.u.string->length; k++) if (r1.u.string->data[k] != r2.u.string->data[k]) break; if (k == r2.u.string->length) SEE_SET_BOOLEAN(res, 0); else if (k == r1.u.string->length) SEE_SET_BOOLEAN(res, 1); else SEE_SET_BOOLEAN(res, r1.u.string->data[k] < r2.u.string->data[k]); } } /* 11.8.1 < */ static void RelationalExpression_lt_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); RelationalExpression_sub(context->interpreter, &r2, &r4, res); if (SEE_VALUE_GET_TYPE(res) == SEE_UNDEFINED) SEE_SET_BOOLEAN(res, 0); } #if WITH_PARSER_PRINT static void RelationalExpression_lt_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('<'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass RelationalExpression_lt_nodeclass = { SUPERCLASS(Binary) RelationalExpression_lt_eval, 0, PARSER_PRINT(RelationalExpression_lt_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.8.2 > */ static void RelationalExpression_gt_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); RelationalExpression_sub(context->interpreter, &r4, &r2, res); if (SEE_VALUE_GET_TYPE(res) == SEE_UNDEFINED) SEE_SET_BOOLEAN(res, 0); } #if WITH_PARSER_PRINT static void RelationalExpression_gt_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('>'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass RelationalExpression_gt_nodeclass = { SUPERCLASS(Binary) RelationalExpression_gt_eval, 0, PARSER_PRINT(RelationalExpression_gt_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.8.3 <= */ static void RelationalExpression_le_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4, r5; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); RelationalExpression_sub(context->interpreter, &r4, &r2, &r5); if (SEE_VALUE_GET_TYPE(&r5) == SEE_UNDEFINED) SEE_SET_BOOLEAN(res, 0); else SEE_SET_BOOLEAN(res, !r5.u.boolean); } #if WITH_PARSER_PRINT static void RelationalExpression_le_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('<'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass RelationalExpression_le_nodeclass = { SUPERCLASS(Binary) RelationalExpression_le_eval, 0, PARSER_PRINT(RelationalExpression_le_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.8.4 >= */ static void RelationalExpression_ge_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4, r5; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); RelationalExpression_sub(context->interpreter, &r2, &r4, &r5); if (SEE_VALUE_GET_TYPE(&r5) == SEE_UNDEFINED) SEE_SET_BOOLEAN(res, 0); else SEE_SET_BOOLEAN(res, !r5.u.boolean); } #if WITH_PARSER_PRINT static void RelationalExpression_ge_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('>'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass RelationalExpression_ge_nodeclass = { SUPERCLASS(Binary) RelationalExpression_ge_eval, 0, PARSER_PRINT(RelationalExpression_ge_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.8.6 */ static void RelationalExpression_instanceof_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_interpreter *interp = context->interpreter; struct SEE_value r1, r2, r3, r4; int r7; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); if (SEE_VALUE_GET_TYPE(&r4) != SEE_OBJECT) SEE_error_throw_string(interp, interp->TypeError, STR(instanceof_not_object)); if (!SEE_OBJECT_HAS_HASINSTANCE(r4.u.object)) SEE_error_throw_string(interp, interp->TypeError, STR(no_hasinstance)); r7 = SEE_OBJECT_HASINSTANCE(interp, r4.u.object, &r2); SEE_SET_BOOLEAN(res, r7); } #if WITH_PARSER_PRINT static void RelationalExpression_instanceof_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_STRING(STR(instanceof)); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass RelationalExpression_instanceof_nodeclass = { SUPERCLASS(Binary) RelationalExpression_instanceof_eval, 0, PARSER_PRINT(RelationalExpression_instanceof_print) PARSER_VISIT(Binary_visit) Binary_isconst }; /* 11.8.7 */ static void RelationalExpression_in_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_interpreter *interp = context->interpreter; struct SEE_value r1, r2, r3, r4, r6; int r7; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); if (SEE_VALUE_GET_TYPE(&r4) != SEE_OBJECT) SEE_error_throw_string(interp, interp->TypeError, STR(in_not_object)); SEE_ToString(interp, &r2, &r6); r7 = SEE_OBJECT_HASPROPERTY(interp, r4.u.object, SEE_intern(interp, r6.u.string)); SEE_SET_BOOLEAN(res, r7); } #if WITH_PARSER_PRINT static void RelationalExpression_in_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_STRING(STR(in)); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass RelationalExpression_in_nodeclass = { SUPERCLASS(Binary) RelationalExpression_in_eval, 0, PARSER_PRINT(RelationalExpression_in_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * RelationalExpression_parse(parser) struct parser *parser; { struct node *n; struct nodeclass *nc; struct Binary_node *rn; n = PARSE(ShiftExpression); for (;;) { /* Left associative */ switch (NEXT) { case '<': nc = &RelationalExpression_lt_nodeclass; break; case '>': nc = &RelationalExpression_gt_nodeclass; break; case tLE: nc = &RelationalExpression_le_nodeclass; break; case tGE: nc = &RelationalExpression_ge_nodeclass; break; case tINSTANCEOF: nc = &RelationalExpression_instanceof_nodeclass; break; case tIN: if (!parser->noin) { nc = &RelationalExpression_in_nodeclass; break; } /* else Fallthrough */ default: return n; } rn = NEW_NODE(struct Binary_node, nc); SKIP; rn->a = n; rn->b = PARSE(RelationalExpression); parser->is_lhs = 0; n = (struct node *)rn; } } /* * -- 11.9 * * EqualityExpression * : RelationalExpression * | EqualityExpression tEQ RelationalExpression -- 11.9.1 * | EqualityExpression tNE RelationalExpression -- 11.9.2 * | EqualityExpression tSEQ RelationalExpression -- 11.9.4 * | EqualityExpression tSNE RelationalExpression -- 11.9.5 * ; * * EqualityExpressionNoIn * : RelationalExpressionNoIn * | EqualityExpressionNoIn tEQ RelationalExpressionNoIn -- 11.9.1 * | EqualityExpressionNoIn tNE RelationalExpressionNoIn -- 11.9.2 * | EqualityExpressionNoIn tSEQ RelationalExpressionNoIn -- 11.9.4 * | EqualityExpressionNoIn tSNE RelationalExpressionNoIn -- 11.9.5 * ; */ /* * 11.9.3 Abstract equality function. */ static void EqualityExpression_eq(interp, x, y, res) struct SEE_interpreter *interp; struct SEE_value *x, *y, *res; { struct SEE_value tmp; int xtype, ytype; if (SEE_VALUE_GET_TYPE(x) == SEE_VALUE_GET_TYPE(y)) switch (SEE_VALUE_GET_TYPE(x)) { case SEE_UNDEFINED: case SEE_NULL: SEE_SET_BOOLEAN(res, 1); return; case SEE_NUMBER: if (SEE_NUMBER_ISNAN(x) || SEE_NUMBER_ISNAN(y)) SEE_SET_BOOLEAN(res, 0); else SEE_SET_BOOLEAN(res, x->u.number == y->u.number); return; case SEE_STRING: SEE_SET_BOOLEAN(res, SEE_string_cmp(x->u.string, y->u.string) == 0); return; case SEE_BOOLEAN: SEE_SET_BOOLEAN(res, !x->u.boolean == !y->u.boolean); return; case SEE_OBJECT: SEE_SET_BOOLEAN(res, SEE_OBJECT_JOINED(x->u.object, y->u.object)); return; default: SEE_error_throw_string(interp, interp->Error, STR(internal_error)); } xtype = SEE_VALUE_GET_TYPE(x); ytype = SEE_VALUE_GET_TYPE(y); if (xtype == SEE_NULL && ytype == SEE_UNDEFINED) SEE_SET_BOOLEAN(res, 1); else if (xtype == SEE_UNDEFINED && ytype == SEE_NULL) SEE_SET_BOOLEAN(res, 1); else if (xtype == SEE_NUMBER && ytype == SEE_STRING) { SEE_ToNumber(interp, y, &tmp); EqualityExpression_eq(interp, x, &tmp, res); } else if (xtype == SEE_STRING && ytype == SEE_NUMBER) { SEE_ToNumber(interp, x, &tmp); EqualityExpression_eq(interp, &tmp, y, res); } else if (xtype == SEE_BOOLEAN) { SEE_ToNumber(interp, x, &tmp); EqualityExpression_eq(interp, &tmp, y, res); } else if (ytype == SEE_BOOLEAN) { SEE_ToNumber(interp, y, &tmp); EqualityExpression_eq(interp, x, &tmp, res); } else if ((xtype == SEE_STRING || xtype == SEE_NUMBER) && ytype == SEE_OBJECT) { SEE_ToPrimitive(interp, y, x, &tmp); EqualityExpression_eq(interp, x, &tmp, res); } else if ((ytype == SEE_STRING || ytype == SEE_NUMBER) && xtype == SEE_OBJECT) { SEE_ToPrimitive(interp, x, y, &tmp); EqualityExpression_eq(interp, &tmp, y, res); } else SEE_SET_BOOLEAN(res, 0); } /* * 19.9.6 Strict equality function */ static void EqualityExpression_seq(context, x, y, res) struct SEE_context *context; struct SEE_value *x, *y, *res; { if (SEE_VALUE_GET_TYPE(x) != SEE_VALUE_GET_TYPE(y)) SEE_SET_BOOLEAN(res, 0); else switch (SEE_VALUE_GET_TYPE(x)) { case SEE_UNDEFINED: SEE_SET_BOOLEAN(res, 1); break; case SEE_NULL: SEE_SET_BOOLEAN(res, 1); break; case SEE_NUMBER: if (SEE_NUMBER_ISNAN(x) || SEE_NUMBER_ISNAN(y)) SEE_SET_BOOLEAN(res, 0); else SEE_SET_BOOLEAN(res, x->u.number == y->u.number); break; case SEE_STRING: SEE_SET_BOOLEAN(res, SEE_string_cmp(x->u.string, y->u.string) == 0); break; case SEE_BOOLEAN: SEE_SET_BOOLEAN(res, !x->u.boolean == !y->u.boolean); break; case SEE_OBJECT: SEE_SET_BOOLEAN(res, SEE_OBJECT_JOINED(x->u.object, y->u.object)); break; default: SEE_SET_BOOLEAN(res, 0); } } static void EqualityExpression_eq_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); EqualityExpression_eq(context->interpreter, &r4, &r2, res); } #if WITH_PARSER_PRINT static void EqualityExpression_eq_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('='); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass EqualityExpression_eq_nodeclass = { SUPERCLASS(Binary) EqualityExpression_eq_eval, 0, PARSER_PRINT(EqualityExpression_eq_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static void EqualityExpression_ne_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4, t; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); EqualityExpression_eq(context->interpreter, &r4, &r2, &t); SEE_SET_BOOLEAN(res, !t.u.boolean); } #if WITH_PARSER_PRINT static void EqualityExpression_ne_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('!'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass EqualityExpression_ne_nodeclass = { SUPERCLASS(Binary) EqualityExpression_ne_eval, 0, PARSER_PRINT(EqualityExpression_ne_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static void EqualityExpression_seq_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); EqualityExpression_seq(context, &r4, &r2, res); } #if WITH_PARSER_PRINT static void EqualityExpression_seq_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('='); PRINT_CHAR('='); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass EqualityExpression_seq_nodeclass = { SUPERCLASS(Binary) EqualityExpression_seq_eval, 0, PARSER_PRINT(EqualityExpression_seq_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static void EqualityExpression_sne_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3, r4, r5; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, &r4); EqualityExpression_seq(context, &r4, &r2, &r5); SEE_SET_BOOLEAN(res, !r5.u.boolean); } #if WITH_PARSER_PRINT static void EqualityExpression_sne_print(na, printer) struct printer *printer; struct node *na; /* (struct Binary_node) */ { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('!'); PRINT_CHAR('='); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass EqualityExpression_sne_nodeclass = { SUPERCLASS(Binary) EqualityExpression_sne_eval, 0, PARSER_PRINT(EqualityExpression_sne_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * EqualityExpression_parse(parser) struct parser *parser; { struct node *n; struct nodeclass *nc; struct Binary_node *rn; n = PARSE(RelationalExpression); for (;;) { /* Left associative */ switch (NEXT) { case tEQ: nc = &EqualityExpression_eq_nodeclass; break; case tNE: nc = &EqualityExpression_ne_nodeclass; break; case tSEQ: nc = &EqualityExpression_seq_nodeclass; break; case tSNE: nc = &EqualityExpression_sne_nodeclass; break; default: return n; } rn = NEW_NODE(struct Binary_node, nc); SKIP; rn->a = n; rn->b = PARSE(EqualityExpression); parser->is_lhs = 0; n = (struct node *)rn; } } /* * -- 11.10 * * BitwiseANDExpression * : EqualityExpression * | BitwiseANDExpression '&' EqualityExpression * ; * * BitwiseANDExpressionNoIn * : EqualityExpressionNoIn * | BitwiseANDExpressionNoIn '&' EqualityExpressionNoIn * ; */ /* 11.10 */ static void BitwiseANDExpression_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4; SEE_int32_t r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); r5 = SEE_ToInt32(context->interpreter, r2); r6 = SEE_ToInt32(context->interpreter, &r4); SEE_SET_NUMBER(res, r5 & r6); } static void BitwiseANDExpression_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); BitwiseANDExpression_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void BitwiseANDExpression_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('&'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass BitwiseANDExpression_nodeclass = { SUPERCLASS(Binary) BitwiseANDExpression_eval, 0, PARSER_PRINT(BitwiseANDExpression_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * BitwiseANDExpression_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *m; n = PARSE(EqualityExpression); if (NEXT != '&') return n; m = NEW_NODE(struct Binary_node, &BitwiseANDExpression_nodeclass); SKIP; m->a = n; m->b = PARSE(BitwiseANDExpression); parser->is_lhs = 0; return (struct node *)m; } /* * BitwiseXORExpression * : BitwiseANDExpression * | BitwiseXORExpression '^' BitwiseANDExpression * ; * * BitwiseXORExpressionNoIn * : BitwiseANDExpressionNoIn * | BitwiseXORExpressionNoIn '^' BitwiseANDExpressionNoIn * ; */ /* 11.10 */ static void BitwiseXORExpression_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4; SEE_int32_t r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); r5 = SEE_ToInt32(context->interpreter, r2); r6 = SEE_ToInt32(context->interpreter, &r4); SEE_SET_NUMBER(res, r5 ^ r6); } static void BitwiseXORExpression_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); BitwiseXORExpression_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void BitwiseXORExpression_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('^'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass BitwiseXORExpression_nodeclass = { SUPERCLASS(Binary) BitwiseXORExpression_eval, 0, PARSER_PRINT(BitwiseXORExpression_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * BitwiseXORExpression_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *m; n = PARSE(BitwiseANDExpression); if (NEXT != '^') return n; m = NEW_NODE(struct Binary_node, &BitwiseXORExpression_nodeclass); SKIP; m->a = n; m->b = PARSE(BitwiseXORExpression); parser->is_lhs = 0; return (struct node *)m; } /* * BitwiseORExpression * : BitwiseXORExpression * | BitwiseORExpression '|' BitwiseXORExpression * ; * * BitwiseORExpressionNoIn * : BitwiseXORExpressionNoIn * | BitwiseORExpressionNoIn '|' BitwiseXORExpressionNoIn * ; */ /* 11.10 */ static void BitwiseORExpression_common(r2, bn, context, res) struct SEE_value *r2, *res; struct node *bn; struct SEE_context *context; { struct SEE_value r3, r4; SEE_int32_t r5, r6; EVAL(bn, context, &r3); GetValue(context, &r3, &r4); r5 = SEE_ToInt32(context->interpreter, r2); r6 = SEE_ToInt32(context->interpreter, &r4); SEE_SET_NUMBER(res, r5 | r6); } static void BitwiseORExpression_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); BitwiseORExpression_common(&r2, n->b, context, res); } #if WITH_PARSER_PRINT static void BitwiseORExpression_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('|'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static struct nodeclass BitwiseORExpression_nodeclass = { SUPERCLASS(Binary) BitwiseORExpression_eval, 0, PARSER_PRINT(BitwiseORExpression_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * BitwiseORExpression_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *m; n = PARSE(BitwiseXORExpression); if (NEXT != '|') return n; m = NEW_NODE(struct Binary_node, &BitwiseORExpression_nodeclass); SKIP; m->a = n; m->b = PARSE(BitwiseORExpression); parser->is_lhs = 0; return (struct node *)m; } /* * -- 11.11 * * LogicalANDExpression * : BitwiseORExpression * | LogicalANDExpression tANDAND BitwiseORExpression * ; * * LogicalANDExpressionNoIn * : BitwiseORExpressionNoIn * | LogicalANDExpressionNoIn tANDAND BitwiseORExpressionNoIn * ; */ static void LogicalANDExpression_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r3, r5; EVAL(n->a, context, &r1); GetValue(context, &r1, res); SEE_ToBoolean(context->interpreter, res, &r3); if (!r3.u.boolean) return; EVAL(n->b, context, &r5); GetValue(context, &r5, res); } #if WITH_PARSER_PRINT static void LogicalANDExpression_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('&'); PRINT_CHAR('&'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static int LogicalANDExpression_isconst(na, interp) struct node *na; /* (struct Binary_node) */ struct SEE_interpreter *interp; { struct Binary_node *n = CAST_NODE(na, Binary); if (ISCONST(n->a, interp)) { struct SEE_value r1, r3; EVAL(n->a, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); return r3.u.boolean ? ISCONST(n->b, interp) : 1; } else return 0; } static struct nodeclass LogicalANDExpression_nodeclass = { SUPERCLASS(Binary) LogicalANDExpression_eval, 0, PARSER_PRINT(LogicalANDExpression_print) PARSER_VISIT(Binary_visit) LogicalANDExpression_isconst }; static struct node * LogicalANDExpression_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *m; n = PARSE(BitwiseORExpression); if (NEXT != tANDAND) return n; m = NEW_NODE(struct Binary_node, &LogicalANDExpression_nodeclass); SKIP; m->a = n; m->b = PARSE(LogicalANDExpression); parser->is_lhs = 0; return (struct node *)m; } /* * LogicalORExpression * : LogicalANDExpression * | LogicalORExpression tOROR LogicalANDExpression * ; * * LogicalORExpressionNoIn * : LogicalANDExpressionNoIn * | LogicalORExpressionNoIn tOROR LogicalANDExpressionNoIn * ; */ static void LogicalORExpression_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r3, r5; EVAL(n->a, context, &r1); GetValue(context, &r1, res); SEE_ToBoolean(context->interpreter, res, &r3); if (r3.u.boolean) return; EVAL(n->b, context, &r5); GetValue(context, &r5, res); } #if WITH_PARSER_PRINT static void LogicalORExpression_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINTP(n->a); PRINT_CHAR('|'); PRINT_CHAR('|'); PRINT_CHAR(' '); PRINTP(n->b); } #endif static int LogicalORExpression_isconst(na, interp) struct node *na; /* (struct Binary_node) */ struct SEE_interpreter *interp; { struct Binary_node *n = CAST_NODE(na, Binary); if (ISCONST(n->a, interp)) { struct SEE_value r1, r3; EVAL(n->a, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); return r3.u.boolean ? 1: ISCONST(n->b, interp); } else return 0; } static struct nodeclass LogicalORExpression_nodeclass = { SUPERCLASS(Binary) LogicalORExpression_eval, 0, PARSER_PRINT(LogicalORExpression_print) PARSER_VISIT(Binary_visit) LogicalORExpression_isconst }; static struct node * LogicalORExpression_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *m; n = PARSE(LogicalANDExpression); if (NEXT != tOROR) return n; m = NEW_NODE(struct Binary_node, &LogicalORExpression_nodeclass); SKIP; m->a = n; m->b = PARSE(LogicalORExpression); parser->is_lhs = 0; return (struct node *)m; } /* * -- 11.12 * * ConditionalExpression * : LogicalORExpression * | LogicalORExpression '?' * AssignmentExpression ':' AssignmentExpression * ; * * ConditionalExpressionNoIn * : LogicalORExpressionNoIn * | LogicalORExpressionNoIn '?' * AssignmentExpressionNoIn ':' AssignmentExpressionNoIn * ; */ struct ConditionalExpression_node { struct node node; struct node *a, *b, *c; }; static void ConditionalExpression_eval(na, context, res) struct node *na; /* (struct ConditionalExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct ConditionalExpression_node *n = CAST_NODE(na, ConditionalExpression); struct SEE_value r1, r2, r3, t; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToBoolean(context->interpreter, &r2, &r3); if (r3.u.boolean) EVAL(n->b, context, &t); else EVAL(n->c, context, &t); GetValue(context, &t, res); } #if WITH_PARSER_PRINT static void ConditionalExpression_print(na, printer) struct node *na; /* (struct ConditionalExpression_node) */ struct printer *printer; { struct ConditionalExpression_node *n = CAST_NODE(na, ConditionalExpression); PRINTP(n->a); PRINT_CHAR('?'); PRINT_CHAR(' '); PRINTP(n->b); PRINT_CHAR(':'); PRINT_CHAR(' '); PRINTP(n->c); } #endif #if WITH_PARSER_VISIT static void ConditionalExpression_visit(na, v, va) struct node *na; /* (struct ConditionalExpression_node) */ visitor_fn_t v; void *va; { struct ConditionalExpression_node *n = CAST_NODE(na, ConditionalExpression); VISIT(n->a, v, va); VISIT(n->b, v, va); VISIT(n->c, v, va); } #endif static int ConditionalExpression_isconst(na, interp) struct node *na; /* (struct ConditionalExpression_node) */ struct SEE_interpreter *interp; { struct ConditionalExpression_node *n = CAST_NODE(na, ConditionalExpression); if (ISCONST(n->a, interp)) { struct SEE_value r1, r3; EVAL(n->a, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); return r3.u.boolean ? ISCONST(n->b, interp) : ISCONST(n->c, interp); } else return 0; } static struct nodeclass ConditionalExpression_nodeclass = { BASECLASS ConditionalExpression_eval, 0, PARSER_PRINT(ConditionalExpression_print) PARSER_VISIT(ConditionalExpression_visit) ConditionalExpression_isconst }; static struct node * ConditionalExpression_parse(parser) struct parser *parser; { struct node *n; struct ConditionalExpression_node *m; n = PARSE(LogicalORExpression); if (NEXT != '?') return n; m = NEW_NODE(struct ConditionalExpression_node, &ConditionalExpression_nodeclass); SKIP; m->a = n; m->b = PARSE(AssignmentExpression); EXPECT(':'); m->c = PARSE(AssignmentExpression); parser->is_lhs = 0; return (struct node *)m; } /* * -- 11.13 * * AssignmentExpression * : ConditionalExpression * | LeftHandSideExpression AssignmentOperator AssignmentExpression * ; * * AssignmentExpressionNoIn * : ConditionalExpressionNoIn * | LeftHandSideExpression AssignmentOperator * AssignmentExpressionNoIn * ; * * AssignmentOperator * : '=' -- 11.13.1 * | tSTAREQ -- 11.13.2 * | tDIVEQ * | tMODEQ * | tPLUSEQ * | tMINUSEQ * | tLSHIFTEQ * | tRSHIFTEQ * | tURSHIFTEQ * | tANDEQ * | tXOREQ * | tOREQ * ; */ struct AssignmentExpression_node { struct node node; struct node *lhs, *expr; }; #if WITH_PARSER_VISIT static void AssignmentExpression_visit(na, v, va) struct node *na; /* (struct AssignmentExpression_node) */ visitor_fn_t v; void *va; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); VISIT(n->lhs, v, va); VISIT(n->expr, v, va); } #endif static struct nodeclass AssignmentExpression_nodeclass /* Abstract */ = { BASECLASS 0, 0, PARSER_PRINT(0) PARSER_VISIT(AssignmentExpression_visit) 0 }; static void AssignmentExpression_simple_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); EVAL(n->expr, context, &r2); GetValue(context, &r2, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_simple_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_simple_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_simple_eval, 0, PARSER_PRINT(AssignmentExpression_simple_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_muleq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); MultiplicativeExpression_mul_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_muleq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('*'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_muleq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_muleq_eval, 0, PARSER_PRINT(AssignmentExpression_muleq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_diveq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); MultiplicativeExpression_div_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_diveq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('/'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_diveq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_diveq_eval, 0, PARSER_PRINT(AssignmentExpression_diveq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_modeq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); MultiplicativeExpression_mod_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_modeq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('%'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_modeq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_modeq_eval, 0, PARSER_PRINT(AssignmentExpression_modeq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_addeq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); AdditiveExpression_add_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_addeq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('+'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_addeq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_addeq_eval, 0, PARSER_PRINT(AssignmentExpression_addeq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_subeq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); AdditiveExpression_sub_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_subeq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('-'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_subeq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_subeq_eval, 0, PARSER_PRINT(AssignmentExpression_subeq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_lshifteq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); ShiftExpression_lshift_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_lshifteq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('<'); PRINT_CHAR('<'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_lshifteq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_lshifteq_eval, 0, PARSER_PRINT(AssignmentExpression_lshifteq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_rshifteq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); ShiftExpression_rshift_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_rshifteq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('>'); PRINT_CHAR('>'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_rshifteq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_rshifteq_eval, 0, PARSER_PRINT(AssignmentExpression_rshifteq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_urshifteq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); ShiftExpression_urshift_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_urshifteq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('>'); PRINT_CHAR('>'); PRINT_CHAR('>'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_urshifteq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_urshifteq_eval, 0, PARSER_PRINT(AssignmentExpression_urshifteq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_andeq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); BitwiseANDExpression_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_andeq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('&'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_andeq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_andeq_eval, 0, PARSER_PRINT(AssignmentExpression_andeq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_xoreq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); BitwiseXORExpression_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_xoreq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('^'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_xoreq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_xoreq_eval, 0, PARSER_PRINT(AssignmentExpression_xoreq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; /* 11.13.2 */ static void AssignmentExpression_oreq_eval(na, context, res) struct node *na; /* (struct AssignmentExpression_node) */ struct SEE_context *context; struct SEE_value *res; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); struct SEE_value r1, r2; EVAL(n->lhs, context, &r1); GetValue(context, &r1, &r2); BitwiseORExpression_common(&r2, n->expr, context, res); PutValue(context, &r1, res); } #if WITH_PARSER_PRINT static void AssignmentExpression_oreq_print(na, printer) struct node *na; /* (struct AssignmentExpression_node) */ struct printer *printer; { struct AssignmentExpression_node *n = CAST_NODE(na, AssignmentExpression); PRINTP(n->lhs); PRINT_CHAR('|'); PRINT_CHAR('='); PRINT_CHAR(' '); PRINTP(n->expr); } #endif static struct nodeclass AssignmentExpression_oreq_nodeclass = { SUPERCLASS(AssignmentExpression) AssignmentExpression_oreq_eval, 0, PARSER_PRINT(AssignmentExpression_oreq_print) PARSER_VISIT(AssignmentExpression_visit) 0 }; static struct node * AssignmentExpression_parse(parser) struct parser *parser; { struct node *n; struct nodeclass *nc; struct AssignmentExpression_node *an; /* * If, while recursing we parse LeftHandSideExpression, * then is_lhs will be set to 1. Otherwise, it is just a * ConditionalExpression, and we cannot derive the second * production in this rule. So we just return. */ n = PARSE(ConditionalExpression); if (!parser->is_lhs) return n; switch (NEXT) { case '=': nc = &AssignmentExpression_simple_nodeclass; break; case tSTAREQ: nc = &AssignmentExpression_muleq_nodeclass; break; case tDIVEQ: nc = &AssignmentExpression_diveq_nodeclass; break; case tMODEQ: nc = &AssignmentExpression_modeq_nodeclass; break; case tPLUSEQ: nc = &AssignmentExpression_addeq_nodeclass; break; case tMINUSEQ: nc = &AssignmentExpression_subeq_nodeclass; break; case tLSHIFTEQ: nc = &AssignmentExpression_lshifteq_nodeclass; break; case tRSHIFTEQ: nc = &AssignmentExpression_rshifteq_nodeclass; break; case tURSHIFTEQ: nc = &AssignmentExpression_urshifteq_nodeclass; break; case tANDEQ: nc = &AssignmentExpression_andeq_nodeclass; break; case tXOREQ: nc = &AssignmentExpression_xoreq_nodeclass; break; case tOREQ: nc = &AssignmentExpression_oreq_nodeclass; break; default: return n; } an = NEW_NODE(struct AssignmentExpression_node, nc); an->lhs = n; SKIP; an->expr = PARSE(AssignmentExpression); parser->is_lhs = 0; return (struct node *)an; } /* * -- 11.14 * * Expression * : AssignmentExpression * | Expression ',' AssignmentExpression * ; * * ExpressionNoIn * : AssignmentExpressionNoIn * | ExpressionNoIn ',' AssignmentExpressionNoIn * ; */ /* 11.14 */ static void Expression_comma_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value r1, r2, r3; EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); EVAL(n->b, context, &r3); GetValue(context, &r3, res); } #if WITH_PARSER_PRINT static void Expression_comma_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINT(n->a); PRINT_CHAR(','); PRINT_CHAR(' '); PRINT(n->b); } #endif static struct nodeclass Expression_comma_nodeclass = { SUPERCLASS(Binary) Expression_comma_eval, 0, PARSER_PRINT(Expression_comma_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * Expression_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *cn; n = PARSE(AssignmentExpression); if (NEXT != ',') return n; cn = NEW_NODE(struct Binary_node, &Expression_comma_nodeclass); SKIP; cn->a = n; cn->b = PARSE(Expression); parser->is_lhs = 0; return (struct node *)cn; } /* * * -- 12 * * Statement * : Block * | VariableStatement * | EmptyStatement * | ExpressionStatement * | IfStatement * | IterationStatement * | ContinueStatement * | BreakStatement * | ReturnStatement * | WithStatement * | LabelledStatement * | SwitchStatement * | ThrowStatement * | TryStatement * ; */ static struct node * Statement_parse(parser) struct parser *parser; { struct node *n; parser->current_labelset = NULL; switch (NEXT) { case '{': return PARSE(Block); case tVAR: return PARSE(VariableStatement); case ';': return PARSE(EmptyStatement); case tIF: return PARSE(IfStatement); case tDO: case tWHILE: case tFOR: n = PARSE(IterationStatement); return n; case tCONTINUE: return PARSE(ContinueStatement); case tBREAK: return PARSE(BreakStatement); case tRETURN: return PARSE(ReturnStatement); case tWITH: return PARSE(WithStatement); case tSWITCH: n = PARSE(SwitchStatement); return n; case tTHROW: return PARSE(ThrowStatement); case tTRY: return PARSE(TryStatement); case tFUNCTION: /* Conditional functions for JS1.5 compatibility */ if (SEE_COMPAT_JS(parser->interpreter, >= ,JS15) && lookahead(parser, 1) != '(') return PARSE(FunctionStatement); ERRORm("function keyword not allowed here"); case tIDENT: if (lookahead(parser, 1) == ':') return PARSE(LabelledStatement); /* FALLTHROUGH */ default: return PARSE(ExpressionStatement); } } /* * -- 12.1 * * Block * : '{' '}' -- 12.1 * | '{' StatementList '}' -- 12.1 * ; */ /* 12.1 */ static void Block_empty_eval(n, context, res) struct node *n; struct SEE_context *context; struct SEE_value *res; { _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); } #if WITH_PARSER_PRINT static void Block_empty_print(n, printer) struct node *n; struct printer *printer; { PRINT_CHAR('{'); PRINT_CHAR('}'); } #endif static struct nodeclass Block_empty_nodeclass = { BASECLASS Block_empty_eval, 0, PARSER_PRINT(Block_empty_print) PARSER_VISIT(0) Always_isconst }; static struct node * Block_parse(parser) struct parser *parser; { struct node *n; EXPECT('{'); if (NEXT == '}') n = NEW_NODE(struct node, &Block_empty_nodeclass); else n = PARSE(StatementList); EXPECT('}'); return n; } /* * StatementList * : Statement -- 12.1 * | StatementList Statement -- 12.1 * ; */ /* 12.1 */ static void StatementList_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); struct SEE_value *val; EVAL(n->a, context, res); if (res->u.completion.type == SEE_COMPLETION_NORMAL) { val = res->u.completion.value; EVAL(n->b, context, res); if (res->u.completion.value == NULL) res->u.completion.value = val; else SEE_free(context->interpreter, (void **)&val); } } static struct nodeclass StatementList_nodeclass = { SUPERCLASS(Binary) StatementList_eval, 0, PARSER_PRINT(Binary_print) PARSER_VISIT(Binary_visit) Binary_isconst }; static struct node * StatementList_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *ln; n = PARSE(Statement); switch (NEXT) { case '}': case tEND: case tFUNCTION: case tCASE: case tDEFAULT: return n; } ln = NEW_NODE(struct Binary_node, &StatementList_nodeclass); ln->a = n; ln->b = PARSE(StatementList); return (struct node *)ln; } /* * -- 12.2 * * VariableStatement * : tVAR VariableDeclarationList ';' * ; * * VariableDeclarationList * : VariableDeclaration * | VariableDeclarationList ',' VariableDeclaration * ; * * VariableDeclarationListNoIn * : VariableDeclarationNoIn * | VariableDeclarationListNoIn ',' VariableDeclarationNoIn * ; * * VariableDeclaration * : tIDENT * | tIDENT Initialiser * ; * * VariableDeclarationNoIn * : tIDENT * | tIDENT InitialiserNoIn * ; * * Initialiser * : '=' AssignmentExpression * ; * * InitialiserNoIn * : '=' AssignmentExpressionNoIn * ; */ static void VariableStatement_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value v; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->a, context, &v); _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); } #if WITH_PARSER_PRINT static void VariableStatement_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_STRING(STR(var)); PRINT_CHAR(' '); PRINT(n->a); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass VariableStatement_nodeclass = { SUPERCLASS(Unary) VariableStatement_eval, 0, PARSER_PRINT(VariableStatement_print) PARSER_VISIT(Unary_visit) 0 }; static struct node * VariableStatement_parse(parser) struct parser *parser; { struct Unary_node *n; n = NEW_NODE(struct Unary_node, &VariableStatement_nodeclass); EXPECT(tVAR); n->a = PARSE(VariableDeclarationList); EXPECT_SEMICOLON; return (struct node *)n; } /* 12.2 */ static void VariableDeclarationList_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; /* unused */ { struct Binary_node *n = CAST_NODE(na, Binary); EVAL(n->a, context, res); EVAL(n->b, context, res); } #if WITH_PARSER_PRINT static void VariableDeclarationList_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINT(n->a); PRINT_CHAR(','); PRINT_CHAR(' '); PRINT(n->b); } #endif static struct nodeclass VariableDeclarationList_nodeclass = { SUPERCLASS(Binary) VariableDeclarationList_eval, 0, PARSER_PRINT(VariableDeclarationList_print) PARSER_VISIT(Binary_visit) 0 }; static struct node * VariableDeclarationList_parse(parser) struct parser *parser; { struct node *n; struct Binary_node *ln; n = PARSE(VariableDeclaration); if (NEXT != ',') return n; ln = NEW_NODE(struct Binary_node, &VariableDeclarationList_nodeclass); SKIP; /* NB: IterationStatement_parse() also constructs a VarDeclList */ ln->a = n; ln->b = PARSE(VariableDeclarationList); return (struct node *)ln; } struct VariableDeclaration_node { struct node node; struct var var; struct node *init; }; static void VariableDeclaration_eval(na, context, res) struct node *na; /* (struct VariableDeclaration_node) */ struct SEE_context *context; struct SEE_value *res; /* unused */ { struct VariableDeclaration_node *n = CAST_NODE(na, VariableDeclaration); struct SEE_value r1, r2, r3; if (n->init) { SEE_scope_lookup(context->interpreter, context->scope, n->var.name, &r1); EVAL(n->init, context, &r2); GetValue(context, &r2, &r3); PutValue(context, &r1, &r3); } } /* * Note: All declared vars end up attached to a function body's vars * list, and are set to undefined upon entry to that function. * See also: * SEE_function_put_args() - put args * FunctionDeclaration_fproc() - put func decls * SourceElements_fproc() - put vars */ #if WITH_PARSER_PRINT static void VariableDeclaration_print(na, printer) struct node *na; /* (struct VariableDeclaration_node) */ struct printer *printer; { struct VariableDeclaration_node *n = CAST_NODE(na, VariableDeclaration); PRINT_STRING(n->var.name); PRINT_CHAR(' '); if (n->init) { PRINT_CHAR('='); PRINT_CHAR(' '); PRINT(n->init); } } #endif #if WITH_PARSER_VISIT static void VariableDeclaration_visit(na, v, va) struct node *na; /* (struct VariableDeclaration_node) */ visitor_fn_t v; void *va; { struct VariableDeclaration_node *n = CAST_NODE(na, VariableDeclaration); if (n->init) VISIT(n->init, v, va); } #endif static struct nodeclass VariableDeclaration_nodeclass = { BASECLASS VariableDeclaration_eval, 0, PARSER_PRINT(VariableDeclaration_print) PARSER_VISIT(VariableDeclaration_visit) 0 }; static struct node * VariableDeclaration_parse(parser) struct parser *parser; { struct VariableDeclaration_node *v; v = NEW_NODE(struct VariableDeclaration_node, &VariableDeclaration_nodeclass); if (NEXT == tIDENT) v->var.name = NEXT_VALUE->u.string; EXPECT(tIDENT); if (NEXT == '=') { SKIP; v->init = PARSE(AssignmentExpression); } else v->init = NULL; /* Record declared variables */ if (parser->vars) { *parser->vars = &v->var; parser->vars = &v->var.next; } return (struct node *)v; } /* * -- 12.3 * * EmptyStatement * : ';' * ; */ /* 12.3 */ static void EmptyStatement_eval(na, context, res) struct node *na; struct SEE_context *context; struct SEE_value *res; { TRACE(na, context, SEE_TRACE_STATEMENT); _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); } #if WITH_PARSER_PRINT static void EmptyStatement_print(n, printer) struct node *n; struct printer *printer; { PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass EmptyStatement_nodeclass = { BASECLASS EmptyStatement_eval, 0, PARSER_PRINT(EmptyStatement_print) PARSER_VISIT(0) Always_isconst }; static struct node * EmptyStatement_parse(parser) struct parser *parser; { struct node *n; n = NEW_NODE(struct node, &EmptyStatement_nodeclass); EXPECT_SEMICOLON; return n; } /* * -- 12.4 * * ExpressionStatement * : Expression ';' -- lookahead != '{' or tFUNCTION * ; */ /* 12.4 */ static void ExpressionStatement_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value *v = SEE_NEW(context->interpreter, struct SEE_value); TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->a, context, v); _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } #if WITH_PARSER_PRINT static void ExpressionStatement_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT(n->a); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass ExpressionStatement_nodeclass = { SUPERCLASS(Unary) ExpressionStatement_eval, 0, PARSER_PRINT(ExpressionStatement_print) PARSER_VISIT(Unary_visit) Unary_isconst }; static struct node * ExpressionStatement_parse(parser) struct parser *parser; { struct Unary_node *n; n = NEW_NODE(struct Unary_node, &ExpressionStatement_nodeclass); n->a = PARSE(Expression); EXPECT_SEMICOLON; return (struct node *)n; } /* * -- 12.5 * * IfStatement * : tIF '(' Expression ')' Statement tELSE Statement * | tIF '(' Expression ')' Statement * ; */ struct IfStatement_node { struct node node; struct node *cond, *btrue, *bfalse; }; /* 12.5 */ static void IfStatement_eval(na, context, res) struct node *na; /* (struct IfStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct IfStatement_node *n = CAST_NODE(na, IfStatement); struct SEE_value r1, r2, r3; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->cond, context, &r1); GetValue(context, &r1, &r2); SEE_ToBoolean(context->interpreter, &r2, &r3); if (r3.u.boolean) EVAL(n->btrue, context, res); else if (n->bfalse) EVAL(n->bfalse, context, res); else _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); } #if WITH_PARSER_PRINT static void IfStatement_print(na, printer) struct node *na; /* (struct IfStatement_node) */ struct printer *printer; { struct IfStatement_node *n = CAST_NODE(na, IfStatement); PRINT_STRING(STR(if)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT(n->cond); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->btrue); PRINT_CHAR('}'); PRINT_NEWLINE(-1); if (n->bfalse) { PRINT_STRING(STR(else)); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->bfalse); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } } #endif #if WITH_PARSER_VISIT static void IfStatement_visit(na, v, va) struct node *na; /* (struct IfStatement_node) */ visitor_fn_t v; void *va; { struct IfStatement_node *n = CAST_NODE(na, IfStatement); VISIT(n->cond, v, va); VISIT(n->btrue, v, va); if (n->bfalse) VISIT(n->bfalse, v, va); } #endif static int IfStatement_isconst(na, interp) struct node *na; /* (struct IfStatement_node) */ struct SEE_interpreter *interp; { struct IfStatement_node *n = CAST_NODE(na, IfStatement); if (ISCONST(n->cond, interp)) { struct SEE_value r1, r3; EVAL(n->cond, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); return r3.u.boolean ? ISCONST(n->btrue, interp) : (n->bfalse ? ISCONST(n->bfalse, interp) : 1); } else return 0; } static struct nodeclass IfStatement_nodeclass = { BASECLASS IfStatement_eval, 0, PARSER_PRINT(IfStatement_print) PARSER_VISIT(IfStatement_visit) IfStatement_isconst }; static struct node * IfStatement_parse(parser) struct parser *parser; { struct node *cond, *btrue, *bfalse; struct IfStatement_node *n; n = NEW_NODE(struct IfStatement_node, &IfStatement_nodeclass); EXPECT(tIF); EXPECT('('); cond = PARSE(Expression); EXPECT(')'); btrue = PARSE(Statement); if (NEXT != tELSE) bfalse = NULL; else { SKIP; /* 'else' */ bfalse = PARSE(Statement); } n->cond = cond; n->btrue = btrue; n->bfalse = bfalse; return (struct node *)n; } /* * -- 12.6 * IterationStatement * : tDO Statement tWHILE '(' Expression ')' ';' -- 12.6.1 * | tWHILE '(' Expression ')' Statement -- 12.6.2 * | tFOR '(' ';' ';' ')' Statement * | tFOR '(' ExpressionNoIn ';' ';' ')' Statement * | tFOR '(' ';' Expression ';' ')' Statement * | tFOR '(' ExpressionNoIn ';' Expression ';' ')' Statement * | tFOR '(' ';' ';' Expression ')' Statement * | tFOR '(' ExpressionNoIn ';' ';' Expression ')' Statement * | tFOR '(' ';' Expression ';' Expression ')' Statement * | tFOR '(' ExpressionNoIn ';' Expression ';' Expression ')' * Statement * | tFOR '(' tVAR VariableDeclarationListNoIn ';' ';' ')' Statement * | tFOR '(' tVAR VariableDeclarationListNoIn ';' * Expression ';' ')' Statement * | tFOR '(' tVAR VariableDeclarationListNoIn ';' ';' * Expression ')' Statement * | tFOR '(' tVAR VariableDeclarationListNoIn ';' Expression ';' * Expression ')' Statement * | tFOR '(' LeftHandSideExpression tIN Expression ')' Statement * | tFOR '(' tVAR VariableDeclarationNoIn tIN Expression ')' * Statement * ; */ struct IterationStatement_while_node { struct Targetable_node targetable; struct node *cond, *body; }; static void IterationStatement_dowhile_eval(na, context, res) struct node *na; /* (struct IterationStatement_while_node) */ struct SEE_context *context; struct SEE_value *res; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); struct SEE_value *v, r7, r8, r9; v = NULL; step2: EVAL(n->body, context, res); if (res->u.completion.value) v = res->u.completion.value; if (res->u.completion.type == SEE_COMPLETION_CONTINUE && target_matches(&n->targetable, res->u.completion.target)) goto step7; if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) { _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); return; } if (res->u.completion.type != SEE_COMPLETION_NORMAL) return; step7: TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->cond, context, &r7); GetValue(context, &r7, &r8); SEE_ToBoolean(context->interpreter, &r8, &r9); if (r9.u.boolean) goto step2; _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } #if WITH_PARSER_PRINT static void IterationStatement_dowhile_print(na, printer) struct node *na; /* (struct IterationStatement_while_node) */ struct printer *printer; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); PRINT_STRING(STR(do)); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->body); PRINT_CHAR('}'); PRINT_NEWLINE(-1); PRINT_STRING(STR(while)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT(n->cond); PRINT_CHAR(')'); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif #if WITH_PARSER_VISIT static void IterationStatement_while_visit(na, v, va) struct node *na; /* (struct IterationStatement_while_node) */ visitor_fn_t v; void *va; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); VISIT(n->cond, v, va); VISIT(n->body, v, va); } #endif static int IterationStatement_dowhile_isconst(na, interp) struct node *na; /* (struct IterationStatement_while_node) */ struct SEE_interpreter *interp; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); if (ISCONST(n->cond, interp)) { struct SEE_value r1, r3; EVAL(n->cond, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); return r3.u.boolean ? 0 : ISCONST(n->body, interp); } else return 0; } static struct nodeclass IterationStatement_dowhile_nodeclass = { SUPERCLASS(IterationStatement_while) IterationStatement_dowhile_eval, 0, PARSER_PRINT(IterationStatement_dowhile_print) PARSER_VISIT(IterationStatement_while_visit) IterationStatement_dowhile_isconst }; static void IterationStatement_while_eval(na, context, res) struct node *na; /* (struct IterationStatement_while_node) */ struct SEE_context *context; struct SEE_value *res; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); struct SEE_value *v, r2, r3, r4; v = NULL; step2: TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->cond, context, &r2); GetValue(context, &r2, &r3); SEE_ToBoolean(context->interpreter, &r3, &r4); if (!r4.u.boolean) { _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); return; } EVAL(n->body, context, res); if (res->u.completion.value) v = res->u.completion.value; if (res->u.completion.type == SEE_COMPLETION_CONTINUE && target_matches(&n->targetable, res->u.completion.target)) goto step2; if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) { _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); return; } if (res->u.completion.type != SEE_COMPLETION_NORMAL) return; goto step2; } #if WITH_PARSER_PRINT static void IterationStatement_while_print(na, printer) struct node *na; /* (struct IterationStatement_while_node) */ struct printer *printer; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); PRINT_STRING(STR(while)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT(n->cond); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->body); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif static int IterationStatement_while_isconst(na, interp) struct node *na; /* (struct IterationStatement_while_node) */ struct SEE_interpreter *interp; { struct IterationStatement_while_node *n = CAST_NODE(na, IterationStatement_while); if (ISCONST(n->cond, interp)) { struct SEE_value r1, r3; EVAL(n->cond, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); return r3.u.boolean ? ISCONST(n->body, interp) : 1; } else return 0; } static struct nodeclass IterationStatement_while_nodeclass = { BASECLASS IterationStatement_while_eval, 0, PARSER_PRINT(IterationStatement_while_print) PARSER_VISIT(IterationStatement_while_visit) IterationStatement_while_isconst }; struct IterationStatement_for_node { struct Targetable_node targetable; struct node *init, *cond, *incr, *body; }; /* 12.6.3 - "for (init; cond; incr) body" */ static void IterationStatement_for_eval(na, context, res) struct node *na; /* (struct IterationStatement_for_node) */ struct SEE_context *context; struct SEE_value *res; { struct IterationStatement_for_node *n = CAST_NODE(na, IterationStatement_for); struct SEE_value *v, r2, r3, r6, r7, r8, r16, r17; if (n->init) { TRACE(n->init, context, SEE_TRACE_STATEMENT); EVAL(n->init, context, &r2); GetValue(context, &r2, &r3); /* r3 not used */ } v = NULL; step5: if (n->cond) { TRACE(n->cond, context, SEE_TRACE_STATEMENT); EVAL(n->cond, context, &r6); GetValue(context, &r6, &r7); SEE_ToBoolean(context->interpreter, &r7, &r8); if (!r8.u.boolean) goto step19; } else TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->body, context, res); if (res->u.completion.value) v = res->u.completion.value; if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) goto step19; if (res->u.completion.type == SEE_COMPLETION_CONTINUE && target_matches(&n->targetable, res->u.completion.target)) goto step15; if (res->u.completion.type != SEE_COMPLETION_NORMAL) return; step15: if (n->incr) { TRACE(n->incr, context, SEE_TRACE_STATEMENT); EVAL(n->incr, context, &r16); GetValue(context, &r16, &r17); /* r17 not used */ } goto step5; step19: _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } #if WITH_PARSER_PRINT static void IterationStatement_for_print(na, printer) struct node *na; /* (struct IterationStatement_for_node) */ struct printer *printer; { struct IterationStatement_for_node *n = CAST_NODE(na, IterationStatement_for); PRINT_STRING(STR(for)); PRINT_CHAR(' '); PRINT_CHAR('('); if (n->init) PRINT(n->init); PRINT_CHAR(';'); PRINT_CHAR(' '); if (n->cond) PRINT(n->cond); PRINT_CHAR(';'); PRINT_CHAR(' '); if (n->incr) PRINT(n->incr); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->body); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif #if WITH_PARSER_VISIT static void IterationStatement_for_visit(na, v, va) struct node *na; /* (struct IterationStatement_for_node) */ visitor_fn_t v; void *va; { struct IterationStatement_for_node *n = CAST_NODE(na, IterationStatement_for); if (n->init) VISIT(n->init, v, va); if (n->cond) VISIT(n->cond, v, va); if (n->incr) VISIT(n->incr, v, va); VISIT(n->body, v, va); } #endif static int IterationStatement_for_isconst(na, interp) struct node *na; /* (struct IterationStatement_for_node) */ struct SEE_interpreter *interp; { struct IterationStatement_for_node *n = CAST_NODE(na, IterationStatement_for); if (n->cond && ISCONST(n->cond, interp)) { struct SEE_value r1, r3; EVAL(n->cond, (struct SEE_context *)NULL, &r1); SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(&r1) != SEE_REFERENCE); SEE_ToBoolean(interp, &r1, &r3); if (r3.u.boolean) return 0; /* Infinite loop */ if (n->init && !ISCONST(n->init, interp)) return 0; if (n->cond && !ISCONST(n->cond, interp)) return 0; if (n->incr && !ISCONST(n->incr, interp)) return 0; return ISCONST(n->body, interp); } else return 0; } static struct nodeclass IterationStatement_for_nodeclass = { BASECLASS IterationStatement_for_eval, 0, PARSER_PRINT(IterationStatement_for_print) PARSER_VISIT(IterationStatement_for_visit) IterationStatement_for_isconst }; /* 12.6.3 - "for (var init; cond; incr) body" */ static void IterationStatement_forvar_eval(na, context, res) struct node *na; /* (struct IterationStatement_for_node) */ struct SEE_context *context; struct SEE_value *res; { struct IterationStatement_for_node *n = CAST_NODE(na, IterationStatement_for); struct SEE_value *v, r1, r4, r5, r6, r14, r15; TRACE(n->init, context, SEE_TRACE_STATEMENT); EVAL(n->init, context, &r1); v = NULL; step3: if (n->cond) { TRACE(n->cond, context, SEE_TRACE_STATEMENT); EVAL(n->cond, context, &r4); GetValue(context, &r4, &r5); SEE_ToBoolean(context->interpreter, &r5, &r6); if (!r6.u.boolean) goto step17; /* XXX spec bug: says step 14 */ } else TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->body, context, res); if (res->u.completion.value) v = res->u.completion.value; if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) goto step17; if (res->u.completion.type == SEE_COMPLETION_CONTINUE && target_matches(&n->targetable, res->u.completion.target)) goto step13; if (res->u.completion.type != SEE_COMPLETION_NORMAL) return; step13: if (n->incr) { TRACE(n->incr, context, SEE_TRACE_STATEMENT); EVAL(n->incr, context, &r14); GetValue(context, &r14, &r15); /* value not used */ } goto step3; step17: _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } #if WITH_PARSER_PRINT static void IterationStatement_forvar_print(na, printer) struct node *na; /* (struct IterationStatement_for_node) */ struct printer *printer; { struct IterationStatement_for_node *n = CAST_NODE(na, IterationStatement_for); PRINT_STRING(STR(for)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT_STRING(STR(var)); PRINT_CHAR(' '); PRINT(n->init); PRINT_CHAR(';'); PRINT_CHAR(' '); if (n->cond) PRINT(n->cond); PRINT_CHAR(';'); PRINT_CHAR(' '); if (n->incr) PRINT(n->incr); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->body); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif /* NB : the VarDecls of n->init are exposed through parser->vars */ static struct nodeclass IterationStatement_forvar_nodeclass = { SUPERCLASS(IterationStatement_for) IterationStatement_forvar_eval, 0, PARSER_PRINT(IterationStatement_forvar_print) PARSER_VISIT(IterationStatement_for_visit) IterationStatement_for_isconst }; struct IterationStatement_forin_node { struct Targetable_node targetable; struct node *lhs, *list, *body; }; /* 12.6.3 - "for (lhs in list) body" */ static void IterationStatement_forin_eval(na, context, res) struct node *na; /* (struct IterationStatement_forin_node) */ struct SEE_context *context; struct SEE_value *res; { struct IterationStatement_forin_node *n = CAST_NODE(na, IterationStatement_forin); struct SEE_interpreter *interp = context->interpreter; struct SEE_value *v, r1, r2, r3, r5, r6; struct SEE_string **props0, **props; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->list, context, &r1); GetValue(context, &r1, &r2); SEE_ToObject(interp, &r2, &r3); v = NULL; for (props0 = props = SEE_enumerate(interp, r3.u.object); *props; props++) { if (!SEE_OBJECT_HASPROPERTY(interp, r3.u.object, *props)) continue; /* property was deleted! */ SEE_SET_STRING(&r5, *props); EVAL(n->lhs, context, &r6); PutValue(context, &r6, &r5); EVAL(n->body, context, res); if (res->u.completion.value) v = res->u.completion.value; if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) break; if (res->u.completion.type == SEE_COMPLETION_CONTINUE && target_matches(&n->targetable, res->u.completion.target)) continue; if (res->u.completion.type != SEE_COMPLETION_NORMAL) return; } SEE_enumerate_free(interp, props0); _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } #if WITH_PARSER_PRINT static void IterationStatement_forin_print(na, printer) struct node *na; /* (struct IterationStatement_forin_node) */ struct printer *printer; { struct IterationStatement_forin_node *n = CAST_NODE(na, IterationStatement_forin); PRINT_STRING(STR(for)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT(n->lhs); PRINT_STRING(STR(in)); PRINT_CHAR(' '); PRINT(n->list); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->body); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif #if WITH_PARSER_VISIT static void IterationStatement_forin_visit(na, v, va) struct node *na; /* (struct IterationStatement_forin_node) */ visitor_fn_t v; void *va; { struct IterationStatement_forin_node *n = CAST_NODE(na, IterationStatement_forin); VISIT(n->lhs, v, va); VISIT(n->list, v, va); VISIT(n->body, v, va); } #endif static struct nodeclass IterationStatement_forin_nodeclass = { SUPERCLASS(IterationStatement_forin) IterationStatement_forin_eval, 0, PARSER_PRINT(IterationStatement_forin_print) PARSER_VISIT(IterationStatement_forin_visit) 0 }; static void IterationStatement_forvarin_eval(na, context, res) struct node *na; /* (struct IterationStatement_forin_node) */ struct SEE_context *context; struct SEE_value *res; { struct IterationStatement_forin_node *n = CAST_NODE(na, IterationStatement_forin); struct SEE_interpreter *interp = context->interpreter; struct SEE_value *v, r2, r3, r4, r6, r7; struct SEE_string **props0, **props; struct VariableDeclaration_node *lhs = CAST_NODE(n->lhs, VariableDeclaration); TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->lhs, context, NULL); EVAL(n->list, context, &r2); GetValue(context, &r2, &r3); SEE_ToObject(interp, &r3, &r4); v = NULL; for (props0 = props = SEE_enumerate(interp, r4.u.object); *props; props++) { if (!SEE_OBJECT_HASPROPERTY(interp, r4.u.object, *props)) continue; /* property was deleted! */ SEE_SET_STRING(&r6, *props); SEE_scope_lookup(context->interpreter, context->scope, lhs->var.name, &r7); PutValue(context, &r7, &r6); EVAL(n->body, context, res); if (res->u.completion.value) v = res->u.completion.value; if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) break; if (res->u.completion.type == SEE_COMPLETION_CONTINUE && target_matches(&n->targetable, res->u.completion.target)) continue; if (res->u.completion.type != SEE_COMPLETION_NORMAL) return; } SEE_enumerate_free(interp, props0); _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } #if WITH_PARSER_PRINT static void IterationStatement_forvarin_print(na, printer) struct node *na; /* (struct IterationStatement_forin_node) */ struct printer *printer; { struct IterationStatement_forin_node *n = CAST_NODE(na, IterationStatement_forin); PRINT_STRING(STR(for)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT_STRING(STR(var)); PRINT(n->lhs); PRINT_STRING(STR(in)); PRINT_CHAR(' '); PRINT(n->list); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->body); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif static struct nodeclass IterationStatement_forvarin_nodeclass = { SUPERCLASS(IterationStatement_forin) IterationStatement_forvarin_eval, 0, PARSER_PRINT(IterationStatement_forvarin_print) PARSER_VISIT(IterationStatement_forin_visit) 0 }; static struct node * IterationStatement_parse(parser) struct parser *parser; { struct IterationStatement_while_node *w; struct IterationStatement_for_node *fn; struct IterationStatement_forin_node *fin; struct node *n; switch (NEXT) { case tDO: w = NEW_NODE(struct IterationStatement_while_node, &IterationStatement_dowhile_nodeclass); SKIP; target_init(&w->targetable, parser, CONTINUABLE); label_push(parser, EMPTY_LABEL, NULL, CONTINUABLE); w->body = PARSE(Statement); EXPECT(tWHILE); EXPECT('('); w->cond = PARSE(Expression); EXPECT(')'); EXPECT_SEMICOLON; label_pop(parser); return (struct node *)w; case tWHILE: w = NEW_NODE(struct IterationStatement_while_node, &IterationStatement_while_nodeclass); SKIP; target_init(&w->targetable, parser, CONTINUABLE); label_push(parser, EMPTY_LABEL, NULL, CONTINUABLE); EXPECT('('); w->cond = PARSE(Expression); EXPECT(')'); w->body = PARSE(Statement); label_pop(parser); return (struct node *)w; case tFOR: break; default: SEE_error_throw_string( parser->interpreter, parser->interpreter->Error, STR(internal_error)); } SKIP; /* tFOR */ EXPECT('('); if (NEXT == tVAR) { /* "for ( var" */ SKIP; /* tVAR */ parser->noin = 1; n = PARSE(VariableDeclarationList); /* NB adds to parser->vars */ parser->noin = 0; if (NEXT == tIN && n->nodeclass == &VariableDeclaration_nodeclass) { /* "for ( var VarDecl in" */ fin = NEW_NODE(struct IterationStatement_forin_node, &IterationStatement_forvarin_nodeclass); target_init(&fin->targetable, parser, CONTINUABLE); fin->lhs = n; SKIP; /* tIN */ fin->list = PARSE(Expression); EXPECT(')'); label_push(parser, EMPTY_LABEL, NULL, CONTINUABLE); fin->body = PARSE(Statement); label_pop(parser); return (struct node *)fin; } /* Accurately describe possible tokens at this stage */ EXPECTX(';', (n->nodeclass == &VariableDeclaration_nodeclass ? "';' or 'in'" : "';'")); /* "for ( var VarDeclList ;" */ fn = NEW_NODE(struct IterationStatement_for_node, &IterationStatement_forvar_nodeclass); target_init(&fn->targetable, parser, CONTINUABLE); label_push(parser, EMPTY_LABEL, NULL, CONTINUABLE); fn->init = n; if (NEXT != ';') fn->cond = PARSE(Expression); else fn->cond = NULL; EXPECT(';'); if (NEXT != ')') fn->incr = PARSE(Expression); else fn->incr = NULL; EXPECT(')'); fn->body = PARSE(Statement); label_pop(parser); return (struct node *)fn; } if (NEXT != ';') { parser->noin = 1; n = PARSE(Expression); parser->noin = 0; if (NEXT == tIN && parser->is_lhs) { /* "for ( lhs in" */ fin = NEW_NODE(struct IterationStatement_forin_node, &IterationStatement_forin_nodeclass); target_init(&fin->targetable, parser, CONTINUABLE); label_push(parser, EMPTY_LABEL, NULL, CONTINUABLE); fin->lhs = n; SKIP; /* tIN */ fin->list = PARSE(Expression); EXPECT(')'); fin->body = PARSE(Statement); label_pop(parser); return (struct node *)fin; } } else n = NULL; /* "for ( ;" */ fn = NEW_NODE(struct IterationStatement_for_node, &IterationStatement_for_nodeclass); target_init(&fn->targetable, parser, CONTINUABLE); label_push(parser, EMPTY_LABEL, NULL, CONTINUABLE); fn->init = n; EXPECT(';'); if (NEXT != ';') fn->cond = PARSE(Expression); else fn->cond = NULL; EXPECT(';'); if (NEXT != ')') fn->incr = PARSE(Expression); else fn->incr = NULL; EXPECT(')'); fn->body = PARSE(Statement); label_pop(parser); return (struct node *)fn; } /* * -- 12.7 * * ContinueStatement * : tCONTINUE ';' * | tCONTINUE tIDENT ';' * ; */ struct ContinueStatement_node { struct node node; void *target; }; static void ContinueStatement_eval(na, context, res) struct node *na; /* (struct ContinueStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct ContinueStatement_node *n = CAST_NODE(na, ContinueStatement); TRACE(na, context, SEE_TRACE_STATEMENT); _SEE_SET_COMPLETION(res, SEE_COMPLETION_CONTINUE, NULL, n->target); } #if WITH_PARSER_PRINT static void ContinueStatement_print(na, printer) struct node *na; /* (struct ContinueStatement_node) */ struct printer *printer; { struct ContinueStatement_node *n = CAST_NODE(na, ContinueStatement); PRINT_STRING(STR(continue)); PRINT_CHAR(' '); PRINT_CHAR('L'); print_hex(printer, (int)n->target); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass ContinueStatement_nodeclass = { BASECLASS ContinueStatement_eval, 0, PARSER_PRINT(ContinueStatement_print) PARSER_VISIT(0) 0 }; static struct node * ContinueStatement_parse(parser) struct parser *parser; { struct ContinueStatement_node *cn; struct label *label = NULL; cn = NEW_NODE(struct ContinueStatement_node, &ContinueStatement_nodeclass); EXPECT(tCONTINUE); if (NEXT_IS_SEMICOLON) label = label_lookup(parser, EMPTY_LABEL, tCONTINUE); else { if (NEXT == tIDENT) label = label_lookup(parser, NEXT_VALUE->u.string, tCONTINUE); EXPECT(tIDENT); } EXPECT_SEMICOLON; cn->target = label_get_target(label); return (struct node *)cn; } /* * -- 12.8 * * BreakStatement * : tBREAK ';' * | tBREAK tIDENT ';' * ; */ struct BreakStatement_node { struct node node; void *target; }; static void BreakStatement_eval(na, context, res) struct node *na; /* (struct BreakStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct BreakStatement_node *n = CAST_NODE(na, BreakStatement); TRACE(na, context, SEE_TRACE_STATEMENT); _SEE_SET_COMPLETION(res, SEE_COMPLETION_BREAK, NULL, n->target); } #if WITH_PARSER_PRINT static void BreakStatement_print(na, printer) struct node *na; /* (struct BreakStatement_node) */ struct printer *printer; { struct BreakStatement_node *n = CAST_NODE(na, BreakStatement); PRINT_STRING(STR(break)); PRINT_CHAR(' '); PRINT_CHAR('L'); print_hex(printer, (int)n->target); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass BreakStatement_nodeclass = { BASECLASS BreakStatement_eval, 0, PARSER_PRINT(BreakStatement_print) PARSER_VISIT(0) 0 }; static struct node * BreakStatement_parse(parser) struct parser *parser; { struct BreakStatement_node *cn; struct label *label = NULL; cn = NEW_NODE(struct BreakStatement_node, &BreakStatement_nodeclass); EXPECT(tBREAK); if (NEXT_IS_SEMICOLON) label = label_lookup(parser, EMPTY_LABEL, tBREAK); else { if (NEXT == tIDENT) label = label_lookup(parser, NEXT_VALUE->u.string, tBREAK); EXPECT(tIDENT); } EXPECT_SEMICOLON; cn->target = label_get_target(label); return (struct node *)cn; } /* * -- 12.9 * * ReturnStatement * : tRETURN ';' * | tRETURN Expression ';' * ; */ struct ReturnStatement_node { struct node node; struct node *expr; void *target; }; static void ReturnStatement_eval(na, context, res) struct node *na; /* (struct ReturnStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct ReturnStatement_node *n = CAST_NODE(na, ReturnStatement); struct SEE_value r2, *v; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->expr, context, &r2); v = SEE_NEW(context->interpreter, struct SEE_value); GetValue(context, &r2, v); _SEE_SET_COMPLETION(res, SEE_COMPLETION_RETURN, v, NULL); } #if WITH_PARSER_PRINT static void ReturnStatement_print(na, printer) struct node *na; /* (struct ReturnStatement_node) */ struct printer *printer; { struct ReturnStatement_node *n = CAST_NODE(na, ReturnStatement); PRINT_STRING(STR(return)); PRINT_CHAR(' '); PRINT(n->expr); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif #if WITH_PARSER_VISIT static void ReturnStatement_visit(na, v, va) struct node *na; /* (struct ReturnStatement_node) */ visitor_fn_t v; void *va; { struct ReturnStatement_node *n = CAST_NODE(na, ReturnStatement); VISIT(n->expr, v, va); } #endif static struct nodeclass ReturnStatement_nodeclass = { BASECLASS ReturnStatement_eval, 0, PARSER_PRINT(ReturnStatement_print) PARSER_VISIT(ReturnStatement_visit) 0 }; static void ReturnStatement_undef_eval(na, context, res) struct node *na; /* (struct ReturnStatement_node) */ struct SEE_context *context; struct SEE_value *res; { static struct SEE_value undef = { SEE_UNDEFINED }; TRACE(na, context, SEE_TRACE_STATEMENT); _SEE_SET_COMPLETION(res, SEE_COMPLETION_RETURN, &undef, NULL); } #if WITH_PARSER_PRINT static void ReturnStatement_undef_print(na, printer) struct node *na; /* (struct ReturnStatement_node) */ struct printer *printer; { PRINT_STRING(STR(return)); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass ReturnStatement_undef_nodeclass = { BASECLASS ReturnStatement_undef_eval, 0, PARSER_PRINT(ReturnStatement_undef_print) PARSER_VISIT(0) 0 }; static struct node * ReturnStatement_parse(parser) struct parser *parser; { struct ReturnStatement_node *rn; rn = NEW_NODE(struct ReturnStatement_node, &ReturnStatement_undef_nodeclass); EXPECT(tRETURN); if (!parser->funcdepth) ERRORm("'return' statement not inside function"); if (!NEXT_IS_SEMICOLON) { rn->node.nodeclass = &ReturnStatement_nodeclass; rn->expr = PARSE(Expression); } EXPECT_SEMICOLON; return (struct node *)rn; } /* * -- 12.10 * * WithStatement * : tWITH '(' Expression ')' Statement * ; */ static void WithStatement_eval(na, context, res) struct node *na; /* (struct Binary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Binary_node *n = CAST_NODE(na, Binary); SEE_try_context_t ctxt; struct SEE_value r1, r2, r3; struct SEE_scope *s; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); SEE_ToObject(context->interpreter, &r2, &r3); /* Insert r3 in front of current scope chain */ s = SEE_NEW(context->interpreter, struct SEE_scope); s->obj = r3.u.object; s->next = context->scope; context->scope = s; SEE_TRY(context->interpreter, ctxt) EVAL(n->b, context, res); context->scope = context->scope->next; SEE_DEFAULT_CATCH(context->interpreter, ctxt); } #if WITH_PARSER_PRINT static void WithStatement_print(na, printer) struct node *na; /* (struct Binary_node) */ struct printer *printer; { struct Binary_node *n = CAST_NODE(na, Binary); PRINT_STRING(STR(with)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT(n->a); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->b); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif static struct nodeclass WithStatement_nodeclass = { SUPERCLASS(Binary) WithStatement_eval, 0, PARSER_PRINT(WithStatement_print) PARSER_VISIT(Binary_visit) 0 }; static struct node * WithStatement_parse(parser) struct parser *parser; { struct Binary_node *n; n = NEW_NODE(struct Binary_node, &WithStatement_nodeclass); EXPECT(tWITH); EXPECT('('); n->a = PARSE(Expression); EXPECT(')'); n->b = PARSE(Statement); return (struct node *)n; } /* * -- 12.11 * * SwitchStatement * : tSWITCH '(' Expression ')' CaseBlock * ; * * CaseBlock * : '{' '}' * | '{' CaseClauses '}' * | '{' DefaultClause '}' * | '{' CaseClauses DefaultClause '}' * | '{' DefaultClause '}' * | '{' CaseClauses DefaultClause CaseClauses '}' * ; * * CaseClauses * : CaseClause * | CaseClauses CaseClause * ; * * CaseClause * : tCASE Expression ':' * | tCASE Expression ':' StatementList * ; * * DefaultClause * : tDEFAULT ':' * | tDEFAULT ':' StatementList * ; */ struct SwitchStatement_node { struct Targetable_node targetable; struct node *cond; struct case_list { struct node *expr; /* NULL for default case */ struct node *body; struct case_list *next; } *cases, *defcase; }; static void SwitchStatement_caseblock(n, context, input, res) struct SwitchStatement_node *n; struct SEE_context *context; struct SEE_value *input, *res; { struct case_list *c; struct SEE_value cc1, cc2, cc3; /* * Note, this should be functionally equivalent * to the standard. We search through the in-order * case statements to find an expression that is * strictly equal to 'input', and then run all * the statements from there till we break or reach * the end. If no expression matches, we start at the * default case, if one exists. */ for (c = n->cases; c; c = c->next) { if (!c->expr) continue; EVAL(c->expr, context, &cc1); GetValue(context, &cc1, &cc2); EqualityExpression_seq(context, input, &cc2, &cc3); if (cc3.u.boolean) break; } if (!c) c = n->defcase; /* can be NULL, meaning no default */ _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); for (; c; c = c->next) { if (c->body) EVAL(c->body, context, res); if (res->u.completion.type != SEE_COMPLETION_NORMAL) break; } } static void SwitchStatement_eval(na, context, res) struct node *na; /* (struct SwitchStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct SwitchStatement_node *n = CAST_NODE(na, SwitchStatement); struct SEE_value *v, r1, r2; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->cond, context, &r1); GetValue(context, &r1, &r2); SwitchStatement_caseblock(n, context, &r2, res); if (res->u.completion.type == SEE_COMPLETION_BREAK && target_matches(&n->targetable, res->u.completion.target)) { v = res->u.completion.value; _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, v, NULL); } } #if WITH_PARSER_PRINT static void SwitchStatement_print(na, printer) struct node *na; /* (struct SwitchStatement_node) */ struct printer *printer; { struct SwitchStatement_node *n = CAST_NODE(na, SwitchStatement); struct case_list *c; PRINT_STRING(STR(switch)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT(n->cond); PRINT_CHAR(')'); PRINT_CHAR(' '); PRINT_CHAR('{'); PRINT_NEWLINE(1); for (c = n->cases; c; c = c->next) { if (c == n->defcase) { PRINT_STRING(STR(default)); PRINT_CHAR(':'); PRINT_NEWLINE(0); } if (c->expr) { PRINT_STRING(STR(case)); PRINT_CHAR(' '); PRINT(c->expr); PRINT_CHAR(':'); PRINT_NEWLINE(0); } PRINT_NEWLINE(1); PRINT(c->body); PRINT_NEWLINE(-1); } PRINT_CHAR('}'); PRINT_NEWLINE(-1); PRINT_NEWLINE(0); } #endif #if WITH_PARSER_VISIT static void SwitchStatement_visit(na, v, va) struct node *na; /* (struct SwitchStatement_node) */ visitor_fn_t v; void *va; { struct SwitchStatement_node *n = CAST_NODE(na, SwitchStatement); struct case_list *c; VISIT(n->cond, v, va); for (c = n->cases; c; c = c->next) { if (c->expr) VISIT(c->expr, v, va); VISIT(c->body, v, va); } } #endif static struct nodeclass SwitchStatement_nodeclass = { BASECLASS SwitchStatement_eval, 0, PARSER_PRINT(SwitchStatement_print) PARSER_VISIT(SwitchStatement_visit) 0 }; static struct node * SwitchStatement_parse(parser) struct parser *parser; { struct SwitchStatement_node *n; struct case_list **cp, *c; int next; n = NEW_NODE(struct SwitchStatement_node, &SwitchStatement_nodeclass); target_init(&n->targetable, parser, 0); EXPECT(tSWITCH); label_push(parser, EMPTY_LABEL, NULL, 0); EXPECT('('); n->cond = PARSE(Expression); EXPECT(')'); EXPECT('{'); cp = &n->cases; n->defcase = NULL; while (NEXT != '}') { c = SEE_NEW(parser->interpreter, struct case_list); *cp = c; cp = &c->next; switch (NEXT) { case tCASE: SKIP; c->expr = PARSE(Expression); break; case tDEFAULT: SKIP; c->expr = NULL; if (n->defcase) ERRORm("duplicate 'default' clause"); n->defcase = c; break; default: EXPECTED("'}', 'case' or 'default'"); } EXPECT(':'); next = NEXT; if (next != '}' && next != tDEFAULT && next != tCASE) c->body = PARSE(StatementList); else c->body = NULL; } *cp = NULL; EXPECT('}'); label_pop(parser); return (struct node *)n; } /* * -- 12.12 * * LabelledStatement * : tIDENT * | Statement * ; */ struct LabelledStatement_node { struct Unary_node unary; struct SEE_string *labelset; }; static void LabelledStatement_eval(na, context, res) struct node *na; /* (struct LabelledStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct LabelledStatement_node *n = CAST_NODE(na, LabelledStatement); EVAL(n->unary.a, context, res); if (res->u.completion.type == SEE_COMPLETION_BREAK && res->u.completion.target == n->labelset) { res->u.completion.type = SEE_COMPLETION_NORMAL; res->u.completion.target = NULL; } } #if WITH_PARSER_PRINT static void LabelledStatement_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct LabelledStatement_node *n = CAST_NODE(na, LabelledStatement); PRINT_STRING(n->labelset); PRINT_CHAR(':'); PRINT(n->unary.a); } #endif static struct nodeclass LabelledStatement_nodeclass = { SUPERCLASS(Unary) LabelledStatement_eval, 0, PARSER_PRINT(LabelledStatement_print) PARSER_VISIT(Unary_visit) 0 }; static struct node * LabelledStatement_parse(parser) struct parser *parser; { struct LabelledStatement_node *n; struct SEE_string *label, *labelset = NULL; unsigned int label_count = 0; n = NEW_NODE(struct LabelledStatement_node, &LabelledStatement_nodeclass); do { /* Lookahead is IDENT ':' */ label = NEXT_VALUE->u.string; if (!labelset) labelset = label; label_push(parser, label, labelset, 0); label_count++; EXPECT(tIDENT); EXPECT(':'); } while (NEXT == tIDENT && lookahead(parser, 1) == ':'); n->labelset = labelset; switch (NEXT) { case tDO: case tWHILE: case tFOR: parser->current_labelset = labelset; n->unary.a = PARSE(IterationStatement); break; case tSWITCH: parser->current_labelset = labelset; n->unary.a = PARSE(SwitchStatement); break; default: n->unary.a = PARSE(Statement); } while (label_count--) label_pop(parser); return (struct node *)n; } /* * -- 12.13 * * ThrowStatement * : tTHROW Expression ';' * ; */ static void ThrowStatement_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); struct SEE_value r1, r2; TRACE(na, context, SEE_TRACE_STATEMENT); EVAL(n->a, context, &r1); GetValue(context, &r1, &r2); TRACE(na, context, SEE_TRACE_THROW); SEE_THROW(context->interpreter, &r2); /* NOTREACHED */ } #if WITH_PARSER_PRINT static void ThrowStatement_print(na, printer) struct node *na; /* (struct Unary_node) */ struct printer *printer; { struct Unary_node *n = CAST_NODE(na, Unary); PRINT_STRING(STR(throw)); PRINT_CHAR(' '); PRINT(n->a); PRINT_CHAR(';'); PRINT_NEWLINE(0); } #endif static struct nodeclass ThrowStatement_nodeclass = { SUPERCLASS(Unary) ThrowStatement_eval, 0, PARSER_PRINT(ThrowStatement_print) PARSER_VISIT(Unary_visit) 0 }; static struct node * ThrowStatement_parse(parser) struct parser *parser; { struct Unary_node *n; n = NEW_NODE(struct Unary_node, &ThrowStatement_nodeclass); EXPECT(tTHROW); if (NEXT_FOLLOWS_NL) ERRORm("newline not allowed after 'throw'"); n->a = PARSE(Expression); EXPECT_SEMICOLON; return (struct node *)n; } /* * -- 12.14 * * TryStatement * : tTRY Block Catch * | tTRY Block Finally * | tTRY Block Catch Finally * ; * * Catch * : tCATCH '(' tIDENT ')' Block * ; * * Finally * : tFINALLY Block * ; */ struct TryStatement_node { struct node node; struct node *block, *bcatch, *bfinally; struct SEE_string *ident; }; static struct nodeclass TryStatement_nodeclass = { BASECLASS 0, 0, PARSER_PRINT(0) PARSER_VISIT(0) 0 }; /* * Helper function to evaluate the catch clause in a new scope. * Weill return a SEE_COMPLETION_THROW completion instead of directly throwing * an exception. */ static void TryStatement_catch(n, context, C, res) struct TryStatement_node *n; struct SEE_context *context; struct SEE_value *C, *res; { struct SEE_value *tcp; struct SEE_object *r2; SEE_try_context_t ctxt; struct SEE_scope *s; struct SEE_interpreter *interp = context->interpreter; r2 = SEE_Object_new(interp); SEE_OBJECT_PUT(interp, r2, n->ident, C, SEE_ATTR_DONTDELETE); s = SEE_NEW(interp, struct SEE_scope); s->obj = r2; s->next = context->scope; context->scope = s; SEE_TRY(interp, ctxt) EVAL(n->bcatch, context, res); context->scope = context->scope->next; if (SEE_CAUGHT(ctxt)) { tcp = SEE_NEW(interp, struct SEE_value); SEE_VALUE_COPY(tcp, SEE_CAUGHT(ctxt)); _SEE_SET_COMPLETION(res, SEE_COMPLETION_THROW, tcp, NULL); } } static void TryStatement_catch_eval(na, context, res) struct node *na; /* (struct TryStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); SEE_try_context_t ctxt; TRACE(na, context, SEE_TRACE_STATEMENT); SEE_TRY(context->interpreter, ctxt) EVAL(n->block, context, res); if (SEE_CAUGHT(ctxt)) TryStatement_catch(n, context, SEE_CAUGHT(ctxt), res); if (res->u.completion.type == SEE_COMPLETION_THROW) { TRACE(na, context, SEE_TRACE_THROW); SEE_THROW(context->interpreter, res->u.completion.value); } } #if WITH_PARSER_PRINT static void TryStatement_catch_print(na, printer) struct node *na; /* (struct TryStatement_node) */ struct printer *printer; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); PRINT_STRING(STR(try)); PRINT_NEWLINE(1); PRINT(n->block); PRINT_NEWLINE(-1); PRINT_STRING(STR(catch)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT_STRING(n->ident); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->bcatch); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif #if WITH_PARSER_VISIT static void TryStatement_catch_visit(na, v, va) struct node *na; /* (struct TryStatement_node) */ visitor_fn_t v; void *va; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); VISIT(n->block, v, va); VISIT(n->bcatch, v, va); } #endif static struct nodeclass TryStatement_catch_nodeclass = { SUPERCLASS(TryStatement) TryStatement_catch_eval, 0, PARSER_PRINT(TryStatement_catch_print) PARSER_VISIT(TryStatement_catch_visit) 0 }; static void TryStatement_finally_eval(na, context, res) struct node *na; /* (struct TryStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); struct SEE_value r2; SEE_try_context_t ctxt; TRACE(na, context, SEE_TRACE_STATEMENT); SEE_TRY(context->interpreter, ctxt) EVAL(n->block, context, res); if (SEE_CAUGHT(ctxt)) _SEE_SET_COMPLETION(res, SEE_COMPLETION_THROW, SEE_CAUGHT(ctxt), NULL); EVAL(n->bfinally, context, &r2); if (r2.u.completion.type != SEE_COMPLETION_NORMAL) SEE_VALUE_COPY(res, &r2); /* break, return etc */ if (res->u.completion.type == SEE_COMPLETION_THROW) { TRACE(na, context, SEE_TRACE_THROW); SEE_THROW(context->interpreter, res->u.completion.value); } } #if WITH_PARSER_PRINT static void TryStatement_finally_print(na, printer) struct node *na; /* (struct TryStatement_node) */ struct printer *printer; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); PRINT_STRING(STR(try)); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->block); PRINT_CHAR('}'); PRINT_NEWLINE(-1); PRINT_STRING(STR(finally)); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->bfinally); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif #if WITH_PARSER_VISIT static void TryStatement_finally_visit(na, v, va) struct node *na; /* (struct TryStatement_node) */ visitor_fn_t v; void *va; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); VISIT(n->block, v, va); VISIT(n->bfinally, v, va); } #endif static struct nodeclass TryStatement_finally_nodeclass = { SUPERCLASS(TryStatement) TryStatement_finally_eval, 0, PARSER_PRINT(TryStatement_finally_print) PARSER_VISIT(TryStatement_finally_visit) 0 }; static void TryStatement_catchfinally_eval(na, context, res) struct node *na; /* (struct TryStatement_node) */ struct SEE_context *context; struct SEE_value *res; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); struct SEE_value r1, r4, r6, *C = NULL, *retv; SEE_try_context_t ctxt, ctxt2; struct SEE_interpreter *interp = context->interpreter; TRACE(na, context, SEE_TRACE_STATEMENT); SEE_TRY(interp, ctxt) /*1*/ EVAL(n->block, context, &r1); if (SEE_CAUGHT(ctxt)) _SEE_SET_COMPLETION(&r1, SEE_COMPLETION_THROW, SEE_CAUGHT(ctxt), NULL); /*2*/ C = &r1; SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(C) == SEE_COMPLETION); /*3*/ if (C->u.completion.type == SEE_COMPLETION_THROW) { /*4*/ TryStatement_catch(n, context, C->u.completion.value, &r4); /*5*/ if (r4.u.completion.type != SEE_COMPLETION_NORMAL) { C = &r4; } } SEE_TRY(interp, ctxt2) /*6*/ EVAL(n->bfinally, context, &r6); if (SEE_CAUGHT(ctxt2)) _SEE_SET_COMPLETION(&r6, SEE_COMPLETION_THROW, SEE_CAUGHT(ctxt2), NULL); if (r6.u.completion.type != SEE_COMPLETION_NORMAL) retv = C; else retv = &r6; SEE_ASSERT(interp, SEE_VALUE_GET_TYPE(retv) == SEE_COMPLETION); if (retv->u.completion.type == SEE_COMPLETION_THROW) { TRACE(na, context, SEE_TRACE_THROW); SEE_THROW(interp, retv->u.completion.value); } else SEE_VALUE_COPY(res, retv); } #if WITH_PARSER_PRINT static void TryStatement_catchfinally_print(na, printer) struct node *na; /* (struct TryStatement_node) */ struct printer *printer; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); PRINT_STRING(STR(try)); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->block); PRINT_CHAR('}'); PRINT_NEWLINE(-1); PRINT_STRING(STR(catch)); PRINT_CHAR(' '); PRINT_CHAR('('); PRINT_STRING(n->ident); PRINT_CHAR(')'); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->bcatch); PRINT_CHAR('}'); PRINT_NEWLINE(-1); PRINT_STRING(STR(finally)); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT(n->bfinally); PRINT_CHAR('}'); PRINT_NEWLINE(-1); } #endif #if WITH_PARSER_VISIT static void TryStatement_catchfinally_visit(na, v, va) struct node *na; /* (struct TryStatement_node) */ visitor_fn_t v; void *va; { struct TryStatement_node *n = CAST_NODE(na, TryStatement); VISIT(n->block, v, va); VISIT(n->bcatch, v, va); VISIT(n->bfinally, v, va); } #endif static struct nodeclass TryStatement_catchfinally_nodeclass = { SUPERCLASS(TryStatement) TryStatement_catchfinally_eval, 0, PARSER_PRINT(TryStatement_catchfinally_print) PARSER_VISIT(TryStatement_catchfinally_visit) 0 }; static struct node * TryStatement_parse(parser) struct parser *parser; { struct TryStatement_node *n; struct nodeclass *nc; n = NEW_NODE(struct TryStatement_node, NULL); EXPECT(tTRY); n->block = PARSE(Block); if (NEXT == tCATCH) { SKIP; EXPECT('('); if (NEXT == tIDENT) n->ident = NEXT_VALUE->u.string; EXPECT(tIDENT); EXPECT(')'); n->bcatch = PARSE(Block); } else n->bcatch = NULL; if (NEXT == tFINALLY) { SKIP; n->bfinally = PARSE(Block); } else n->bfinally = NULL; if (n->bcatch && n->bfinally) nc = &TryStatement_catchfinally_nodeclass; else if (n->bcatch) nc = &TryStatement_catch_nodeclass; else if (n->bfinally) nc = &TryStatement_finally_nodeclass; else ERRORm("expected 'catch' or 'finally'"); n->node.nodeclass = nc; return (struct node *)n; } /* * -- 13 * * FunctionDeclaration * : tFUNCTION tIDENT '( ')' '{' FunctionBody '}' * | tFUNCTION tIDENT '( FormalParameterList ')' * '{' FunctionBody '}' * ; * * FunctionExpression * : tFUNCTION '( ')' '{' FunctionBody '}' * | tFUNCTION '( FormalParameterList ')' '{' FunctionBody '}' * | tFUNCTION tIDENT '( ')' '{' FunctionBody '}' * | tFUNCTION tIDENT '( FormalParameterList ')' * '{' FunctionBody '}' * ; * * FormalParameterList * : tIDENT * | FormalParameterList ',' tIDENT * ; * * FunctionBody * : SourceElements * ; */ struct Function_node { struct node node; struct function *function; }; #if 0 /* This is never called, but defined in the spec. (Spec bug?) */ static void FunctionDeclaration_eval(na, context, res) struct node *na; /* (struct Function_node) */ struct SEE_context *context; struct SEE_value *res; { struct Function_node *n = CAST_NODE(na, Function); _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); /* 14 */ } #endif #if WITH_PARSER_PRINT static void Function_print(na, printer) struct node *na; /* (struct Function_node) */ struct printer *printer; { struct Function_node *n = CAST_NODE(na, Function); int i; PRINT_STRING(STR(function)); PRINT_CHAR(' '); if (n->function->name) { PRINT_STRING(n->function->name); PRINT_CHAR(' '); } PRINT_CHAR('('); for (i = 0; i < n->function->nparams; i++) { if (i) { PRINT_CHAR(','); PRINT_CHAR(' '); } PRINT_STRING(n->function->params[i]); } PRINT_CHAR(')'); PRINT_CHAR(' '); PRINT_CHAR('{'); PRINT_NEWLINE(1); PRINT((struct node *)n->function->body); PRINT_NEWLINE(-1); PRINT_CHAR('}'); PRINT_NEWLINE(0); } #endif #if WITH_PARSER_VISIT static void Function_visit(na, v, va) struct node *na; /* (struct Function_node) */ visitor_fn_t v; void *va; { struct Function_node *n = CAST_NODE(na, Function); VISIT((struct node *)n->function->body, v, va); } #endif static struct nodeclass Function_nodeclass = { BASECLASS 0, 0, PARSER_PRINT(Function_print) PARSER_VISIT(Function_visit) 0 }; static void FunctionDeclaration_fproc(na, context) struct node *na; /* struct Function_node */ struct SEE_context *context; { struct Function_node *n = CAST_NODE(na, Function); struct SEE_object *funcobj; struct SEE_value funcval; /* 10.1.3 */ funcobj = SEE_function_inst_create(context->interpreter, n->function, context->scope); SEE_SET_OBJECT(&funcval, funcobj); SEE_OBJECT_PUT(context->interpreter, context->variable, n->function->name, &funcval, context->varattr); } static struct nodeclass FunctionDeclaration_nodeclass = { SUPERCLASS(Function) 0 /* FunctionDeclaration_eval */, FunctionDeclaration_fproc, PARSER_PRINT(Function_print) PARSER_VISIT(Function_visit) 0 }; static struct node * FunctionDeclaration_parse(parser) struct parser *parser; { struct Function_node *n; struct node *body; struct var *formal; struct SEE_string *name = NULL; n = NEW_NODE(struct Function_node, &FunctionDeclaration_nodeclass); EXPECT(tFUNCTION); if (NEXT == tIDENT) name = NEXT_VALUE->u.string; EXPECT(tIDENT); EXPECT('('); formal = PARSE(FormalParameterList); EXPECT(')'); EXPECT('{'); parser->funcdepth++; body = PARSE(FunctionBody); parser->funcdepth--; EXPECT('}'); n->function = SEE_function_make(parser->interpreter, name, formal, body); return (struct node *)n; } static void FunctionExpression_eval(na, context, res) struct node *na; /* (struct Function_node) */ struct SEE_context *context; struct SEE_value *res; { struct Function_node *n = CAST_NODE(na, Function); struct SEE_object *funcobj = NULL, *obj; struct SEE_value v; struct SEE_scope *scope; SEE_try_context_t ctxt; struct SEE_interpreter *interp = context->interpreter; if (n->function->name == NULL) { funcobj = SEE_function_inst_create(interp, n->function, context->scope); SEE_SET_OBJECT(res, funcobj); } else { /* * Construct a single scope step that lets the * function call itself recursively */ obj = SEE_Object_new(interp); scope = SEE_NEW(interp, struct SEE_scope); scope->obj = obj; scope->next = context->scope; context->scope = scope; /* Be careful to restore the scope on any exception! */ SEE_TRY(interp, ctxt) { funcobj = SEE_function_inst_create(interp, n->function, context->scope); SEE_SET_OBJECT(&v, funcobj); SEE_OBJECT_PUT(interp, obj, n->function->name, &v, SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); SEE_SET_OBJECT(res, funcobj); } context->scope = context->scope->next; SEE_DEFAULT_CATCH(interp, ctxt); /* re-throw any exception */ } } static struct nodeclass FunctionExpression_nodeclass = { SUPERCLASS(Function) FunctionExpression_eval, 0, PARSER_PRINT(Function_print) PARSER_VISIT(Function_visit) 0 }; static struct node * FunctionExpression_parse(parser) struct parser *parser; { struct Function_node *n; struct var *formal; int noin_save, is_lhs_save; struct SEE_string *name; struct node *body; /* Save parser state */ noin_save = parser->noin; is_lhs_save = parser->is_lhs; parser->noin = 0; parser->is_lhs = 0; n = NEW_NODE(struct Function_node, &FunctionExpression_nodeclass); EXPECT(tFUNCTION); if (NEXT == tIDENT) { name = NEXT_VALUE->u.string; SKIP; } else name = NULL; EXPECT('('); formal = PARSE(FormalParameterList); EXPECT(')'); EXPECT('{'); parser->funcdepth++; body = PARSE(FunctionBody); parser->funcdepth--; EXPECT('}'); n->function = SEE_function_make(parser->interpreter, name, formal, body); /* Restore parser state */ parser->noin = noin_save; parser->is_lhs = is_lhs_save; return (struct node *)n; } static struct var * FormalParameterList_parse(parser) struct parser *parser; { struct var **p; struct var *result; p = &result; if (NEXT == tIDENT) { *p = SEE_NEW(parser->interpreter, struct var); (*p)->name = NEXT_VALUE->u.string; p = &(*p)->next; SKIP; while (NEXT == ',') { SKIP; if (NEXT == tIDENT) { *p = SEE_NEW(parser->interpreter, struct var); (*p)->name = NEXT_VALUE->u.string; p = &(*p)->next; } EXPECT(tIDENT); } } *p = NULL; return result; } static void FunctionBody_eval(na, context, res) struct node *na; /* (struct Unary_node) */ struct SEE_context *context; struct SEE_value *res; { struct Unary_node *n = CAST_NODE(na, Unary); FPROC(n->a, context); EVAL(n->a, context, res); } struct FunctionBody_node { struct Unary_node u; }; static struct nodeclass FunctionBody_nodeclass = { SUPERCLASS(Unary) FunctionBody_eval, 0, PARSER_PRINT(Unary_print) PARSER_VISIT(Unary_visit) 0 }; static struct node * FunctionBody_parse(parser) struct parser *parser; { struct FunctionBody_node *n; n = NEW_NODE(struct FunctionBody_node, &FunctionBody_nodeclass); n->u.a = PARSE(SourceElements); return (struct node *)n; } /* * JavaScript 1.5 function statements. (Not part of ECMA-262, which * treats functions as declarations.) The statement * 'function foo (args) { body };' is treated syntactically * equivalent to 'foo = function foo (args) { body };' The Netscape * documentation calls these 'conditional functions', as their intent * is to be used like this: * if (0) function foo() { abc }; * else function foo() { xyz }; */ static struct node * FunctionStatement_parse(parser) struct parser *parser; { struct Function_node *f; struct PrimaryExpression_ident_node *i; struct AssignmentExpression_node *an; struct Unary_node *e; f = (struct Function_node *)FunctionExpression_parse(parser); i = NEW_NODE(struct PrimaryExpression_ident_node, &PrimaryExpression_ident_nodeclass); i->string = f->function->name; an = NEW_NODE(struct AssignmentExpression_node, &AssignmentExpression_simple_nodeclass); an->lhs = (struct node *)i; an->expr = (struct node *)f; e = NEW_NODE(struct Unary_node, &ExpressionStatement_nodeclass); e->a = (struct node *)an; return (struct node *)e; } /* * -- 14 * * Program * : SourceElements * ; * * * SourceElements * : SourceElement * | SourceElements SourceElement * ; * * * SourceElement * : Statement * | FunctionDeclaration * ; */ static struct function * Program_parse(parser) struct parser *parser; { struct node *body; /* * NB: The semantics of Program are indistinguishable from that of * a FunctionBody. Syntactically, the only difference is that * Program must be followed by the tEND (end-of-input) token. * Practically, a program does not have parameters nor a name, * and its 'this' is always set to the Global object. */ body = PARSE(FunctionBody); if (NEXT == '}') ERRORm("unmatched '}'"); if (NEXT == ')') ERRORm("unmatched ')'"); if (NEXT == ']') ERRORm("unmatched ']'"); if (NEXT != tEND) ERRORm("unexpected token"); return SEE_function_make(parser->interpreter, NULL, NULL, body); } struct SourceElements_node { struct node node; struct SourceElement { struct node *node; struct SourceElement *next; } *statements, *functions; struct var *vars; }; static void SourceElements_eval(na, context, res) struct node *na; /* (struct SourceElements_node) */ struct SEE_context *context; struct SEE_value *res; { struct SourceElements_node *n = CAST_NODE(na, SourceElements); struct SourceElement *e; /* * NB: strictly, this should 'evaluate' the * FunctionDeclarations, but they only yield <NORMAL, NULL, NULL> * so, we don't. We just run the non-functiondecl statements * instead. It has the same result. */ _SEE_SET_COMPLETION(res, SEE_COMPLETION_NORMAL, NULL, NULL); for (e = n->statements; e; e = e->next) { EVAL(e->node, context, res); if (res->u.completion.type != SEE_COMPLETION_NORMAL) break; } } static void SourceElements_fproc(na, context) struct node *na; /* struct SourceElements_node */ struct SEE_context *context; { struct SourceElements_node *n = CAST_NODE(na, SourceElements); struct SourceElement *e; struct var *v; struct SEE_value undefv; for (e = n->functions; e; e = e->next) FPROC(e->node, context); /* * spec bug(?): although not mentioned in the spec, this * is the place to set the declared variables * to undefined. (10.1.3). * (I say 'spec bug' because there is partial overlap * between 10.1.3 and the semantics of 13.) */ SEE_SET_UNDEFINED(&undefv); for (v = n->vars; v; v = v->next) if (!SEE_OBJECT_HASPROPERTY(context->interpreter, context->variable, v->name)) SEE_OBJECT_PUT(context->interpreter, context->variable, v->name, &undefv, context->varattr); } #if WITH_PARSER_PRINT static void SourceElements_print(na, printer) struct node *na; /* (struct SourceElements_node) */ struct printer *printer; { struct SourceElements_node *n = CAST_NODE(na, SourceElements); struct var *v; struct SourceElement *e; SEE_char_t c; if (n->vars) { PRINT_CHAR('/'); PRINT_CHAR('*'); PRINT_CHAR(' '); PRINT_STRING(STR(var)); c = ' '; for (v = n->vars; v; v = v->next) { PRINT_CHAR(c); c = ','; PRINT_STRING(v->name); } PRINT_CHAR(';'); PRINT_CHAR(' '); PRINT_CHAR('*'); PRINT_CHAR('/'); PRINT_NEWLINE(0); } for (e = n->functions; e; e = e->next) PRINT(e->node); PRINT_NEWLINE(0); for (e = n->statements; e; e = e->next) PRINT(e->node); } #endif #if WITH_PARSER_VISIT static void SourceElements_visit(na, v, va) struct node *na; /* (struct SourceElements_node) */ visitor_fn_t v; void *va; { struct SourceElements_node *n = CAST_NODE(na, SourceElements); struct SourceElement *e; for (e = n->functions; e; e = e->next) VISIT(e->node, v, va); for (e = n->statements; e; e = e->next) VISIT(e->node, v, va); } #endif static struct nodeclass SourceElements_nodeclass = { BASECLASS SourceElements_eval, SourceElements_fproc, PARSER_PRINT(SourceElements_print) PARSER_VISIT(SourceElements_visit) 0 }; static struct node * SourceElements_parse(parser) struct parser *parser; { struct SourceElements_node *se; struct SourceElement **s, **f; struct var **vars_save; se = NEW_NODE(struct SourceElements_node, &SourceElements_nodeclass); s = &se->statements; f = &se->functions; /* Whenever a VarDecl parses, it will get added to se->vars! */ vars_save = parser->vars; parser->vars = &se->vars; for (;;) switch (NEXT) { case tFUNCTION: if (lookahead(parser, 1) != '(') { *f = SEE_NEW(parser->interpreter, struct SourceElement); (*f)->node = PARSE(FunctionDeclaration); f = &(*f)->next; #ifndef NDEBUG if (SEE_parse_debug) dprintf("SourceElements_parse: got function\n"); #endif break; } /* else it's a function expression */ /* The 'first's of Statement */ case tTHIS: case tIDENT: case tSTRING: case tNUMBER: case tNULL: case tTRUE: case tFALSE: case '(': case '[': case '{': case tNEW: case tDELETE: case tVOID: case tTYPEOF: case tPLUSPLUS: case tMINUSMINUS: case '+': case '-': case '~': case '!': case ';': case tVAR: case tIF: case tDO: case tWHILE: case tFOR: case tCONTINUE: case tBREAK: case tRETURN: case tWITH: case tSWITCH: case tTHROW: case tTRY: case tDIV: case tDIVEQ: /* in lieu of tREGEX */ *s = SEE_NEW(parser->interpreter, struct SourceElement); (*s)->node = PARSE(Statement); s = &(*s)->next; #ifndef NDEBUG if (SEE_parse_debug) dprintf("SourceElements_parse: got statement\n"); #endif break; case tEND: default: #ifndef NDEBUG if (SEE_parse_debug) dprintf("SourceElements_parse: got EOF/other (%d)\n", NEXT); #endif *s = NULL; *f = NULL; *parser->vars = NULL; parser->vars = vars_save; return (struct node *)se; } } /*------------------------------------------------------------ * Public API */ /* * Parses a function declaration in two parts and * return a function structure, in a similar way to * FunctionDeclaration_parse() when called with the * right input. */ struct function * SEE_parse_function(interp, name, paraminp, bodyinp) struct SEE_interpreter *interp; struct SEE_string *name; struct SEE_input *paraminp, *bodyinp; { struct lex lex; struct parser parservar, *parser = &parservar; struct var *formal; struct node *body; if (paraminp) { SEE_lex_init(&lex, SEE_input_lookahead(paraminp, 6)); parser_init(parser, interp, &lex); formal = PARSE(FormalParameterList); /* handles "" too */ EXPECT_NOSKIP(tEND); /* uses parser var */ } else formal = NULL; if (bodyinp) SEE_lex_init(&lex, SEE_input_lookahead(bodyinp, 6)); else { /* Set the lexer to EOF quickly */ lex.input = NULL; lex.next = tEND; } parser_init(parser, interp, &lex); parser->funcdepth++; body = PARSE(FunctionBody); parser->funcdepth--; EXPECT_NOSKIP(tEND); return SEE_function_make(interp, name, formal, body); } /* * Parses a Program. * Does not close the input, but may consume up to 6 characters. * lookahead. This is not usually a problem, because the input is * always read to EOF on normal completion. */ struct function * SEE_parse_program(interp, inp) struct SEE_interpreter *interp; struct SEE_input *inp; { struct lex lex; struct parser localparse, *parser = &localparse; struct function *f; SEE_lex_init(&lex, SEE_input_lookahead(inp, 6)); parser_init(parser, interp, &lex); f = PARSE(Program); #if !defined(NDEBUG) && WITH_PARSER_PRINT if (SEE_parse_debug) { dprintf("parse Program result:\n"); print_functionbody(interp, f, stderr); dprintf("<end>\n"); } #endif return f; } /* Evaluates the function body with the given execution context. */ void SEE_eval_functionbody(f, context, res) struct function *f; struct SEE_context *context; struct SEE_value *res; { EVAL((struct node *)f->body, context, res); } int SEE_functionbody_isempty(interp, f) struct SEE_interpreter *interp; struct function *f; { return FunctionBody_isempty(interp, (struct node *)f->body); } /* Returns true if the FunctionBody is empty. */ static int FunctionBody_isempty(interp, body) struct SEE_interpreter *interp; struct node *body; { struct SourceElements_node *se; struct FunctionBody_node *f; f = CAST_NODE(body, FunctionBody); se = CAST_NODE(f->u.a, SourceElements); return se->statements == NULL; } #if WITH_PARSER_PRINT /*------------------------------------------------------------ * Printer common code */ static void printer_init(printer, interp, printerclass) struct printer *printer; struct SEE_interpreter *interp; struct printerclass *printerclass; { printer->printerclass = printerclass; printer->interpreter = interp; printer->indent = 0; printer->bol = 0; } /* Called when the printer is at the beginning of a line. */ static void printer_atbol(printer) struct printer *printer; { int i; printer->bol = 0; /* prevent recursion */ PRINT_CHAR('\n'); for (i = 0; i < printer->indent; i++) { PRINT_CHAR(' '); PRINT_CHAR(' '); } } static void printer_print_newline(printer, indent) struct printer *printer; int indent; { printer->bol = 1; printer->indent += indent; } static void printer_print_node(printer, n) struct printer *printer; struct node *n; { (*(n)->nodeclass->print)(n, printer); } static void print_hex(printer, i) struct printer *printer; int i; { if (i >= 16) print_hex(printer, i >> 4); PRINT_CHAR(SEE_hexstr_lowercase[i & 0xf]); } /*------------------------------------------------------------ * Stdio printer - Prints each node in an AST to a stdio file. * So we can reconstruct parsed programs and print them to the screen. */ struct stdio_printer { struct printer printer; FILE *output; }; static void stdio_print_string(printer, s) struct printer *printer; struct SEE_string *s; { struct stdio_printer *sp = (struct stdio_printer *)printer; if (printer->bol) printer_atbol(printer); SEE_string_fputs(s, sp->output); } static void stdio_print_char(printer, c) struct printer *printer; int c; /* SEE_char_t promoted to int */ { struct stdio_printer *sp = (struct stdio_printer *)printer; if (printer->bol) printer_atbol(printer); fputc(c & 0x7f, sp->output); } static void stdio_print_node(printer, n) struct printer *printer; struct node *n; { struct stdio_printer *sp = (struct stdio_printer *)printer; fprintf(sp->output, "(%d: ", n->location.lineno); (*(n)->nodeclass->print)(n, printer); fprintf(sp->output, ")"); fflush(sp->output); } static struct printerclass stdio_printerclass = { stdio_print_string, stdio_print_char, printer_print_newline, stdio_print_node, /* printer_print_node */ }; static struct printer * stdio_printer_new(interp, output) struct SEE_interpreter *interp; FILE *output; { struct stdio_printer *sp; sp = SEE_NEW(interp, struct stdio_printer); printer_init(&sp->printer, interp, &stdio_printerclass); sp->output = output; return (struct printer *)sp; } /*------------------------------------------------------------ * String printer * Used to reconstruct parsed programs and save them in a string. */ struct string_printer { struct printer printer; struct SEE_string *string; }; static void string_print_string(printer, s) struct printer *printer; struct SEE_string *s; { struct string_printer *sp = (struct string_printer *)printer; if (printer->bol) printer_atbol(printer); SEE_string_append(sp->string, s); } static void string_print_char(printer, c) struct printer *printer; int c; /* SEE_char_t promoted to int */ { struct string_printer *sp = (struct string_printer *)printer; if (printer->bol) printer_atbol(printer); SEE_string_addch(sp->string, c); } static struct printerclass string_printerclass = { string_print_string, string_print_char, printer_print_newline, printer_print_node }; static struct printer * string_printer_new(interp, string) struct SEE_interpreter *interp; struct SEE_string *string; { struct string_printer *sp; sp = SEE_NEW(interp, struct string_printer); printer_init(&sp->printer, interp, &string_printerclass); sp->string = string; return (struct printer *)sp; } /* * Prints a function body to standard error. */ static void print_functionbody(interp, f, fp) struct SEE_interpreter *interp; struct function *f; FILE *fp; { struct printer *printer; printer = stdio_printer_new(interp, fp); PRINT((struct node *)f->body); } #endif /* WITH_PARSER_PRINT */ /* Returns the function body as a string */ struct SEE_string * SEE_functionbody_string(interp, f) struct SEE_interpreter *interp; struct function *f; { struct SEE_string *s = SEE_string_new(interp, 0); #if WITH_PARSER_PRINT struct printer *printer = string_printer_new(interp, s); PRINT((struct node *)f->body); #else SEE_string_addch(s, '/'); SEE_string_addch(s, '*'); SEE_string_append_int(s, (int)f); SEE_string_addch(s, '*'); SEE_string_addch(s, '/'); #endif return s; } /*------------------------------------------------------------ * eval * -- 15.1.2.1 */ /* * Global.eval() * 'Eval' is a special function (not a cfunction), because it accesses * the execution context of the caller (which is not available to * functions and methods invoked via SEE_OBJECT_CALL()). * * This normally only ever get called from CallExpression_eval(). * A stub cfunction exists for Global.eval, but it is bypassed. */ static void eval(context, thisobj, argc, argv, res) struct SEE_context *context; struct SEE_object *thisobj; int argc; struct SEE_value **argv, *res; { struct SEE_input *inp; struct function *f; struct SEE_value v; struct SEE_context evalcontext; struct SEE_interpreter *interp = context->interpreter; if (argc == 0) { SEE_SET_UNDEFINED(res); return; } if (SEE_VALUE_GET_TYPE(argv[0]) != SEE_STRING) { SEE_VALUE_COPY(res, argv[0]); return; } inp = SEE_input_string(interp, argv[0]->u.string); f = SEE_parse_program(interp, inp); SEE_INPUT_CLOSE(inp); /* 10.2.2 */ evalcontext.interpreter = interp; evalcontext.activation = context->activation; /* XXX */ evalcontext.variable = context->variable; evalcontext.varattr = 0; evalcontext.thisobj = context->thisobj; evalcontext.scope = context->scope; if (SEE_COMPAT_JS(interp, >=, JS11) /* EXT:23 */ && thisobj && thisobj != interp->Global) { /* * support eval() being called from something * other than the global object, where the 'thisobj' * becomes the scope chain and variable object */ evalcontext.thisobj = thisobj; evalcontext.variable = thisobj; evalcontext.scope = SEE_NEW(interp, struct SEE_scope); evalcontext.scope->next = context->scope; evalcontext.scope->obj = thisobj; } /* Set formal params to undefined, if any exist -- redundant? */ SEE_function_put_args(context, f, 0, NULL); /* Evaluate the statement */ SEE_eval_functionbody(f, &evalcontext, &v); if (SEE_VALUE_GET_TYPE(&v) != SEE_COMPLETION || v.u.completion.type != SEE_COMPLETION_NORMAL) { #ifndef NDEBUG dprintf("eval'd string returned "); dprintv(interp, &v); dprintf("\n"); #endif SEE_error_throw_string( interp, interp->EvalError, STR(internal_error)); } if (v.u.completion.value == NULL) SEE_SET_UNDEFINED(res); else SEE_VALUE_COPY(res, v.u.completion.value); } /* * Evaluates an expression in the given context. * This is a helper function intended for external debuggers wanting * to evaluate user expressions in a given context. */ void SEE_context_eval(context, expr, res) struct SEE_context *context; struct SEE_string *expr; struct SEE_value *res; { struct SEE_value s, *argv[1]; argv[0] = &s; SEE_SET_STRING(argv[0], expr); eval(context, context->interpreter->Global, 1, argv, res); } /* * Compares two value using ECMAScript == and > operator semantics. * Returns 0 if x == y, * 1 if x > y or indeterminate, * -1 otherwise. * This could be used as a better comparsion function for Array.sort(). * Currently only used by RegExp.prototype.test() */ int SEE_compare(interp, x, y) struct SEE_interpreter *interp; struct SEE_value *x, *y; { struct SEE_value v; EqualityExpression_eq(interp, x, y, &v); if (v.u.boolean) return 0; RelationalExpression_sub(interp, x, y, &v); if (SEE_VALUE_GET_TYPE(&v) == SEE_UNDEFINED || !v.u.boolean) return 1; else return -1; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/platform_posix.c����������������������������������������������������������0000664�0000000�0000000�00000012774�12660066715�0020567�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2006 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <stdlib.h> #endif #if HAVE_STRING_H # include <string.h> #endif #if TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> #else # if HAVE_SYS_TIME_H # include <sys/time.h> # else # include <time.h> # endif #endif #include "see_type.h" #include "see_error.h" #include "see_interpreter.h" #include "see_dprint.h" #include "see_platform.h" /* Returns the current right now in milliseconds since Jan 1 1970 UTC 0:00 */ SEE_number_t _SEE_platform_time(interp) struct SEE_interpreter *interp; { #if HAVE_GETTIMEOFDAY struct timeval tv; if (gettimeofday(&tv, NULL) < 0) SEE_error_throw_sys(interp, interp->Error, "gettimeofday"); return tv.tv_sec * 1e3 + tv.tv_usec * 1e-3; #else # if HAVE_TIME return time(0) * 1000.0; # else # warning "no time() or gettimeofday(); accessing time will throw an error" SEE_error_throw_sys(interp, interp->Error, "System time unavailable"); # endif #endif } SEE_number_t _SEE_platform_tza(interp) struct SEE_interpreter *interp; { #if HAVE_LOCALTIME static int initialized = 0; static SEE_number_t tza; if (!initialized) { /* XXX not thread safe */ time_t time0 = 0, diff; struct tm *tm; #pragma warning(disable : 4996) // disable the warning "localtime is unsecure" tm = localtime(&time0); diff = tm->tm_sec + 60 * (tm->tm_min + tm->tm_hour * 60); if (tm->tm_year < 0) diff = diff - 24 * 60 * 60; tza = diff * 1000.0; initialized = 1; } return tza; #else # warning "no localtime(); effective timezone has been set to UTC" return 0; #endif } /* * Compute the daylight savings adjustment. * Because of standards madness (15.9.1.9[8]) * we must translate the date in question to an * 'equivalent' year of a fixed era. I've chosen the * fourteen years near the current year. * Once the translation is done, we then figure out what * the difference between dst and non-dst times are, using the * system's timezone databases. */ SEE_number_t _SEE_platform_dst(interp, ysec, ily, wstart) struct SEE_interpreter *interp; SEE_number_t ysec; int ily, wstart; { #if HAVE_MKTIME struct tm tm; time_t dst_time, nodst_time; time_t s = ysec / 1000.0; int jday, mon, mday; static unsigned int yearmap[2][7] = { { 2006, 2007, 2002, 2003, 2009, 1999, 2005 }, { 1984, 1996, 2008, 1992, 2004, 1988, 2000 } }; memset(&tm, 0, sizeof tm); tm.tm_sec = s % 60; tm.tm_min = (s / 60) % 60; tm.tm_hour = (s / (60 * 60)) % 24; jday = s / (60 * 60 * 24); if (jday < 31) { mon = 0; mday = jday + 1; } else if (jday < 59+ily) { mon = 1; mday = jday - 30; } else if (jday < 90+ily) { mon = 2; mday = jday - 58 - ily; } else if (jday < 120+ily) { mon = 3; mday = jday - 89 - ily; } else if (jday < 151+ily) { mon = 4; mday = jday - 119 - ily; } else if (jday < 181+ily) { mon = 5; mday = jday - 150 - ily; } else if (jday < 212+ily) { mon = 6; mday = jday - 180 - ily; } else if (jday < 243+ily) { mon = 7; mday = jday - 211 - ily; } else if (jday < 273+ily) { mon = 8; mday = jday - 242 - ily; } else if (jday < 304+ily) { mon = 9; mday = jday - 272 - ily; } else if (jday < 334+ily) { mon = 10; mday = jday - 303 - ily; } else if (jday < 365+ily) { mon = 11; mday = jday - 334 - ily; } else SEE_error_throw_sys(interp, interp->Error, "_SEE_platform_dst"); tm.tm_mday = mday; tm.tm_mon = mon; tm.tm_year = yearmap[ily][wstart] - 1900; tm.tm_isdst = -1; dst_time = mktime(&tm); tm.tm_isdst = 0; nodst_time = mktime(&tm); return (dst_time - nodst_time) * 1000; #else # warning "no mktime(); daylight savings adjustments have been disabled" return 0; #endif } /* Abort the current system with a message */ void _SEE_platform_abort(interp, msg) struct SEE_interpreter *interp; const char *msg; { #if STDC_HEADERS if (msg) fprintf(stderr, "fatal error: %s\n", msg); fflush(stderr); fflush(stdout); #endif #if HAVE_ABORT abort(); #else # ifndef NDEBUG dprintf("fatal error: %s\n", msg); # endif exit(1); #endif } ����silverjuke-16.2.3/src/see/printf.c������������������������������������������������������������������0000664�0000000�0000000�00000022324�12660066715�0017013�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2006 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* * A simplified printf implementation. Formats understood are: * * %[-|0][#]d signed int * %[-|0][#]u unsigned int * %[-|0][#]x unsigned int * %c char [0x00..0x7f] * %C SEE_char_t [0x00..0xffff] * %[-][#][.#]s char * * %[-][#][.#]S struct SEE_string * * %[-][#]p void * * * Arguments to %s,%S,%c,%C are padded without heeding Unicode combining chars * The format string and arguments to %s and %c are assumed to be 7 bit ASCII * Unknown %-escapes are passed without change */ #if HAVE_CONFIG_H # include <config.h> #endif #if HAVE_STRING_H # include <string.h> #endif #include "see_type.h" #include "see_string.h" #include "see_mem.h" #include "see_printf.h" #define isdigit(c) ((c) >= '0' && (c) <= '9') #define UNDEF (-1) #define STAR (-2) /* Returns the number of digits required to represent the * unsigned integer n in digits of the given base */ static unsigned int baselen(n, base) unsigned int n, base; { unsigned int digits; digits = 1; while (n >= base) { digits++; n /= base; } return digits; } /* * Fills in a given string structure, allocating a new SEE_char_t array * containing the format string, with %-expansions. */ void _SEE_vsprintf(interp, s, fmt, ap) struct SEE_interpreter *interp; struct SEE_string *s; const char *fmt; va_list ap; { va_list ap0; unsigned int i, nlen, slen, base, unsig; unsigned int uint, outlen = 0; signed int sint; unsigned int factor, digit; int phase; const char *str = 0; char strch, fmtch; SEE_char_t *out, *outbuf = 0, *sstr = 0, sstrch; const char *fmtstart = 0; double dbl; #define OUTPUT(c) do { \ if (out) *out++ = (c); else outlen++; \ } while (0) /* * Phase 0: scan fmt to figure out how much buffer space is needed * Phase 1: re-scan fmt to fill out the buffer */ for (phase = 0; phase < 2; phase++) { if (phase == 0) { va_copy(ap0, ap); outlen = 0; out = 0; fmtstart = fmt; } else { if (outlen == 0) break; va_copy(ap, ap0); fmt = fmtstart; outbuf = SEE_NEW_STRING_ARRAY(interp, SEE_char_t, outlen); out = outbuf; } while (*fmt) { int pad_zero, pad_plus; int width = UNDEF; int precis = UNDEF; int pad_left, minus; const char *fmtrestart; if (*fmt != '%' || fmt[1] == 0) { /* Literal char */ OUTPUT(*fmt); fmt++; continue; } fmtrestart = ++fmt; if (*fmt == '%') { /* "%%" -> output "%" */ OUTPUT('%'); fmt++; continue; } pad_left = 0; pad_zero = 0; pad_plus = 0; while (*fmt == '-' || *fmt == '0' || *fmt == '+' || *fmt == ' ' || *fmt == '#') { switch (*fmt) { case '-': pad_left = 1; break; case '0': pad_zero = 1; break; case '+': pad_plus = 1; break; case '#': break; /* ignore */ case ' ': break; /* ignore */ } fmt++; } if (pad_left && pad_zero) goto badform; if (*fmt == '*') { /* "%*" -> read later */ width = STAR; fmt++; } else if (isdigit(*fmt)) { width = 0; while (isdigit(*fmt)) { /* "%nnn" -> width */ width = width * 10 + *fmt - '0'; fmt++; } } if (*fmt == '.') { fmt++; if (*fmt == '*') { /* "%.*" -> read later */ precis = STAR; fmt++; } else if (isdigit(*fmt)) { precis = 0; while (isdigit(*fmt)) { /* "%.nnn" -> precision */ precis = precis * 10 + *fmt - '0'; fmt++; } } else goto badform; /* require digits after dot */ } switch ((fmtch = *fmt++)) { /* Integer formats */ case 'u': unsig = 1; base = 10; goto number; /* unsigned decimal */ case 'd': unsig = 0; base = 10; goto number; /* signed decimal */ case 'x': unsig = 1; base = 16; goto number; /* unsigned hex */ case 'p': unsig = 1; base = 16; goto number; /* pointer hex */ number: if (precis != UNDEF) goto badform; /* precision is bad */ if (width == STAR) { width = va_arg(ap, int); if (width < 0) width = 0; } /* Convert the argument into an unsigned int with minus flag */ minus = 0; if (unsig) { uint = va_arg(ap, unsigned int); } else { sint = va_arg(ap, signed int); if (sint < 0) { uint = (unsigned int)-sint; minus = 1; } else { uint = (unsigned int)sint; } } /* Figure out the width of the representation */ nlen = baselen(uint, base); if (minus || pad_plus) nlen++; /* Grow the width to fit the representation (we don't trunc) */ if (width < 0 || width < nlen) width = nlen; if (minus || pad_plus) { nlen--; width--; } /* Perfom left-hand padding and minus sign insertion */ if (pad_zero) { if (minus) OUTPUT('-'); /* "-000" */ else if (pad_plus) OUTPUT('+'); for (i = 0; i < width - nlen; i++) OUTPUT('0'); } else { if (!pad_left) for (i = 0; i < width - nlen; i++) /* " -" */ OUTPUT(' '); if (minus) OUTPUT('-'); else if (pad_plus) OUTPUT('+'); } /* Perform left-to-right conversion (slow?) */ factor = 1; for (i = 0; i < nlen - 1; i++) factor *= base; for (i = 0; i < nlen; i++) { digit = uint / factor; uint -= digit * factor; if (digit < 10) OUTPUT('0'+digit); else OUTPUT('a'+digit-10); factor /= base; } /* Perform right-hand padding */ if (pad_left) for (i = 0; i < width - nlen; i++) OUTPUT(' '); break; /* String formats */ case 'c': case 'C': case 's': case 'S': if (pad_zero) /* "%0s" is illegal */ goto badform; if (width == STAR) { width = va_arg(ap, int); if (width < 0) width = 0; } if (precis == STAR) { precis = va_arg(ap, int); if (precis < 0) precis = 0; } if (fmtch == 'c') { strch = va_arg(ap, int); /* char is promoted to int */ str = &strch; slen = 1; } else if (fmtch == 'C') { sstrch = va_arg(ap, int); sstr = &sstrch; slen = 1; } else if (fmtch == 's') { str = va_arg(ap, const char *); if (!str) str = "(NULL)"; /* convert NULL to "(NULL)" */ /* Figure out the string's length */ slen = 0; while ((precis == UNDEF || slen < precis) && str[slen]) slen++; } else /* fmtch == 'S' */ { struct SEE_string *ss = va_arg(ap, struct SEE_string *); static SEE_char_t snull[] = { '(','N','U','L','L',')' }; slen = ss ? ss->length : (sizeof snull / sizeof snull[0]); sstr = ss ? ss->data : snull; } if (precis != UNDEF && slen > precis) slen = precis; /* Stretch width to fit the string */ if (width < 0 || width < slen) width = slen; /* Figure out padding */ if (!pad_left) { if (!out) outlen += width - slen; else for (i = 0; i < width - slen; i++) *out++ = ' '; } /* Insert the argument string */ if (!out) outlen += slen; else if (fmtch == 'S' || fmtch == 'C') { memcpy(out, sstr, slen * sizeof *out); out += slen; } else for (i = 0; i < slen; i++) *out++ = str[i]; /* Perform right-hand-side padding */ if (pad_left) { if (!out) outlen += width - slen; else for (i = 0; i < width - slen; i++) *out++ = ' '; } break; /* Floating point formats - not implemented */ case 'e': case 'f': case 'g': /* For now, consume the argument and skip */ dbl = va_arg(ap, double); /* FALLTHROUGH */ /* Unknown formats */ default: badform: OUTPUT('%'); fmt = fmtrestart; } } } s->data = outbuf; s->length = outlen; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/regex.c�������������������������������������������������������������������0000664�0000000�0000000�00000127162�12660066715�0016631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: regex.c 1126 2006-08-05 12:48:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> #endif #include "see_interpreter.h" #include "see_mem.h" #include "see_type.h" #include "see_input.h" #include "see_error.h" #include "see_string.h" #include "see_system.h" #include "see_regex.h" #include "see_unicode.h" #include "see_stringdefs.h" #include "see_dprint.h" /* * Regular expression engine. * * This module contains a parser to compile ECMA-262 regular expressions * into 'p-code', and a matcher engine that runs the p-code against * strings. * * NOTE: ECMA-262 "regular" expressions are not actually regular in * a technical sense, since the presence of non-greedy and zero-width * lookahead patterns make the matching process an NP-complete algorithm * rather than a linear process implied by context-free finite automata. * (See the NP-complete regex discussion at <http://perl.plover.com/NPC/>) * * The regex parser generates a 'struct regex' which contains the bytecode * ('p-code'), that when executed will try to match the pattern against the * given string, commencing at the given index into the string. */ #ifndef NDEBUG int SEE_regex_debug = 0; #endif #define OP_FAIL 0 /* match failed */ #define OP_SUCCEED 1 /* match succeeded */ #define OP_CHAR 2 /* match a char class instance */ #define OP_ZERO 3 /* reset counter */ #define OP_REACH 4 /* test counter over */ #define OP_NREACH 5 /* test counter under */ #define OP_START 6 /* enter a group */ #define OP_END 7 /* exit a group */ #define OP_UNDEF 8 /* reset a group */ #define OP_MARK 9 /* record a position */ #define OP_FDIST 10 /* position test */ #define OP_RDIST 11 /* position and counter test */ #define OP_MNEXT 12 /* max-loop */ #define OP_RNEXT 13 /* reach-loop */ #define OP_GOTO 14 /* branch */ #define OP_GS 15 /* greedy success */ #define OP_NS 16 /* non-greedy success */ #define OP_GF 17 /* greedy fail */ #define OP_NF 18 /* non-greedy fail */ #define OP_AS 19 /* assert success */ #define OP_AF 20 /* assert fail */ #define OP_BOL 21 /* test beginning of line */ #define OP_EOL 22 /* test end of line */ #define OP_BRK 23 /* test word-break */ #define OP_NBRK 24 /* test non-word-break */ #define OP_BACKREF 25 /* backreference match */ struct charclassrange { struct charclassrange *next; SEE_unicode_t lo, hi; /* simple range of chars, eg [a-z] */ }; struct charclass { struct charclassrange *ranges; /* linked list of character ranges */ }; struct regex { int ncaptures, ncounters, nmarks, maxref; int statesz; unsigned char *code; int codealloc, codelen; struct charclass **cc; int ccalloc, cclen; int flags; }; struct recontext { struct SEE_interpreter *interpreter; struct SEE_input *input; struct regex *regex; }; #define NEW1(t) SEE_NEW(recontext->interpreter, t) #define NEXT (recontext->input->lookahead) #define SKIP SEE_INPUT_NEXT(recontext->input) #define ATEOF (recontext->input->eof) #define LOOKAHEAD(buf,len) SEE_input_lookahead_copy( \ recontext->input, buf, len) #define SYNTAX_ERROR \ SEE_error_throw_string(recontext->interpreter, \ recontext->interpreter->SyntaxError, \ STR(regex_syntax_error)) #define EXPECT(c) do { if (ATEOF || NEXT != (c)) \ SYNTAX_ERROR; \ SKIP; } while (0) #define RELADDR(base,addr) (addr) - (base) #define ASSERT(x) SEE_ASSERT(recontext->interpreter, x) #define CODE_ADD(c) code_add(recontext, c) #define CODE_INSERT(pos, n) code_insert(recontext, pos, n) #define CODE_POS recontext->regex->codelen #define CODE_PATCH(pos, c) recontext->regex->code[pos] = c #define CODE_ADDI(i) \ do { unsigned int _i = (i); \ CODE_ADD((_i >> 8) & 0xff); \ CODE_ADD(_i & 0xff); } while (0) #define CODE_ADDA(i) CODE_ADDI(RELADDR(CODE_POS, i)) #define CODE_PATCHI(pos, i) \ do { CODE_PATCH(pos, ((i) >> 8) & 0xff); \ CODE_PATCH((pos)+1, (i) & 0xff); } while (0) #define CODE_PATCHA(addr,i) CODE_PATCHI(addr,RELADDR(addr, i)) #define CODE_SZA 2 #define CODE_SZI 2 #define CODE_MAKEI(code, addr) \ ((code[addr] << 8) | code[(addr)+1]) #define CODE_MAKEA(code, addr) \ ((CODE_MAKEI(code,addr) + (addr)) & 0xffff) #define CC_NEW() cc_new(recontext) #define CC_ADDRANGE(cc,l,h) cc_add_range(recontext, cc, l, (h)+1) #define CC_ADDCHAR(cc, ch) CC_ADDRANGE(cc, ch, ch) #define CC_INVERT(cc) cc_invert(recontext, cc) #define CC_ADDCC(dst, src) cc_add_cc(recontext, dst, src) #define CC_INTERN(cc) cc_intern(recontext, cc) #define UNDEFINED (-1) #undef INFINITY /* XXX fixme - rename INFINITY in this file maybe? */ #define INFINITY (-1) /* Prototypes */ static struct charclass *cc_new(struct recontext *); static void cc_add_range(struct recontext *, struct charclass *, SEE_unicode_t, SEE_unicode_t); static void cc_invert(struct recontext *, struct charclass *); static void cc_add_cc(struct recontext *, struct charclass *, struct charclass *); static int cc_issingle(struct charclass *); static SEE_uint32_t cc_count(struct charclass *); static int cc_cmp(struct charclass *, struct charclass *); static int cc_intern(struct recontext *, struct charclass *); static int cc_contains(struct charclass *, SEE_unicode_t); static struct regex *regex_new(struct recontext *); static void code_add(struct recontext *, int); static void code_insert(struct recontext *, int, int); static void Disjunction_parse(struct recontext *); static void Alternative_parse(struct recontext *); static void Term_parse(struct recontext *); static int Quantifier_is_next(struct recontext *); static int Integer_parse(struct recontext *); static void Atom_parse(struct recontext *); static unsigned char HexDigit_parse(struct recontext *); static struct charclass *ClassEscape_parse(struct recontext *); static struct charclass *ClassAtom_parse(struct recontext *); static struct charclass *CanonicalizeClass(struct recontext *, struct charclass *); static struct charclass *CharacterClass_parse(struct recontext *); #ifndef NDEBUG static void dprint_ch(SEE_unicode_t); static void dprint_cc(struct charclass *); static int dprint_code(struct regex *, int); static void dprint_regex(struct regex *); #endif static SEE_unicode_t Canonicalize(struct regex *, SEE_unicode_t); static SEE_boolean_t pcode_run(struct SEE_interpreter *, struct regex *, unsigned int, struct SEE_string *, char *); static void optimize_regex(struct SEE_interpreter *, struct regex *); /*------------------------------------------------------------ * charclass */ /* Create a new, empty charclass */ static struct charclass * cc_new(recontext) struct recontext *recontext; { struct charclass *c; c = NEW1(struct charclass); c->ranges = NULL; return c; } /* Add a range to a charclass */ static void cc_add_range(recontext, c, lo, hi) struct recontext *recontext; struct charclass *c; SEE_unicode_t lo, hi; { struct charclassrange *s, *newr = NULL; struct charclassrange **rp; for (rp = &c->ranges; *rp; rp = &(*rp)->next) if (lo <= (*rp)->hi) break; if (!*rp || hi < (*rp)->lo) { newr = NEW1(struct charclassrange); newr->lo = lo; newr->hi = hi; newr->next = *rp; *rp = newr; } else { if (lo < (*rp)->lo) (*rp)->lo = lo; if (hi > (*rp)->hi) { (*rp)->hi = hi; s = (*rp)->next; while (s && s->hi < hi) (*rp)->next = s = s->next; if (s && s->lo <= hi) { (*rp)->hi = s->hi; (*rp)->next = s->next; } } } } /* Invert a charclass */ static void cc_invert(recontext, c) struct recontext *recontext; struct charclass *c; { struct charclassrange *l, *newlist, *r; r = c->ranges; if (r && r->lo == 0 && r->hi == ~0) { c->ranges = NULL; return; } l = newlist = NEW1(struct charclassrange); if (r && r->lo == 0) { l->lo = r->hi; r = r->next; } else l->lo = 0; for (; r; r = r->next) { l->hi = r->lo; if (r->hi == ~0) { l->next = NULL; l = NULL; break; } l = (l->next = NEW1(struct charclassrange)); l->lo = r->hi; } if (l) { l->hi = ~0; l->next = NULL; } c->ranges = newlist; } static void cc_add_cc(recontext, dst, src) struct recontext *recontext; struct charclass *dst, *src; { struct charclassrange *r; /* XXX very inefficient */ for (r = src->ranges; r; r = r->next) cc_add_range(recontext, dst, r->lo, r->hi); } static int cc_issingle(c) struct charclass *c; { struct charclassrange *r = c->ranges; return r != NULL && r->next == NULL && r->lo + 1 == r->hi; } /* Return the number of characters in the class */ static SEE_uint32_t cc_count(c) struct charclass *c; { SEE_uint32_t count = 0; struct charclassrange *r; for (r = c->ranges; r; r = r->next) count += r->hi - r->lo; return count; } /* Return 0 if two charclasses are identical */ static int cc_cmp(c1, c2) struct charclass *c1, *c2; { struct charclassrange *r1, *r2; r1 = c1->ranges; r2 = c2->ranges; while (r1 && r2) { if (r1->lo != r2->lo) return r1->lo - r2->lo; if (r1->hi != r2->hi) return r1->hi - r2->hi; r1 = r1->next; r2 = r2->next; } if (r1) return 1; if (r2) return -1; return 0; } /* Insert charclass into recontext, returning unique ID */ static int cc_intern(recontext, c) struct recontext *recontext; struct charclass *c; { struct regex *regex = recontext->regex; struct SEE_interpreter *interp = recontext->interpreter; int i; for (i = 0; i < regex->cclen; i++) if (cc_cmp(c, regex->cc[i]) == 0) return i; if (regex->cclen == regex->ccalloc) { int new_sz; struct charclass **new_cc; new_sz = regex->ccalloc ? regex->ccalloc * 2 : 256; new_cc = SEE_NEW_ARRAY(interp, struct charclass *, new_sz); if (regex->cclen) memcpy(new_cc, regex->cc, regex->cclen * sizeof (struct charclass *)); regex->cc = new_cc; regex->ccalloc = new_sz; } i = regex->cclen++; regex->cc[i] = c; return i; } /* Return true if charclass c contains character ch */ static int cc_contains(c, ch) struct charclass *c; SEE_unicode_t ch; { struct charclassrange *r; for (r = c->ranges; r; r = r->next) { if (ch >= r->lo && ch < r->hi) return 1; if (ch < r->lo) return 0; } return 0; } #ifndef NDEBUG /* Print a character in a readable form. */ static void dprint_ch(ch) SEE_unicode_t ch; { switch (ch) { case '{': case '}': case '[': case ']': case '(': case ')': case '-': case '.': case '^': case '$': case '|': case '?': case '*': case '+': case '\\': dprintf("\\%c", ch & 0x7f); break; case 0x0000: dprintf("\\0"); break; case 0x0009: dprintf("\\t"); break; case 0x000a: dprintf("\\n"); break; case 0x000b: dprintf("\\v"); break; case 0x000c: dprintf("\\f"); break; case 0x000d: dprintf("\\r"); break; default: if (ch >= ' ' && ch <= '~') dprintf("%c", ch & 0x7f); else if (ch < 0x100) dprintf("\\x%02x", ch & 0xff); else dprintf("\\u%04x", ch); } } #endif #ifndef NDEBUG /* Print a character class in a readable form. */ static void dprint_cc(c) struct charclass *c; { struct charclassrange *r; dprintf("["); if (c->ranges && c->ranges->lo == 0) { dprintf("^"); for (r = c->ranges; r; r = r->next) { if (r->next) { dprint_ch(r->hi); if (r->next->lo != r->hi + 1) { dprintf("-"); dprint_ch(r->next->lo - 1); } } else if (r->hi != ~0) { dprint_ch(r->hi); dprintf("-"); dprint_ch(~0); } } } else for (r = c->ranges; r; r = r->next) { dprint_ch(r->lo); if (r->hi != r->lo + 1) { dprintf("-"); dprint_ch(r->hi - 1); } } dprintf("]"); } #endif /*------------------------------------------------------------ * regex and pcode construction */ /* * Allocate a new regex structure. This will contain everything needed * to run and match a string, independent of the original pattern text. */ static struct regex * regex_new(recontext) struct recontext *recontext; { struct regex *regex; regex = NEW1(struct regex); regex->ncaptures = 0; regex->maxref = 0; regex->ncounters = 0; regex->nmarks = 0; regex->statesz = 0; regex->code = NULL; regex->codealloc = 0; regex->codelen = 0; regex->cc = NULL; regex->ccalloc = 0; regex->cclen = 0; regex->flags = 0; return regex; } /* add to the end of the p-code array, resizing as needed */ static void code_add(recontext, c) struct recontext *recontext; int c; { struct regex *regex = recontext->regex; struct SEE_interpreter *interp = recontext->interpreter; if (regex->codealloc <= regex->codelen) { unsigned char *new_code; int new_size; new_size = regex->codealloc ? regex->codealloc * 2 : 512; new_code = SEE_NEW_STRING_ARRAY(interp, unsigned char, new_size); if (regex->codealloc) memcpy(new_code, regex->code, regex->codelen * sizeof (unsigned char)); regex->code = new_code; regex->codealloc = new_size; } regex->code[regex->codelen++] = c; } /* insert some bytes into the middle of the p-code, resizing as needed */ static void code_insert(recontext, pos, n) struct recontext *recontext; int pos, n; { struct regex *regex = recontext->regex; int i; for (i = 0; i < n; i++) code_add(recontext, 0); for (i = regex->codelen - n; i > pos; i--) regex->code[i - 1 + n] = regex->code[i - 1]; } /*------------------------------------------------------------ * Parser * * This recursive descent parser builds a p-code array as it runs. * During recursion, the p-code array is sometimes 'back-patched' * because branch distances weren't known in advance. In some * cases, p-code segments are also shifted. This all means that we * have to be very careful that our p-code is quite relocatable, * and not dependendent on absolute addresses. */ /* parse a source pattern, and return a filled-in regex structure */ struct regex * SEE_regex_parse(interp, source, flags) struct SEE_interpreter *interp; struct SEE_string *source; int flags; { struct recontext *recontext; struct regex *regex; recontext = SEE_NEW(interp, struct recontext); recontext->interpreter = interp; recontext->input = SEE_input_lookahead( SEE_input_string(interp, source), 24); recontext->regex = regex = regex_new(recontext); regex->flags = flags; regex->ncaptures = 1; Disjunction_parse(recontext); CODE_ADD(OP_SUCCEED); /* Check that no backreferences were too big */ if (regex->maxref >= regex->ncaptures) SYNTAX_ERROR; /* XXX - should this close be enclosed in a 'finally'? */ SEE_INPUT_CLOSE(recontext->input); /* compute the size of a captures context */ regex->statesz = regex->ncaptures * sizeof (struct capture) + regex->ncounters * sizeof (int) + regex->nmarks * sizeof (int); optimize_regex(interp, regex); #ifndef NDEBUG if (SEE_regex_debug) { dprintf("regex:"); dprint_regex(regex); dprintf(".\n"); } #endif return regex; } /* Returns the number of capture parentheses in the compiled regex */ int SEE_regex_count_captures(regex) struct regex *regex; { return regex->ncaptures; } /* Returns the flags of the regex object */ int SEE_regex_get_flags(regex) struct regex *regex; { return regex->flags; } /* * Disjunction :: Alternative * Alternative | Disjunction */ static void Disjunction_parse(recontext) struct recontext *recontext; { int pos; pos = CODE_POS; Alternative_parse(recontext); if (!ATEOF && NEXT == '|') { int p = pos, p1, p2, x1, x2; int insert = 1 + CODE_SZA; SKIP; CODE_INSERT(pos, insert); CODE_PATCH(p, OP_GF); p++; /* GF x1 */ p1 = p; p += CODE_SZA; ASSERT(p == pos + insert); /* (a) */ CODE_ADD(OP_GOTO); /* GOTO x2 */ p2 = CODE_POS; CODE_ADDA(0); x1 = CODE_POS; /* x1: (b) */ Disjunction_parse(recontext); x2 = CODE_POS; /* x2: */ CODE_PATCHA(p1, x1); CODE_PATCHA(p2, x2); } } /* * Alternative :: [empty] -- lookahead in ) | * Term * Term Alternative */ static void Alternative_parse(recontext) struct recontext *recontext; { while (!(ATEOF || NEXT == /*(*/')' || NEXT == '|')) Term_parse(recontext); } /*------------------------------------------------------------ * Term :: * Assertion la = ^ $ \b \B * Atom * Atom Quantifier */ /* We have 24 bytes of lookahead, which is sufficient to * scan for {2147483647,2147483647}. Anything larger will * overflow the signed int type on 32 bit systems. */ static int Quantifier_is_next(recontext) struct recontext *recontext; { int pos, len; SEE_unicode_t lookahead[24]; if (NEXT != '{') return 0; /* * Strict ECMA-262 says that '{' is NOT a Pattern character, * but Mozilla allows it */ /*EXT:24*/if (!SEE_COMPAT_JS(recontext->interpreter, >=, JS11)) return 1; len = LOOKAHEAD(lookahead, 24); pos = 1; while (pos < len && lookahead[pos] >= '0' && lookahead[pos] <= '9') pos++; if (pos < len && lookahead[pos] == ',') pos++; else if (pos < len && lookahead[pos] == '}') return pos > 1; else return 0; while (pos < len && lookahead[pos] >= '0' && lookahead[pos] <= '9') pos++; if (pos < len && lookahead[pos] == '}') pos++; else return 0; return 1; } static void Term_parse(recontext) struct recontext *recontext; { int min, max, greedy, pos; int oparen, cparen; /* * parse Assertion inline since it is a bit special * in terms of its lookahead */ if (NEXT == '\\') { int lookahead_len; SEE_unicode_t lookahead[2]; lookahead_len = LOOKAHEAD(lookahead, 2); if (lookahead_len > 1 && lookahead[1] == 'b') { SKIP; SKIP; CODE_ADD(OP_BRK); return; } if (lookahead_len > 1 && lookahead[1] == 'B') { SKIP; SKIP; CODE_ADD(OP_NBRK); return; } /* some other kind of escape */ } else if (NEXT == '^') { SKIP; CODE_ADD(OP_BOL); return; } else if (NEXT == '$') { SKIP; CODE_ADD(OP_EOL); return; } pos = CODE_POS; oparen = recontext->regex->ncaptures; Atom_parse(recontext); cparen = recontext->regex->ncaptures; /* * parse Quantifier inline to save my sanity */ if (ATEOF) { min = max = 1; } else if (NEXT == '*') { SKIP; min = 0; max = INFINITY; } else if (NEXT == '+') { SKIP; min = 1; max = INFINITY; } else if (NEXT == '?') { SKIP; min = 0; max = 1; } else if (Quantifier_is_next(recontext)) { SKIP; min = Integer_parse(recontext); if (!ATEOF && NEXT == ',') { EXPECT(','); /*{*/ if (!ATEOF && NEXT == '}') max = INFINITY; else max = Integer_parse(recontext); /*{*/ } else max = min; EXPECT('}'); } else { min = max = 1; } if (!ATEOF && NEXT == '?') { SKIP; greedy = 0; } else greedy = 1; if (min == max && !greedy) { /* * XXX should we warn that the greedy modifiers to * 'a{n,n}?' and 'a{n}?' are technically meaningless? * We speed up our code by using greedy mode anyway. */ greedy = 1; } /* Don't allow stupid ranges, such as 'a{7,3}' */ if (max != INFINITY && min > max) SYNTAX_ERROR; if (min == 1 && max == 1) /* a */ return; if (max == 0) { /* a{0} */ /* Undo! */ CODE_POS = pos; return; } if (oparen != cparen) { /* * If the atom introduces capture parentheses, * then insert code to reset them before each * iteration. */ CODE_INSERT(pos, 1 + 2*CODE_SZI); CODE_PATCH(pos, OP_UNDEF); CODE_PATCHI(pos + 1, oparen); CODE_PATCHI(pos + 1 + CODE_SZI, cparen); } /* * The following code generators all generate looping * matchers. While every corresponding pattern could * be written as the generalised 'a{n,m}' (where m could * be INFINITY), some efficiency is gained by selecting cases * where general code that would be a no-op is not emitted. */ if (min == max) { /* a{m} */ int p = pos, px; int insert = 1 + CODE_SZI; int c = recontext->regex->ncounters++; CODE_INSERT(pos, insert); CODE_PATCH(p, OP_ZERO); p++; /* ZERO c; */ CODE_PATCHI(p, c); p += CODE_SZI; px = p; /* x: */ ASSERT(p == pos + insert); /* (a) */ CODE_ADD(OP_RNEXT); /* RNEXT c,m,x */ CODE_ADDI(c); CODE_ADDI(max); CODE_ADDA(px); return; } if (min == 0 && max == 1) { /* a? */ int p = pos, p1, px; int insert = 1 + CODE_SZA; CODE_INSERT(pos, insert); CODE_PATCH(p, greedy ? OP_GF : OP_NF); /* GF x */ p++; p1 = p; p += CODE_SZA; ASSERT(p == pos + insert); /* (a) */ px = CODE_POS; /* x: */ CODE_PATCHA(p1, px); return; } if (min == 0 && max == INFINITY) { /* a* */ int p = pos, px, py, p1; int insert = 2 + CODE_SZA + CODE_SZI; int m = recontext->regex->nmarks++; CODE_INSERT(pos, insert); px = p; /* x: GF y */ CODE_PATCH(p, greedy ? OP_GF : OP_NF); p++; p1 = p; p += CODE_SZA; CODE_PATCH(p, OP_MARK); p++; /* MARK m */ CODE_PATCHI(p, m); p += CODE_SZI; ASSERT(p == pos + insert); /* (a) */ CODE_ADD(OP_FDIST); /* FDIST m */ CODE_ADDI(m); CODE_ADD(OP_GOTO); /* GOTO x */ CODE_ADDA(px); py = CODE_POS; /* y: */ CODE_PATCHA(p1, py); return; } { /* a{n,m} */ int p = pos, px, py, p1; int insert = 3 + CODE_SZI * 2 + CODE_SZA; int c = recontext->regex->ncounters++; int k = recontext->regex->nmarks++; CODE_INSERT(pos, insert); CODE_PATCH(p, OP_ZERO); p++; /* ZERO c */ CODE_PATCHI(p, c); p += CODE_SZI; px = p; /* x: GF y */ CODE_PATCH(p, greedy ? OP_GF : OP_NF); p++; p1 = p; p += CODE_SZA; CODE_PATCH(p, OP_MARK); p++; /* MARK k */ CODE_PATCHI(p, k); p += CODE_SZI; ASSERT(p == pos + insert); /* (a) */ if (min) { CODE_ADD(OP_RDIST); /* RDIST k,c,n */ CODE_ADDI(k); CODE_ADDI(c); CODE_ADDI(min); } else { CODE_ADD(OP_FDIST); /* FDIST k */ CODE_ADDI(k); } if (max != INFINITY) { CODE_ADD(OP_RNEXT); /* RNEXT c,m,x */ CODE_ADDI(c); CODE_ADDI(max); CODE_ADDA(px); } else { CODE_ADD(OP_MNEXT); /* MNEXT c,n,x */ CODE_ADDI(c); CODE_ADDI(min); CODE_ADDA(px); } py = CODE_POS; /* y: */ if (min) { CODE_ADD(OP_REACH); /* REACH c,n */ CODE_ADDI(c); CODE_ADDI(min); } CODE_PATCHA(p1, py); return; } } /* Parse a simple integer. Used for repetition ranges */ static int Integer_parse(recontext) struct recontext *recontext; { int val; int hasdig = 0; val = 0; while (!ATEOF && NEXT >= '0' && NEXT <= '9') { val = 10 * val + (NEXT - '0'); hasdig = 1; SKIP; } if (!hasdig) SYNTAX_ERROR; return val; } /* * Atom:: * pattern character la != ^ $ \ . * + ? ( ) [ ] { } | * . * \ AtomEscape * [ CharacterClass ] * ( Disjunction ) * ( ?: Disjunction ) * ( ?= Disjunction ) * ( ?! Disjunction ) */ static void Atom_parse(recontext) struct recontext *recontext; { struct charclass *c; int i; if (NEXT == '(') { SKIP; if (!ATEOF && NEXT == '?') { /* (?... */ SKIP; if (!ATEOF && NEXT == ':') { /* (?:... */ SKIP; Disjunction_parse(recontext); } else if (!ATEOF && (NEXT == '=' || NEXT == '!')) { int px, p1; /* (?=... */ int neg = (NEXT == '!'); /* (?!... */ SKIP; CODE_ADD(neg ? OP_AF : OP_AS); /* AS x */ p1 = CODE_POS; CODE_ADDI(0); Disjunction_parse(recontext); /* (a) */ CODE_ADD(OP_SUCCEED); /* SUCCEED */ px = CODE_POS; /* x: */ CODE_PATCHA(p1, px); } else SYNTAX_ERROR; } else { /* (...) */ i = recontext->regex->ncaptures++; CODE_ADD(OP_START); /* START i */ CODE_ADDI(i); Disjunction_parse(recontext); /* (a) */ CODE_ADD(OP_END); /* END i */ CODE_ADDI(i); } EXPECT(')'); return; } /* * All other atoms compile to simple character class matches * (or backreferences) */ switch (NEXT) { case '\\': SKIP; if (ATEOF) SYNTAX_ERROR; if (NEXT >= '1' && NEXT <= '9') { i = 0; while (!ATEOF && (NEXT >= '0' && NEXT <= '9')) { i = 10 * i + NEXT - '0'; SKIP; } CODE_ADD(OP_BACKREF); CODE_ADDI(i); if (i > recontext->regex->maxref) recontext->regex->maxref = i; return; } c = ClassEscape_parse(recontext); break; case '[': c = CharacterClass_parse(recontext); break; case '.': SKIP; c = CC_NEW(); CC_ADDCHAR(c, 0x000a); CC_ADDCHAR(c, 0x000d); CC_ADDCHAR(c, 0x2028); CC_ADDCHAR(c, 0x2029); CC_INVERT(c); break; default: c = CC_NEW(); CC_ADDCHAR(c, Canonicalize(recontext->regex, NEXT)); SKIP; break; } i = CC_INTERN(c); CODE_ADD(OP_CHAR); CODE_ADDI(i); } static unsigned char HexDigit_parse(recontext) struct recontext *recontext; { SEE_unicode_t c; if (ATEOF) SYNTAX_ERROR; c = NEXT; SKIP; if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; SYNTAX_ERROR; return 0; } static struct charclass * ClassEscape_parse(recontext) struct recontext *recontext; { struct charclass *c; SEE_unicode_t ch, lookahead[3]; int i; /* EXPECT('\\'); */ /* backslash already skipped */ c = CC_NEW(); if (NEXT >= '0' && NEXT <= '9') { /* \0oo - 3 digit octal escapes */ /*EXT:25*/ if (SEE_COMPAT_JS(recontext->interpreter, >=, JS11) && NEXT == '0' && LOOKAHEAD(lookahead, 3) >= 2 && lookahead[1] >= '0' && lookahead[1] < '8' && lookahead[2] >= '0' && lookahead[2] < '8') { ch = (lookahead[1] - '0') * 8 + (lookahead[2] - '0'); CC_ADDCHAR(c, ch); SKIP; SKIP; SKIP; return c; } i = 0; while (!ATEOF && NEXT >= '0' && NEXT <= '9') { i = 10 * i + NEXT - '0'; SKIP; } /* * 15.10.2.1.9: "Using a backreference inside a ClassAtom * causes an error" */ if (i != 0) SYNTAX_ERROR; CC_ADDCHAR(c, i); return c; } ch = NEXT; SKIP; switch (ch) { case 'b': CC_ADDCHAR(c, 0x0008); break; case 't': CC_ADDCHAR(c, 0x0009); break; case 'n': CC_ADDCHAR(c, 0x000a); break; case 'v': CC_ADDCHAR(c, 0x000b); break; case 'f': CC_ADDCHAR(c, 0x000c); break; case 'r': CC_ADDCHAR(c, 0x000d); break; case 'D': case 'd': CC_ADDRANGE(c, '0', '9'); if (ch == 'D') CC_INVERT(c); break; case 'W': case 'w': CC_ADDRANGE(c, 'a', 'z'); CC_ADDRANGE(c, 'A', 'Z'); CC_ADDRANGE(c, '0', '9'); CC_ADDCHAR(c, '_'); if (ch == 'W') CC_INVERT(c); break; case 'S': case 's': #if WITH_UNICODE_TABLES for (i = 0; i < SEE_unicode_Zscodeslen; i++) CC_ADDCHAR(c, SEE_unicode_Zscodes[i]); #else CC_ADDCHAR(c, 0x0020); #endif if (ch == 'S') CC_INVERT(c); break; case 'c': if (ATEOF) SYNTAX_ERROR; ch = NEXT; SKIP; if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) CC_ADDCHAR(c, ch % 32); else SYNTAX_ERROR; break; case 'u': case 'x': i = (ch == 'x' ? 2 : 4); ch = 0; while (i--) ch = (ch << 4) | HexDigit_parse(recontext); CC_ADDCHAR(c, ch); break; default: CC_ADDCHAR(c, ch); break; } return c; } /* * ClassAtom : * '\' ClassEscape * anychar */ static struct charclass * ClassAtom_parse(recontext) struct recontext *recontext; { struct charclass *c; if (ATEOF) SYNTAX_ERROR; if (NEXT == '\\') { SKIP; return ClassEscape_parse(recontext); } c = CC_NEW(); CC_ADDCHAR(c, NEXT); SKIP; return c; } /* * Convert the charclass into a canonicalised version. (SLOW!) * !!!Every character in the class has to be individually canonicalized!!! * !!!OUCH!!!OUCH!!!I!HATE!YOU!ALL!!! */ static struct charclass * CanonicalizeClass(recontext, c) struct recontext *recontext; struct charclass *c; { struct charclass *ccanon; struct charclassrange *r; SEE_unicode_t ch, uch; if (cc_count(c) > (SEE_uint32_t)~0 / 2) { CC_INVERT(c); ccanon = CanonicalizeClass(recontext, c); CC_INVERT(ccanon); return ccanon; } /* * Evil hack: if the charclass range includes ['A'-0xEFFFF], then * there is no need to canonicalize because every uppercase character * is already there. */ for (r = c->ranges; r; r = r->next) if (r->lo <= 'A' && r->hi > 0xf0000) return c; ccanon = CC_NEW(); for (r = c->ranges; r; r = r->next) for (ch = r->lo; ch < r->hi; ch++) { uch = UNICODE_TOUPPER(ch); CC_ADDCHAR(ccanon, uch); } return ccanon; } /* * CharacterClass :: * '[' [^] ( ClassAtom | ClassAtom '-' ClassAtom ) * ']' */ static struct charclass * CharacterClass_parse(recontext) struct recontext *recontext; { struct charclass *c = CC_NEW(), *a, *b; int invertflag = 0; EXPECT('['); if (!ATEOF && NEXT == '^') { invertflag = 1; SKIP; } while (!ATEOF && NEXT != ']') { a = ClassAtom_parse(recontext); if (!ATEOF && NEXT == '-') { SKIP; /* Treat '-' literally if at end of ClassRanges 15.10.2.16 */ if (!ATEOF && NEXT == ']') { CC_ADDCHAR(a, '-'); goto out; } if (!cc_issingle(a)) SYNTAX_ERROR; b = ClassAtom_parse(recontext); if (!cc_issingle(b)) SYNTAX_ERROR; if (b->ranges->lo < a->ranges->lo) SYNTAX_ERROR; a->ranges->hi = b->ranges->hi; /* free(b) */ } out: CC_ADDCC(c, a); /* free(a) */ } if (c->ranges == NULL) SYNTAX_ERROR; EXPECT(']'); if (recontext->regex->flags & FLAG_IGNORECASE) { c = CanonicalizeClass(recontext, c); /* free(c) -- i.e the old c */ } if (invertflag) CC_INVERT(c); return c; } /*------------------------------------------------------------ * P-code */ #ifndef NDEBUG static int dprint_code(regex, addr) struct regex *regex; int addr; { int i; const char *op="", *opc; unsigned char *code = regex->code; dprintf("0x%04x: ", addr); switch (code[addr]) { case OP_FAIL: dprintf("FAIL"); op = ""; break; case OP_SUCCEED: dprintf("SUCCEED"); op = ""; break; case OP_CHAR: dprintf("CHAR"); op = "i"; break; case OP_ZERO: dprintf("ZERO"); op = "i"; break; case OP_REACH: dprintf("REACH"); op = "ii"; break; case OP_NREACH: dprintf("NREACH"); op = "ii"; break; case OP_START: dprintf("START"); op = "i"; break; case OP_END: dprintf("END"); op = "i"; break; case OP_UNDEF: dprintf("UNDEF"); op = "ii"; break; case OP_MARK: dprintf("MARK"); op = "i"; break; case OP_FDIST: dprintf("FDIST"); op = "i"; break; case OP_RDIST: dprintf("RDIST"); op = "iii"; break; case OP_MNEXT: dprintf("MNEXT"); op = "iia"; break; case OP_RNEXT: dprintf("RNEXT"); op = "iia"; break; case OP_GOTO: dprintf("GOTO"); op = "a"; break; case OP_GS: dprintf("GS"); op = "a"; break; case OP_NS: dprintf("NS"); op = "a"; break; case OP_GF: dprintf("GF"); op = "a"; break; case OP_NF: dprintf("NF"); op = "a"; break; case OP_AS: dprintf("AS"); op = "a"; break; case OP_AF: dprintf("AF"); op = "a"; break; case OP_BOL: dprintf("BOL"); op = ""; break; case OP_EOL: dprintf("EOL"); op = ""; break; case OP_BRK: dprintf("BRK"); op = ""; break; case OP_NBRK: dprintf("NBRK"); op = ""; break; case OP_BACKREF: dprintf("BACKREF"); op = "i"; break; default: dprintf("*** %d", code[addr]); } addr++; for (opc = op; *opc; opc++) { if (opc != op) dprintf(","); dprintf(" "); switch (*opc) { case 'a': i = CODE_MAKEA(code, addr); dprintf("0x%04x", i); i = CODE_MAKEI(code, addr); dprintf(" [0x%04x]", i); addr += CODE_SZA; break; case 'i': i = CODE_MAKEI(code, addr); addr += CODE_SZI; dprintf("%d", i); break; case 'c': i = CODE_MAKEI(code, addr); addr += CODE_SZI; dprintf("%d=", i); if (i > regex->cclen) dprintf("**BAD**"); else dprint_cc(regex->cc[i]); break; } } dprintf("\n"); return addr; } #endif #ifndef NDEBUG static void dprint_regex(regex) struct regex *regex; { int i, addr; struct charclassrange *r; dprintf("regex %p\n", regex); dprintf("\tncaptures = %d\n", regex->ncaptures); dprintf("\tcodealloc = %d\n", regex->codealloc); dprintf("\tcodelen = %d\n", regex->codelen); dprintf("\tccalloc = %d\n", regex->ccalloc); dprintf("\tcclen = %d\n", regex->cclen); dprintf("\tflags = 0x%x\n", regex->flags); dprintf("\tcc:\n"); for (i = 0; i < regex->cclen; i++) { dprintf("\t\t%d = ", i); dprint_cc(regex->cc[i]); dprintf("\n\t\t = { "); for (r = regex->cc[i]->ranges; r; r = r->next) dprintf("%x:%x ", r->lo, r->hi); dprintf("}\n"); } dprintf("\tcode:\n"); addr = 0; while (addr < regex->codelen) addr = dprint_code(regex, addr); } #endif /*------------------------------------------------------------ * pcode-execution */ /* 15.10.2.8 */ static SEE_unicode_t Canonicalize(regex, ch) struct regex *regex; SEE_unicode_t ch; { if (regex->flags & FLAG_IGNORECASE) return UNICODE_TOUPPER(ch); else return ch; } static SEE_boolean_t pcode_run(interp, regex, addr, text, state) struct SEE_interpreter *interp; struct regex *regex; unsigned int addr; struct SEE_string *text; char *state; { SEE_boolean_t result; int i=0, i2=0, i3=0; unsigned int a=0; unsigned char op; SEE_unicode_t ch; struct capture *capture; int *counter, *mark, statesz; unsigned int newaddr; char *newstate; if (SEE_system.periodic) (*SEE_system.periodic)(interp); /* Compute the offsets into the state structure */ statesz = 0; capture = (struct capture *)state; statesz += regex->ncaptures * sizeof (struct capture); counter = (int *)(state + statesz); statesz += regex->ncounters * sizeof (int); mark = (int *)(state + statesz); statesz += regex->nmarks * sizeof (int); SEE_ASSERT(interp, statesz == regex->statesz); newstate = SEE_STRING_ALLOCA(interp, char, statesz); #define index (capture[0].end) for (;;) { /* Catch bad branches */ if (addr >= regex->codelen) SEE_error_throw_string(interp, interp->Error, STR(internal_error)); /* Read the opcode and its arguments */ op = regex->code[addr]; #ifndef NDEBUG if (SEE_regex_debug) { int x; struct SEE_string mys; mys.stringclass = 0; mys.interpreter = 0; mys.flags = 0; dprintf("index=%d captures=[", index); for (x = 0; x < regex->ncaptures; x++) { if (x) dprintf(","); if (capture[x].start == -1) dprintf("undef"); else if (capture[x].start + capture[x].end > text->length) { dprintf("bad<%x:%x>", capture[x].start, capture[x].end); } else { int end = capture[x].end; if (end == -1) end = index; mys.length = end - capture[x].start; mys.data = text->data + capture[x].start; dprintf("\""); dprints(&mys); dprintf("\""); if (capture[x].end == -1) dprintf("+"); } } dprintf("]"); if (op == OP_ZERO || op == OP_REACH || op == OP_NREACH || op == OP_MNEXT || op == OP_RNEXT) { dprintf(" counter=["); for (x = 0; x < regex->ncounters; x++) { if (x) dprintf(","); dprintf("%d", counter[x]); } dprintf("]"); } if (op == OP_MARK || op == OP_FDIST || op == OP_RDIST) { dprintf(" mark=["); for (x = 0; x < regex->nmarks; x++) { if (x) dprintf(","); dprintf("%d", mark[x]); } dprintf("]"); } if (regex->code[addr] == OP_CHAR && index < text->length) dprintf(" ch='%c'", Canonicalize(regex, text->data[index])); dprintf("\n"); (void)dprint_code(regex, addr); } #endif addr++; switch (op) { case OP_FAIL: case OP_SUCCEED: case OP_BOL: case OP_EOL: case OP_BRK: case OP_NBRK: break; case OP_CHAR: case OP_ZERO: case OP_START: case OP_END: case OP_MARK: case OP_FDIST: case OP_BACKREF: i = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; break; case OP_REACH: case OP_NREACH: case OP_UNDEF: i = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; i2 = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; break; case OP_RDIST: i = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; i2 = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; i3 = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; break; case OP_MNEXT: case OP_RNEXT: i = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; i2 = CODE_MAKEI(regex->code, addr); /* integer arg */ addr += CODE_SZI; a = CODE_MAKEA(regex->code, addr); /* address arg */ addr += CODE_SZA; break; case OP_GOTO: case OP_GS: case OP_NS: case OP_GF: case OP_NF: case OP_AS: case OP_AF: a = CODE_MAKEA(regex->code, addr); /* address arg */ addr += CODE_SZA; break; default: /* error */ SEE_error_throw_string(interp, interp->Error, STR(internal_error)); } switch (op) { case OP_FAIL: return 0; case OP_SUCCEED: return 1; /* succeed if current character matches charclass. index++ */ case OP_CHAR: if (index < text->length) { ch = text->data[index++]; /* N.B. strings are UTF-16 encoded! */ if ((ch & 0xfc00) == 0xd800 && index < text->length && (text->data[index] & 0xfc00) == 0xdc00) ch = (((ch & 0x3ff) << 10) | (text->data[index++] & 0x3ff)) + 0x10000; ch = Canonicalize(regex, ch); if (!cc_contains(regex->cc[i], ch)) return 0; } else return 0; break; /* reset an iteration counter */ case OP_ZERO: counter[i] = 0; break; /* fail if we havent reached a particular count */ case OP_REACH: if (counter[i] < i2) return 0; break; /* fail if we reached a particular count */ case OP_NREACH: if (counter[i] >= i2) return 0; break; /* start a capture group at current index */ case OP_START: capture[i].start = index; capture[i].end = -1; break; /* finish a capture group at current index */ case OP_END: capture[i].end = index; break; /* reset the given captures - usually done at a loop start */ case OP_UNDEF: while (i < i2) { capture[i].start = -1; capture[i].end = -1; i++; } break; /* Set a mark to the current index */ case OP_MARK: mark[i] = index; break; /* fail if we haven't advanced past the mark */ case OP_FDIST: if (mark[i] == index) return 0; break; /* fail if haven't advanced past mark AND counter has reached * a limit */ case OP_RDIST: if (mark[i] == index && counter[i2] >= i3) return 0; break; /* increment counter if it is less than n. always branch */ case OP_MNEXT: if (counter[i] < i2) counter[i]++; addr = a; break; /* increment counter. if it is less than n, then branch */ case OP_RNEXT: counter[i]++; if (counter[i] < i2) addr = a; break; case OP_GOTO: addr = a; break; /* operations that push state and branch for backtracking */ case OP_GS: /* greedy success */ case OP_NS: /* non-greedy success */ case OP_GF: /* greedy fail */ case OP_NF: /* greedy fail */ case OP_AS: /* assert success */ case OP_AF: /* assert fail */ newaddr = (op == OP_NS || op == OP_NF) ? a : addr; memcpy(newstate, state, statesz); result = pcode_run(interp, regex, newaddr, text, newstate); if (result) { if (op == OP_GF || op == OP_NF) { memcpy(state, newstate, statesz); return 1; } else if (op == OP_AF) return 0; else if (op == OP_AS) { int index_save = index; memcpy(state, newstate, statesz); index = index_save; addr = a; } else if (op == OP_GS) addr = a; } else { if (op == OP_GS || op == OP_NS || op == OP_AS) return 0; else if (op == OP_GF || op == OP_AF) addr = a; } break; /* succeed if we are at the beginning of a line */ /* See 15.10.2.6 */ case OP_BOL: if (index == 0) /* ^ */ ; /* succeed */ else if ((regex->flags & FLAG_MULTILINE) == 0) return 0; else if (text->data[index-1] == 0x000a /*LF*/ || text->data[index-1] == 0x000d /*CR*/ || text->data[index-1] == 0x2028 /*LS*/ || text->data[index-1] == 0x2029) /*PS*/ ; /* succeed */ else return 0; break; /* succeed if we are at the end of a line */ case OP_EOL: if (index == text->length) /* $ */ ; /* succeed */ else if ((regex->flags & FLAG_MULTILINE) == 0) return 0; else if (text->data[index] == 0x000a /*LF*/ || text->data[index] == 0x000d /*CR*/ || text->data[index] == 0x2028 /*LS*/ || text->data[index] == 0x2029) /*PS*/ ; /* succeed */ else return 0; break; #define IsWordChar(e) ((e) >= 0 && (e) < text->length && ( \ (text->data[e] >= 'a' && text->data[e] <= 'z') \ || (text->data[e] >= 'A' && text->data[e] <= 'Z') \ || (text->data[e] >= '0' && text->data[e] <= '9') \ || text->data[e] == '_')) /* succeed if we are at a word break */ case OP_BRK: case OP_NBRK: { SEE_boolean_t a, b; a = IsWordChar(index - 1); b = IsWordChar(index); if (op == OP_BRK) { if (a == b) return 0; } else { if (a != b) return 0; } break; } /* succeed if we match a backreference */ case OP_BACKREF: if (!CAPTURE_IS_UNDEFINED(capture[i])) { int x, len, br; br = capture[i].start; len = capture[i].end - br; if (len + index > text->length) return 0; for (x = 0; x < len; x++) if (Canonicalize(regex, text->data[br+x]) != Canonicalize(regex, text->data[index+x])) return 0; index += len; } break; /* catch unexpected instructions */ default: SEE_error_throw_string(interp, interp->Error, STR(internal_error)); } } } #undef index /* * Executes the regex on the text beginning at index. * Returns true of a match was successful. */ int SEE_regex_match(interp, regex, text, index, capture_ret) struct SEE_interpreter *interp; struct regex *regex; struct SEE_string *text; unsigned int index; struct capture *capture_ret; { int i, success; char *state = SEE_STRING_ALLOCA(interp, char, regex->statesz); struct capture *capture = (struct capture *)state; #ifndef NDEBUG memset(state, 0xd0, regex->statesz); /* catch bugs */ #endif capture[0].start = index; capture[0].end = index; for (i = 1; i < regex->ncaptures; i++) { capture[i].start = -1; capture[i].end = -1; } success = pcode_run(interp, regex, 0, text, state); #ifndef NDEBUG if (SEE_regex_debug) dprintf(". %s\n", success ? "success" : "failure"); #endif if (success) memcpy(capture_ret, capture, regex->ncaptures * sizeof (struct capture)); return success; } /*------------------------------------------------------------ * optimizer */ static void optimize_regex(interp, regex) struct SEE_interpreter *interp; struct regex *regex; { /* * (nothing here yet) * * possible optimisations include branch short-cuts, * and compiling the p-code to native machine instructions. */ } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/scope.c�������������������������������������������������������������������0000664�0000000�0000000�00000007100�12660066715�0016615�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: scope.c 926 2006-01-09 00:31:29Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #include "see_object.h" #include "see_value.h" #include "see_native.h" #include "see_debug.h" #include "see_string.h" #include "see_scope.h" #include "see_dprint.h" #ifndef NDEBUG int SEE_scope_debug = 0; #endif /* * Used in the 'PrimaryExpression: Identifier' production * to resolve an identifier within an execution context. * Returns a reference. * -- 10.1.4 */ void SEE_scope_lookup(interp, scope, ident, res) struct SEE_interpreter *interp; struct SEE_scope *scope; struct SEE_string *ident; struct SEE_value *res; { for (; scope; scope = scope->next) { #ifndef NDEBUG if (SEE_scope_debug) { dprintf("scope_lookup: searching for '"); dprints(ident); dprintf("' in scope %p, obj = ", scope); dprinto(interp, scope->obj); dprintf("\n"); } #endif if (SEE_OBJECT_HASPROPERTY(interp, scope->obj, ident)) { _SEE_SET_REFERENCE(res, scope->obj, ident); #ifndef NDEBUG if (SEE_scope_debug) { dprintf("SEE_scope_lookup: found '"); dprints(ident); dprintf("' in "); dprinto(interp, scope->obj); dprintf("\n"); } #endif return; } } #ifndef NDEBUG if (SEE_scope_debug) { dprintf("SEE_scope_lookup: not found: '"); dprints(ident); dprintf("'\n"); } #endif _SEE_SET_REFERENCE(res, NULL, ident); } /* * Return false if the two scopes have observable difference. * In some cases, (esp. mutually recursion) this simple test * will incorrectly return false. Simple scope recursion is handled OK. */ int SEE_scope_eq(s1, s2) struct SEE_scope *s1, *s2; { struct SEE_object *o; while (s1 && s2) { if (s1 == s2) return 1; if (!SEE_OBJECT_JOINED(s1->obj, s2->obj)) return 0; /* Advance down the scope chains, skipping duplicates */ o = s1->obj; do { s1 = s1->next; } while (s1 && SEE_OBJECT_JOINED(s1->obj, o)); o = s2->obj; do { s2 = s2->next; } while (s2 && SEE_OBJECT_JOINED(s2->obj, o)); } return s1 == s2; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_array.h���������������������������������������������������������������0000664�0000000�0000000�00000000770�12660066715�0017471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: array.h 725 2004-10-24 00:55:49Z d $ */ #ifndef _SEE_h_array_ #define _SEE_h_array_ #include "see_type.h" struct SEE_object; int SEE_is_Array(struct SEE_object *a); void SEE_Array_push(struct SEE_interpreter *i, struct SEE_object *a, struct SEE_value *val); SEE_uint32_t SEE_Array_length(struct SEE_interpreter *i, struct SEE_object *a); int SEE_to_array_index(struct SEE_string *, SEE_uint32_t *); #endif /* _SEE_h_array_ */ ��������silverjuke-16.2.3/src/see/see_cfunction.h�����������������������������������������������������������0000664�0000000�0000000�00000001735�12660066715�0020345�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: cfunction.h 1098 2006-07-28 15:20:53Z d $ */ #ifndef _SEE_h_cfunction_ #define _SEE_h_cfunction_ #include "see_object.h" struct SEE_interpeter; struct SEE_string; /* Creates a new function object, implemented by func */ struct SEE_object *SEE_cfunction_make(struct SEE_interpreter *i, SEE_call_fn_t func, struct SEE_string *name, int length); #define SEE_CFUNCTION_PUTA(interp, obj, name, func, length, attr) \ do { \ struct SEE_value _SEE_v; \ struct SEE_object *_SEE_obj; \ struct SEE_string *_SEE_name; \ _SEE_name = SEE_intern_ascii(interp, name); \ _SEE_obj = SEE_cfunction_make(interp, func, \ _SEE_name, length); \ SEE_SET_OBJECT(&_SEE_v, _SEE_obj); \ SEE_OBJECT_PUT(interp, obj, _SEE_name, &_SEE_v, \ attr); \ } while (0) void SEE_parse_args(struct SEE_interpreter *i, int argc, struct SEE_value **argv, const char *fmt, ...); #endif /* _SEE_h_cfunction_ */ �����������������������������������silverjuke-16.2.3/src/see/see_cfunction_private.h���������������������������������������������������0000664�0000000�0000000�00000001003�12660066715�0022063�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2005, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_cfunction_private_ #define _SEE_h_cfunction_private_ struct SEE_interpreter; struct SEE_object; struct SEE_value; struct SEE_string; struct SEE_string *SEE_cfunction_getname(struct SEE_interpreter *i, struct SEE_object *o); void SEE_cfunction_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); #endif /* _SEE_h_cfunction_private_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_context.h�������������������������������������������������������������0000664�0000000�0000000�00000001321�12660066715�0020030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: context.h 808 2005-11-25 12:44:25Z d $ */ #ifndef _SEE_h_context_ #define _SEE_h_context_ struct SEE_string; struct SEE_object; struct SEE_value; struct SEE_scope; struct SEE_interpreter; /* * Execution context. * (This structure is only of interest to debugger writers.) * -- 10 */ struct SEE_context { struct SEE_interpreter *interpreter; struct SEE_object *activation; struct SEE_object *variable; int varattr; /* default attrs for new vars */ struct SEE_object *thisobj; struct SEE_scope *scope; }; void SEE_context_eval(struct SEE_context *context, struct SEE_string *expr, struct SEE_value *res); #endif /* _SEE_h_context_ */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_debug.h���������������������������������������������������������������0000664�0000000�0000000�00000001460�12660066715�0017436�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: debug.h 774 2005-04-26 11:42:45Z d $ */ #ifndef _SEE_h_debug_ #define _SEE_h_debug_ #include <stdio.h> struct SEE_value; struct SEE_object; struct SEE_interpreter; /* Prints a representation of the value to the stream */ void SEE_PrintValue(struct SEE_interpreter *i, const struct SEE_value *v, FILE *f); /* Prints a representation of the object to the stream */ void SEE_PrintObject(struct SEE_interpreter *i, const struct SEE_object *o, FILE *f); /* Prints a string to the stream */ void SEE_PrintString(struct SEE_interpreter *i, const struct SEE_string *s, FILE *f); /* Prints the interpreter's current stack trace back to the stream */ void SEE_PrintTraceback(struct SEE_interpreter *i, FILE *f); #endif /* _SEE_h_debug_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_dprint.h��������������������������������������������������������������0000664�0000000�0000000�00000001124�12660066715�0017645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2005, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _h_dprint_ #define _h_dprint_ #ifndef NDEBUG struct SEE_string; struct SEE_interpreter; struct SEE_value; struct SEE_object; void SEE_dprintf(const char *fmt, ...); void SEE_dprints(const struct SEE_string *s); void SEE_dprintv(struct SEE_interpreter *interp, const struct SEE_value *v); void SEE_dprinto(struct SEE_interpreter *interp, struct SEE_object *o); # define dprintf SEE_dprintf # define dprints SEE_dprints # define dprintv SEE_dprintv # define dprinto SEE_dprinto #endif #endif /* _h_dprint_ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_dtoa.h����������������������������������������������������������������0000664�0000000�0000000�00000001405�12660066715�0017276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: dtoa.h 579 2004-02-10 08:54:36Z d $ */ #ifndef _SEE_h_dtoa_ #define _SEE_h_dtoa_ double SEE_strtod(const char *s00, char **se); char * SEE_dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); void SEE_freedtoa(char *s); #define DTOA_MODE_SHORT 0 /* shortest string */ #define DTOA_MODE_SHORT_SW 1 /* " w/ Steele & White rule */ #define DTOA_MODE_ECVT 2 /* max(1,ndigits) sig digits */ #define DTOA_MODE_FCVT 3 /* ndigits past decimal pt */ #define DTOA_MODE_SHORT_ECVT 4 #define DTOA_MODE_SHORT_FCVT 5 #define DTOA_MODE_ECVT_DEBUG 6 #define DTOA_MODE_FCVT_DEBUG 7 #define DTOA_MODE_SHORT_ECVT_DEBUG 8 #define DTOA_MODE_SHORT_FCVT_DEBUG 9 #endif /* _SEE_h_dtoa_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_dtoa_config.h���������������������������������������������������������0000664�0000000�0000000�00000004741�12660066715�0020631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: dtoa_config.h 997 2006-01-31 21:10:59Z d $ */ /* * Configuration directives for dtoa when used by SEE */ #if STDC_HEADERS #include <float.h> #include <stdlib.h> #endif #include "see_type.h" /* If there is endian.h, use it for robust detection of endianness */ #if HAVE_ENDIAN_H #include <endian.h> #if __BYTE_ORDER == __LITTLE_ENDIAN # define IEEE_8087 #endif #if __BYTE_ORDER == __BIG_ENDIAN # define IEEE_MC68k #endif #if defined(__vax__) && !defined(VAX) # define VAX #endif #else /* #if HAVE_ENDIAN_H */ /* endian.h is not available, so fall back to old method of endianness detection */ #if defined(__i386__) || defined(__amd64__) || defined(__ia64__) || defined(__alpha__) # define IEEE_8087 #endif #if defined(__m68k__) || defined(__sparc__) || defined(__ppc__) # define IEEE_MC68k #endif #if defined(__vax__) && !defined(VAX) # define VAX #endif #endif /* #if HAVE_ENDIAN_H */ /* #define IBM for IBM mainframe-style floating-point arithmetic. */ /* Use the types determined from <see/types.h> */ #define Long SEE_int32_t #define ULong SEE_uint32_t #define LLong SEE_int64_t #define ULLong SEE_uint64_t #if HAVE_MALLOC #define MALLOC malloc #endif #define NO_ERRNO #define IEEE_Arith /* Note that <see/config.h> will define 'const' as empty if it is unusable */ #define CONST const /* #define No_leftright to omit left-right logic in fast floating-point */ /* #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 */ /* #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 */ /* #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines */ /* #define ROUND_BIASED for IEEE-format with biased rounding. */ /* #define Inaccurate_Divide for IEEE-format with correctly rounded */ /* #define KR_headers for old-style C function headers. */ /* #define Bad_float_h if your system lacks a float.h or if it does not */ /* #define INFNAN_CHECK on IEEE systems to cause strtod to check for */ /* #define MULTIPLE_THREADS if the system offers preemptively scheduled */ /* #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that */ /* #define YES_ALIAS to permit aliasing certain double values with */ /* #define USE_LOCALE to use the current locale's decimal_point value. */ /* #define SET_INEXACT if IEEE arithmetic is being used and extra */ /* Translate these symbols for SEE-only use */ #define strtod SEE_strtod #define dtoa SEE_dtoa #define freedtoa SEE_freedtoa �������������������������������silverjuke-16.2.3/src/see/see_enumerate.h�����������������������������������������������������������0000664�0000000�0000000�00000000623�12660066715�0020335�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: enumerate.h 923 2006-01-07 11:30:41Z d $ */ #ifndef _SEE_h_enumerate_ #define _SEE_h_enumerate_ struct SEE_string; struct SEE_object; struct SEE_string **SEE_enumerate(struct SEE_interpreter *i, struct SEE_object *o); void SEE_enumerate_free(struct SEE_interpreter *i, struct SEE_string **props); #endif /* _SEE_h_enumerate_ */ �������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_error.h���������������������������������������������������������������0000664�0000000�0000000�00000006327�12660066715�0017510�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Automatically generated. Do not edit. */ /* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: error.h.in 820 2005-12-05 13:57:36Z d $ */ #ifndef _SEE_h_error_ #define _SEE_h_error_ #include "see_type.h" #include "see_native.h" struct SEE_object; struct SEE_string; struct SEE_interpreter; /* * Convenience error throwing. * These functions call the given object's constructor with * the string as a single argument, and then throws the * resulting, constructed object. */ void SEE_error__throw_string(struct SEE_interpreter *i, struct SEE_object *errorobj, const char *filename, int lineno, struct SEE_string *message) SEE_dead; void SEE_error__throw(struct SEE_interpreter *i, struct SEE_object *errorobj, const char *filename, int lineno, const char *fmt, ...) SEE_dead; void SEE_error__throw_sys(struct SEE_interpreter *i, struct SEE_object *errorobj, const char *filename, int lineno, const char *fmt, ...) SEE_dead; struct SEE_object * SEE_Error_make(struct SEE_interpreter *i, struct SEE_string *name); #ifndef NDEBUG # define SEE_error_throw_string(i, o, s) \ SEE_error__throw_string(i, o, __FILE__, __LINE__, s) #else # define SEE_error_throw_string(i, o, s) \ SEE_error__throw_string(i, o, 0, 0, s) #endif /* Determine how variadic macros are available */ #if __STDC_VERSION__ >= 199901L /* C99-style variadic macros */ # ifndef NDEBUG # define SEE_error_throw(i, o, ...) \ SEE_error__throw(i, o, __FILE__, __LINE__, __VA_ARGS__) # define SEE_error_throw_sys(i, o, ...) \ SEE_error__throw_sys(i, o, __FILE__, __LINE__, __VA_ARGS__) # else # define SEE_error_throw(i, o, ...) \ SEE_error__throw(i, o, 0, 0, __VA_ARGS__) # define SEE_error_throw_sys(i, o, ...) \ SEE_error__throw_sys(i, o, 0, 0, __VA_ARGS__) # endif #else # if 0/*HAVE_VARIADIC_MACROS*/ /* GNU-style variadic macros */ # ifndef NDEBUG # define SEE_error_throw(i, o, fmt, arg...) \ SEE_error__throw(i, o, __FILE__, __LINE__, fmt , ## arg) # define SEE_error_throw_sys(i, o, fmt, arg...) \ SEE_error__throw_sys(i, o, __FILE__, __LINE__, fmt , ## arg) # else # define SEE_error_throw(i, o, fmt, arg...) \ SEE_error__throw(i, o, 0, 0, fmt , ## arg) # define SEE_error_throw_sys(i, o, fmt, arg...) \ SEE_error__throw_sys(i, o, 0, 0, fmt , ## arg) # endif # else /* * Without variadic macros, we cannot insert file and line * information into a call to an intercepted variadic function call. */ # define SEE_error_throw SEE_error__throw0 # define SEE_error_throw_sys SEE_error__throw_sys0 # endif #endif /* * The following functions are only useful when variadic macros are * not available. */ void SEE_error__throw0(struct SEE_interpreter *i, struct SEE_object *errorobj, const char *fmt, ...) SEE_dead; void SEE_error__throw_sys0(struct SEE_interpreter *i, struct SEE_object *errorobj, const char *fmt, ...) SEE_dead; /* * An assertion macro. */ #ifndef NDEBUG # define SEE_ASSERT(i, x) \ do { \ if (!(x)) \ SEE_error_throw(i, (i)->Error, \ "%s:%d: assertion '%s' failed", \ __FILE__, __LINE__, #x); \ } while (0) #else /* NDEBUG */ # define SEE_ASSERT(i, x) /* ignore */ #endif /* NDEBUG */ #endif /* _SEE_h_error_ */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_eval.h����������������������������������������������������������������0000664�0000000�0000000�00000001151�12660066715�0017274�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: eval.h 774 2005-04-26 11:42:45Z d $ */ #ifndef _SEE_h_eval #define _SEE_h_eval struct SEE_string; struct SEE_value; struct SEE_interpreter; struct SEE_input; /* Parses and evaluates the program text from input */ void SEE_Global_eval(struct SEE_interpreter *i, struct SEE_input *input, struct SEE_value *res); /* Constructs a new function object from inputs */ struct SEE_object *SEE_Function_new(struct SEE_interpreter *i, struct SEE_string *name, struct SEE_input *param_input, struct SEE_input *body_input); #endif /* _SEE_h_eval */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_function.h������������������������������������������������������������0000664�0000000�0000000�00000003524�12660066715�0020200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: function.h 1108 2006-08-01 14:22:09Z d $ */ #ifndef _SEE_h_function_ #define _SEE_h_function_ struct SEE_interpreter; struct SEE_string; struct SEE_scope; struct SEE_native; struct SEE_object; struct SEE_context; /* Linked list of variable declarations, or formal parameter names */ struct var { struct SEE_string *name; struct var *next; /* linked list of vars */ }; struct function { int nparams; struct SEE_string **params; void *body; /* FunctionBody_node */ struct SEE_string *name; /* optional function name */ struct SEE_object *common; /* common to joined functions */ struct SEE_object *cache; /* used by SEE_Function_create() */ struct function *next; /* linked list of functions */ int is_empty; /* true if body is empty */ void *sec_domain; /* security domain active when defined */ }; struct function *SEE_function_make(struct SEE_interpreter *i, struct SEE_string *name, struct var *vars, void *node); void SEE_function_put_args(struct SEE_context *i, struct function *func, int argc, struct SEE_value **argv); extern struct SEE_objectclass SEE_activation_class; #define IS_ACTIVATION_OBJECT(o) ((o)->objectclass == &SEE_activation_class) struct SEE_object *SEE_activation_new(struct SEE_interpreter * i); /* obj_Function.c */ struct SEE_object *SEE_function_inst_create(struct SEE_interpreter *i, struct function *func, struct SEE_scope *scope); struct SEE_string *SEE_function_getname(struct SEE_interpreter * i, struct SEE_object *o); /* cfunction.c */ struct SEE_string *SEE_cfunction_getname(struct SEE_interpreter *i, struct SEE_object *o); /* cfunction.h */ void SEE_cfunction_toString(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); #endif /* _SEE_h_function_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_init.h����������������������������������������������������������������0000664�0000000�0000000�00000003344�12660066715�0017316�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2004, David Leonard. All rights reserved. */ /* $Id: init.h 1032 2006-02-19 13:59:17Z d $ */ #ifndef _SEE_h_init #define _SEE_h_init /* * Initialisers and allocators used by the interpreter initialisation * code (SEE_interpreter_init) are declared here in one place. */ /* obj_Array.c */ void SEE_Array_alloc(struct SEE_interpreter *); void SEE_Array_init(struct SEE_interpreter *); /* obj_Boolean.c */ void SEE_Boolean_alloc(struct SEE_interpreter *); void SEE_Boolean_init(struct SEE_interpreter *); /* obj_Date.c */ void SEE_Date_alloc(struct SEE_interpreter *); void SEE_Date_init(struct SEE_interpreter *); /* obj_Error.c */ void SEE_Error_alloc(struct SEE_interpreter *); void SEE_Error_init(struct SEE_interpreter *); /* obj_Function.c */ void SEE_Function_alloc(struct SEE_interpreter *); void SEE_Function_init(struct SEE_interpreter *); /* obj_Global.c */ void SEE_Global_alloc(struct SEE_interpreter *); void SEE_Global_init(struct SEE_interpreter *); /* obj_Math.c */ void SEE_Math_alloc(struct SEE_interpreter *); void SEE_Math_init(struct SEE_interpreter *); /* obj_Number.c */ void SEE_Number_alloc(struct SEE_interpreter *); void SEE_Number_init(struct SEE_interpreter *); /* obj_Object.c */ void SEE_Object_alloc(struct SEE_interpreter *); void SEE_Object_init(struct SEE_interpreter *); /* obj_RegExp.c */ void SEE_RegExp_alloc(struct SEE_interpreter *); void SEE_RegExp_init(struct SEE_interpreter *); /* obj_String.c */ void SEE_String_alloc(struct SEE_interpreter *); void SEE_String_init(struct SEE_interpreter *); /* module.c */ void _SEE_module_alloc(struct SEE_interpreter *); void _SEE_module_init(struct SEE_interpreter *); void _SEE_module_fini(struct SEE_interpreter *); #endif /* _SEE_h_init */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_input.h���������������������������������������������������������������0000664�0000000�0000000�00000004605�12660066715�0017513�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: input.h 920 2005-12-24 10:30:35Z d $ */ #ifndef _SEE_h_input_ #define _SEE_h_input_ /* * UCS-32 character stream inputs, * used by the lexical analyser. * * Supported streams: * - ASCII stdio file * - SEE_string * - UTF-8 C-strings * * Inputs can also implement filters. * Supported filters: * - n-character lookahead * */ #include <stdio.h> #include "see_type.h" struct SEE_input; struct SEE_string; struct SEE_interpreter; struct SEE_inputclass { /* Returns the next character on the stream. Invalid if !eof */ SEE_unicode_t (*next)(struct SEE_input *); /* Releases system resources allocated to input */ void (*close)(struct SEE_input *); }; struct SEE_input { struct SEE_inputclass *inputclass; SEE_boolean_t eof; /* True means next() will be invalid */ SEE_unicode_t lookahead; /* UCS-32 - what next() will return */ struct SEE_string *filename; /* source origin desc (or NULL) */ int first_lineno; struct SEE_interpreter *interpreter; }; #define SEE_INPUT_NEXT(i) (*(i)->inputclass->next)(i) #define SEE_INPUT_CLOSE(i) (*(i)->inputclass->close)(i) /* * These input filters are intended for testing and demonstration. * Host applications will normally provide their own input class if they * want to support embedded JavaScript. Typically, you will have your * program text in a buffer that your application owns, and your * input class will return characters from that buffer. * Remember: ASCII chars 0x80-0xff are not Unicode! */ /* Creates an input from a stdio file. Unicode markers are understood */ struct SEE_input *SEE_input_file(struct SEE_interpreter *i, FILE *f, const char *filename, const char *encoding); /* Creates an input from an interpreter string */ struct SEE_input *SEE_input_string(struct SEE_interpreter *i, struct SEE_string *s); /* Creates an input from a C string */ struct SEE_input *SEE_input_utf8(struct SEE_interpreter *i, const char *s); /* Creates an input filter around another input, keeping a lookahead buffer */ struct SEE_input *SEE_input_lookahead(struct SEE_input *i, int maxlookahead); /* Copy out the lookahead buffer */ int SEE_input_lookahead_copy(struct SEE_input *li, SEE_unicode_t *buf, int buflen); /* Unicode character returned when source is malformed */ #define SEE_INPUT_BADCHAR ((SEE_unicode_t)0x100000) #endif /* _SEE_h_input_ */ ���������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_intern.h��������������������������������������������������������������0000664�0000000�0000000�00000002147�12660066715�0017652�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: intern.h 992 2006-01-31 15:04:16Z d $ */ #ifndef _SEE_h_intern_ #define _SEE_h_intern_ struct SEE_interpreter; struct SEE_string; void _SEE_intern_init(struct SEE_interpreter *i); /* * Internalises a string local to the intepreter. Returns a string * with the same content so that pointer inequality implies * content inequality. */ struct SEE_string *SEE_intern(struct SEE_interpreter *i, struct SEE_string *s); /* * Internalises a string, and frees the original string. * The string s must not be used by anywhere else at this stage. */ void SEE_intern_and_free(struct SEE_interpreter *i, struct SEE_string **s); /* * Returns an interned SEE_string containing the ASCII string promoted to * unicode. All the characters in s must be ASCII (ie between 1 and 127 incl.) */ struct SEE_string *SEE_intern_ascii(struct SEE_interpreter *i, const char *s); /* * Internalises an ASCII string into the global table. * Invalid if interpreter instances exist. */ struct SEE_string *SEE_intern_global(const char *s); #endif /* _SEE_h_intern_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_interpreter.h���������������������������������������������������������0000664�0000000�0000000�00000007773�12660066715�0020730�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: interpreter.h 1126 2006-08-05 12:48:25Z d $ */ #ifndef _SEE_h_interpreter_ #define _SEE_h_interpreter_ #include "see_type.h" struct SEE_object; struct SEE_try_context; struct SEE_throw_location; struct SEE_context; struct SEE_scope; enum SEE_trace_event { SEE_TRACE_CALL, SEE_TRACE_RETURN, SEE_TRACE_STATEMENT, SEE_TRACE_THROW }; /* * This is the place to stick things that, once created * for an interpreter instance, should be kept around * for easy access. (And cannot be replaced by scripts) */ struct SEE_interpreter { void * host_data; /* reserved for host app's use */ int compatibility; /* compatibility flags (read-only?) */ /* Built-in objects newly created for each interpreter instance */ struct SEE_object *Global; struct SEE_object *Object; struct SEE_object *Object_prototype; struct SEE_object *Error; struct SEE_object *EvalError; struct SEE_object *RangeError; struct SEE_object *ReferenceError; struct SEE_object *SyntaxError; struct SEE_object *TypeError; struct SEE_object *URIError; struct SEE_object *String; struct SEE_object *String_prototype; struct SEE_object *Function; struct SEE_object *Function_prototype; struct SEE_object *Array; struct SEE_object *Array_prototype; struct SEE_object *Number; struct SEE_object *Number_prototype; struct SEE_object *Boolean; struct SEE_object *Boolean_prototype; struct SEE_object *Math; struct SEE_object *RegExp; struct SEE_object *RegExp_prototype; struct SEE_object *Date; struct SEE_object *Date_prototype; struct SEE_object *Global_eval; struct SEE_scope *Global_scope; /* Current 'try-catch' context */ volatile struct SEE_try_context * try_context; struct SEE_throw_location * try_location; /* Call traceback */ struct SEE_traceback { struct SEE_throw_location *call_location; struct SEE_object *callee; int call_type; /* SEE_CALLTYPE_* */ struct SEE_traceback *prev; } *traceback; void **module_private; /* private pointers for each module */ void *intern_tab; /* interned string table */ unsigned int random_seed; /* used by Math.random() */ const char *locale; /* current locale (may be NULL) */ int recursion_limit; /* -1 means don't care */ void *sec_domain; /* security domain inherited by new code */ /* Trace hook, called by interpreter at each step if not NULL */ void (*trace)(struct SEE_interpreter *, struct SEE_throw_location *, struct SEE_context *, enum SEE_trace_event); }; /* Compatibility flags */ #define SEE_COMPAT_STRICT 0x0000 /* Strict ECMA-262 3rd ed. */ #define SEE_COMPAT_262_3B (1<< 1) /* ECMA-262 3rd ed. Annex B */ #define SEE_COMPAT_UTF_UNSAFE (1<< 2) /* accept 'valid but insecure' UTF */ #define SEE_COMPAT_SGMLCOM (1<< 3) /* treat '<!--' as a '//' comment */ /* SEE_COMPAT_EXT1 deprecated; use SEE_COMPAT_JS11 instead */ #define SEE_COMPAT_JS_MASK (7<< 5) /* mask for JS compat values */ #define SEE_COMPAT_JS_NONE 0 /* no JS compat */ #define SEE_COMPAT_JS11 (1<< 5) /* JavaScript1.1 */ #define SEE_COMPAT_JS12 (2<< 5) /* JavaScript1.2 */ #define SEE_COMPAT_JS13 (3<< 5) /* JavaScript1.3 */ #define SEE_COMPAT_JS14 (4<< 5) /* JavaScript1.4 */ #define SEE_COMPAT_JS15 (5<< 5) /* JavaScript1.5 */ /* This macro is used to see if an ECMA deviation is required */ #define SEE_COMPAT_JS(i,cmp,jsnn) \ ((SEE_GET_JS_COMPAT(i) != SEE_COMPAT_JS_NONE) && \ (SEE_GET_JS_COMPAT(i) cmp SEE_COMPAT_##jsnn)) #define SEE_GET_JS_COMPAT(i) ((i)->compatibility & SEE_COMPAT_JS_MASK) #define SEE_SET_JS_COMPAT(i,c) \ (i)->compatibility = ((i)->compatibility & ~SEE_COMPAT_JS_MASK)|(c) /* traceback call_type */ #define SEE_CALLTYPE_CALL 1 #define SEE_CALLTYPE_CONSTRUCT 2 /* Initialises an interpreter with default behaviour */ void SEE_interpreter_init(struct SEE_interpreter *i); /* Initialises an interpreter with specific behaviour */ void SEE_interpreter_init_compat(struct SEE_interpreter *i, int compat_flags); #endif /* _SEE_h_interpreter_ */ �����silverjuke-16.2.3/src/see/see_lex.h�����������������������������������������������������������������0000664�0000000�0000000�00000004605�12660066715�0017144�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: lex.h 631 2004-03-29 20:13:45Z d $ */ #ifndef _SEE_h_lex_ #define _SEE_h_lex_ /* * The lexical analyser returns the next syntactic token from * the input stream. */ #include "see_value.h" struct SEE_string; struct lex { struct SEE_input *input; struct SEE_value value; int next; /* single token lookahead */ int next_lineno; /* line number of next */ struct SEE_string *next_filename; /* source id for line number */ SEE_boolean_t next_follows_nl; /* next was preceeded by NL */ }; void SEE_lex_init(struct lex *lex, struct SEE_input *input); int SEE_lex_next(struct lex *lex); void SEE_lex_regex(struct lex *lex); int SEE_lex_number(struct SEE_interpreter *i, struct SEE_string *s, struct SEE_value *res); /* * tokens returned by SEE_lex_next() * (single-character tokens, like ';', are represented by their ASCII value) */ #define tEND (-1) /* end of file */ #define tANDAND 257 #define tANDEQ 258 #define tBREAK 259 #define tCASE 260 #define tCATCH 261 #define tCONTINUE 262 #define tDEFAULT 263 #define tDELETE 264 #define tDIV '/' #define tDIVEQ 266 #define tDO 267 #define tELSE 268 #define tEQ 269 #define tFINALLY 270 #define tFOR 271 #define tFUNCTION 272 #define tGE 273 #define tIF 274 #define tIN 275 #define tINSTANCEOF 276 #define tLE 277 #define tLSHIFT 278 #define tLSHIFTEQ 279 #define tMINUSEQ 280 #define tMINUSMINUS 281 #define tMODEQ 282 #define tNE 283 #define tNEW 284 #define tOREQ 285 #define tOROR 286 #define tPLUSEQ 287 #define tPLUSPLUS 288 #define tREGEX 289 #define tRESERVED 290 /* any "reserved" keyword */ #define tRETURN 291 #define tRSHIFT 292 #define tRSHIFTEQ 293 #define tSEQ 294 #define tSNE 295 #define tSTAREQ 296 #define tSWITCH 297 #define tTHIS 298 #define tTHROW 299 #define tTRY 300 #define tTYPEOF 301 #define tURSHIFT 302 #define tURSHIFTEQ 303 #define tVAR 304 #define tVOID 305 #define tWHILE 306 #define tWITH 307 #define tXOREQ 308 #define tNUMBER 309 /* numeric constant */ #define tSTRING 310 /* string constant */ #define tIDENT 311 /* non-keyword identifier */ #define tCOMMENT 312 /* internal: any kind of comment */ #define tLINETERMINATOR 313 /* internal: end of line */ #define tTRUE 314 #define tNULL 315 #define tFALSE 316 #define tSGMLCOMMENT 317 /* internal: '<!--' (treated like '//') */ #endif /* _SEE_h_lex_ */ ���������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_mem.h�����������������������������������������������������������������0000664�0000000�0000000�00000003633�12660066715�0017132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: mem.h 1065 2006-04-19 14:29:27Z d $ */ #ifndef _SEE_h_mem_ #define _SEE_h_mem_ #include "see_type.h" struct SEE_interpreter; void * SEE_malloc(struct SEE_interpreter *i, SEE_size_t sz) _SEE_malloc; void * SEE_malloc_string(struct SEE_interpreter *i, SEE_size_t sz) _SEE_malloc; void * SEE_malloc_finalize(struct SEE_interpreter *i, SEE_size_t sz, void (*finalizefn)(struct SEE_interpreter *i, void *p, void *closure), void *closure) _SEE_malloc; void SEE_free(struct SEE_interpreter *i, void **memp); void SEE_gcollect(struct SEE_interpreter *i); #ifndef NDEBUG /* Debugging variants */ void * _SEE_malloc_debug(struct SEE_interpreter *i, SEE_size_t sz, const char *file, int line, const char *arg); void * _SEE_malloc_string_debug(struct SEE_interpreter *i, SEE_size_t sz, const char *file, int line, const char *arg); void * _SEE_malloc_finalize_debug(struct SEE_interpreter *i, SEE_size_t sz, void (*finalizefn)(struct SEE_interpreter *i, void *p, void *closure), void *closure, const char *file, int line, const char *arg); void _SEE_free_debug(struct SEE_interpreter *i, void **memp, const char *file, int line, const char *arg); #define SEE_malloc(i,s) \ _SEE_malloc_debug(i,s,__FILE__,__LINE__,#s) #define SEE_malloc_string(i,s) \ _SEE_malloc_string_debug(i,s,__FILE__,__LINE__,#s) #define SEE_malloc_finalize(i,s,f,c) \ _SEE_malloc_finalize_debug(i,s,f,c,__FILE__,__LINE__,\ #s "," #f "," #c) #define SEE_free(i,p) \ _SEE_free_debug(i,p,__FILE__,__LINE__,#p) #endif /* Convenience macros */ #define SEE_NEW(i, t) (t *)SEE_malloc(i, sizeof (t)) #define SEE_NEW_FINALIZE(i, t, f, c) \ (t *)SEE_malloc_finalize(i, sizeof (t), f, c) #define SEE_NEW_ARRAY(i, t, n) (t *)SEE_malloc(i, (n) * sizeof (t)) #define SEE_NEW_STRING_ARRAY(i, t, n) \ (t *)SEE_malloc_string(i, (n) * sizeof (t)) #endif /* _SEE_h_mem_ */ �����������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_module.h��������������������������������������������������������������0000664�0000000�0000000�00000001230�12660066715�0017630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2006, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_module_ #define _SEE_h_module_ struct SEE_interpreter; struct SEE_module { SEE_uint32_t magic; const char *name; const char *version; unsigned int index; /* Set by SEE_module_add() */ int (*mod_init)(void); void (*alloc)(struct SEE_interpreter *); void (*init)(struct SEE_interpreter *); }; #define SEE_MODULE_MAGIC (SEE_uint32_t)0x5345456d int SEE_module_add(struct SEE_module *module); /* Reference to the per-module private field of an interpreter */ #define SEE_MODULE_PRIVATE(interp, module) \ ((interp)->module_private[(module)->index]) #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_native.h��������������������������������������������������������������0000664�0000000�0000000�00000005007�12660066715�0017637�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: native.h 920 2005-12-24 10:30:35Z d $ */ #ifndef _SEE_h_native_ #define _SEE_h_native_ /* * 'Native' is an object class that implements objects as * a hash table of name-value pairs called 'properties'. This * is the normal, expected behaviour of objects in ECMAScript. * Properties can have attributes that prevent them being deleted * modified, or visible with the 'for prop in object' enumerator. */ #include "see_value.h" #include "see_object.h" /* Default attributes for the built-in properties described in the standard */ #define SEE_ATTR_DEFAULT (SEE_ATTR_DONTENUM) /* (see section 15) */ /* Default attributes for the 'length' property of functions */ #define SEE_ATTR_LENGTH (SEE_ATTR_READONLY | \ SEE_ATTR_DONTDELETE | \ SEE_ATTR_DONTENUM) struct SEE_interpreter; struct SEE_property; /* A native object is a primitive object plus a hash table of properties */ #define SEE_NATIVE_HASHLEN 257 struct SEE_native { struct SEE_object object; struct SEE_property * properties[SEE_NATIVE_HASHLEN]; }; /* Object class methods that assume the object is a struct SEE_native */ void SEE_native_get(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop, struct SEE_value *res); void SEE_native_put(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop, struct SEE_value *val, int flags); int SEE_native_canput(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop); int SEE_native_hasproperty(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop); int SEE_native_hasownproperty(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop); int SEE_native_getownattr(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop); int SEE_native_delete(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop); void SEE_native_defaultvalue(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_value *hint, struct SEE_value *res); struct SEE_enum *SEE_native_enumerator(struct SEE_interpreter *i, struct SEE_object *obj); /* Allocate and initialise a new native object, with NULL prototype */ struct SEE_object *SEE_native_new(struct SEE_interpreter *i); /* Initialise a SEE_native object. Useful when subtyping SEE_native */ void SEE_native_init(struct SEE_native *obj, struct SEE_interpreter *i, struct SEE_objectclass *obj_class, struct SEE_object *prototype); #endif /* _SEE_h_native_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_nmath.h���������������������������������������������������������������0000664�0000000�0000000�00000002675�12660066715�0017470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2005, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_nmath #define _SEE_h_nmath #if STDC_HEADERS # include <math.h> #endif #if SEE_NUMBER_IS_FLOAT # define NUMBER_acos(a) acosf(a) # define NUMBER_asin(a) asinf(a) # define NUMBER_atan(a) atanf(a) # define NUMBER_atan2(a,b) atan2f(a,b) # define NUMBER_ceil(a) ceilf(a) # define NUMBER_cos(a) cosf(a) # define NUMBER_copysign(a,b) copysignf(a,b) # define NUMBER_exp(a) expf(a) # define NUMBER_floor(a) floorf(a) # define NUMBER_fmod(a,b) fmodf(a,b) # define NUMBER_log(a) logf(a) # define NUMBER_pow(a,b) powf(a,b) # define NUMBER_rint(a) rintf(a) # define NUMBER_sin(a) sinf(a) # define NUMBER_sqrt(a) sqrtf(a) # define NUMBER_tan(a) tanf(a) #endif #if SEE_NUMBER_IS_DOUBLE # define NUMBER_acos(a) acos(a) # define NUMBER_asin(a) asin(a) # define NUMBER_atan(a) atan(a) # define NUMBER_atan2(a,b) atan2(a,b) # define NUMBER_ceil(a) ceil(a) # define NUMBER_cos(a) cos(a) # define NUMBER_copysign(a,b) copysign(a,b) # define NUMBER_exp(a) exp(a) # define NUMBER_floor(a) floor(a) # define NUMBER_fmod(a,b) fmod(a,b) # define NUMBER_log(a) log(a) # define NUMBER_pow(a,b) pow(a,b) # define NUMBER_rint(a) rint(a) # define NUMBER_sin(a) sin(a) # define NUMBER_sqrt(a) sqrt(a) # define NUMBER_tan(a) tan(a) #endif #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #ifndef MAX # define MAX(a,b) ((a) < (b) ? (b) : (a)) #endif #endif /* _SEE_h_nmath */ �������������������������������������������������������������������silverjuke-16.2.3/src/see/see_no.h������������������������������������������������������������������0000664�0000000�0000000�00000001752�12660066715�0016770�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: no.h 774 2005-04-26 11:42:45Z d $ */ #ifndef _SEE_h_no_ #define _SEE_h_no_ struct SEE_object; struct SEE_string; struct SEE_value; /* Object class methods that do nothing or return empty or failure */ void SEE_no_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *val); void SEE_no_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *val, int); int SEE_no_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); int SEE_no_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); int SEE_no_delete(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); void SEE_no_defaultvalue(struct SEE_interpreter *, struct SEE_object *, struct SEE_value *, struct SEE_value *); struct SEE_enum *SEE_no_enumerator(struct SEE_interpreter *, struct SEE_object *); #endif /* _SEE_h_no_ */ ����������������������silverjuke-16.2.3/src/see/see_object.h��������������������������������������������������������������0000664�0000000�0000000�00000015653�12660066715�0017627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: object.h 1108 2006-08-01 14:22:09Z d $ */ #ifndef _SEE_h_object_ #define _SEE_h_object_ struct SEE_value; struct SEE_object; struct SEE_string; struct SEE_scope; struct SEE_enum; struct SEE_interpreter; /* * Class method types. Even though ECMAScript uses a prototype * inheritance model, objects still have to carry something like * a vtbl. */ typedef void (*SEE_get_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop, struct SEE_value *res); typedef void (*SEE_put_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop, struct SEE_value *res, int flags); typedef int (*SEE_boolean_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_string *prop); typedef int (*SEE_hasinstance_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_value *instance); typedef void (*SEE_default_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_value *hint, struct SEE_value *res); typedef void (*SEE_call_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj, struct SEE_object *thisobj, int argc, struct SEE_value **argv, struct SEE_value *res); typedef struct SEE_enum *(*SEE_enumerator_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj); typedef void * (*SEE_get_sec_domain_fn_t)(struct SEE_interpreter *i, struct SEE_object *obj); /* * Object classes: an object insatnce appears as a container of named * properties accessible through methods provided by its object class. * Object classes are a SEE implementation feature and not directly visible * to ECMAScript programs. * * All object classes must implement: Prototype, Class, Get, Put, CanPut, * HasProperty, Delete and DefaultValue. (DefaultValue may simply * throw a TypeError, and Proptype may be NULL) * Optionally, object classes can implement the enumerator, Construct, Call * or HasInstance. Unimplemented optional methods are indicated as NULL. */ struct SEE_objectclass { const char * Class; /* [[Class]] */ SEE_get_fn_t Get; /* [[Get]] */ SEE_put_fn_t Put; /* [[Put]] */ SEE_boolean_fn_t CanPut; /* [[CanPut]] */ SEE_boolean_fn_t HasProperty; /* [[HasProperty]] */ SEE_boolean_fn_t Delete; /* [[Delete]] */ SEE_default_fn_t DefaultValue; /* [[DefaultValue]] */ SEE_enumerator_fn_t enumerator; /* enumerator */ SEE_call_fn_t Construct; /* [[Construct]] */ SEE_call_fn_t Call; /* [[Call]] */ SEE_hasinstance_fn_t HasInstance; /* [[HasInstance]] */ SEE_get_sec_domain_fn_t get_sec_domain; /* get_sec_domain */ }; /* * Base object structure. This structure is not generally useful * unless extended (see struct SEE_native in <see/native.h>). */ struct SEE_object { struct SEE_objectclass *objectclass; struct SEE_object * Prototype; /* [[Prototype]] */ }; #define SEE_OBJECT_GET(interp, obj, name, res) \ (*(obj)->objectclass->Get)(interp, obj, name, res) #define SEE_OBJECT_PUT(interp, obj, name, val, attrs) \ (*(obj)->objectclass->Put)(interp, obj, name, val, attrs) #define SEE_OBJECT_CANPUT(interp, obj, name) \ (*(obj)->objectclass->CanPut)(interp, obj, name) #define SEE_OBJECT_HASPROPERTY(interp, obj, name) \ (*(obj)->objectclass->HasProperty)(interp, obj, name) #define SEE_OBJECT_DELETE(interp, obj, name) \ (*(obj)->objectclass->Delete)(interp, obj, name) #define SEE_OBJECT_DEFAULTVALUE(interp, obj, hint, res) \ (*(obj)->objectclass->DefaultValue)(interp, obj, hint, res) #define SEE_OBJECT_CONSTRUCT(interp, obj, thisobj, argc, argv, res) \ SEE_object_construct(interp, obj, thisobj, argc, argv, res) #define _SEE_OBJECT_CONSTRUCT(interp, obj, thisobj, argc, argv, res) \ (*(obj)->objectclass->Construct)(interp, obj, thisobj, argc, argv, res) #define SEE_OBJECT_CALL(interp, obj, thisobj, argc, argv, res) \ SEE_object_call(interp, obj, thisobj, argc, argv, res) #define _SEE_OBJECT_CALL(interp, obj, thisobj, argc, argv, res) \ (*(obj)->objectclass->Call)(interp, obj, thisobj, argc, argv, res) #define SEE_OBJECT_HASINSTANCE(interp, obj, instance) \ (*(obj)->objectclass->HasInstance)(interp, obj, instance) #define SEE_OBJECT_ENUMERATOR(interp, obj) \ (*(obj)->objectclass->enumerator)(interp, obj) #define SEE_OBJECT_GET_SEC_DOMAIN(interp, obj) \ (*(obj)->objectclass->get_sec_domain)(interp, obj) /* Convenience macros that use ASCII C strings for names */ struct SEE_string *SEE_intern_ascii(struct SEE_interpreter *, const char *); #define SEE_OBJECT_GETA(interp, obj, name, res) \ SEE_OBJECT_GET(interp, obj, SEE_intern_ascii(interp, name), res) #define SEE_OBJECT_PUTA(interp, obj, name, val, attrs) \ SEE_OBJECT_PUT(interp, obj, SEE_intern_ascii(interp, name), val, attrs) #define SEE_OBJECT_CANPUTA(interp, obj, name) \ SEE_OBJECT_CANPUT(interp, obj, SEE_intern_ascii(interp, name)) #define SEE_OBJECT_HASPROPERTYA(interp, obj, name) \ SEE_OBJECT_HASPROPERTY(interp, obj, SEE_intern_ascii(interp, name)) #define SEE_OBJECT_DELETEA(interp, obj, name) \ SEE_OBJECT_DELETE(interp, obj, SEE_intern_ascii(interp, name)) #define SEE_OBJECT_HAS_CALL(obj) ((obj)->objectclass->Call) #define SEE_OBJECT_HAS_CONSTRUCT(obj) ((obj)->objectclass->Construct) #define SEE_OBJECT_HAS_HASINSTANCE(obj) ((obj)->objectclass->HasInstance) #define SEE_OBJECT_HAS_ENUMERATOR(obj) ((obj)->objectclass->enumerator) #define SEE_OBJECT_HAS_GET_SEC_DOMAIN(obj) ((obj)->objectclass->get_sec_domain) /* [[Put]] attributes */ #define SEE_ATTR_READONLY 0x01 #define SEE_ATTR_DONTENUM 0x02 #define SEE_ATTR_DONTDELETE 0x04 #define SEE_ATTR_INTERNAL 0x08 /* Enumerator class. */ struct SEE_enumclass { void *unused; /* XXX leftover from deprecated reset method */ struct SEE_string *(*next)(struct SEE_interpreter *i, struct SEE_enum *e, int *flags_return); }; /* * Enumerator instance. This structure is generally subclassed to * hold enumeration state. */ struct SEE_enum { struct SEE_enumclass *enumclass; }; #define SEE_ENUM_NEXT(i,e,dep) ((e)->enumclass->next)(i,e,dep) /* * This macro tests to see if two objects are "joined", i.e. a change to one * is reflected in the other. This is only useful with function * objects that share a common function implementation. */ #define SEE_OBJECT_JOINED(a,b) \ ((a) == (b) || \ ((a)->objectclass == (b)->objectclass && \ SEE_function_is_joined(a,b))) int SEE_function_is_joined(struct SEE_object *a, struct SEE_object *b); /* A convenience function equivalent to "new Object()" */ struct SEE_object *SEE_Object_new(struct SEE_interpreter *); /* * Wrappers around [[Call]] and [[Construct]] that check for * recursion limits being reached and to keep track of the security * domains. */ void SEE_object_call(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); void SEE_object_construct(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); #endif /* _SEE_h_object_ */ �������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_parse.h���������������������������������������������������������������0000664�0000000�0000000�00000001756�12660066715�0017472�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: parse.h 1004 2006-02-04 10:06:07Z d $ */ #ifndef _SEE_h_parse_ #define _SEE_h_parse_ struct SEE_string; struct SEE_value; struct SEE_interpreter; struct SEE_context; struct SEE_input; struct function; #include "see_eval.h" struct function *SEE_parse_function(struct SEE_interpreter *i, struct SEE_string *name, struct SEE_input *param_input, struct SEE_input *body_input); void SEE_eval_functionbody(struct function *f, struct SEE_context *context, struct SEE_value *res); struct function *SEE_parse_program(struct SEE_interpreter *i, struct SEE_input *input); void SEE_functionbody_print(struct SEE_interpreter *i, struct function *f); struct SEE_string *SEE_functionbody_string(struct SEE_interpreter *i, struct function *f); int SEE_functionbody_isempty(struct SEE_interpreter *i, struct function *f); int SEE_compare(struct SEE_interpreter *i, struct SEE_value *x, struct SEE_value *y); #endif /* _SEE_h_parse_ */ ������������������silverjuke-16.2.3/src/see/see_platform.h������������������������������������������������������������0000664�0000000�0000000�00000001374�12660066715�0020200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright 2006, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_platform_ #define _SEE_h_platform_ #include <stdarg.h> #include "see_type.h" /* Returns the time right now in milliseconds since Jan 1 1970 UTC 0:00 */ SEE_number_t _SEE_platform_time(struct SEE_interpreter *interp); /* Returns the local timezone adjustment in milliseconds */ SEE_number_t _SEE_platform_tza(struct SEE_interpreter *interp); /* Returns the daylight saving time adjustment in msec for a local time */ SEE_number_t _SEE_platform_dst(struct SEE_interpreter *interp, SEE_number_t ysec, int ily, int wstart); /* Abort the current system with a message */ void _SEE_platform_abort(struct SEE_interpreter *interp, const char *msg); #endif /* _SEE_h_platform_ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_printf.h��������������������������������������������������������������0000664�0000000�0000000�00000000476�12660066715�0017660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2006, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_printf #define _SEE_h_printf #include <stdarg.h> struct SEE_string; struct SEE_interpreter; void _SEE_vsprintf(struct SEE_interpreter *interp, struct SEE_string *, const char *fmt, va_list ap); #endif /* _SEE_h_printf */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_regex.h���������������������������������������������������������������0000664�0000000�0000000�00000002244�12660066715�0017463�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: regex.h 1008 2006-02-05 13:01:44Z d $ */ #ifndef _SEE_h_regex_ #define _SEE_h_regex_ struct SEE_interpreter; struct SEE_string; struct SEE_object; struct regex; struct capture { unsigned int start, end; }; #define CAPTURE_IS_UNDEFINED(c) ((c).end == -1) #define FLAG_GLOBAL 0x01 /* 'g'-flag */ #define FLAG_IGNORECASE 0x02 /* 'i'-flag */ #define FLAG_MULTILINE 0x04 /* 'm'-flag */ struct regex *SEE_regex_parse(struct SEE_interpreter *interp, struct SEE_string *pattern, int flags); int SEE_regex_count_captures(struct regex *regex); int SEE_regex_get_flags(struct regex *regex); int SEE_regex_match(struct SEE_interpreter *interp, struct regex *regex, struct SEE_string *text, unsigned int start, struct capture *captures); /* defined in obj_RegExp.c to wrap RegExp objects: */ int SEE_is_RegExp(struct SEE_object *regexp); int SEE_RegExp_match(struct SEE_interpreter *interp, struct SEE_object *regexp, struct SEE_string *text, unsigned int start, struct capture *captures); int SEE_RegExp_count_captures(struct SEE_interpreter *interp, struct SEE_object *regexp); #endif /* _SEE_h_regex_ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_scope.h���������������������������������������������������������������0000664�0000000�0000000�00000001015�12660066715�0017455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2005, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_scope_ #define _SEE_h_scope_ struct SEE_interpreter; struct SEE_object; struct SEE_string; struct SEE_value; /* Execution scope chain */ struct SEE_scope { struct SEE_scope *next; struct SEE_object *obj; }; void SEE_scope_lookup(struct SEE_interpreter *, struct SEE_scope *scope, struct SEE_string *name, struct SEE_value *res); int SEE_scope_eq(struct SEE_scope *scope1, struct SEE_scope *scope2); #endif /* _SEE_h_context_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_see.h�����������������������������������������������������������������0000664�0000000�0000000�00000001347�12660066715�0017130�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef _SEE_h_see_ #define _SEE_h_see_ /* * Although every header file is autonomous (or handles its own dependencies), * this header file conveniently includes them all. */ #ifdef __cplusplus extern "C" { #endif /* C++ */ #include "see_type.h" #include "see_value.h" #include "see_object.h" #include "see_native.h" #include "see_cfunction.h" #include "see_debug.h" #include "see_eval.h" #include "see_error.h" #include "see_input.h" #include "see_intern.h" #include "see_interpreter.h" #include "see_context.h" #include "see_mem.h" #include "see_module.h" #include "see_no.h" #include "see_string.h" #include "see_system.h" #include "see_try.h" #include "see_version.h" #ifdef __cplusplus } #endif /* C++ */ #endif /* _SEE_h_see_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_string.h��������������������������������������������������������������0000664�0000000�0000000�00000005732�12660066715�0017664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: string.h 1098 2006-07-28 15:20:53Z d $ */ #ifndef _SEE_h_string_ #define _SEE_h_string_ /* * Strings are in-memory, sized arrays of 16-bit characters. * They have length and content, and may be 'owned' by the intern system. * * Like objects, a string class provides an implementation. * The implementation can optionally provide a 'growby' method that * is used by SEE_string_append() and SEE_string_addch() to ensure the * string length can be incremented by a given amount; * although care must be taken to ensure that the grown * string's data is not in use elsewhere. * Practically there are only two string implementations: growable and * non-growable. * * The lifetime of a string is as it passes through the following stages: * 1. new, mutable; can be modified, grown and kept private * 2. public, immutable; must not be changed, can be referenced anywhere * 3. unreachable; garbage collector determines when to deallocate string */ #include <stdio.h> #include <stdarg.h> #include "see_type.h" struct SEE_stringclass; struct SEE_string { unsigned int length; SEE_char_t *data; struct SEE_stringclass *stringclass; /* NULL means static */ struct SEE_interpreter *interpreter; int flags; }; #define SEE_STRING_FLAG_INTERNED 1 #define SEE_STRING_FLAG_STATIC 2 #define SEE_STRING_DECL(chararray) \ { sizeof (chararray) / sizeof (SEE_char_t), (chararray), \ NULL, NULL, SEE_STRING_FLAG_STATIC } struct SEE_stringclass { void (*growby)(struct SEE_string *, unsigned int); }; void SEE_string_addch(struct SEE_string *s, /* SEE_char_t */ int ch); void SEE_string_append(struct SEE_string *s, const struct SEE_string *sffx); void SEE_string_append_ascii(struct SEE_string *s, const char *ascii); void SEE_string_append_int(struct SEE_string *s, int i); int SEE_string_fputs(const struct SEE_string *s, FILE *file); int SEE_string_cmp(const struct SEE_string *s1, const struct SEE_string *s2); struct SEE_string *SEE_string_new(struct SEE_interpreter *i, unsigned int space); struct SEE_string *SEE_string_dup(struct SEE_interpreter *i, const struct SEE_string *s); struct SEE_string *SEE_string_substr(struct SEE_interpreter *i, struct SEE_string *s, int index, int length); struct SEE_string *SEE_string_concat(struct SEE_interpreter *i, struct SEE_string *s1, struct SEE_string *s2); struct SEE_string *SEE_string_sprintf(struct SEE_interpreter *i, const char *fmt, ...); struct SEE_string *SEE_string_vsprintf(struct SEE_interpreter *i, const char *fmt, va_list ap); struct SEE_string *SEE_string_literal(struct SEE_interpreter *i, const struct SEE_string *s); void SEE_string_free(struct SEE_interpreter *i, struct SEE_string **sp); void SEE_string_toutf8(struct SEE_interpreter *i, char *buf, SEE_size_t buflen, const struct SEE_string *s); SEE_size_t SEE_string_utf8_size(struct SEE_interpreter *interp, const struct SEE_string *s); #endif /* _SEE_h_string_ */ ��������������������������������������silverjuke-16.2.3/src/see/see_stringdefs.h����������������������������������������������������������0000664�0000000�0000000�00000023535�12660066715�0020527�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This is a generated file: do not edit */ struct SEE_string; extern struct SEE_string SEE_stringtab[]; extern const unsigned int SEE_nstringtab; #define STR(x) (&SEE_stringtab[SEE_STR_##x]) #define SEE_STR_bad_argc 0 #define SEE_STR_bad_arg 1 #define SEE_STR_internal_error 2 #define SEE_STR_new_not_an_object 3 #define SEE_STR_not_a_constructor 4 #define SEE_STR_no_such_function 5 #define SEE_STR_not_a_function 6 #define SEE_STR_not_callable 7 #define SEE_STR_instanceof_not_object 8 #define SEE_STR_in_not_object 9 #define SEE_STR_no_hasinstance 10 #define SEE_STR_bad_lvalue 11 #define SEE_STR_regex_syntax_error 12 #define SEE_STR_recursion_limit_reached 13 #define SEE_STR_string_limit_reached 14 #define SEE_STR_error 15 #define SEE_STR_no_string_space 16 #define SEE_STR_bad_utf16_string 17 #define SEE_STR_unknown_file 18 #define SEE_STR_string_input_name 19 #define SEE_STR_duplicate_label 20 #define SEE_STR_previous_definition 21 #define SEE_STR_toobject_undefined 22 #define SEE_STR_toobject_null 23 #define SEE_STR_toobject_bad 24 #define SEE_STR_toboolean_bad 25 #define SEE_STR_tonumber_bad 26 #define SEE_STR_tostring_bad 27 #define SEE_STR_defaultvalue_string_bad 28 #define SEE_STR_defaultvalue_number_bad 29 #define SEE_STR_defaultvalue_no_bad 30 #define SEE_STR_not_array 31 #define SEE_STR_array_badlen 32 #define SEE_STR_not_boolean 33 #define SEE_STR_not_function 34 #define SEE_STR_not_number 35 #define SEE_STR_not_regexp 36 #define SEE_STR_not_string 37 #define SEE_STR_not_date 38 #define SEE_STR_apply_not_array 39 #define SEE_STR_bad_radix 40 #define SEE_STR_regexp_bad_string 41 #define SEE_STR_regexp_bad_flag 42 #define SEE_STR_uri_badhex 43 #define SEE_STR_bad_utf8 44 #define SEE_STR_bad_unicode 45 #define SEE_STR_array_sort_error 46 #define SEE_STR_toLocaleString_notfunc 47 #define SEE_STR_toLocaleString_notstring 48 #define SEE_STR_too_many_args 49 #define SEE_STR_string_not_ascii 50 #define SEE_STR_string_contains_null 51 #define SEE_STR_implementation_dependent 52 #define SEE_STR_empty_string 53 #define SEE_STR_zero_digit 54 #define SEE_STR_comma 55 #define SEE_STR_write 56 #define SEE_STR_writeval 57 #define SEE_STR_minus 58 #define SEE_STR_name 59 #define SEE_STR_message 60 #define SEE_STR_Error 61 #define SEE_STR_EvalError 62 #define SEE_STR_RangeError 63 #define SEE_STR_ReferenceError 64 #define SEE_STR_SyntaxError 65 #define SEE_STR_TypeError 66 #define SEE_STR_URIError 67 #define SEE_STR_arguments 68 #define SEE_STR_callee 69 #define SEE_STR_source 70 #define SEE_STR_global 71 #define SEE_STR_ignoreCase 72 #define SEE_STR_multiline 73 #define SEE_STR_lastIndex 74 #define SEE_STR_exec 75 #define SEE_STR_test 76 #define SEE_STR_index 77 #define SEE_STR_input 78 #define SEE_STR_parse 79 #define SEE_STR_UTC 80 #define SEE_STR_toDateString 81 #define SEE_STR_toTimeString 82 #define SEE_STR_toLocaleDateString 83 #define SEE_STR_toLocaleTimeString 84 #define SEE_STR_getTime 85 #define SEE_STR_getFullYear 86 #define SEE_STR_getUTCFullYear 87 #define SEE_STR_getMonth 88 #define SEE_STR_getUTCMonth 89 #define SEE_STR_getDate 90 #define SEE_STR_getUTCDate 91 #define SEE_STR_getDay 92 #define SEE_STR_getUTCDay 93 #define SEE_STR_getHours 94 #define SEE_STR_getUTCHours 95 #define SEE_STR_getMinutes 96 #define SEE_STR_getUTCMinutes 97 #define SEE_STR_getSeconds 98 #define SEE_STR_getUTCSeconds 99 #define SEE_STR_getMilliseconds 100 #define SEE_STR_getUTCMilliseconds 101 #define SEE_STR_getTimezoneOffset 102 #define SEE_STR_setTime 103 #define SEE_STR_setMilliseconds 104 #define SEE_STR_setUTCMilliseconds 105 #define SEE_STR_setSeconds 106 #define SEE_STR_setUTCSeconds 107 #define SEE_STR_setMinutes 108 #define SEE_STR_setUTCMinutes 109 #define SEE_STR_setHours 110 #define SEE_STR_setUTCHours 111 #define SEE_STR_setDate 112 #define SEE_STR_setUTCDate 113 #define SEE_STR_setMonth 114 #define SEE_STR_setUTCMonth 115 #define SEE_STR_setFullYear 116 #define SEE_STR_setUTCFullYear 117 #define SEE_STR_toUTCString 118 #define SEE_STR_Object 119 #define SEE_STR_Function 120 #define SEE_STR_Array 121 #define SEE_STR_String 122 #define SEE_STR_Boolean 123 #define SEE_STR_Number 124 #define SEE_STR_Date 125 #define SEE_STR_RegExp 126 #define SEE_STR_Math 127 #define SEE_STR_Infinity 128 #define SEE_STR_NaN 129 #define SEE_STR_apply 130 #define SEE_STR_call 131 #define SEE_STR_charAt 132 #define SEE_STR_charCodeAt 133 #define SEE_STR_concat 134 #define SEE_STR_constructor 135 #define SEE_STR_decodeURI 136 #define SEE_STR_decodeURIComponent 137 #define SEE_STR_encodeURI 138 #define SEE_STR_encodeURIComponent 139 #define SEE_STR_eval 140 #define SEE_STR_fromCharCode 141 #define SEE_STR_hasOwnProperty 142 #define SEE_STR_indexOf 143 #define SEE_STR_isFinite 144 #define SEE_STR_isNaN 145 #define SEE_STR_isPrototypeOf 146 #define SEE_STR_join 147 #define SEE_STR_lastIndexOf 148 #define SEE_STR_length 149 #define SEE_STR_localeCompare 150 #define SEE_STR_match 151 #define SEE_STR_parseFloat 152 #define SEE_STR_parseInt 153 #define SEE_STR_pop 154 #define SEE_STR_propertyIsEnumerable 155 #define SEE_STR_prototype 156 #define SEE_STR_push 157 #define SEE_STR_replace 158 #define SEE_STR_reverse 159 #define SEE_STR_search 160 #define SEE_STR_shift 161 #define SEE_STR_slice 162 #define SEE_STR_sort 163 #define SEE_STR_splice 164 #define SEE_STR_split 165 #define SEE_STR_substring 166 #define SEE_STR_toLocaleLowerCase 167 #define SEE_STR_toLocaleString 168 #define SEE_STR_toLocaleUpperCase 169 #define SEE_STR_toLowerCase 170 #define SEE_STR_toString 171 #define SEE_STR_toUpperCase 172 #define SEE_STR_undefined 173 #define SEE_STR_unshift 174 #define SEE_STR_valueOf 175 #define SEE_STR_MAX_VALUE 176 #define SEE_STR_MIN_VALUE 177 #define SEE_STR_NEGATIVE_INFINITY 178 #define SEE_STR_POSITIVE_INFINITY 179 #define SEE_STR_toFixed 180 #define SEE_STR_toExponential 181 #define SEE_STR_toPrecision 182 #define SEE_STR_E 183 #define SEE_STR_LN10 184 #define SEE_STR_LN2 185 #define SEE_STR_LOG2E 186 #define SEE_STR_LOG10E 187 #define SEE_STR_PI 188 #define SEE_STR_SQRT1_2 189 #define SEE_STR_SQRT2 190 #define SEE_STR_abs 191 #define SEE_STR_acos 192 #define SEE_STR_asin 193 #define SEE_STR_atan 194 #define SEE_STR_atan2 195 #define SEE_STR_ceil 196 #define SEE_STR_cos 197 #define SEE_STR_exp 198 #define SEE_STR_floor 199 #define SEE_STR_log 200 #define SEE_STR_max 201 #define SEE_STR_min 202 #define SEE_STR_pow 203 #define SEE_STR_random 204 #define SEE_STR_round 205 #define SEE_STR_sin 206 #define SEE_STR_sqrt 207 #define SEE_STR_tan 208 #define SEE_STR_escape 209 #define SEE_STR_unescape 210 #define SEE_STR_substr 211 #define SEE_STR_getYear 212 #define SEE_STR_setYear 213 #define SEE_STR_toGMTString 214 #define SEE_STR_object 215 #define SEE_STR_string 216 #define SEE_STR_number 217 #define SEE_STR_unknown 218 #define SEE_STR_unexpected_eof 219 #define SEE_STR_broken_literal 220 #define SEE_STR_escaped_lit_nl 221 #define SEE_STR_invalid_esc_x 222 #define SEE_STR_invalid_esc_u 223 #define SEE_STR_hex_literal_detritus 224 #define SEE_STR_dec_literal_detritus 225 #define SEE_STR_eof_in_c_comment 226 #define SEE_STR_eof_in_regex 227 #define SEE_STR_broken_regex 228 #define SEE_STR_synchronized 229 #define SEE_STR_eleven_filler 230 #define SEE_STR_implements 231 #define SEE_STR_instanceof 232 #define SEE_STR_transient 233 #define SEE_STR_protected 234 #define SEE_STR_interface 235 #define SEE_STR_volatile 236 #define SEE_STR_debugger 237 #define SEE_STR_function 238 #define SEE_STR_continue 239 #define SEE_STR_abstract 240 #define SEE_STR_private 241 #define SEE_STR_package 242 #define SEE_STR_extends 243 #define SEE_STR_boolean 244 #define SEE_STR_finally 245 #define SEE_STR_default 246 #define SEE_STR_native 247 #define SEE_STR_export 248 #define SEE_STR_typeof 249 #define SEE_STR_switch 250 #define SEE_STR_return 251 #define SEE_STR_throws 252 #define SEE_STR_import 253 #define SEE_STR_static 254 #define SEE_STR_delete 255 #define SEE_STR_public 256 #define SEE_STR_double 257 #define SEE_STR_float 258 #define SEE_STR_super 259 #define SEE_STR_short 260 #define SEE_STR_const 261 #define SEE_STR_class 262 #define SEE_STR_while 263 #define SEE_STR_final 264 #define SEE_STR_throw 265 #define SEE_STR_catch 266 #define SEE_STR_break 267 #define SEE_STR_with 268 #define SEE_STR_long 269 #define SEE_STR_void 270 #define SEE_STR_else 271 #define SEE_STR_goto 272 #define SEE_STR_enum 273 #define SEE_STR_this 274 #define SEE_STR_byte 275 #define SEE_STR_case 276 #define SEE_STR_char 277 #define SEE_STR_new 278 #define SEE_STR_try 279 #define SEE_STR_int 280 #define SEE_STR_for 281 #define SEE_STR_var 282 #define SEE_STR_in 283 #define SEE_STR_do 284 #define SEE_STR_if 285 #define SEE_STR_null 286 #define SEE_STR_true 287 #define SEE_STR_false 288 #define SEE_STR___proto__ 289 #define SEE_STR_cfunction_body1 290 #define SEE_STR_cfunction_body2 291 #define SEE_STR_cfunction_body3 292 #define SEE_STR_1 293 #define SEE_STR_2 294 #define SEE_STR_3 295 #define SEE_STR_4 296 #define SEE_STR_5 297 #define SEE_STR_6 298 #define SEE_STR_7 299 #define SEE_STR_8 300 #define SEE_STR_9 301 #define SEE_STR_dollar_underscore 302 #define SEE_STR_dollar_star 303 #define SEE_STR_dollar_ampersand 304 #define SEE_STR_dollar_plus 305 #define SEE_STR_dollar_backquote 306 #define SEE_STR_dollar_quote 307 #define SEE_STR_dollar_1 308 #define SEE_STR_dollar_2 309 #define SEE_STR_dollar_3 310 #define SEE_STR_dollar_4 311 #define SEE_STR_dollar_5 312 #define SEE_STR_dollar_6 313 #define SEE_STR_dollar_7 314 #define SEE_STR_dollar_8 315 #define SEE_STR_dollar_9 316 #define SEE_STR_lastMatch 317 #define SEE_STR_lastParen 318 #define SEE_STR_leftContext 319 #define SEE_STR_rightContext 320 #define SEE_STR__ns_nop 321 #define SEE_STR_anchor 322 #define SEE_STR_big 323 #define SEE_STR_blink 324 #define SEE_STR_bold 325 #define SEE_STR_fixed 326 #define SEE_STR_fontcolor 327 #define SEE_STR_fontsize 328 #define SEE_STR_italics 329 #define SEE_STR_link 330 #define SEE_STR_small 331 #define SEE_STR_strike 332 #define SEE_STR_sub 333 #define SEE_STR_sup 334 �������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_stringdefs.inc��������������������������������������������������������0000664�0000000�0000000�00000075663�12660066715�0021062�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This is a generated file: do not edit */ #include "see_string.h" #define STR_SEGMENT(offset,length) \ { length, (SEE_char_t *)stringtext + offset, 0, 0, SEE_STRING_FLAG_STATIC } static const SEE_char_t stringtext[] = { /* "Wrong number of arguments passed to the function" */ 87,114,111,110,103,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,112,97,115,115,101,100,32,116,111,32,116,104,101,32,102,117,110,99,116,105,111,110, /* "Invalid arguments were given to the function" */ 73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,32,119,101,114,101,32,103,105,118,101,110,32,116,111,32,116,104,101,32,102,117,110,99,116,105,111,110, /* "Internal error occurred; please report" */ 73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,59,32,112,108,101,97,115,101,32,114,101,112,111,114,116, /* "'new' cannot be applied to a non-object" */ 39,110,101,119,39,32,99,97,110,110,111,116,32,98,101,32,97,112,112,108,105,101,100,32,116,111,32,97,32,110,111,110,45,111,98,106,101,99,116, /* "'new' cannot be applied to the object" */ 39,110,101,119,39,32,99,97,110,110,111,116,32,98,101,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,111,98,106,101,99,116, /* "Function is not defined" */ 70,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100, /* "Value is not a function" */ 86,97,108,117,101,32,105,115,32,110,111,116,32,97,32,102,117,110,99,116,105,111,110, /* "Object is not callable" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,99,97,108,108,97,98,108,101, /* "Value following 'instanceof' is not an object" */ 86,97,108,117,101,32,102,111,108,108,111,119,105,110,103,32,39,105,110,115,116,97,110,99,101,111,102,39,32,105,115,32,110,111,116,32,97,110,32,111,98,106,101,99,116, /* "Value following 'in' is not an object" */ 86,97,108,117,101,32,102,111,108,108,111,119,105,110,103,32,39,105,110,39,32,105,115,32,110,111,116,32,97,110,32,111,98,106,101,99,116, /* "Object does not support the 'instanceof' operator" */ 79,98,106,101,99,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,39,105,110,115,116,97,110,99,101,111,102,39,32,111,112,101,114,97,116,111,114, /* "Left-hand-side of the assignment cannot be assigned to" */ 76,101,102,116,45,104,97,110,100,45,115,105,100,101,32,111,102,32,116,104,101,32,97,115,115,105,103,110,109,101,110,116,32,99,97,110,110,111,116,32,98,101,32,97,115,115,105,103,110,101,100,32,116,111, /* "Regular expression contained a syntax error" */ 82,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,110,116,97,105,110,101,100,32,97,32,115,121,110,116,97,120,32,101,114,114,111,114, /* "Call limit was reached; runaway recursion?" */ 67,97,108,108,32,108,105,109,105,116,32,119,97,115,32,114,101,97,99,104,101,100,59,32,114,117,110,97,119,97,121,32,114,101,99,117,114,115,105,111,110,63, /* "String too long" */ 83,116,114,105,110,103,32,116,111,111,32,108,111,110,103, /* "error" */ 101,114,114,111,114, /* "No string space left" */ 78,111,32,115,116,114,105,110,103,32,115,112,97,99,101,32,108,101,102,116, /* "Invalid UTF-16 sequence was found in the string" */ 73,110,118,97,108,105,100,32,85,84,70,45,49,54,32,115,101,113,117,101,110,99,101,32,119,97,115,32,102,111,117,110,100,32,105,110,32,116,104,101,32,115,116,114,105,110,103, /* "<input>" */ 60,105,110,112,117,116,62, /* "<string>" */ 60,115,116,114,105,110,103,62, /* "Duplicate label '" */ 68,117,112,108,105,99,97,116,101,32,108,97,98,101,108,32,39, /* "Previous definition" */ 80,114,101,118,105,111,117,115,32,100,101,102,105,110,105,116,105,111,110, /* "Tried to use undefined as an object" */ 84,114,105,101,100,32,116,111,32,117,115,101,32,117,110,100,101,102,105,110,101,100,32,97,115,32,97,110,32,111,98,106,101,99,116, /* "Tried to use null as an object" */ 84,114,105,101,100,32,116,111,32,117,115,101,32,110,117,108,108,32,97,115,32,97,110,32,111,98,106,101,99,116, /* "Value cannot be converted into an object" */ 86,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,110,32,111,98,106,101,99,116, /* "Value cannot be converted into a boolean" */ 86,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,32,98,111,111,108,101,97,110, /* "Value cannot be converted into a number" */ 86,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,32,110,117,109,98,101,114, /* "Value cannot be converted into a string" */ 86,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,32,115,116,114,105,110,103, /* "Object cannot be converted into a string" */ 79,98,106,101,99,116,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,32,115,116,114,105,110,103, /* "Object cannot be converted into a number" */ 79,98,106,101,99,116,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,32,110,117,109,98,101,114, /* "Object cannot be converted into a default form" */ 79,98,106,101,99,116,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,97,32,100,101,102,97,117,108,116,32,102,111,114,109, /* "Object is not a native Array object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,65,114,114,97,121,32,111,98,106,101,99,116, /* "Bad length given to the Array constructor" */ 66,97,100,32,108,101,110,103,116,104,32,103,105,118,101,110,32,116,111,32,116,104,101,32,65,114,114,97,121,32,99,111,110,115,116,114,117,99,116,111,114, /* "Object is not a native Boolean object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,66,111,111,108,101,97,110,32,111,98,106,101,99,116, /* "Object is not a native Function object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,70,117,110,99,116,105,111,110,32,111,98,106,101,99,116, /* "Object is not a native Number object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,78,117,109,98,101,114,32,111,98,106,101,99,116, /* "Object is not a native RegExp object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,82,101,103,69,120,112,32,111,98,106,101,99,116, /* "Object is not a native String object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,83,116,114,105,110,103,32,111,98,106,101,99,116, /* "Object is not a native Date object" */ 79,98,106,101,99,116,32,105,115,32,110,111,116,32,97,32,110,97,116,105,118,101,32,68,97,116,101,32,111,98,106,101,99,116, /* "Second argument to apply() is not an array" */ 83,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,116,111,32,97,112,112,108,121,40,41,32,105,115,32,110,111,116,32,97,110,32,97,114,114,97,121, /* "Radix argument does not lie between 2 and 36, inclusive" */ 82,97,100,105,120,32,97,114,103,117,109,101,110,116,32,100,111,101,115,32,110,111,116,32,108,105,101,32,98,101,116,119,101,101,110,32,50,32,97,110,100,32,51,54,44,32,105,110,99,108,117,115,105,118,101, /* "Bad argument was given to RegExp constructor" */ 66,97,100,32,97,114,103,117,109,101,110,116,32,119,97,115,32,103,105,118,101,110,32,116,111,32,82,101,103,69,120,112,32,99,111,110,115,116,114,117,99,116,111,114, /* "Bad flag given to RegExp constructor" */ 66,97,100,32,102,108,97,103,32,103,105,118,101,110,32,116,111,32,82,101,103,69,120,112,32,99,111,110,115,116,114,117,99,116,111,114, /* "Bad hexadecimal escape sequence in URI" */ 66,97,100,32,104,101,120,97,100,101,99,105,109,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,105,110,32,85,82,73, /* "Invalid UTF-8 sequence in string" */ 73,110,118,97,108,105,100,32,85,84,70,45,56,32,115,101,113,117,101,110,99,101,32,105,110,32,115,116,114,105,110,103, /* "Unicode codepoint is too large for UTF-16" */ 85,110,105,99,111,100,101,32,99,111,100,101,112,111,105,110,116,32,105,115,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,85,84,70,45,49,54, /* "Sort comparison function did not return a number" */ 83,111,114,116,32,99,111,109,112,97,114,105,115,111,110,32,102,117,110,99,116,105,111,110,32,100,105,100,32,110,111,116,32,114,101,116,117,114,110,32,97,32,110,117,109,98,101,114, /* "'toLocaleString' property is not a function" */ 39,116,111,76,111,99,97,108,101,83,116,114,105,110,103,39,32,112,114,111,112,101,114,116,121,32,105,115,32,110,111,116,32,97,32,102,117,110,99,116,105,111,110, /* "toLocaleString() property did not return a string" */ 116,111,76,111,99,97,108,101,83,116,114,105,110,103,40,41,32,112,114,111,112,101,114,116,121,32,100,105,100,32,110,111,116,32,114,101,116,117,114,110,32,97,32,115,116,114,105,110,103, /* "Too many arguments" */ 84,111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115, /* "String contains non-ASCII character(s)" */ 83,116,114,105,110,103,32,99,111,110,116,97,105,110,115,32,110,111,110,45,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,40,115,41, /* "String contains null character(s)" */ 83,116,114,105,110,103,32,99,111,110,116,97,105,110,115,32,110,117,108,108,32,99,104,97,114,97,99,116,101,114,40,115,41, /* "ECMA-262 'implementation dependent' result" */ 69,67,77,65,45,50,54,50,32,39,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,100,101,112,101,110,100,101,110,116,39,32,114,101,115,117,108,116, /* "" */ /* "0" */ 48, /* "," */ 44, /* "write" */ 119,114,105,116,101, /* "writeval" */ 119,114,105,116,101,118,97,108, /* "-" */ 45, /* "name" */ 110,97,109,101, /* "message" */ 109,101,115,115,97,103,101, /* "Error" */ 69,114,114,111,114, /* "EvalError" */ 69,118,97,108,69,114,114,111,114, /* "RangeError" */ 82,97,110,103,101,69,114,114,111,114, /* "ReferenceError" */ 82,101,102,101,114,101,110,99,101,69,114,114,111,114, /* "SyntaxError" */ 83,121,110,116,97,120,69,114,114,111,114, /* "TypeError" */ 84,121,112,101,69,114,114,111,114, /* "URIError" */ 85,82,73,69,114,114,111,114, /* "arguments" */ 97,114,103,117,109,101,110,116,115, /* "callee" */ 99,97,108,108,101,101, /* "source" */ 115,111,117,114,99,101, /* "global" */ 103,108,111,98,97,108, /* "ignoreCase" */ 105,103,110,111,114,101,67,97,115,101, /* "multiline" */ 109,117,108,116,105,108,105,110,101, /* "lastIndex" */ 108,97,115,116,73,110,100,101,120, /* "exec" */ 101,120,101,99, /* "test" */ 116,101,115,116, /* "index" */ 105,110,100,101,120, /* "input" */ 105,110,112,117,116, /* "parse" */ 112,97,114,115,101, /* "UTC" */ 85,84,67, /* "toDateString" */ 116,111,68,97,116,101,83,116,114,105,110,103, /* "toTimeString" */ 116,111,84,105,109,101,83,116,114,105,110,103, /* "toLocaleDateString" */ 116,111,76,111,99,97,108,101,68,97,116,101,83,116,114,105,110,103, /* "toLocaleTimeString" */ 116,111,76,111,99,97,108,101,84,105,109,101,83,116,114,105,110,103, /* "getTime" */ 103,101,116,84,105,109,101, /* "getFullYear" */ 103,101,116,70,117,108,108,89,101,97,114, /* "getUTCFullYear" */ 103,101,116,85,84,67,70,117,108,108,89,101,97,114, /* "getMonth" */ 103,101,116,77,111,110,116,104, /* "getUTCMonth" */ 103,101,116,85,84,67,77,111,110,116,104, /* "getDate" */ 103,101,116,68,97,116,101, /* "getUTCDate" */ 103,101,116,85,84,67,68,97,116,101, /* "getDay" */ 103,101,116,68,97,121, /* "getUTCDay" */ 103,101,116,85,84,67,68,97,121, /* "getHours" */ 103,101,116,72,111,117,114,115, /* "getUTCHours" */ 103,101,116,85,84,67,72,111,117,114,115, /* "getMinutes" */ 103,101,116,77,105,110,117,116,101,115, /* "getUTCMinutes" */ 103,101,116,85,84,67,77,105,110,117,116,101,115, /* "getSeconds" */ 103,101,116,83,101,99,111,110,100,115, /* "getUTCSeconds" */ 103,101,116,85,84,67,83,101,99,111,110,100,115, /* "getMilliseconds" */ 103,101,116,77,105,108,108,105,115,101,99,111,110,100,115, /* "getUTCMilliseconds" */ 103,101,116,85,84,67,77,105,108,108,105,115,101,99,111,110,100,115, /* "getTimezoneOffset" */ 103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116, /* "setTime" */ 115,101,116,84,105,109,101, /* "setMilliseconds" */ 115,101,116,77,105,108,108,105,115,101,99,111,110,100,115, /* "setUTCMilliseconds" */ 115,101,116,85,84,67,77,105,108,108,105,115,101,99,111,110,100,115, /* "setSeconds" */ 115,101,116,83,101,99,111,110,100,115, /* "setUTCSeconds" */ 115,101,116,85,84,67,83,101,99,111,110,100,115, /* "setMinutes" */ 115,101,116,77,105,110,117,116,101,115, /* "setUTCMinutes" */ 115,101,116,85,84,67,77,105,110,117,116,101,115, /* "setHours" */ 115,101,116,72,111,117,114,115, /* "setUTCHours" */ 115,101,116,85,84,67,72,111,117,114,115, /* "setDate" */ 115,101,116,68,97,116,101, /* "setUTCDate" */ 115,101,116,85,84,67,68,97,116,101, /* "setMonth" */ 115,101,116,77,111,110,116,104, /* "setUTCMonth" */ 115,101,116,85,84,67,77,111,110,116,104, /* "setFullYear" */ 115,101,116,70,117,108,108,89,101,97,114, /* "setUTCFullYear" */ 115,101,116,85,84,67,70,117,108,108,89,101,97,114, /* "toUTCString" */ 116,111,85,84,67,83,116,114,105,110,103, /* "Object" */ 79,98,106,101,99,116, /* "Function" */ 70,117,110,99,116,105,111,110, /* "Array" */ 65,114,114,97,121, /* "String" */ 83,116,114,105,110,103, /* "Boolean" */ 66,111,111,108,101,97,110, /* "Number" */ 78,117,109,98,101,114, /* "Date" */ 68,97,116,101, /* "RegExp" */ 82,101,103,69,120,112, /* "Math" */ 77,97,116,104, /* "Infinity" */ 73,110,102,105,110,105,116,121, /* "NaN" */ 78,97,78, /* "apply" */ 97,112,112,108,121, /* "call" */ 99,97,108,108, /* "charAt" */ 99,104,97,114,65,116, /* "charCodeAt" */ 99,104,97,114,67,111,100,101,65,116, /* "concat" */ 99,111,110,99,97,116, /* "constructor" */ 99,111,110,115,116,114,117,99,116,111,114, /* "decodeURI" */ 100,101,99,111,100,101,85,82,73, /* "decodeURIComponent" */ 100,101,99,111,100,101,85,82,73,67,111,109,112,111,110,101,110,116, /* "encodeURI" */ 101,110,99,111,100,101,85,82,73, /* "encodeURIComponent" */ 101,110,99,111,100,101,85,82,73,67,111,109,112,111,110,101,110,116, /* "eval" */ 101,118,97,108, /* "fromCharCode" */ 102,114,111,109,67,104,97,114,67,111,100,101, /* "hasOwnProperty" */ 104,97,115,79,119,110,80,114,111,112,101,114,116,121, /* "indexOf" */ 105,110,100,101,120,79,102, /* "isFinite" */ 105,115,70,105,110,105,116,101, /* "isNaN" */ 105,115,78,97,78, /* "isPrototypeOf" */ 105,115,80,114,111,116,111,116,121,112,101,79,102, /* "join" */ 106,111,105,110, /* "lastIndexOf" */ 108,97,115,116,73,110,100,101,120,79,102, /* "length" */ 108,101,110,103,116,104, /* "localeCompare" */ 108,111,99,97,108,101,67,111,109,112,97,114,101, /* "match" */ 109,97,116,99,104, /* "parseFloat" */ 112,97,114,115,101,70,108,111,97,116, /* "parseInt" */ 112,97,114,115,101,73,110,116, /* "pop" */ 112,111,112, /* "propertyIsEnumerable" */ 112,114,111,112,101,114,116,121,73,115,69,110,117,109,101,114,97,98,108,101, /* "prototype" */ 112,114,111,116,111,116,121,112,101, /* "push" */ 112,117,115,104, /* "replace" */ 114,101,112,108,97,99,101, /* "reverse" */ 114,101,118,101,114,115,101, /* "search" */ 115,101,97,114,99,104, /* "shift" */ 115,104,105,102,116, /* "slice" */ 115,108,105,99,101, /* "sort" */ 115,111,114,116, /* "splice" */ 115,112,108,105,99,101, /* "split" */ 115,112,108,105,116, /* "substring" */ 115,117,98,115,116,114,105,110,103, /* "toLocaleLowerCase" */ 116,111,76,111,99,97,108,101,76,111,119,101,114,67,97,115,101, /* "toLocaleString" */ 116,111,76,111,99,97,108,101,83,116,114,105,110,103, /* "toLocaleUpperCase" */ 116,111,76,111,99,97,108,101,85,112,112,101,114,67,97,115,101, /* "toLowerCase" */ 116,111,76,111,119,101,114,67,97,115,101, /* "toString" */ 116,111,83,116,114,105,110,103, /* "toUpperCase" */ 116,111,85,112,112,101,114,67,97,115,101, /* "undefined" */ 117,110,100,101,102,105,110,101,100, /* "unshift" */ 117,110,115,104,105,102,116, /* "valueOf" */ 118,97,108,117,101,79,102, /* "MAX_VALUE" */ 77,65,88,95,86,65,76,85,69, /* "MIN_VALUE" */ 77,73,78,95,86,65,76,85,69, /* "NEGATIVE_INFINITY" */ 78,69,71,65,84,73,86,69,95,73,78,70,73,78,73,84,89, /* "POSITIVE_INFINITY" */ 80,79,83,73,84,73,86,69,95,73,78,70,73,78,73,84,89, /* "toFixed" */ 116,111,70,105,120,101,100, /* "toExponential" */ 116,111,69,120,112,111,110,101,110,116,105,97,108, /* "toPrecision" */ 116,111,80,114,101,99,105,115,105,111,110, /* "E" */ 69, /* "LN10" */ 76,78,49,48, /* "LN2" */ 76,78,50, /* "LOG2E" */ 76,79,71,50,69, /* "LOG10E" */ 76,79,71,49,48,69, /* "PI" */ 80,73, /* "SQRT1_2" */ 83,81,82,84,49,95,50, /* "SQRT2" */ 83,81,82,84,50, /* "abs" */ 97,98,115, /* "acos" */ 97,99,111,115, /* "asin" */ 97,115,105,110, /* "atan" */ 97,116,97,110, /* "atan2" */ 97,116,97,110,50, /* "ceil" */ 99,101,105,108, /* "cos" */ 99,111,115, /* "exp" */ 101,120,112, /* "floor" */ 102,108,111,111,114, /* "log" */ 108,111,103, /* "max" */ 109,97,120, /* "min" */ 109,105,110, /* "pow" */ 112,111,119, /* "random" */ 114,97,110,100,111,109, /* "round" */ 114,111,117,110,100, /* "sin" */ 115,105,110, /* "sqrt" */ 115,113,114,116, /* "tan" */ 116,97,110, /* "escape" */ 101,115,99,97,112,101, /* "unescape" */ 117,110,101,115,99,97,112,101, /* "substr" */ 115,117,98,115,116,114, /* "getYear" */ 103,101,116,89,101,97,114, /* "setYear" */ 115,101,116,89,101,97,114, /* "toGMTString" */ 116,111,71,77,84,83,116,114,105,110,103, /* "object" */ 111,98,106,101,99,116, /* "string" */ 115,116,114,105,110,103, /* "number" */ 110,117,109,98,101,114, /* "unknown" */ 117,110,107,110,111,119,110, /* "Token truncated at end of file" */ 84,111,107,101,110,32,116,114,117,110,99,97,116,101,100,32,97,116,32,101,110,100,32,111,102,32,102,105,108,101, /* "String literal not closed at end of line" */ 83,116,114,105,110,103,32,108,105,116,101,114,97,108,32,110,111,116,32,99,108,111,115,101,100,32,97,116,32,101,110,100,32,111,102,32,108,105,110,101, /* "Backslash immediately followed by end of line" */ 66,97,99,107,115,108,97,115,104,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,101,110,100,32,111,102,32,108,105,110,101, /* "Invalid \\x escape" */ 73,110,118,97,108,105,100,32,92,120,32,101,115,99,97,112,101, /* "Invalid \\u escape" */ 73,110,118,97,108,105,100,32,92,117,32,101,115,99,97,112,101, /* "Unexpected characters after hexadecimal literal" */ 85,110,101,120,112,101,99,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,97,102,116,101,114,32,104,101,120,97,100,101,99,105,109,97,108,32,108,105,116,101,114,97,108, /* "Unexpected characters after decimal literal" */ 85,110,101,120,112,101,99,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,97,102,116,101,114,32,100,101,99,105,109,97,108,32,108,105,116,101,114,97,108, /* "Comment is missing its closing '*\/'" */ 67,111,109,109,101,110,116,32,105,115,32,109,105,115,115,105,110,103,32,105,116,115,32,99,108,111,115,105,110,103,32,39,42,47,39, /* "Regular expression missing final '/'" */ 82,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,105,115,115,105,110,103,32,102,105,110,97,108,32,39,47,39, /* "Regular expression missing final '/'" */ 82,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,105,115,115,105,110,103,32,102,105,110,97,108,32,39,47,39, /* "synchronized" */ 115,121,110,99,104,114,111,110,105,122,101,100, /* "..........." */ 46,46,46,46,46,46,46,46,46,46,46, /* "implements" */ 105,109,112,108,101,109,101,110,116,115, /* "instanceof" */ 105,110,115,116,97,110,99,101,111,102, /* "transient" */ 116,114,97,110,115,105,101,110,116, /* "protected" */ 112,114,111,116,101,99,116,101,100, /* "interface" */ 105,110,116,101,114,102,97,99,101, /* "volatile" */ 118,111,108,97,116,105,108,101, /* "debugger" */ 100,101,98,117,103,103,101,114, /* "function" */ 102,117,110,99,116,105,111,110, /* "continue" */ 99,111,110,116,105,110,117,101, /* "abstract" */ 97,98,115,116,114,97,99,116, /* "private" */ 112,114,105,118,97,116,101, /* "package" */ 112,97,99,107,97,103,101, /* "extends" */ 101,120,116,101,110,100,115, /* "boolean" */ 98,111,111,108,101,97,110, /* "finally" */ 102,105,110,97,108,108,121, /* "default" */ 100,101,102,97,117,108,116, /* "native" */ 110,97,116,105,118,101, /* "export" */ 101,120,112,111,114,116, /* "typeof" */ 116,121,112,101,111,102, /* "switch" */ 115,119,105,116,99,104, /* "return" */ 114,101,116,117,114,110, /* "throws" */ 116,104,114,111,119,115, /* "import" */ 105,109,112,111,114,116, /* "static" */ 115,116,97,116,105,99, /* "delete" */ 100,101,108,101,116,101, /* "public" */ 112,117,98,108,105,99, /* "double" */ 100,111,117,98,108,101, /* "float" */ 102,108,111,97,116, /* "super" */ 115,117,112,101,114, /* "short" */ 115,104,111,114,116, /* "const" */ 99,111,110,115,116, /* "class" */ 99,108,97,115,115, /* "while" */ 119,104,105,108,101, /* "final" */ 102,105,110,97,108, /* "throw" */ 116,104,114,111,119, /* "catch" */ 99,97,116,99,104, /* "break" */ 98,114,101,97,107, /* "with" */ 119,105,116,104, /* "long" */ 108,111,110,103, /* "void" */ 118,111,105,100, /* "else" */ 101,108,115,101, /* "goto" */ 103,111,116,111, /* "enum" */ 101,110,117,109, /* "this" */ 116,104,105,115, /* "byte" */ 98,121,116,101, /* "case" */ 99,97,115,101, /* "char" */ 99,104,97,114, /* "new" */ 110,101,119, /* "try" */ 116,114,121, /* "int" */ 105,110,116, /* "for" */ 102,111,114, /* "var" */ 118,97,114, /* "in" */ 105,110, /* "do" */ 100,111, /* "if" */ 105,102, /* "null" */ 110,117,108,108, /* "true" */ 116,114,117,101, /* "false" */ 102,97,108,115,101, /* "__proto__" */ 95,95,112,114,111,116,111,95,95, /* "function " */ 102,117,110,99,116,105,111,110,32, /* "() { /\* built-in " */ 40,41,32,123,32,47,42,32,98,117,105,108,116,45,105,110,32, /* " *\/ }" */ 32,42,47,32,125, /* "1" */ 49, /* "2" */ 50, /* "3" */ 51, /* "4" */ 52, /* "5" */ 53, /* "6" */ 54, /* "7" */ 55, /* "8" */ 56, /* "9" */ 57, /* "$_" */ 36,95, /* "$*" */ 36,42, /* "$&" */ 36,38, /* "$+" */ 36,43, /* "$`" */ 36,96, /* "$'" */ 36,39, /* "$1" */ 36,49, /* "$2" */ 36,50, /* "$3" */ 36,51, /* "$4" */ 36,52, /* "$5" */ 36,53, /* "$6" */ 36,54, /* "$7" */ 36,55, /* "$8" */ 36,56, /* "$9" */ 36,57, /* "lastMatch" */ 108,97,115,116,77,97,116,99,104, /* "lastParen" */ 108,97,115,116,80,97,114,101,110, /* "leftContext" */ 108,101,102,116,67,111,110,116,101,120,116, /* "rightContext" */ 114,105,103,104,116,67,111,110,116,101,120,116, /* "_ns_nop" */ 95,110,115,95,110,111,112, /* "anchor" */ 97,110,99,104,111,114, /* "big" */ 98,105,103, /* "blink" */ 98,108,105,110,107, /* "bold" */ 98,111,108,100, /* "fixed" */ 102,105,120,101,100, /* "fontcolor" */ 102,111,110,116,99,111,108,111,114, /* "fontsize" */ 102,111,110,116,115,105,122,101, /* "italics" */ 105,116,97,108,105,99,115, /* "link" */ 108,105,110,107, /* "small" */ 115,109,97,108,108, /* "strike" */ 115,116,114,105,107,101, /* "sub" */ 115,117,98, /* "sup" */ 115,117,112}; struct SEE_string SEE_stringtab[] = { STR_SEGMENT(0, 48), STR_SEGMENT(48, 44), STR_SEGMENT(92, 38), STR_SEGMENT(130, 39), STR_SEGMENT(169, 37), STR_SEGMENT(206, 23), STR_SEGMENT(229, 23), STR_SEGMENT(252, 22), STR_SEGMENT(274, 45), STR_SEGMENT(319, 37), STR_SEGMENT(356, 49), STR_SEGMENT(405, 54), STR_SEGMENT(459, 43), STR_SEGMENT(502, 42), STR_SEGMENT(544, 15), STR_SEGMENT(559, 5), STR_SEGMENT(564, 20), STR_SEGMENT(584, 47), STR_SEGMENT(631, 7), STR_SEGMENT(638, 8), STR_SEGMENT(646, 17), STR_SEGMENT(663, 19), STR_SEGMENT(682, 35), STR_SEGMENT(717, 30), STR_SEGMENT(747, 40), STR_SEGMENT(787, 40), STR_SEGMENT(827, 39), STR_SEGMENT(866, 39), STR_SEGMENT(905, 40), STR_SEGMENT(945, 40), STR_SEGMENT(985, 46), STR_SEGMENT(1031, 35), STR_SEGMENT(1066, 41), STR_SEGMENT(1107, 37), STR_SEGMENT(1144, 38), STR_SEGMENT(1182, 36), STR_SEGMENT(1218, 36), STR_SEGMENT(1254, 36), STR_SEGMENT(1290, 34), STR_SEGMENT(1324, 42), STR_SEGMENT(1366, 55), STR_SEGMENT(1421, 44), STR_SEGMENT(1465, 36), STR_SEGMENT(1501, 38), STR_SEGMENT(1539, 32), STR_SEGMENT(1571, 41), STR_SEGMENT(1612, 48), STR_SEGMENT(1660, 43), STR_SEGMENT(1703, 49), STR_SEGMENT(1752, 18), STR_SEGMENT(1770, 38), STR_SEGMENT(1808, 33), STR_SEGMENT(1841, 42), STR_SEGMENT(1883, 0), STR_SEGMENT(1883, 1), STR_SEGMENT(1884, 1), STR_SEGMENT(1885, 5), STR_SEGMENT(1890, 8), STR_SEGMENT(1898, 1), STR_SEGMENT(1899, 4), STR_SEGMENT(1903, 7), STR_SEGMENT(1910, 5), STR_SEGMENT(1915, 9), STR_SEGMENT(1924, 10), STR_SEGMENT(1934, 14), STR_SEGMENT(1948, 11), STR_SEGMENT(1959, 9), STR_SEGMENT(1968, 8), STR_SEGMENT(1976, 9), STR_SEGMENT(1985, 6), STR_SEGMENT(1991, 6), STR_SEGMENT(1997, 6), STR_SEGMENT(2003, 10), STR_SEGMENT(2013, 9), STR_SEGMENT(2022, 9), STR_SEGMENT(2031, 4), STR_SEGMENT(2035, 4), STR_SEGMENT(2039, 5), STR_SEGMENT(2044, 5), STR_SEGMENT(2049, 5), STR_SEGMENT(2054, 3), STR_SEGMENT(2057, 12), STR_SEGMENT(2069, 12), STR_SEGMENT(2081, 18), STR_SEGMENT(2099, 18), STR_SEGMENT(2117, 7), STR_SEGMENT(2124, 11), STR_SEGMENT(2135, 14), STR_SEGMENT(2149, 8), STR_SEGMENT(2157, 11), STR_SEGMENT(2168, 7), STR_SEGMENT(2175, 10), STR_SEGMENT(2185, 6), STR_SEGMENT(2191, 9), STR_SEGMENT(2200, 8), STR_SEGMENT(2208, 11), STR_SEGMENT(2219, 10), STR_SEGMENT(2229, 13), STR_SEGMENT(2242, 10), STR_SEGMENT(2252, 13), STR_SEGMENT(2265, 15), STR_SEGMENT(2280, 18), STR_SEGMENT(2298, 17), STR_SEGMENT(2315, 7), STR_SEGMENT(2322, 15), STR_SEGMENT(2337, 18), STR_SEGMENT(2355, 10), STR_SEGMENT(2365, 13), STR_SEGMENT(2378, 10), STR_SEGMENT(2388, 13), STR_SEGMENT(2401, 8), STR_SEGMENT(2409, 11), STR_SEGMENT(2420, 7), STR_SEGMENT(2427, 10), STR_SEGMENT(2437, 8), STR_SEGMENT(2445, 11), STR_SEGMENT(2456, 11), STR_SEGMENT(2467, 14), STR_SEGMENT(2481, 11), STR_SEGMENT(2492, 6), STR_SEGMENT(2498, 8), STR_SEGMENT(2506, 5), STR_SEGMENT(2511, 6), STR_SEGMENT(2517, 7), STR_SEGMENT(2524, 6), STR_SEGMENT(2530, 4), STR_SEGMENT(2534, 6), STR_SEGMENT(2540, 4), STR_SEGMENT(2544, 8), STR_SEGMENT(2552, 3), STR_SEGMENT(2555, 5), STR_SEGMENT(2560, 4), STR_SEGMENT(2564, 6), STR_SEGMENT(2570, 10), STR_SEGMENT(2580, 6), STR_SEGMENT(2586, 11), STR_SEGMENT(2597, 9), STR_SEGMENT(2606, 18), STR_SEGMENT(2624, 9), STR_SEGMENT(2633, 18), STR_SEGMENT(2651, 4), STR_SEGMENT(2655, 12), STR_SEGMENT(2667, 14), STR_SEGMENT(2681, 7), STR_SEGMENT(2688, 8), STR_SEGMENT(2696, 5), STR_SEGMENT(2701, 13), STR_SEGMENT(2714, 4), STR_SEGMENT(2718, 11), STR_SEGMENT(2729, 6), STR_SEGMENT(2735, 13), STR_SEGMENT(2748, 5), STR_SEGMENT(2753, 10), STR_SEGMENT(2763, 8), STR_SEGMENT(2771, 3), STR_SEGMENT(2774, 20), STR_SEGMENT(2794, 9), STR_SEGMENT(2803, 4), STR_SEGMENT(2807, 7), STR_SEGMENT(2814, 7), STR_SEGMENT(2821, 6), STR_SEGMENT(2827, 5), STR_SEGMENT(2832, 5), STR_SEGMENT(2837, 4), STR_SEGMENT(2841, 6), STR_SEGMENT(2847, 5), STR_SEGMENT(2852, 9), STR_SEGMENT(2861, 17), STR_SEGMENT(2878, 14), STR_SEGMENT(2892, 17), STR_SEGMENT(2909, 11), STR_SEGMENT(2920, 8), STR_SEGMENT(2928, 11), STR_SEGMENT(2939, 9), STR_SEGMENT(2948, 7), STR_SEGMENT(2955, 7), STR_SEGMENT(2962, 9), STR_SEGMENT(2971, 9), STR_SEGMENT(2980, 17), STR_SEGMENT(2997, 17), STR_SEGMENT(3014, 7), STR_SEGMENT(3021, 13), STR_SEGMENT(3034, 11), STR_SEGMENT(3045, 1), STR_SEGMENT(3046, 4), STR_SEGMENT(3050, 3), STR_SEGMENT(3053, 5), STR_SEGMENT(3058, 6), STR_SEGMENT(3064, 2), STR_SEGMENT(3066, 7), STR_SEGMENT(3073, 5), STR_SEGMENT(3078, 3), STR_SEGMENT(3081, 4), STR_SEGMENT(3085, 4), STR_SEGMENT(3089, 4), STR_SEGMENT(3093, 5), STR_SEGMENT(3098, 4), STR_SEGMENT(3102, 3), STR_SEGMENT(3105, 3), STR_SEGMENT(3108, 5), STR_SEGMENT(3113, 3), STR_SEGMENT(3116, 3), STR_SEGMENT(3119, 3), STR_SEGMENT(3122, 3), STR_SEGMENT(3125, 6), STR_SEGMENT(3131, 5), STR_SEGMENT(3136, 3), STR_SEGMENT(3139, 4), STR_SEGMENT(3143, 3), STR_SEGMENT(3146, 6), STR_SEGMENT(3152, 8), STR_SEGMENT(3160, 6), STR_SEGMENT(3166, 7), STR_SEGMENT(3173, 7), STR_SEGMENT(3180, 11), STR_SEGMENT(3191, 6), STR_SEGMENT(3197, 6), STR_SEGMENT(3203, 6), STR_SEGMENT(3209, 7), STR_SEGMENT(3216, 30), STR_SEGMENT(3246, 40), STR_SEGMENT(3286, 45), STR_SEGMENT(3331, 17), STR_SEGMENT(3348, 17), STR_SEGMENT(3365, 47), STR_SEGMENT(3412, 43), STR_SEGMENT(3455, 35), STR_SEGMENT(3490, 36), STR_SEGMENT(3526, 36), STR_SEGMENT(3562, 12), STR_SEGMENT(3574, 11), STR_SEGMENT(3585, 10), STR_SEGMENT(3595, 10), STR_SEGMENT(3605, 9), STR_SEGMENT(3614, 9), STR_SEGMENT(3623, 9), STR_SEGMENT(3632, 8), STR_SEGMENT(3640, 8), STR_SEGMENT(3648, 8), STR_SEGMENT(3656, 8), STR_SEGMENT(3664, 8), STR_SEGMENT(3672, 7), STR_SEGMENT(3679, 7), STR_SEGMENT(3686, 7), STR_SEGMENT(3693, 7), STR_SEGMENT(3700, 7), STR_SEGMENT(3707, 7), STR_SEGMENT(3714, 6), STR_SEGMENT(3720, 6), STR_SEGMENT(3726, 6), STR_SEGMENT(3732, 6), STR_SEGMENT(3738, 6), STR_SEGMENT(3744, 6), STR_SEGMENT(3750, 6), STR_SEGMENT(3756, 6), STR_SEGMENT(3762, 6), STR_SEGMENT(3768, 6), STR_SEGMENT(3774, 6), STR_SEGMENT(3780, 5), STR_SEGMENT(3785, 5), STR_SEGMENT(3790, 5), STR_SEGMENT(3795, 5), STR_SEGMENT(3800, 5), STR_SEGMENT(3805, 5), STR_SEGMENT(3810, 5), STR_SEGMENT(3815, 5), STR_SEGMENT(3820, 5), STR_SEGMENT(3825, 5), STR_SEGMENT(3830, 4), STR_SEGMENT(3834, 4), STR_SEGMENT(3838, 4), STR_SEGMENT(3842, 4), STR_SEGMENT(3846, 4), STR_SEGMENT(3850, 4), STR_SEGMENT(3854, 4), STR_SEGMENT(3858, 4), STR_SEGMENT(3862, 4), STR_SEGMENT(3866, 4), STR_SEGMENT(3870, 3), STR_SEGMENT(3873, 3), STR_SEGMENT(3876, 3), STR_SEGMENT(3879, 3), STR_SEGMENT(3882, 3), STR_SEGMENT(3885, 2), STR_SEGMENT(3887, 2), STR_SEGMENT(3889, 2), STR_SEGMENT(3891, 4), STR_SEGMENT(3895, 4), STR_SEGMENT(3899, 5), STR_SEGMENT(3904, 9), STR_SEGMENT(3913, 9), STR_SEGMENT(3922, 17), STR_SEGMENT(3939, 5), STR_SEGMENT(3944, 1), STR_SEGMENT(3945, 1), STR_SEGMENT(3946, 1), STR_SEGMENT(3947, 1), STR_SEGMENT(3948, 1), STR_SEGMENT(3949, 1), STR_SEGMENT(3950, 1), STR_SEGMENT(3951, 1), STR_SEGMENT(3952, 1), STR_SEGMENT(3953, 2), STR_SEGMENT(3955, 2), STR_SEGMENT(3957, 2), STR_SEGMENT(3959, 2), STR_SEGMENT(3961, 2), STR_SEGMENT(3963, 2), STR_SEGMENT(3965, 2), STR_SEGMENT(3967, 2), STR_SEGMENT(3969, 2), STR_SEGMENT(3971, 2), STR_SEGMENT(3973, 2), STR_SEGMENT(3975, 2), STR_SEGMENT(3977, 2), STR_SEGMENT(3979, 2), STR_SEGMENT(3981, 2), STR_SEGMENT(3983, 9), STR_SEGMENT(3992, 9), STR_SEGMENT(4001, 11), STR_SEGMENT(4012, 12), STR_SEGMENT(4024, 7), STR_SEGMENT(4031, 6), STR_SEGMENT(4037, 3), STR_SEGMENT(4040, 5), STR_SEGMENT(4045, 4), STR_SEGMENT(4049, 5), STR_SEGMENT(4054, 9), STR_SEGMENT(4063, 8), STR_SEGMENT(4071, 7), STR_SEGMENT(4078, 4), STR_SEGMENT(4082, 5), STR_SEGMENT(4087, 6), STR_SEGMENT(4093, 3), STR_SEGMENT(4096, 3)}; const unsigned int SEE_nstringtab = 335; �����������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_system.h��������������������������������������������������������������0000664�0000000�0000000�00000002731�12660066715�0017676�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2005, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_system_ #define _SEE_h_system_ struct SEE_interpreter; struct SEE_throw_location; struct SEE_context; #include "see_interpreter.h" /* for enum SEE_trace_event */ #include "see_type.h" struct SEE_system { /* Interpreter field defaults */ const char *default_locale; /* default: NULL */ int default_recursion_limit; /* default: -1 (no limit) */ void (*default_trace)(struct SEE_interpreter *, struct SEE_throw_location *, struct SEE_context *, enum SEE_trace_event); /* default: NULL */ int default_compat_flags; unsigned int (*random_seed)(void); /* Fatal error handler */ void (*abort)(struct SEE_interpreter *, const char *) SEE_dead; /* Periodic execution callback */ void (*periodic)(struct SEE_interpreter *); /* Memory allocator */ void *(*malloc)(struct SEE_interpreter *, SEE_size_t); void *(*malloc_finalize)(struct SEE_interpreter *, SEE_size_t, void (*)(struct SEE_interpreter *, void *, void *), void *); void *(*malloc_string)(struct SEE_interpreter *, SEE_size_t); void (*free)(struct SEE_interpreter *, void *); void (*mem_exhausted)(struct SEE_interpreter *) SEE_dead; void (*gcollect)(struct SEE_interpreter *); /* Security domain tracking */ void *(*transit_sec_domain)(struct SEE_interpreter *, void *); }; extern struct SEE_system SEE_system; #define SEE_ABORT(interp, msg) (*SEE_system.abort)(interp, msg) #endif /* _SEE_h_interpreter_ */ ���������������������������������������silverjuke-16.2.3/src/see/see_tokens.h��������������������������������������������������������������0000664�0000000�0000000�00000001140�12660066715�0017646�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: tokens.h 671 2004-03-30 12:30:19Z d $ */ #ifndef _SEE_h_tokens_ #define _SEE_h_tokens_ #include "see_type.h" struct SEE_string; /* Token tables */ struct strtoken { struct SEE_string *str; int token; }; extern struct strtoken SEE_tok_keywords[]; extern int SEE_tok_nkeywords; struct token { SEE_char_t identifier[4]; int token; }; extern struct token *SEE_tok_operators[]; extern int SEE_tok_noperators; const char *SEE_tokenname(int token); void SEE_tokenname_buf(int token, char *buf, int bufsz); #endif /* _SEE_h_tokens_ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_try.h�����������������������������������������������������������������0000664�0000000�0000000�00000010156�12660066715�0017170�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Automatically generated. Do not edit. */ /* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: try.h.in 920 2005-12-24 10:30:35Z d $ */ #ifndef _SEE_h_try_ #define _SEE_h_try_ /* * Exception handling (try/catch) * * Usage example: * * SEE_try_context_t c; * * SEE_TRY(interp, c) { * -- do code here that may call SEE_THROW() * -- the try block breaks as soon as SEE_THROW happens * -- NEVER 'return' or 'break' from inside a SEE_TRY! * -- use TRY_BREAK or 'continue' to exit the SEE_TRY block. * } * -- 'finally' code gets run here always * if (SEE_CAUGHT(c)) { * -- this code run if a SEE_THROW was called during SEE_TRY * -- the exception thrown is SEE_CAUGHT(c) * -- do a SEE_THROW(interp, SEE_CAUGHT(c)) if you can't handle it * } * * If you only want a finally, and don't want to catch anything, use: * * SEE_TRY(interp, c) { * ... * } * -- 'finally' code goes here * SEE_DEFAULT_CATCH(interp, c); * * The signatures for the macros are: * * struct SEE_value *SEE_CAUGHT(SEE_try_context_t); * void SEE_THROW(struct SEE_interpreter *, struct SEE_value *); * void SEE_DEFAULT_CATCH(SEE_interpreter *, SEE_try_context_t); * */ #include "see_type.h" #include "see_value.h" /* * Determine which setjmp/longjmp interface to use */ #if 0/*HAVE__LONGJMP*/ # include <setjmp.h> # define _SEE_LONGJMP(buf, val) _longjmp(buf, val) # define _SEE_SETJMP(buf) _setjmp(buf) # define _SEE_JMPBUF jmp_buf #else # if 1/*HAVE_LONGJMP*/ # include <setjmp.h> # define _SEE_LONGJMP(buf, val) longjmp(buf, val) # define _SEE_SETJMP(buf) setjmp(buf) # define _SEE_JMPBUF jmp_buf # else # error "exception handling features requires longjmp/setjmp" # endif #endif /* * Exception handling macros */ #define SEE_TRY(interp, c) \ for ((c).previous = (interp)->try_context, \ (interp)->try_context = &(c), \ (c).interpreter = (interp), \ SEE_SET_NULL(&(c).thrown), \ (c).done = 0; \ !(c).done && (_SEE_SETJMP( \ ((struct SEE_try_context *)&(c))->env) \ ? ((c).interpreter->try_context = \ (c).previous, 0) \ : 1); \ (c).done = 1, \ (c).interpreter->try_context = (c).previous) #define TRY_BREAK \ continue #define SEE_CAUGHT(c) \ ((struct SEE_value *)((c).done ? 0 : &(c).thrown)) #define SEE_THROW(interp, v) SEE__THROW(interp, v, __FILE__, __LINE__) #define SEE__THROW(interp, v, _file, _line) \ do { \ if (!(interp)->try_context) \ SEE_throw_abort(interp, v, _file, \ _line); \ SEE_VALUE_COPY((struct SEE_value *) \ &(interp)->try_context->thrown, \ (struct SEE_value *)v); \ (interp)->try_context->throw_file = _file; \ (interp)->try_context->throw_line = _line; \ SEE_throw(); /* debugger hook */ \ _SEE_LONGJMP(((struct SEE_try_context *) \ (interp)->try_context)->env, 1); \ /* NOTREACHED */ \ } while (0) /* convenience macro */ #define SEE_DEFAULT_CATCH(interp, c) \ do { \ if (!(c).done) \ SEE__THROW(interp, \ (struct SEE_value *)&(c).thrown, \ (c).throw_file, (c).throw_line); \ } while (0) /*------------------------------------------------------------ * private functions and externs used by the above macros */ struct SEE_throw_location { struct SEE_string *filename; /* source location */ int lineno; }; struct SEE_try_context { struct SEE_interpreter *interpreter; volatile struct SEE_try_context *previous; /* try chain */ struct SEE_value thrown; /* value thrown during try */ int done; /* true if try completed */ _SEE_JMPBUF env; /* setjmp storage */ const char *throw_file; /* (debugging) */ int throw_line; /* (debugging) */ }; typedef struct SEE_try_context volatile SEE_try_context_t; struct SEE_interpreter; void SEE_throw_abort(struct SEE_interpreter *, const struct SEE_value *, const char *, int) SEE_dead; struct SEE_string *SEE_location_string(struct SEE_interpreter *i, struct SEE_throw_location *loc); /* Debugger hook for exceptions */ #ifndef NDEBUG void SEE_throw(void); #else # define SEE_throw() /* nothing */ #endif #endif /* _SEE_h_try_ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_type.h����������������������������������������������������������������0000664�0000000�0000000�00000011664�12660066715�0017340�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Automatically generated. Do not edit. */ /* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: type.h.in 993 2006-01-31 15:07:25Z d $ */ #ifndef _SEE_h_type_ #define _SEE_h_type_ /* * Machine-dependent types and definitions */ #include <see/see_type_sjconfig.h> #if 0/*!size_t*/ typedef SEE_size_t unsigned; #else # include <sys/types.h> # define SEE_size_t size_t #endif #if 1/*HAVE_FLOAT_H*/ # include <float.h> #endif #if 0/*HAVE_INTTYPES_H*/ # include <inttypes.h> typedef uint16_t SEE_uint16_t; typedef uint32_t SEE_uint32_t; typedef int32_t SEE_int32_t; typedef uint64_t SEE_uint64_t; typedef int64_t SEE_int64_t; #else /* !HAVE_INTTYPES_H */ # if 0/*!HAVE_STDINT_H*/ # include <stdint.h> typedef uint16_t SEE_uint16_t; typedef uint32_t SEE_uint32_t; typedef int32_t SEE_int32_t; # else /* !HAVE_STDINT_H */ /* 16-bit unsigned integer */ # if 2/*SIZEOF_UNSIGNED_SHORT*/ == 2 typedef unsigned short SEE_uint16_t; # else # if 4/*SIZEOF_UNSIGNED_INT*/ == 2 typedef unsigned int SEE_uint16_t; # else # error "cannot provide type for SEE_uint16_t" # endif # endif /* 32-bit signed integer */ # if 2/*SIZEOF_SIGNED_SHORT*/ == 4 typedef signed short SEE_int32_t; # else # if 4/*SIZEOF_SIGNED_INT*/ == 4 typedef signed int SEE_int32_t; # else # if 4/*SIZEOF_SIGNED_LONG*/ == 4 typedef signed long SEE_int32_t; # else # error "cannot provide type for SEE_int32_t" # endif # endif # endif /* 32-bit unsigned integer */ # if 2/*SIZEOF_UNSIGNED_SHORT*/ == 4 typedef unsigned short SEE_uint32_t; # else # if 4/*SIZEOF_UNSIGNED_INT*/ == 4 typedef unsigned int SEE_uint32_t; # else # if 4/*SIZEOF_UNSIGNED_LONG*/ == 4 typedef unsigned long SEE_uint32_t; # else # error "cannot provide type for SEE_uint32_t" # endif # endif # endif # endif /* !HAVE_STDINT_H */ /* 64-bit signed integer */ # if 4/*SIZEOF_SIGNED_INT*/ == 8 typedef signed int SEE_int64_t; # else # if 4/*SIZEOF_SIGNED_LONG*/ == 8 typedef signed long SEE_int64_t; # else # if 0/*SIZEOF_SIGNED_LONGLONG*/ == 8 typedef signed LONGLONG SEE_int64_t; # else # if 8/*SIZEOF_SIGNED_LONG_LONG*/ == 8 #ifdef WIN32 typedef signed __int64 SEE_int64_t; #else typedef signed long long SEE_int64_t; #endif # else # error "cannot provide type for SEE_int64_t" # endif # endif # endif # endif /* 64-bit unsigned integer */ # if 4/*SIZEOF_UNSIGNED_INT*/ == 8 typedef unsigned int SEE_uint64_t; # else # if 4/*SIZEOF_UNSIGNED_LONG*/ == 8 typedef unsigned long SEE_uint64_t; # else # if 0/*SIZEOF_UNSIGNED_LONGLONG*/ == 8 typedef unsigned LONGLONG SEE_uint64_t; # else # if 8/*SIZEOF_UNSIGNED_LONG_LONG*/ == 8 #ifdef WIN32 typedef unsigned __int64 SEE_uint64_t; #else typedef unsigned long long SEE_uint64_t; #endif # else # error "cannot provide type for SEE_uint64_t" # endif # endif # endif # endif #endif /* !HAVE_INTTYPES_H */ /* 64-bit floating point */ #if 4/*SIZEOF_FLOAT*/ == 8 # define SEE_NUMBER_IS_FLOAT 1 typedef float SEE_number_t; #else # if 8/*SIZEOF_DOUBLE*/ == 8 # define SEE_NUMBER_IS_DOUBLE 1 typedef double SEE_number_t; # else # error "cannot provide 64-bit IEEE-754 type for SEE_number_t" # endif #endif typedef unsigned char SEE_boolean_t; /* non-zero means true */ /* derived types */ typedef SEE_uint16_t SEE_char_t; /* UTF-16 encoding */ typedef SEE_uint32_t SEE_unicode_t; /* UCS-4 encoding */ /* attributes that assist the compiler */ #if __GNUC__ # define SEE_dead __attribute__((__noreturn__)) # define _SEE_malloc __attribute__((__malloc__)) #else # define SEE_dead /* nothing */ # define _SEE_malloc /* nothing */ #endif /* IEEE-754 constants defined in value.o */ extern const unsigned char SEE_literal_NaN[8], SEE_literal_Inf[8], SEE_literal_Max[8], SEE_literal_Min[8]; #if 0 //1/*HAVE_CONSTANT_HEX_FLOAT*/ && 1/*HAVE_CONSTANT_NAN_DIV*/ && 1/*HAVE_CONSTANT_INF_DIV*/ # define SEE_NaN ((SEE_number_t) (0.0 / 0.0)) # define SEE_Infinity ((SEE_number_t) (1.0 / 0.0)) # define SEE_MinNumber ((SEE_number_t) 0x1p-1074) # define SEE_MaxNumber ((SEE_number_t) 0x1fffffffffffffp971) #else # define SEE_NaN (*(SEE_number_t *)&SEE_literal_NaN) # define SEE_Infinity (*(SEE_number_t *)&SEE_literal_Inf) # define SEE_MinNumber (*(SEE_number_t *)&SEE_literal_Min) # define SEE_MaxNumber (*(SEE_number_t *)&SEE_literal_Max) #endif /* On-stack allocation */ #define SEE_ALLOCA(i,t,n) (t *)((n) ? alloca((n) * sizeof (t)) : 0) #define SEE_STRING_ALLOCA(i,t,n) SEE_ALLOCA(i,t,n) #if 1/*STDC_HEADERS*/ # include <stdlib.h> #endif #if 0 #ifndef __GNUC__ # if *@HAVE_ALLOCA_H@ # include <alloca.h> # else # ifdef _AIX # pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ # ifndef 1/*HAVE_ALLOCA*/ # undef SEE_ALLOCA # define SEE_ALLOCA(i,t,n) SEE_NEW_ARRAY(i,t,n) # undef SEE_STRING_ALLOCA # define SEE_STRING_ALLOCA(i,t,n) SEE_NEW_STRING_ARRAY(i,t,n) # endif # endif # endif # endif #endif #endif #endif /* _SEE_h_type_ */ ����������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_type_sjconfig.h�������������������������������������������������������0000664�0000000�0000000�00000000631�12660066715�0021212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #ifndef SEE_TYPE_SJCONFIG_H #define SEE_TYPE_SJCONFIG_H #include <stdlib.h> #include <time.h> #include <memory.h> #include <string.h> #define WITH_UNICODE_TABLES 1 #define HAVE_MEMCMP 1 #define HAVE_TIME 1 #define HAVE_LOCALTIME 1 #define HAVE_MKTIME 1 #define SEE_SJ_PACKAGE_VERSION "2.0" #define MAXMODULES 1 // save some memory, we do not used modules #endif /* SEE_TYPE_SJCONFIG_H */ �������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_unicase.inc�����������������������������������������������������������0000664�0000000�0000000�00000111547�12660066715�0020331�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2006 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* This file is generated. Do not edit. */ static struct case_map lowercase_map[] = { { 0x0041, 0x0061 }, { 0x0042, 0x0062 }, { 0x0043, 0x0063 }, { 0x0044, 0x0064 }, { 0x0045, 0x0065 }, { 0x0046, 0x0066 }, { 0x0047, 0x0067 }, { 0x0048, 0x0068 }, { 0x0049, 0x0069 }, { 0x004a, 0x006a }, { 0x004b, 0x006b }, { 0x004c, 0x006c }, { 0x004d, 0x006d }, { 0x004e, 0x006e }, { 0x004f, 0x006f }, { 0x0050, 0x0070 }, { 0x0051, 0x0071 }, { 0x0052, 0x0072 }, { 0x0053, 0x0073 }, { 0x0054, 0x0074 }, { 0x0055, 0x0075 }, { 0x0056, 0x0076 }, { 0x0057, 0x0077 }, { 0x0058, 0x0078 }, { 0x0059, 0x0079 }, { 0x005a, 0x007a }, { 0x00c0, 0x00e0 }, { 0x00c1, 0x00e1 }, { 0x00c2, 0x00e2 }, { 0x00c3, 0x00e3 }, { 0x00c4, 0x00e4 }, { 0x00c5, 0x00e5 }, { 0x00c6, 0x00e6 }, { 0x00c7, 0x00e7 }, { 0x00c8, 0x00e8 }, { 0x00c9, 0x00e9 }, { 0x00ca, 0x00ea }, { 0x00cb, 0x00eb }, { 0x00cc, 0x00ec }, { 0x00cd, 0x00ed }, { 0x00ce, 0x00ee }, { 0x00cf, 0x00ef }, { 0x00d0, 0x00f0 }, { 0x00d1, 0x00f1 }, { 0x00d2, 0x00f2 }, { 0x00d3, 0x00f3 }, { 0x00d4, 0x00f4 }, { 0x00d5, 0x00f5 }, { 0x00d6, 0x00f6 }, { 0x00d8, 0x00f8 }, { 0x00d9, 0x00f9 }, { 0x00da, 0x00fa }, { 0x00db, 0x00fb }, { 0x00dc, 0x00fc }, { 0x00dd, 0x00fd }, { 0x00de, 0x00fe }, { 0x0100, 0x0101 }, { 0x0102, 0x0103 }, { 0x0104, 0x0105 }, { 0x0106, 0x0107 }, { 0x0108, 0x0109 }, { 0x010a, 0x010b }, { 0x010c, 0x010d }, { 0x010e, 0x010f }, { 0x0110, 0x0111 }, { 0x0112, 0x0113 }, { 0x0114, 0x0115 }, { 0x0116, 0x0117 }, { 0x0118, 0x0119 }, { 0x011a, 0x011b }, { 0x011c, 0x011d }, { 0x011e, 0x011f }, { 0x0120, 0x0121 }, { 0x0122, 0x0123 }, { 0x0124, 0x0125 }, { 0x0126, 0x0127 }, { 0x0128, 0x0129 }, { 0x012a, 0x012b }, { 0x012c, 0x012d }, { 0x012e, 0x012f }, { 0x0130, 0x0069 }, { 0x0132, 0x0133 }, { 0x0134, 0x0135 }, { 0x0136, 0x0137 }, { 0x0139, 0x013a }, { 0x013b, 0x013c }, { 0x013d, 0x013e }, { 0x013f, 0x0140 }, { 0x0141, 0x0142 }, { 0x0143, 0x0144 }, { 0x0145, 0x0146 }, { 0x0147, 0x0148 }, { 0x014a, 0x014b }, { 0x014c, 0x014d }, { 0x014e, 0x014f }, { 0x0150, 0x0151 }, { 0x0152, 0x0153 }, { 0x0154, 0x0155 }, { 0x0156, 0x0157 }, { 0x0158, 0x0159 }, { 0x015a, 0x015b }, { 0x015c, 0x015d }, { 0x015e, 0x015f }, { 0x0160, 0x0161 }, { 0x0162, 0x0163 }, { 0x0164, 0x0165 }, { 0x0166, 0x0167 }, { 0x0168, 0x0169 }, { 0x016a, 0x016b }, { 0x016c, 0x016d }, { 0x016e, 0x016f }, { 0x0170, 0x0171 }, { 0x0172, 0x0173 }, { 0x0174, 0x0175 }, { 0x0176, 0x0177 }, { 0x0178, 0x00ff }, { 0x0179, 0x017a }, { 0x017b, 0x017c }, { 0x017d, 0x017e }, { 0x0181, 0x0253 }, { 0x0182, 0x0183 }, { 0x0184, 0x0185 }, { 0x0186, 0x0254 }, { 0x0187, 0x0188 }, { 0x0189, 0x0256 }, { 0x018a, 0x0257 }, { 0x018b, 0x018c }, { 0x018e, 0x01dd }, { 0x018f, 0x0259 }, { 0x0190, 0x025b }, { 0x0191, 0x0192 }, { 0x0193, 0x0260 }, { 0x0194, 0x0263 }, { 0x0196, 0x0269 }, { 0x0197, 0x0268 }, { 0x0198, 0x0199 }, { 0x019c, 0x026f }, { 0x019d, 0x0272 }, { 0x019f, 0x0275 }, { 0x01a0, 0x01a1 }, { 0x01a2, 0x01a3 }, { 0x01a4, 0x01a5 }, { 0x01a6, 0x0280 }, { 0x01a7, 0x01a8 }, { 0x01a9, 0x0283 }, { 0x01ac, 0x01ad }, { 0x01ae, 0x0288 }, { 0x01af, 0x01b0 }, { 0x01b1, 0x028a }, { 0x01b2, 0x028b }, { 0x01b3, 0x01b4 }, { 0x01b5, 0x01b6 }, { 0x01b7, 0x0292 }, { 0x01b8, 0x01b9 }, { 0x01bc, 0x01bd }, { 0x01c4, 0x01c6 }, { 0x01c5, 0x01c6 }, { 0x01c7, 0x01c9 }, { 0x01c8, 0x01c9 }, { 0x01ca, 0x01cc }, { 0x01cb, 0x01cc }, { 0x01cd, 0x01ce }, { 0x01cf, 0x01d0 }, { 0x01d1, 0x01d2 }, { 0x01d3, 0x01d4 }, { 0x01d5, 0x01d6 }, { 0x01d7, 0x01d8 }, { 0x01d9, 0x01da }, { 0x01db, 0x01dc }, { 0x01de, 0x01df }, { 0x01e0, 0x01e1 }, { 0x01e2, 0x01e3 }, { 0x01e4, 0x01e5 }, { 0x01e6, 0x01e7 }, { 0x01e8, 0x01e9 }, { 0x01ea, 0x01eb }, { 0x01ec, 0x01ed }, { 0x01ee, 0x01ef }, { 0x01f1, 0x01f3 }, { 0x01f2, 0x01f3 }, { 0x01f4, 0x01f5 }, { 0x01fa, 0x01fb }, { 0x01fc, 0x01fd }, { 0x01fe, 0x01ff }, { 0x0200, 0x0201 }, { 0x0202, 0x0203 }, { 0x0204, 0x0205 }, { 0x0206, 0x0207 }, { 0x0208, 0x0209 }, { 0x020a, 0x020b }, { 0x020c, 0x020d }, { 0x020e, 0x020f }, { 0x0210, 0x0211 }, { 0x0212, 0x0213 }, { 0x0214, 0x0215 }, { 0x0216, 0x0217 }, { 0x0386, 0x03ac }, { 0x0388, 0x03ad }, { 0x0389, 0x03ae }, { 0x038a, 0x03af }, { 0x038c, 0x03cc }, { 0x038e, 0x03cd }, { 0x038f, 0x03ce }, { 0x0391, 0x03b1 }, { 0x0392, 0x03b2 }, { 0x0393, 0x03b3 }, { 0x0394, 0x03b4 }, { 0x0395, 0x03b5 }, { 0x0396, 0x03b6 }, { 0x0397, 0x03b7 }, { 0x0398, 0x03b8 }, { 0x0399, 0x03b9 }, { 0x039a, 0x03ba }, { 0x039b, 0x03bb }, { 0x039c, 0x03bc }, { 0x039d, 0x03bd }, { 0x039e, 0x03be }, { 0x039f, 0x03bf }, { 0x03a0, 0x03c0 }, { 0x03a1, 0x03c1 }, { 0x03a3, 0x03c3 }, { 0x03a4, 0x03c4 }, { 0x03a5, 0x03c5 }, { 0x03a6, 0x03c6 }, { 0x03a7, 0x03c7 }, { 0x03a8, 0x03c8 }, { 0x03a9, 0x03c9 }, { 0x03aa, 0x03ca }, { 0x03ab, 0x03cb }, { 0x03e2, 0x03e3 }, { 0x03e4, 0x03e5 }, { 0x03e6, 0x03e7 }, { 0x03e8, 0x03e9 }, { 0x03ea, 0x03eb }, { 0x03ec, 0x03ed }, { 0x03ee, 0x03ef }, { 0x0401, 0x0451 }, { 0x0402, 0x0452 }, { 0x0403, 0x0453 }, { 0x0404, 0x0454 }, { 0x0405, 0x0455 }, { 0x0406, 0x0456 }, { 0x0407, 0x0457 }, { 0x0408, 0x0458 }, { 0x0409, 0x0459 }, { 0x040a, 0x045a }, { 0x040b, 0x045b }, { 0x040c, 0x045c }, { 0x040e, 0x045e }, { 0x040f, 0x045f }, { 0x0410, 0x0430 }, { 0x0411, 0x0431 }, { 0x0412, 0x0432 }, { 0x0413, 0x0433 }, { 0x0414, 0x0434 }, { 0x0415, 0x0435 }, { 0x0416, 0x0436 }, { 0x0417, 0x0437 }, { 0x0418, 0x0438 }, { 0x0419, 0x0439 }, { 0x041a, 0x043a }, { 0x041b, 0x043b }, { 0x041c, 0x043c }, { 0x041d, 0x043d }, { 0x041e, 0x043e }, { 0x041f, 0x043f }, { 0x0420, 0x0440 }, { 0x0421, 0x0441 }, { 0x0422, 0x0442 }, { 0x0423, 0x0443 }, { 0x0424, 0x0444 }, { 0x0425, 0x0445 }, { 0x0426, 0x0446 }, { 0x0427, 0x0447 }, { 0x0428, 0x0448 }, { 0x0429, 0x0449 }, { 0x042a, 0x044a }, { 0x042b, 0x044b }, { 0x042c, 0x044c }, { 0x042d, 0x044d }, { 0x042e, 0x044e }, { 0x042f, 0x044f }, { 0x0460, 0x0461 }, { 0x0462, 0x0463 }, { 0x0464, 0x0465 }, { 0x0466, 0x0467 }, { 0x0468, 0x0469 }, { 0x046a, 0x046b }, { 0x046c, 0x046d }, { 0x046e, 0x046f }, { 0x0470, 0x0471 }, { 0x0472, 0x0473 }, { 0x0474, 0x0475 }, { 0x0476, 0x0477 }, { 0x0478, 0x0479 }, { 0x047a, 0x047b }, { 0x047c, 0x047d }, { 0x047e, 0x047f }, { 0x0480, 0x0481 }, { 0x0490, 0x0491 }, { 0x0492, 0x0493 }, { 0x0494, 0x0495 }, { 0x0496, 0x0497 }, { 0x0498, 0x0499 }, { 0x049a, 0x049b }, { 0x049c, 0x049d }, { 0x049e, 0x049f }, { 0x04a0, 0x04a1 }, { 0x04a2, 0x04a3 }, { 0x04a4, 0x04a5 }, { 0x04a6, 0x04a7 }, { 0x04a8, 0x04a9 }, { 0x04aa, 0x04ab }, { 0x04ac, 0x04ad }, { 0x04ae, 0x04af }, { 0x04b0, 0x04b1 }, { 0x04b2, 0x04b3 }, { 0x04b4, 0x04b5 }, { 0x04b6, 0x04b7 }, { 0x04b8, 0x04b9 }, { 0x04ba, 0x04bb }, { 0x04bc, 0x04bd }, { 0x04be, 0x04bf }, { 0x04c1, 0x04c2 }, { 0x04c3, 0x04c4 }, { 0x04c7, 0x04c8 }, { 0x04cb, 0x04cc }, { 0x04d0, 0x04d1 }, { 0x04d2, 0x04d3 }, { 0x04d4, 0x04d5 }, { 0x04d6, 0x04d7 }, { 0x04d8, 0x04d9 }, { 0x04da, 0x04db }, { 0x04dc, 0x04dd }, { 0x04de, 0x04df }, { 0x04e0, 0x04e1 }, { 0x04e2, 0x04e3 }, { 0x04e4, 0x04e5 }, { 0x04e6, 0x04e7 }, { 0x04e8, 0x04e9 }, { 0x04ea, 0x04eb }, { 0x04ee, 0x04ef }, { 0x04f0, 0x04f1 }, { 0x04f2, 0x04f3 }, { 0x04f4, 0x04f5 }, { 0x04f8, 0x04f9 }, { 0x0531, 0x0561 }, { 0x0532, 0x0562 }, { 0x0533, 0x0563 }, { 0x0534, 0x0564 }, { 0x0535, 0x0565 }, { 0x0536, 0x0566 }, { 0x0537, 0x0567 }, { 0x0538, 0x0568 }, { 0x0539, 0x0569 }, { 0x053a, 0x056a }, { 0x053b, 0x056b }, { 0x053c, 0x056c }, { 0x053d, 0x056d }, { 0x053e, 0x056e }, { 0x053f, 0x056f }, { 0x0540, 0x0570 }, { 0x0541, 0x0571 }, { 0x0542, 0x0572 }, { 0x0543, 0x0573 }, { 0x0544, 0x0574 }, { 0x0545, 0x0575 }, { 0x0546, 0x0576 }, { 0x0547, 0x0577 }, { 0x0548, 0x0578 }, { 0x0549, 0x0579 }, { 0x054a, 0x057a }, { 0x054b, 0x057b }, { 0x054c, 0x057c }, { 0x054d, 0x057d }, { 0x054e, 0x057e }, { 0x054f, 0x057f }, { 0x0550, 0x0580 }, { 0x0551, 0x0581 }, { 0x0552, 0x0582 }, { 0x0553, 0x0583 }, { 0x0554, 0x0584 }, { 0x0555, 0x0585 }, { 0x0556, 0x0586 }, { 0x10a0, 0x10d0 }, { 0x10a1, 0x10d1 }, { 0x10a2, 0x10d2 }, { 0x10a3, 0x10d3 }, { 0x10a4, 0x10d4 }, { 0x10a5, 0x10d5 }, { 0x10a6, 0x10d6 }, { 0x10a7, 0x10d7 }, { 0x10a8, 0x10d8 }, { 0x10a9, 0x10d9 }, { 0x10aa, 0x10da }, { 0x10ab, 0x10db }, { 0x10ac, 0x10dc }, { 0x10ad, 0x10dd }, { 0x10ae, 0x10de }, { 0x10af, 0x10df }, { 0x10b0, 0x10e0 }, { 0x10b1, 0x10e1 }, { 0x10b2, 0x10e2 }, { 0x10b3, 0x10e3 }, { 0x10b4, 0x10e4 }, { 0x10b5, 0x10e5 }, { 0x10b6, 0x10e6 }, { 0x10b7, 0x10e7 }, { 0x10b8, 0x10e8 }, { 0x10b9, 0x10e9 }, { 0x10ba, 0x10ea }, { 0x10bb, 0x10eb }, { 0x10bc, 0x10ec }, { 0x10bd, 0x10ed }, { 0x10be, 0x10ee }, { 0x10bf, 0x10ef }, { 0x10c0, 0x10f0 }, { 0x10c1, 0x10f1 }, { 0x10c2, 0x10f2 }, { 0x10c3, 0x10f3 }, { 0x10c4, 0x10f4 }, { 0x10c5, 0x10f5 }, { 0x1e00, 0x1e01 }, { 0x1e02, 0x1e03 }, { 0x1e04, 0x1e05 }, { 0x1e06, 0x1e07 }, { 0x1e08, 0x1e09 }, { 0x1e0a, 0x1e0b }, { 0x1e0c, 0x1e0d }, { 0x1e0e, 0x1e0f }, { 0x1e10, 0x1e11 }, { 0x1e12, 0x1e13 }, { 0x1e14, 0x1e15 }, { 0x1e16, 0x1e17 }, { 0x1e18, 0x1e19 }, { 0x1e1a, 0x1e1b }, { 0x1e1c, 0x1e1d }, { 0x1e1e, 0x1e1f }, { 0x1e20, 0x1e21 }, { 0x1e22, 0x1e23 }, { 0x1e24, 0x1e25 }, { 0x1e26, 0x1e27 }, { 0x1e28, 0x1e29 }, { 0x1e2a, 0x1e2b }, { 0x1e2c, 0x1e2d }, { 0x1e2e, 0x1e2f }, { 0x1e30, 0x1e31 }, { 0x1e32, 0x1e33 }, { 0x1e34, 0x1e35 }, { 0x1e36, 0x1e37 }, { 0x1e38, 0x1e39 }, { 0x1e3a, 0x1e3b }, { 0x1e3c, 0x1e3d }, { 0x1e3e, 0x1e3f }, { 0x1e40, 0x1e41 }, { 0x1e42, 0x1e43 }, { 0x1e44, 0x1e45 }, { 0x1e46, 0x1e47 }, { 0x1e48, 0x1e49 }, { 0x1e4a, 0x1e4b }, { 0x1e4c, 0x1e4d }, { 0x1e4e, 0x1e4f }, { 0x1e50, 0x1e51 }, { 0x1e52, 0x1e53 }, { 0x1e54, 0x1e55 }, { 0x1e56, 0x1e57 }, { 0x1e58, 0x1e59 }, { 0x1e5a, 0x1e5b }, { 0x1e5c, 0x1e5d }, { 0x1e5e, 0x1e5f }, { 0x1e60, 0x1e61 }, { 0x1e62, 0x1e63 }, { 0x1e64, 0x1e65 }, { 0x1e66, 0x1e67 }, { 0x1e68, 0x1e69 }, { 0x1e6a, 0x1e6b }, { 0x1e6c, 0x1e6d }, { 0x1e6e, 0x1e6f }, { 0x1e70, 0x1e71 }, { 0x1e72, 0x1e73 }, { 0x1e74, 0x1e75 }, { 0x1e76, 0x1e77 }, { 0x1e78, 0x1e79 }, { 0x1e7a, 0x1e7b }, { 0x1e7c, 0x1e7d }, { 0x1e7e, 0x1e7f }, { 0x1e80, 0x1e81 }, { 0x1e82, 0x1e83 }, { 0x1e84, 0x1e85 }, { 0x1e86, 0x1e87 }, { 0x1e88, 0x1e89 }, { 0x1e8a, 0x1e8b }, { 0x1e8c, 0x1e8d }, { 0x1e8e, 0x1e8f }, { 0x1e90, 0x1e91 }, { 0x1e92, 0x1e93 }, { 0x1e94, 0x1e95 }, { 0x1ea0, 0x1ea1 }, { 0x1ea2, 0x1ea3 }, { 0x1ea4, 0x1ea5 }, { 0x1ea6, 0x1ea7 }, { 0x1ea8, 0x1ea9 }, { 0x1eaa, 0x1eab }, { 0x1eac, 0x1ead }, { 0x1eae, 0x1eaf }, { 0x1eb0, 0x1eb1 }, { 0x1eb2, 0x1eb3 }, { 0x1eb4, 0x1eb5 }, { 0x1eb6, 0x1eb7 }, { 0x1eb8, 0x1eb9 }, { 0x1eba, 0x1ebb }, { 0x1ebc, 0x1ebd }, { 0x1ebe, 0x1ebf }, { 0x1ec0, 0x1ec1 }, { 0x1ec2, 0x1ec3 }, { 0x1ec4, 0x1ec5 }, { 0x1ec6, 0x1ec7 }, { 0x1ec8, 0x1ec9 }, { 0x1eca, 0x1ecb }, { 0x1ecc, 0x1ecd }, { 0x1ece, 0x1ecf }, { 0x1ed0, 0x1ed1 }, { 0x1ed2, 0x1ed3 }, { 0x1ed4, 0x1ed5 }, { 0x1ed6, 0x1ed7 }, { 0x1ed8, 0x1ed9 }, { 0x1eda, 0x1edb }, { 0x1edc, 0x1edd }, { 0x1ede, 0x1edf }, { 0x1ee0, 0x1ee1 }, { 0x1ee2, 0x1ee3 }, { 0x1ee4, 0x1ee5 }, { 0x1ee6, 0x1ee7 }, { 0x1ee8, 0x1ee9 }, { 0x1eea, 0x1eeb }, { 0x1eec, 0x1eed }, { 0x1eee, 0x1eef }, { 0x1ef0, 0x1ef1 }, { 0x1ef2, 0x1ef3 }, { 0x1ef4, 0x1ef5 }, { 0x1ef6, 0x1ef7 }, { 0x1ef8, 0x1ef9 }, { 0x1f08, 0x1f00 }, { 0x1f09, 0x1f01 }, { 0x1f0a, 0x1f02 }, { 0x1f0b, 0x1f03 }, { 0x1f0c, 0x1f04 }, { 0x1f0d, 0x1f05 }, { 0x1f0e, 0x1f06 }, { 0x1f0f, 0x1f07 }, { 0x1f18, 0x1f10 }, { 0x1f19, 0x1f11 }, { 0x1f1a, 0x1f12 }, { 0x1f1b, 0x1f13 }, { 0x1f1c, 0x1f14 }, { 0x1f1d, 0x1f15 }, { 0x1f28, 0x1f20 }, { 0x1f29, 0x1f21 }, { 0x1f2a, 0x1f22 }, { 0x1f2b, 0x1f23 }, { 0x1f2c, 0x1f24 }, { 0x1f2d, 0x1f25 }, { 0x1f2e, 0x1f26 }, { 0x1f2f, 0x1f27 }, { 0x1f38, 0x1f30 }, { 0x1f39, 0x1f31 }, { 0x1f3a, 0x1f32 }, { 0x1f3b, 0x1f33 }, { 0x1f3c, 0x1f34 }, { 0x1f3d, 0x1f35 }, { 0x1f3e, 0x1f36 }, { 0x1f3f, 0x1f37 }, { 0x1f48, 0x1f40 }, { 0x1f49, 0x1f41 }, { 0x1f4a, 0x1f42 }, { 0x1f4b, 0x1f43 }, { 0x1f4c, 0x1f44 }, { 0x1f4d, 0x1f45 }, { 0x1f59, 0x1f51 }, { 0x1f5b, 0x1f53 }, { 0x1f5d, 0x1f55 }, { 0x1f5f, 0x1f57 }, { 0x1f68, 0x1f60 }, { 0x1f69, 0x1f61 }, { 0x1f6a, 0x1f62 }, { 0x1f6b, 0x1f63 }, { 0x1f6c, 0x1f64 }, { 0x1f6d, 0x1f65 }, { 0x1f6e, 0x1f66 }, { 0x1f6f, 0x1f67 }, { 0x1f88, 0x1f80 }, { 0x1f89, 0x1f81 }, { 0x1f8a, 0x1f82 }, { 0x1f8b, 0x1f83 }, { 0x1f8c, 0x1f84 }, { 0x1f8d, 0x1f85 }, { 0x1f8e, 0x1f86 }, { 0x1f8f, 0x1f87 }, { 0x1f98, 0x1f90 }, { 0x1f99, 0x1f91 }, { 0x1f9a, 0x1f92 }, { 0x1f9b, 0x1f93 }, { 0x1f9c, 0x1f94 }, { 0x1f9d, 0x1f95 }, { 0x1f9e, 0x1f96 }, { 0x1f9f, 0x1f97 }, { 0x1fa8, 0x1fa0 }, { 0x1fa9, 0x1fa1 }, { 0x1faa, 0x1fa2 }, { 0x1fab, 0x1fa3 }, { 0x1fac, 0x1fa4 }, { 0x1fad, 0x1fa5 }, { 0x1fae, 0x1fa6 }, { 0x1faf, 0x1fa7 }, { 0x1fb8, 0x1fb0 }, { 0x1fb9, 0x1fb1 }, { 0x1fba, 0x1f70 }, { 0x1fbb, 0x1f71 }, { 0x1fbc, 0x1fb3 }, { 0x1fc8, 0x1f72 }, { 0x1fc9, 0x1f73 }, { 0x1fca, 0x1f74 }, { 0x1fcb, 0x1f75 }, { 0x1fcc, 0x1fc3 }, { 0x1fd8, 0x1fd0 }, { 0x1fd9, 0x1fd1 }, { 0x1fda, 0x1f76 }, { 0x1fdb, 0x1f77 }, { 0x1fe8, 0x1fe0 }, { 0x1fe9, 0x1fe1 }, { 0x1fea, 0x1f7a }, { 0x1feb, 0x1f7b }, { 0x1fec, 0x1fe5 }, { 0x1ff8, 0x1f78 }, { 0x1ff9, 0x1f79 }, { 0x1ffa, 0x1f7c }, { 0x1ffb, 0x1f7d }, { 0x1ffc, 0x1ff3 }, { 0x2160, 0x2170 }, { 0x2161, 0x2171 }, { 0x2162, 0x2172 }, { 0x2163, 0x2173 }, { 0x2164, 0x2174 }, { 0x2165, 0x2175 }, { 0x2166, 0x2176 }, { 0x2167, 0x2177 }, { 0x2168, 0x2178 }, { 0x2169, 0x2179 }, { 0x216a, 0x217a }, { 0x216b, 0x217b }, { 0x216c, 0x217c }, { 0x216d, 0x217d }, { 0x216e, 0x217e }, { 0x216f, 0x217f }, { 0x24b6, 0x24d0 }, { 0x24b7, 0x24d1 }, { 0x24b8, 0x24d2 }, { 0x24b9, 0x24d3 }, { 0x24ba, 0x24d4 }, { 0x24bb, 0x24d5 }, { 0x24bc, 0x24d6 }, { 0x24bd, 0x24d7 }, { 0x24be, 0x24d8 }, { 0x24bf, 0x24d9 }, { 0x24c0, 0x24da }, { 0x24c1, 0x24db }, { 0x24c2, 0x24dc }, { 0x24c3, 0x24dd }, { 0x24c4, 0x24de }, { 0x24c5, 0x24df }, { 0x24c6, 0x24e0 }, { 0x24c7, 0x24e1 }, { 0x24c8, 0x24e2 }, { 0x24c9, 0x24e3 }, { 0x24ca, 0x24e4 }, { 0x24cb, 0x24e5 }, { 0x24cc, 0x24e6 }, { 0x24cd, 0x24e7 }, { 0x24ce, 0x24e8 }, { 0x24cf, 0x24e9 }, { 0xff21, 0xff41 }, { 0xff22, 0xff42 }, { 0xff23, 0xff43 }, { 0xff24, 0xff44 }, { 0xff25, 0xff45 }, { 0xff26, 0xff46 }, { 0xff27, 0xff47 }, { 0xff28, 0xff48 }, { 0xff29, 0xff49 }, { 0xff2a, 0xff4a }, { 0xff2b, 0xff4b }, { 0xff2c, 0xff4c }, { 0xff2d, 0xff4d }, { 0xff2e, 0xff4e }, { 0xff2f, 0xff4f }, { 0xff30, 0xff50 }, { 0xff31, 0xff51 }, { 0xff32, 0xff52 }, { 0xff33, 0xff53 }, { 0xff34, 0xff54 }, { 0xff35, 0xff55 }, { 0xff36, 0xff56 }, { 0xff37, 0xff57 }, { 0xff38, 0xff58 }, { 0xff39, 0xff59 }, { 0xff3a, 0xff5a } }; static struct case_map uppercase_map[] = { { 0x0061, 0x0041 }, { 0x0062, 0x0042 }, { 0x0063, 0x0043 }, { 0x0064, 0x0044 }, { 0x0065, 0x0045 }, { 0x0066, 0x0046 }, { 0x0067, 0x0047 }, { 0x0068, 0x0048 }, { 0x0069, 0x0049 }, { 0x006a, 0x004a }, { 0x006b, 0x004b }, { 0x006c, 0x004c }, { 0x006d, 0x004d }, { 0x006e, 0x004e }, { 0x006f, 0x004f }, { 0x0070, 0x0050 }, { 0x0071, 0x0051 }, { 0x0072, 0x0052 }, { 0x0073, 0x0053 }, { 0x0074, 0x0054 }, { 0x0075, 0x0055 }, { 0x0076, 0x0056 }, { 0x0077, 0x0057 }, { 0x0078, 0x0058 }, { 0x0079, 0x0059 }, { 0x007a, 0x005a }, { 0x00e0, 0x00c0 }, { 0x00e1, 0x00c1 }, { 0x00e2, 0x00c2 }, { 0x00e3, 0x00c3 }, { 0x00e4, 0x00c4 }, { 0x00e5, 0x00c5 }, { 0x00e6, 0x00c6 }, { 0x00e7, 0x00c7 }, { 0x00e8, 0x00c8 }, { 0x00e9, 0x00c9 }, { 0x00ea, 0x00ca }, { 0x00eb, 0x00cb }, { 0x00ec, 0x00cc }, { 0x00ed, 0x00cd }, { 0x00ee, 0x00ce }, { 0x00ef, 0x00cf }, { 0x00f0, 0x00d0 }, { 0x00f1, 0x00d1 }, { 0x00f2, 0x00d2 }, { 0x00f3, 0x00d3 }, { 0x00f4, 0x00d4 }, { 0x00f5, 0x00d5 }, { 0x00f6, 0x00d6 }, { 0x00f8, 0x00d8 }, { 0x00f9, 0x00d9 }, { 0x00fa, 0x00da }, { 0x00fb, 0x00db }, { 0x00fc, 0x00dc }, { 0x00fd, 0x00dd }, { 0x00fe, 0x00de }, { 0x00ff, 0x0178 }, { 0x0101, 0x0100 }, { 0x0103, 0x0102 }, { 0x0105, 0x0104 }, { 0x0107, 0x0106 }, { 0x0109, 0x0108 }, { 0x010b, 0x010a }, { 0x010d, 0x010c }, { 0x010f, 0x010e }, { 0x0111, 0x0110 }, { 0x0113, 0x0112 }, { 0x0115, 0x0114 }, { 0x0117, 0x0116 }, { 0x0119, 0x0118 }, { 0x011b, 0x011a }, { 0x011d, 0x011c }, { 0x011f, 0x011e }, { 0x0121, 0x0120 }, { 0x0123, 0x0122 }, { 0x0125, 0x0124 }, { 0x0127, 0x0126 }, { 0x0129, 0x0128 }, { 0x012b, 0x012a }, { 0x012d, 0x012c }, { 0x012f, 0x012e }, { 0x0131, 0x0049 }, { 0x0133, 0x0132 }, { 0x0135, 0x0134 }, { 0x0137, 0x0136 }, { 0x013a, 0x0139 }, { 0x013c, 0x013b }, { 0x013e, 0x013d }, { 0x0140, 0x013f }, { 0x0142, 0x0141 }, { 0x0144, 0x0143 }, { 0x0146, 0x0145 }, { 0x0148, 0x0147 }, { 0x014b, 0x014a }, { 0x014d, 0x014c }, { 0x014f, 0x014e }, { 0x0151, 0x0150 }, { 0x0153, 0x0152 }, { 0x0155, 0x0154 }, { 0x0157, 0x0156 }, { 0x0159, 0x0158 }, { 0x015b, 0x015a }, { 0x015d, 0x015c }, { 0x015f, 0x015e }, { 0x0161, 0x0160 }, { 0x0163, 0x0162 }, { 0x0165, 0x0164 }, { 0x0167, 0x0166 }, { 0x0169, 0x0168 }, { 0x016b, 0x016a }, { 0x016d, 0x016c }, { 0x016f, 0x016e }, { 0x0171, 0x0170 }, { 0x0173, 0x0172 }, { 0x0175, 0x0174 }, { 0x0177, 0x0176 }, { 0x017a, 0x0179 }, { 0x017c, 0x017b }, { 0x017e, 0x017d }, { 0x017f, 0x0053 }, { 0x0183, 0x0182 }, { 0x0185, 0x0184 }, { 0x0188, 0x0187 }, { 0x018c, 0x018b }, { 0x0192, 0x0191 }, { 0x0199, 0x0198 }, { 0x01a1, 0x01a0 }, { 0x01a3, 0x01a2 }, { 0x01a5, 0x01a4 }, { 0x01a8, 0x01a7 }, { 0x01ad, 0x01ac }, { 0x01b0, 0x01af }, { 0x01b4, 0x01b3 }, { 0x01b6, 0x01b5 }, { 0x01b9, 0x01b8 }, { 0x01bd, 0x01bc }, { 0x01c5, 0x01c4 }, { 0x01c6, 0x01c4 }, { 0x01c8, 0x01c7 }, { 0x01c9, 0x01c7 }, { 0x01cb, 0x01ca }, { 0x01cc, 0x01ca }, { 0x01ce, 0x01cd }, { 0x01d0, 0x01cf }, { 0x01d2, 0x01d1 }, { 0x01d4, 0x01d3 }, { 0x01d6, 0x01d5 }, { 0x01d8, 0x01d7 }, { 0x01da, 0x01d9 }, { 0x01dc, 0x01db }, { 0x01dd, 0x018e }, { 0x01df, 0x01de }, { 0x01e1, 0x01e0 }, { 0x01e3, 0x01e2 }, { 0x01e5, 0x01e4 }, { 0x01e7, 0x01e6 }, { 0x01e9, 0x01e8 }, { 0x01eb, 0x01ea }, { 0x01ed, 0x01ec }, { 0x01ef, 0x01ee }, { 0x01f2, 0x01f1 }, { 0x01f3, 0x01f1 }, { 0x01f5, 0x01f4 }, { 0x01fb, 0x01fa }, { 0x01fd, 0x01fc }, { 0x01ff, 0x01fe }, { 0x0201, 0x0200 }, { 0x0203, 0x0202 }, { 0x0205, 0x0204 }, { 0x0207, 0x0206 }, { 0x0209, 0x0208 }, { 0x020b, 0x020a }, { 0x020d, 0x020c }, { 0x020f, 0x020e }, { 0x0211, 0x0210 }, { 0x0213, 0x0212 }, { 0x0215, 0x0214 }, { 0x0217, 0x0216 }, { 0x0253, 0x0181 }, { 0x0254, 0x0186 }, { 0x0256, 0x0189 }, { 0x0257, 0x018a }, { 0x0259, 0x018f }, { 0x025b, 0x0190 }, { 0x0260, 0x0193 }, { 0x0263, 0x0194 }, { 0x0268, 0x0197 }, { 0x0269, 0x0196 }, { 0x026f, 0x019c }, { 0x0272, 0x019d }, { 0x0275, 0x019f }, { 0x0280, 0x01a6 }, { 0x0283, 0x01a9 }, { 0x0288, 0x01ae }, { 0x028a, 0x01b1 }, { 0x028b, 0x01b2 }, { 0x0292, 0x01b7 }, { 0x0345, 0x0399 }, { 0x03ac, 0x0386 }, { 0x03ad, 0x0388 }, { 0x03ae, 0x0389 }, { 0x03af, 0x038a }, { 0x03b1, 0x0391 }, { 0x03b2, 0x0392 }, { 0x03b3, 0x0393 }, { 0x03b4, 0x0394 }, { 0x03b5, 0x0395 }, { 0x03b6, 0x0396 }, { 0x03b7, 0x0397 }, { 0x03b8, 0x0398 }, { 0x03b9, 0x0399 }, { 0x03ba, 0x039a }, { 0x03bb, 0x039b }, { 0x03bc, 0x039c }, { 0x03bd, 0x039d }, { 0x03be, 0x039e }, { 0x03bf, 0x039f }, { 0x03c0, 0x03a0 }, { 0x03c1, 0x03a1 }, { 0x03c2, 0x03a3 }, { 0x03c3, 0x03a3 }, { 0x03c4, 0x03a4 }, { 0x03c5, 0x03a5 }, { 0x03c6, 0x03a6 }, { 0x03c7, 0x03a7 }, { 0x03c8, 0x03a8 }, { 0x03c9, 0x03a9 }, { 0x03ca, 0x03aa }, { 0x03cb, 0x03ab }, { 0x03cc, 0x038c }, { 0x03cd, 0x038e }, { 0x03ce, 0x038f }, { 0x03d0, 0x0392 }, { 0x03d1, 0x0398 }, { 0x03d5, 0x03a6 }, { 0x03d6, 0x03a0 }, { 0x03e3, 0x03e2 }, { 0x03e5, 0x03e4 }, { 0x03e7, 0x03e6 }, { 0x03e9, 0x03e8 }, { 0x03eb, 0x03ea }, { 0x03ed, 0x03ec }, { 0x03ef, 0x03ee }, { 0x03f0, 0x039a }, { 0x03f1, 0x03a1 }, { 0x03f2, 0x03a3 }, { 0x0430, 0x0410 }, { 0x0431, 0x0411 }, { 0x0432, 0x0412 }, { 0x0433, 0x0413 }, { 0x0434, 0x0414 }, { 0x0435, 0x0415 }, { 0x0436, 0x0416 }, { 0x0437, 0x0417 }, { 0x0438, 0x0418 }, { 0x0439, 0x0419 }, { 0x043a, 0x041a }, { 0x043b, 0x041b }, { 0x043c, 0x041c }, { 0x043d, 0x041d }, { 0x043e, 0x041e }, { 0x043f, 0x041f }, { 0x0440, 0x0420 }, { 0x0441, 0x0421 }, { 0x0442, 0x0422 }, { 0x0443, 0x0423 }, { 0x0444, 0x0424 }, { 0x0445, 0x0425 }, { 0x0446, 0x0426 }, { 0x0447, 0x0427 }, { 0x0448, 0x0428 }, { 0x0449, 0x0429 }, { 0x044a, 0x042a }, { 0x044b, 0x042b }, { 0x044c, 0x042c }, { 0x044d, 0x042d }, { 0x044e, 0x042e }, { 0x044f, 0x042f }, { 0x0451, 0x0401 }, { 0x0452, 0x0402 }, { 0x0453, 0x0403 }, { 0x0454, 0x0404 }, { 0x0455, 0x0405 }, { 0x0456, 0x0406 }, { 0x0457, 0x0407 }, { 0x0458, 0x0408 }, { 0x0459, 0x0409 }, { 0x045a, 0x040a }, { 0x045b, 0x040b }, { 0x045c, 0x040c }, { 0x045e, 0x040e }, { 0x045f, 0x040f }, { 0x0461, 0x0460 }, { 0x0463, 0x0462 }, { 0x0465, 0x0464 }, { 0x0467, 0x0466 }, { 0x0469, 0x0468 }, { 0x046b, 0x046a }, { 0x046d, 0x046c }, { 0x046f, 0x046e }, { 0x0471, 0x0470 }, { 0x0473, 0x0472 }, { 0x0475, 0x0474 }, { 0x0477, 0x0476 }, { 0x0479, 0x0478 }, { 0x047b, 0x047a }, { 0x047d, 0x047c }, { 0x047f, 0x047e }, { 0x0481, 0x0480 }, { 0x0491, 0x0490 }, { 0x0493, 0x0492 }, { 0x0495, 0x0494 }, { 0x0497, 0x0496 }, { 0x0499, 0x0498 }, { 0x049b, 0x049a }, { 0x049d, 0x049c }, { 0x049f, 0x049e }, { 0x04a1, 0x04a0 }, { 0x04a3, 0x04a2 }, { 0x04a5, 0x04a4 }, { 0x04a7, 0x04a6 }, { 0x04a9, 0x04a8 }, { 0x04ab, 0x04aa }, { 0x04ad, 0x04ac }, { 0x04af, 0x04ae }, { 0x04b1, 0x04b0 }, { 0x04b3, 0x04b2 }, { 0x04b5, 0x04b4 }, { 0x04b7, 0x04b6 }, { 0x04b9, 0x04b8 }, { 0x04bb, 0x04ba }, { 0x04bd, 0x04bc }, { 0x04bf, 0x04be }, { 0x04c2, 0x04c1 }, { 0x04c4, 0x04c3 }, { 0x04c8, 0x04c7 }, { 0x04cc, 0x04cb }, { 0x04d1, 0x04d0 }, { 0x04d3, 0x04d2 }, { 0x04d5, 0x04d4 }, { 0x04d7, 0x04d6 }, { 0x04d9, 0x04d8 }, { 0x04db, 0x04da }, { 0x04dd, 0x04dc }, { 0x04df, 0x04de }, { 0x04e1, 0x04e0 }, { 0x04e3, 0x04e2 }, { 0x04e5, 0x04e4 }, { 0x04e7, 0x04e6 }, { 0x04e9, 0x04e8 }, { 0x04eb, 0x04ea }, { 0x04ef, 0x04ee }, { 0x04f1, 0x04f0 }, { 0x04f3, 0x04f2 }, { 0x04f5, 0x04f4 }, { 0x04f9, 0x04f8 }, { 0x0561, 0x0531 }, { 0x0562, 0x0532 }, { 0x0563, 0x0533 }, { 0x0564, 0x0534 }, { 0x0565, 0x0535 }, { 0x0566, 0x0536 }, { 0x0567, 0x0537 }, { 0x0568, 0x0538 }, { 0x0569, 0x0539 }, { 0x056a, 0x053a }, { 0x056b, 0x053b }, { 0x056c, 0x053c }, { 0x056d, 0x053d }, { 0x056e, 0x053e }, { 0x056f, 0x053f }, { 0x0570, 0x0540 }, { 0x0571, 0x0541 }, { 0x0572, 0x0542 }, { 0x0573, 0x0543 }, { 0x0574, 0x0544 }, { 0x0575, 0x0545 }, { 0x0576, 0x0546 }, { 0x0577, 0x0547 }, { 0x0578, 0x0548 }, { 0x0579, 0x0549 }, { 0x057a, 0x054a }, { 0x057b, 0x054b }, { 0x057c, 0x054c }, { 0x057d, 0x054d }, { 0x057e, 0x054e }, { 0x057f, 0x054f }, { 0x0580, 0x0550 }, { 0x0581, 0x0551 }, { 0x0582, 0x0552 }, { 0x0583, 0x0553 }, { 0x0584, 0x0554 }, { 0x0585, 0x0555 }, { 0x0586, 0x0556 }, { 0x1e01, 0x1e00 }, { 0x1e03, 0x1e02 }, { 0x1e05, 0x1e04 }, { 0x1e07, 0x1e06 }, { 0x1e09, 0x1e08 }, { 0x1e0b, 0x1e0a }, { 0x1e0d, 0x1e0c }, { 0x1e0f, 0x1e0e }, { 0x1e11, 0x1e10 }, { 0x1e13, 0x1e12 }, { 0x1e15, 0x1e14 }, { 0x1e17, 0x1e16 }, { 0x1e19, 0x1e18 }, { 0x1e1b, 0x1e1a }, { 0x1e1d, 0x1e1c }, { 0x1e1f, 0x1e1e }, { 0x1e21, 0x1e20 }, { 0x1e23, 0x1e22 }, { 0x1e25, 0x1e24 }, { 0x1e27, 0x1e26 }, { 0x1e29, 0x1e28 }, { 0x1e2b, 0x1e2a }, { 0x1e2d, 0x1e2c }, { 0x1e2f, 0x1e2e }, { 0x1e31, 0x1e30 }, { 0x1e33, 0x1e32 }, { 0x1e35, 0x1e34 }, { 0x1e37, 0x1e36 }, { 0x1e39, 0x1e38 }, { 0x1e3b, 0x1e3a }, { 0x1e3d, 0x1e3c }, { 0x1e3f, 0x1e3e }, { 0x1e41, 0x1e40 }, { 0x1e43, 0x1e42 }, { 0x1e45, 0x1e44 }, { 0x1e47, 0x1e46 }, { 0x1e49, 0x1e48 }, { 0x1e4b, 0x1e4a }, { 0x1e4d, 0x1e4c }, { 0x1e4f, 0x1e4e }, { 0x1e51, 0x1e50 }, { 0x1e53, 0x1e52 }, { 0x1e55, 0x1e54 }, { 0x1e57, 0x1e56 }, { 0x1e59, 0x1e58 }, { 0x1e5b, 0x1e5a }, { 0x1e5d, 0x1e5c }, { 0x1e5f, 0x1e5e }, { 0x1e61, 0x1e60 }, { 0x1e63, 0x1e62 }, { 0x1e65, 0x1e64 }, { 0x1e67, 0x1e66 }, { 0x1e69, 0x1e68 }, { 0x1e6b, 0x1e6a }, { 0x1e6d, 0x1e6c }, { 0x1e6f, 0x1e6e }, { 0x1e71, 0x1e70 }, { 0x1e73, 0x1e72 }, { 0x1e75, 0x1e74 }, { 0x1e77, 0x1e76 }, { 0x1e79, 0x1e78 }, { 0x1e7b, 0x1e7a }, { 0x1e7d, 0x1e7c }, { 0x1e7f, 0x1e7e }, { 0x1e81, 0x1e80 }, { 0x1e83, 0x1e82 }, { 0x1e85, 0x1e84 }, { 0x1e87, 0x1e86 }, { 0x1e89, 0x1e88 }, { 0x1e8b, 0x1e8a }, { 0x1e8d, 0x1e8c }, { 0x1e8f, 0x1e8e }, { 0x1e91, 0x1e90 }, { 0x1e93, 0x1e92 }, { 0x1e95, 0x1e94 }, { 0x1e9b, 0x1e60 }, { 0x1ea1, 0x1ea0 }, { 0x1ea3, 0x1ea2 }, { 0x1ea5, 0x1ea4 }, { 0x1ea7, 0x1ea6 }, { 0x1ea9, 0x1ea8 }, { 0x1eab, 0x1eaa }, { 0x1ead, 0x1eac }, { 0x1eaf, 0x1eae }, { 0x1eb1, 0x1eb0 }, { 0x1eb3, 0x1eb2 }, { 0x1eb5, 0x1eb4 }, { 0x1eb7, 0x1eb6 }, { 0x1eb9, 0x1eb8 }, { 0x1ebb, 0x1eba }, { 0x1ebd, 0x1ebc }, { 0x1ebf, 0x1ebe }, { 0x1ec1, 0x1ec0 }, { 0x1ec3, 0x1ec2 }, { 0x1ec5, 0x1ec4 }, { 0x1ec7, 0x1ec6 }, { 0x1ec9, 0x1ec8 }, { 0x1ecb, 0x1eca }, { 0x1ecd, 0x1ecc }, { 0x1ecf, 0x1ece }, { 0x1ed1, 0x1ed0 }, { 0x1ed3, 0x1ed2 }, { 0x1ed5, 0x1ed4 }, { 0x1ed7, 0x1ed6 }, { 0x1ed9, 0x1ed8 }, { 0x1edb, 0x1eda }, { 0x1edd, 0x1edc }, { 0x1edf, 0x1ede }, { 0x1ee1, 0x1ee0 }, { 0x1ee3, 0x1ee2 }, { 0x1ee5, 0x1ee4 }, { 0x1ee7, 0x1ee6 }, { 0x1ee9, 0x1ee8 }, { 0x1eeb, 0x1eea }, { 0x1eed, 0x1eec }, { 0x1eef, 0x1eee }, { 0x1ef1, 0x1ef0 }, { 0x1ef3, 0x1ef2 }, { 0x1ef5, 0x1ef4 }, { 0x1ef7, 0x1ef6 }, { 0x1ef9, 0x1ef8 }, { 0x1f00, 0x1f08 }, { 0x1f01, 0x1f09 }, { 0x1f02, 0x1f0a }, { 0x1f03, 0x1f0b }, { 0x1f04, 0x1f0c }, { 0x1f05, 0x1f0d }, { 0x1f06, 0x1f0e }, { 0x1f07, 0x1f0f }, { 0x1f10, 0x1f18 }, { 0x1f11, 0x1f19 }, { 0x1f12, 0x1f1a }, { 0x1f13, 0x1f1b }, { 0x1f14, 0x1f1c }, { 0x1f15, 0x1f1d }, { 0x1f20, 0x1f28 }, { 0x1f21, 0x1f29 }, { 0x1f22, 0x1f2a }, { 0x1f23, 0x1f2b }, { 0x1f24, 0x1f2c }, { 0x1f25, 0x1f2d }, { 0x1f26, 0x1f2e }, { 0x1f27, 0x1f2f }, { 0x1f30, 0x1f38 }, { 0x1f31, 0x1f39 }, { 0x1f32, 0x1f3a }, { 0x1f33, 0x1f3b }, { 0x1f34, 0x1f3c }, { 0x1f35, 0x1f3d }, { 0x1f36, 0x1f3e }, { 0x1f37, 0x1f3f }, { 0x1f40, 0x1f48 }, { 0x1f41, 0x1f49 }, { 0x1f42, 0x1f4a }, { 0x1f43, 0x1f4b }, { 0x1f44, 0x1f4c }, { 0x1f45, 0x1f4d }, { 0x1f51, 0x1f59 }, { 0x1f53, 0x1f5b }, { 0x1f55, 0x1f5d }, { 0x1f57, 0x1f5f }, { 0x1f60, 0x1f68 }, { 0x1f61, 0x1f69 }, { 0x1f62, 0x1f6a }, { 0x1f63, 0x1f6b }, { 0x1f64, 0x1f6c }, { 0x1f65, 0x1f6d }, { 0x1f66, 0x1f6e }, { 0x1f67, 0x1f6f }, { 0x1f70, 0x1fba }, { 0x1f71, 0x1fbb }, { 0x1f72, 0x1fc8 }, { 0x1f73, 0x1fc9 }, { 0x1f74, 0x1fca }, { 0x1f75, 0x1fcb }, { 0x1f76, 0x1fda }, { 0x1f77, 0x1fdb }, { 0x1f78, 0x1ff8 }, { 0x1f79, 0x1ff9 }, { 0x1f7a, 0x1fea }, { 0x1f7b, 0x1feb }, { 0x1f7c, 0x1ffa }, { 0x1f7d, 0x1ffb }, { 0x1f80, 0x1f88 }, { 0x1f81, 0x1f89 }, { 0x1f82, 0x1f8a }, { 0x1f83, 0x1f8b }, { 0x1f84, 0x1f8c }, { 0x1f85, 0x1f8d }, { 0x1f86, 0x1f8e }, { 0x1f87, 0x1f8f }, { 0x1f90, 0x1f98 }, { 0x1f91, 0x1f99 }, { 0x1f92, 0x1f9a }, { 0x1f93, 0x1f9b }, { 0x1f94, 0x1f9c }, { 0x1f95, 0x1f9d }, { 0x1f96, 0x1f9e }, { 0x1f97, 0x1f9f }, { 0x1fa0, 0x1fa8 }, { 0x1fa1, 0x1fa9 }, { 0x1fa2, 0x1faa }, { 0x1fa3, 0x1fab }, { 0x1fa4, 0x1fac }, { 0x1fa5, 0x1fad }, { 0x1fa6, 0x1fae }, { 0x1fa7, 0x1faf }, { 0x1fb0, 0x1fb8 }, { 0x1fb1, 0x1fb9 }, { 0x1fb3, 0x1fbc }, { 0x1fbe, 0x0399 }, { 0x1fc3, 0x1fcc }, { 0x1fd0, 0x1fd8 }, { 0x1fd1, 0x1fd9 }, { 0x1fe0, 0x1fe8 }, { 0x1fe1, 0x1fe9 }, { 0x1fe5, 0x1fec }, { 0x1ff3, 0x1ffc }, { 0x2170, 0x2160 }, { 0x2171, 0x2161 }, { 0x2172, 0x2162 }, { 0x2173, 0x2163 }, { 0x2174, 0x2164 }, { 0x2175, 0x2165 }, { 0x2176, 0x2166 }, { 0x2177, 0x2167 }, { 0x2178, 0x2168 }, { 0x2179, 0x2169 }, { 0x217a, 0x216a }, { 0x217b, 0x216b }, { 0x217c, 0x216c }, { 0x217d, 0x216d }, { 0x217e, 0x216e }, { 0x217f, 0x216f }, { 0x24d0, 0x24b6 }, { 0x24d1, 0x24b7 }, { 0x24d2, 0x24b8 }, { 0x24d3, 0x24b9 }, { 0x24d4, 0x24ba }, { 0x24d5, 0x24bb }, { 0x24d6, 0x24bc }, { 0x24d7, 0x24bd }, { 0x24d8, 0x24be }, { 0x24d9, 0x24bf }, { 0x24da, 0x24c0 }, { 0x24db, 0x24c1 }, { 0x24dc, 0x24c2 }, { 0x24dd, 0x24c3 }, { 0x24de, 0x24c4 }, { 0x24df, 0x24c5 }, { 0x24e0, 0x24c6 }, { 0x24e1, 0x24c7 }, { 0x24e2, 0x24c8 }, { 0x24e3, 0x24c9 }, { 0x24e4, 0x24ca }, { 0x24e5, 0x24cb }, { 0x24e6, 0x24cc }, { 0x24e7, 0x24cd }, { 0x24e8, 0x24ce }, { 0x24e9, 0x24cf }, { 0xff41, 0xff21 }, { 0xff42, 0xff22 }, { 0xff43, 0xff23 }, { 0xff44, 0xff24 }, { 0xff45, 0xff25 }, { 0xff46, 0xff26 }, { 0xff47, 0xff27 }, { 0xff48, 0xff28 }, { 0xff49, 0xff29 }, { 0xff4a, 0xff2a }, { 0xff4b, 0xff2b }, { 0xff4c, 0xff2c }, { 0xff4d, 0xff2d }, { 0xff4e, 0xff2e }, { 0xff4f, 0xff2f }, { 0xff50, 0xff30 }, { 0xff51, 0xff31 }, { 0xff52, 0xff32 }, { 0xff53, 0xff33 }, { 0xff54, 0xff34 }, { 0xff55, 0xff35 }, { 0xff56, 0xff36 }, { 0xff57, 0xff37 }, { 0xff58, 0xff38 }, { 0xff59, 0xff39 }, { 0xff5a, 0xff3a } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_unicode.h�������������������������������������������������������������0000664�0000000�0000000�00000004414�12660066715�0020000�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: unicode.h 892 2005-12-21 04:38:20Z d $ */ #ifndef _SEE_h_unicode_ #define _SEE_h_unicode_ #include "see_type.h" #define _UNICODE_MAX 0x10ffff #if WITH_UNICODE_TABLES /* * Macros to test if a given character is in a Unicode 4.0 (meta)class * Cf - Format control (=Cf) * Zs - Whitespace (=Zs) * IS - identifier start (=Lu+Ll+Lt+Lm+Lo+Nl + '$' + '_') * IP - identifier part (=Lu+Ll+Lt+Lm+Lo+Nl+Mn+Mc+Nd+Pc + '$' + '_') */ # define UNICODE_IS_Cf(c) _UNICODE_IS(c, SEE_unicode_Cf, 11) # define UNICODE_IS_Zs(c) _UNICODE_IS(c, SEE_unicode_Zs, 14) # define UNICODE_IS_IS(c) _UNICODE_IS(c, SEE_unicode_IS, 11) # define UNICODE_IS_IP(c) _UNICODE_IS(c, SEE_unicode_IP, 11) /* * The sparse bit tables would be 600kB in total size, but because * of some clustering in the Unicode layout this can be * easily reduced to 20kB using a two-level lookup. My * analyses showed that using the lower 11 bits for Cf, IP and IS * produced the smallest tables, while Zs was minimal at 14 bits. * (Based on UnicodeData.txt 4.0). (See gen.c) */ extern unsigned char* SEE_unicode_Cf[]; extern unsigned char* SEE_unicode_Zs[]; extern unsigned char* SEE_unicode_IS[]; extern unsigned char* SEE_unicode_IP[]; # define _UNICODE_IS(c, table, grp) \ ((c) < _UNICODE_MAX && \ (table)[(c)>>(grp)] && \ (table[(c)>>(grp)][((c) >> 3) & ((1<<((grp)-3))-1)] \ & (1<<((c)&7)))) extern SEE_unicode_t SEE_unicode_Zscodes[]; extern int SEE_unicode_Zscodeslen; SEE_char_t SEE_unicase_tolower(unsigned int ch); SEE_char_t SEE_unicase_toupper(unsigned int ch); # define UNICODE_TOLOWER(ch) SEE_unicase_tolower(ch) # define UNICODE_TOUPPER(ch) SEE_unicase_toupper(ch) #else /* !WITH_UNICODE_TABLES */ # include <ctype.h> # define UNICODE_IS_Cf(c) ((c) <= 0x7f && iscntrl((int)(c))) # define UNICODE_IS_Zs(c) ((c) <= 0x7f && isspace((int)(c))) # define UNICODE_IS_IS(c) ((c) <= 0x7f && \ (isalpha((int)(c)) || (c)=='$' || (c)=='_')) # define UNICODE_IS_IP(c) ((c) <= 0x7f && \ (isalnum((int)(c)) || (c)=='$' || (c)=='_')) # define UNICODE_TOLOWER(c) ((c) <= 0x7f ? tolower((int)c) : (c)) # define UNICODE_TOUPPER(c) ((c) <= 0x7f ? toupper((int)c) : (c)) #endif /* ! WITH_UNICODE_TABLES */ #endif /* _SEE_h_unicode_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_unicode.inc�����������������������������������������������������������0000664�0000000�0000000�00000064170�12660066715�0020327�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2006 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* generated by gen on Thu Apr 20 21:59:38 EST 2006 */ /* Unicode tables for 11-bit groups: Cf */ /* 16 codepoints in this table */ static unsigned char Cf_4[] = { 0,240,0,0,0,124,0,0,0,0,0,0,0,252,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char Cf_31[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; unsigned char *SEE_unicode_Cf[] = { 0,0,0,0,Cf_4,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Cf_31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; /* Unicode tables for 14-bit groups: Zs */ /* 15 codepoints in this table */ static unsigned char Zs_0[] = { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; unsigned char *SEE_unicode_Zs[] = { Zs_0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0 }; /* Unicode tables for 11-bit groups: $_ Lu Ll Lt Lm Lo Nl */ /* 4106 codepoints in this table */ static unsigned char IS_0[] = { 0,0,0,0,16,0,0,0,254,255,255,135,254,255,255,7, 0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,252, 255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255, 255,255,255,255,255,1,255,249,3,0,3,0,31,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, 64,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0, 254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255, 3,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3, 0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255, 255,0,0,0,0,0,0,0,0,0,255,255,255,7,7,0, 0,0,0,0,254,255,255,7,255,7,0,0,0,0,254,255, 255,255,255,255,255,255,255,124,255,127,47,0,96,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_1[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 224,255,255,255,255,255,255,35,0,0,1,255,3,0,0,0, 224,159,249,255,255,253,197,3,0,0,0,176,3,0,3,0, 224,135,249,255,255,253,109,3,0,0,0,94,0,0,28,0, 224,175,251,255,255,253,237,35,0,0,1,0,1,0,0,0, 224,159,249,255,255,253,205,35,0,0,0,176,3,0,0,0, 224,199,61,214,24,199,191,3,0,0,0,0,0,0,0,0, 224,223,253,255,255,253,239,3,0,0,0,0,3,0,0,0, 224,223,253,255,255,253,239,3,0,0,0,64,3,0,0,0, 224,223,253,255,255,253,255,3,0,0,0,0,3,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 254,255,255,255,255,255,13,0,127,0,0,0,0,0,0,0, 150,37,240,254,174,236,13,32,95,0,0,48,0,0,0,0, 1,0,0,0,0,0,0,0,255,254,255,255,255,3,0,0, 0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_2[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,255,255,255,255,63,0,255,255,255,255,127,0, 255,255,255,255,255,255,255,255,255,255,255,131,255,255,255,255, 255,255,255,255,7,255,255,255,255,255,255,255,255,255,255,3, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_3[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,3, 255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63, 255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31 }; static unsigned char IS_4[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 132,252,47,63,80,253,251,1,0,0,0,0,255,255,255,255, 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_6[] = { 224,0,0,0,254,3,62,0,254,255,255,255,255,255,255,255, 255,255,31,96,254,255,255,255,255,255,255,255,255,255,255,119, 224,255,255,255,255,31,254,255,255,255,255,255,255,255,255,255, 255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_9[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_19[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_21[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_26[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IS_31[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 127,0,248,128,255,253,127,95,219,255,255,255,255,255,255,255, 255,255,255,255,255,255,3,0,0,0,248,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255, 255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31, 0,0,0,0,254,255,255,7,254,255,255,7,192,255,255,255, 255,255,255,255,255,255,255,127,252,252,252,28,0,0,0,0 }; unsigned char *SEE_unicode_IS[] = { IS_0,IS_1,IS_2,IS_3,IS_4,0,IS_6,0,0,IS_9,0,0,0,0,0,0, 0,0,0,IS_19,0,IS_21,0,0,0,0,IS_26,0,0,0,0,IS_31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; /* Unicode tables for 11-bit groups: $_ Lu Ll Lt Lm Lo Nl Mn Mc Nd Pc */ /* 4711 codepoints in this table */ static unsigned char IP_0[] = { 0,0,0,0,16,0,255,3,254,255,255,135,254,255,255,7, 0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,252, 255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255, 255,255,255,255,255,1,255,249,3,0,3,0,31,0,0,0, 255,255,255,255,255,255,255,255,63,0,0,0,3,0,0,4, 64,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0, 254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255, 123,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3, 0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255, 255,0,254,255,251,255,255,187,22,0,255,255,255,7,7,0, 0,0,0,0,254,255,255,7,255,255,7,0,255,3,255,255, 255,255,255,255,255,255,255,124,255,127,239,159,255,61,255,3, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_1[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 238,255,255,255,255,255,255,243,255,63,31,255,207,255,0,0, 238,159,249,255,255,253,197,211,159,57,128,176,207,255,3,0, 228,135,249,255,255,253,109,211,135,57,0,94,192,255,31,0, 238,175,251,255,255,253,237,243,191,59,1,0,193,255,0,0, 238,159,249,255,255,253,205,243,143,57,192,176,195,255,0,0, 236,199,61,214,24,199,191,195,199,61,128,0,128,255,0,0, 238,223,253,255,255,253,239,195,223,61,96,0,195,255,0,0, 236,223,253,255,255,253,239,195,223,61,96,64,195,255,0,0, 236,223,253,255,255,253,255,195,207,61,128,0,195,255,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 254,255,255,255,255,255,255,7,255,127,255,3,0,0,0,0, 150,37,240,254,174,236,255,59,95,63,255,51,0,0,0,0, 1,0,0,3,255,3,160,194,255,254,255,255,255,3,254,255, 223,15,191,254,255,63,254,2,0,0,0,0,0,0,0,0 }; static unsigned char IP_2[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,255,255,255,255,63,0,255,255,255,255,127,0, 255,255,255,255,255,255,255,255,255,255,255,131,255,255,255,255, 255,255,255,255,7,255,255,255,255,255,255,255,255,255,255,3, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_3[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,3, 255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63, 255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31 }; static unsigned char IP_4[] = { 0,0,0,0,0,0,0,128,1,0,0,0,0,0,0,128, 0,0,0,0,0,0,0,0,0,0,255,31,2,0,0,0, 132,252,47,63,80,253,251,1,0,0,0,0,255,255,255,255, 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_6[] = { 224,0,0,0,254,255,62,0,254,255,255,255,255,255,255,255, 255,255,31,102,254,255,255,255,255,255,255,255,255,255,255,127, 224,255,255,255,255,31,254,255,255,255,255,255,255,255,255,255, 255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_9[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_19[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_21[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_26[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0 }; static unsigned char IP_31[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 127,0,248,192,255,253,127,95,219,255,255,255,255,255,255,255, 255,255,255,255,255,255,3,0,0,0,248,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255, 255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15, 0,0,0,0,15,0,24,0,0,224,0,0,0,0,215,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31, 0,0,255,3,254,255,255,135,254,255,255,7,224,255,255,255, 255,255,255,255,255,255,255,127,252,252,252,28,0,0,0,0 }; unsigned char *SEE_unicode_IP[] = { IP_0,IP_1,IP_2,IP_3,IP_4,0,IP_6,0,0,IP_9,0,0,0,0,0,0, 0,0,0,IP_19,0,IP_21,0,0,0,0,IP_26,0,0,0,0,IP_31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; /* Zs code points for use by RegExp */ SEE_unicode_t SEE_unicode_Zscodes[] = { 0x0020, 0x00A0, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x3000, }; int SEE_unicode_Zscodeslen = sizeof SEE_unicode_Zscodes / sizeof SEE_unicode_Zscodes[0]; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_value.h���������������������������������������������������������������0000664�0000000�0000000�00000011653�12660066715�0017471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2003, David Leonard. All rights reserved. */ /* $Id: value.h 883 2005-12-20 05:44:43Z d $ */ #ifndef _SEE_h_value_ #define _SEE_h_value_ /* * Values are small units of short-life, typed memory * that contain primitive information, object * references or string references. */ #include <math.h> #include "see_type.h" /* if not defined, define NULL as a pointer, not as ANSI C's (0) */ #ifndef NULL #define NULL ((void *)0) #endif struct SEE_object; struct SEE_string; struct SEE_value; struct SEE_interpreter; /* Value types */ enum SEE_type { SEE_UNDEFINED, SEE_NULL, SEE_BOOLEAN, SEE_NUMBER, SEE_STRING, SEE_OBJECT, SEE_REFERENCE, /* internal type (8.7) */ SEE_COMPLETION /* internal type (8.9) */ }; /* This structure is not part of the public API and may change */ struct _SEE_reference { struct SEE_object *base; struct SEE_string *property; }; /* This structure is not part of the public API and may change */ struct _SEE_completion { struct SEE_value *value; void *target; enum { SEE_COMPLETION_NORMAL, SEE_COMPLETION_BREAK, SEE_COMPLETION_CONTINUE, SEE_COMPLETION_RETURN, SEE_COMPLETION_THROW } type; }; /* Value storage */ struct SEE_value { enum SEE_type _type; union { SEE_number_t number; SEE_boolean_t boolean; struct SEE_object *object; struct SEE_string *string; /* The following members are not part of the public API */ struct _SEE_reference reference; struct _SEE_completion completion; void *_padding[4]; } u; }; /* Copy between value storages */ #define SEE_VALUE_COPY(dst, src) \ memcpy(dst, src, sizeof (struct SEE_value)) /* Obtain the value's type */ #define SEE_VALUE_GET_TYPE(v) ((v)->_type) /* This macro is not part of the public API and may change */ #define _SEE_VALUE_SET_TYPE(v, t) \ (v)->_type = t /* Fill a value storage with the undefined value */ #define SEE_SET_UNDEFINED(v) \ _SEE_VALUE_SET_TYPE(v, SEE_UNDEFINED) /* Fill a value storage with the null value */ #define SEE_SET_NULL(v) \ _SEE_VALUE_SET_TYPE(v, SEE_NULL) /* Fill a value storage with a boolean value */ #define SEE_SET_BOOLEAN(v, b) \ do { \ _SEE_VALUE_SET_TYPE(v, SEE_BOOLEAN); \ (v)->u.boolean = (b); \ } while (0) /* Fill a value storage with a numeric value */ #define SEE_SET_NUMBER(v, n) \ do { \ _SEE_VALUE_SET_TYPE(v, SEE_NUMBER); \ (v)->u.number = (n); \ } while (0) /* Fill a value storage with a pointer to a string */ #define SEE_SET_STRING(v, s) \ do { \ _SEE_VALUE_SET_TYPE(v, SEE_STRING); \ (v)->u.string = (s); \ } while (0) /* Fill a value storage with a pointer to an object */ #define SEE_SET_OBJECT(v, o) \ do { \ _SEE_VALUE_SET_TYPE(v, SEE_OBJECT); \ (v)->u.object = (o); \ } while (0) /* This macro is not part of the public API and may change */ #define _SEE_SET_REFERENCE(v, b, p) \ do { \ _SEE_VALUE_SET_TYPE(v, SEE_REFERENCE); \ (v)->u.reference.base = (b); \ (v)->u.reference.property = (p); \ } while (0) /* This macro is not part of the public API and may change */ /* NB: 'val' must NOT be on the stack */ #define _SEE_SET_COMPLETION(v, typ, val, tgt) \ do { \ _SEE_VALUE_SET_TYPE(v, SEE_COMPLETION); \ (v)->u.completion.type = (typ); \ (v)->u.completion.value = (val); \ (v)->u.completion.target = (tgt); \ } while (0) /* Convenience macros for numbers */ #if SEE_NUMBER_IS_FLOAT # define SEE_ISNAN(n) isnanf(n) # define SEE_ISINF(n) isinff(n) # define SEE_ISFINITE(n) finitef(n) #endif #if SEE_NUMBER_IS_DOUBLE # define SEE_ISNAN(n) isnan(n) # define SEE_ISINF(n) isinf(n) # define SEE_ISFINITE(n) finite(n) #endif #define SEE_NUMBER_ISNAN(v) SEE_ISNAN((v)->u.number) #define SEE_NUMBER_ISINF(v) SEE_ISINF((v)->u.number) #define SEE_NUMBER_ISFINITE(v) SEE_ISFINITE((v)->u.number) #define SEE_NUMBER_ISPINF(v) (SEE_NUMBER_ISINF(v) && (v)->u.number > 0) #define SEE_NUMBER_ISNINF(v) (SEE_NUMBER_ISINF(v) && (v)->u.number < 0) /* Converters */ void SEE_ToPrimitive(struct SEE_interpreter *i, struct SEE_value *val, struct SEE_value *type, struct SEE_value *res); void SEE_ToBoolean(struct SEE_interpreter *i, struct SEE_value *val, struct SEE_value *res); void SEE_ToNumber(struct SEE_interpreter *i, struct SEE_value *val, struct SEE_value *res); void SEE_ToInteger(struct SEE_interpreter *i, struct SEE_value *val, struct SEE_value *res); void SEE_ToString(struct SEE_interpreter *i, struct SEE_value *val, struct SEE_value *res); void SEE_ToObject(struct SEE_interpreter *i, struct SEE_value *val, struct SEE_value *res); /* Integer converters */ SEE_int32_t SEE_ToInt32(struct SEE_interpreter *i, struct SEE_value *val); SEE_uint32_t SEE_ToUint32(struct SEE_interpreter *i, struct SEE_value *val); SEE_uint16_t SEE_ToUint16(struct SEE_interpreter *i, struct SEE_value *val); /* "0123456789abcdef" */ extern char SEE_hexstr_lowercase[16], SEE_hexstr_uppercase[16]; #endif /* _SEE_h_value_ */ �������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/see_version.h�������������������������������������������������������������0000664�0000000�0000000�00000003602�12660066715�0020035�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 2005, David Leonard. All rights reserved. */ /* $Id$ */ #ifndef _SEE_h_version_ #define _SEE_h_version_ /* * Returns a static version string consisting of identifiers separated by * a single space character. * The first word is the library package name (usually "see"). * The second word is the library package version (e.g. "1.3"). * Successive words are feature identifiers that indicate compile-time * options used when building the library. * This function is useful for end-users to determine the characteristics * of the library their application is using. */ const char *SEE_version(void); /* * The major and minor version numbers indicate backward-compatible * and backward-incompatible changes to the API (i.e this set of * header files.). They are *indepenent* of the package and library * implementation version numbers. * * Practically, developers should use the following code to signal the * rare case of major API changes when compiling: * #if SEE_VERSION_API_MAJOR > 1 * #warning "SEE API major version mismatch" * #endif * This precaution will signal when past use of older API may be * incompatible with newer APIs. * * The API versioning rules are: * + If a function, type, extern or macro has been changed since last * release so that previous use is incompatible with future use, then * the major version number is incremented and the minor version number * is reset to zero. * + If a function, type, extern or macro has been added since last * release such that its future use is incompatible with previous headers * with the same API major version number, then the minor version number * is incremented. * * The API documentation should indicate at what API version new API * elements are added, defaulting to "1.0". * */ #define SEE_VERSION_API_MAJOR 2 #define SEE_VERSION_API_MINOR 0 #endif /* _SEE_h_version */ ������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/string.c������������������������������������������������������������������0000664�0000000�0000000�00000041050�12660066715�0017014�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: string.c 1098 2006-07-28 15:20:53Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> # include <stdarg.h> #endif #if 1 // HAVE_LIMITS_H - EDIT BY ME limmits.h is available # include <limits.h> #else # define UINT_MAX (~(unsigned int)0) #endif #include "see_mem.h" #include "see_type.h" #include "see_string.h" #include "see_object.h" #include "see_error.h" #include "see_try.h" #include "see_interpreter.h" #include "see_value.h" #include "see_stringdefs.h" #include "see_printf.h" static void growby(struct SEE_string *s, unsigned int extra); static void simple_growby(struct SEE_string *s, unsigned int extra); static void string_append_int(struct SEE_string *s, unsigned int i); static struct SEE_stringclass fixed_stringclass = { 0 /* growby */ }; #define IS_GROWABLE(s) ((s)->stringclass && (s)->stringclass->growby) #define MAKE_UNGROWABLE(s) (s)->stringclass = 0 #define ASSERT_GROWABLE(s) SEE_ASSERT(s->interpreter, IS_GROWABLE(s)) /* * Strings. * * Strings are arrays of 16-bit characters with UTF-16 encoding. * Because the ECMAScript standard never needs the strings * interpreted in their full unicode form, (such as UCS-4), * the implementation here maintains them as an array of 16-bit * unsigned integers. */ /* * Grows a string's data[] array by the given length increment */ static void growby(s, extra) struct SEE_string *s; unsigned int extra; { if (!IS_GROWABLE(s)) SEE_error_throw_string(s->interpreter, s->interpreter->Error, STR(no_string_space)); (*s->stringclass->growby)(s, extra); } /* * Creates a new, growable string containing a copy of an existing one. */ struct SEE_string * SEE_string_dup(interp, s) struct SEE_interpreter *interp; const struct SEE_string *s; { struct SEE_string *cp; cp = SEE_string_new(interp, s->length); SEE_string_append(cp, s); return cp; } /* * Creates a new (ungrowable) string that is a substring of another. * Raises an error if the substring indixies are out of bounds. * The source string (s) may continue to be grown, but should not * be changed. */ struct SEE_string * SEE_string_substr(interp, s, start, len) struct SEE_interpreter *interp; struct SEE_string *s; int start, len; { struct SEE_string *subs; if (start < 0 || len < 0 || (unsigned int)(start + len) > s->length) SEE_error_throw_string(interp, interp->Error, STR(bad_arg)); subs = SEE_NEW(interp, struct SEE_string); subs->length = len; subs->data = s->data + start; subs->interpreter = interp; subs->flags = 0; subs->stringclass = &fixed_stringclass; return subs; } /* * Compares two strings, a and b, lexicographically by UTF-16. Returns * -1 if a < b * 0 if a = b * +1 if a > b */ int SEE_string_cmp(a, b) const struct SEE_string *a, *b; { const SEE_char_t *ap, *bp; unsigned int alen, blen; if (a == b) return 0; ap = a->data; alen = a->length; bp = b->data; blen = b->length; while (alen && blen && *ap == *bp) { alen--; blen--; ap++; bp++; } if (!alen) { if (!blen) return 0; return -1; } if (!blen) return 1; return (*ap < *bp) ? -1 : 1; } /* * Appends character c to the end of string s. */ void SEE_string_addch(s, c) struct SEE_string *s; int c; /* promoted SEE_char_t */ { ASSERT_GROWABLE(s); growby(s, 1); s->data[s->length++] = c; } /* * Appends string t to the end of string s. */ void SEE_string_append(s, t) struct SEE_string *s; const struct SEE_string *t; { ASSERT_GROWABLE(s); if (t->length) { growby(s, t->length); memcpy(s->data + s->length, t->data, t->length * sizeof (SEE_char_t)); s->length += t->length; } } /* * Appends 7-bit ascii string to the end of string s. */ void SEE_string_append_ascii(s, ascii) struct SEE_string *s; const char *ascii; { const char *p; ASSERT_GROWABLE(s); for (p = ascii; *p; p++) SEE_ASSERT(s->interpreter, !(*p & 0x80)); if (p - ascii) { growby(s, p - ascii); for (p = ascii; *p; p++) s->data[s->length++] = *p; } } /* * Appends a signed integer onto the end of string s */ void SEE_string_append_int(s, i) struct SEE_string *s; int i; { ASSERT_GROWABLE(s); if (i < 0) { i = -i; SEE_string_addch(s, '-'); } string_append_int(s, i); } static void string_append_int(s, i) struct SEE_string *s; unsigned int i; { if (i >= 10) string_append_int(s, i / 10); growby(s, 1); s->data[s->length++] = (i % 10) + '0'; } /* * Converts a UTF-16 string to UTF-8 and write to a stdio file. * Returns 0 on success, like fputs(). * Returns EOF on write error, like fputs(). * Throws exception on conversion error, unlike fputs(). * Ref: RFC2279, RFC2781 */ int SEE_string_fputs(s, f) const struct SEE_string *s; FILE *f; { unsigned int i; SEE_char_t ch, ch2; struct SEE_interpreter *interp = s->interpreter; #define OUTPUT(c) do { if (fputc(c, f) == EOF) goto error; } while (0) for (i = 0; i < s->length; i++) { ch = s->data[i]; if ((ch & 0xff80) == 0) OUTPUT(ch & 0x7f); else if ((ch & 0xf800) == 0) { OUTPUT(0xc0 | ((ch >> 6) & 0x1f)); OUTPUT(0x80 | (ch & 0x3f)); } else if ((ch & 0xfc00) != 0xd800) { OUTPUT(0xe0 | ((ch >> 12) & 0x0f)); OUTPUT(0x80 | ((ch >> 6) & 0x3f)); OUTPUT(0x80 | (ch & 0x3f)); } else { if (i == s->length - 1) SEE_error_throw_string(interp, interp->Error, STR(bad_utf16_string)); ch2 = s->data[++i]; if ((ch2 & 0xfc00) != 0xdc00) SEE_error_throw_string(interp, interp->Error, STR(bad_utf16_string)); ch = (ch & 0x03ff) + 0x0040; OUTPUT(0xf0 | ((ch >> 8) & 0x07)); OUTPUT(0x80 | ((ch >> 2) & 0x3f)); OUTPUT(0x80 | ((ch & 0x3) << 4) | ((ch2 & 0x03c0) >> 6)); OUTPUT(0x80 | (ch2 & 0x3f)); } } return 0; error: return EOF; #undef OUTPUT } /*------------------------------------------------------------ * The simple string class */ struct simple_string { struct SEE_string string; unsigned int space; }; /* * Tunable parameters, specified in bytes. * These can be varied at build time to suit a particular platform. * TODO: provide support for segmented strings? */ #ifndef STRING_INITIAL_SIZE # define STRING_INITIAL_SIZE 512 #endif #ifndef STRING_MAXIMUM_SIZE # define STRING_MAXIMUM_SIZE UINT_MAX #endif #ifndef STRING_MAXIMUM_PADDING # define STRING_MAXIMUM_PADDING 4096 #endif /* * Derived variables, in 'SEE_char_t's: * INITSPACE: initial length of a string * MAXSPACE: biggest string length possible with length type * BIGSPACE: largest string length allocation likely to succeed */ #define INITSPACE (STRING_INITIAL_SIZE / sizeof (SEE_char_t)) #define MAXSPACE (STRING_MAXIMUM_SIZE / sizeof (SEE_char_t)) #define BIGSPACE ((STRING_MAXIMUM_SIZE - STRING_MAXIMUM_PADDING) / \ sizeof (SEE_char_t)) /* * Grows the string storage to have at least current+extra elements of storage. * Simple strings never shrink. Growth is in powers of two from INITSPACE. */ static void simple_growby(s, extra) struct SEE_string *s; unsigned int extra; { struct simple_string *ss = (struct simple_string *)s; unsigned int minspace, new_space; SEE_char_t *new_data; struct SEE_interpreter *interp = s->interpreter; if (s->length > MAXSPACE - extra) SEE_error_throw_string(interp, interp->Error, STR(string_limit_reached)); minspace = s->length + extra; if (ss->space < minspace) { /* * The non-empty string space starts at INITSPACE, and then * doubles until it would exceepd BIGSPACE, at which point it * is set to BIGSPACE (the practical size limit of memory * allocations). A further increase is permitted to MAXSPACE, * but the memory subsystem is expected to complain at that */ new_space = ss->space; while (new_space < minspace) { if (new_space == 0) new_space = INITSPACE; else if (ss->space >= BIGSPACE) new_space = MAXSPACE; else if (ss->space > BIGSPACE/2) new_space = BIGSPACE; else new_space = new_space * 2; } new_data = SEE_NEW_STRING_ARRAY(interp, SEE_char_t, new_space); if (s->length) memcpy(new_data, s->data, s->length * sizeof (SEE_char_t)); ss->string.data = new_data; ss->space = new_space; } } static struct SEE_stringclass simple_stringclass = { simple_growby /* growby */ }; /* * Constrycts a new, empty string. * Storage is pre-allocated for the number of UTF-16 characters indicated * by the 'space' argument. */ struct SEE_string * SEE_string_new(interp, space) struct SEE_interpreter *interp; unsigned int space; { struct simple_string *ss = SEE_NEW(interp, struct simple_string); ss->string.length = 0; ss->string.data = NULL; ss->string.interpreter = interp; ss->string.flags = 0; ss->space = 0; ss->string.stringclass = &simple_stringclass; if (space) simple_growby((struct SEE_string *)ss, space); return (struct SEE_string *)ss; } /* * Creates a string using vsprintf-like arguments. */ struct SEE_string * SEE_string_vsprintf(interp, fmt, ap) struct SEE_interpreter *interp; const char *fmt; va_list ap; { struct simple_string *ss; ss = (struct simple_string *)SEE_string_new(interp, 0); _SEE_vsprintf(interp, &ss->string, fmt, ap); ss->space = ss->string.length; return (struct SEE_string *)ss; } /* * Creates a string using sprintf-like arguments. */ struct SEE_string * SEE_string_sprintf(struct SEE_interpreter *interp, const char *fmt, ...) { va_list ap; struct SEE_string *s; va_start(ap, fmt); s = SEE_string_vsprintf(interp, fmt, ap); va_end(ap); return s; } /** * Returns a quoted, escaped string, suitable for lexical analysis. */ struct SEE_string * SEE_string_literal(interp, s) struct SEE_interpreter *interp; const struct SEE_string *s; { struct SEE_string *lit; unsigned int i; SEE_char_t c; if (s == NULL) return NULL; lit = SEE_string_new(interp, 0); SEE_string_addch(lit, '\"'); for (i = 0; i < s->length; i++) { c = s->data[i]; switch (c) { case 0x0008: SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'b'); break; case 0x0009: SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 't'); break; case 0x000a: SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'n'); break; case 0x000b: SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'v'); break; case 0x000c: SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'f'); break; case 0x000d: SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'r'); break; case '\\': case '\"': SEE_string_addch(lit, '\\'); SEE_string_addch(lit, c); break; default: if (c >= 0x20 && c < 0x7f) SEE_string_addch(lit, c); else if (c < 0x100) { SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'x'); SEE_string_addch(lit, SEE_hexstr_lowercase[(c >> 4) & 0xf]); SEE_string_addch(lit, SEE_hexstr_lowercase[ c & 0xf]); } else { SEE_string_addch(lit, '\\'); SEE_string_addch(lit, 'u'); SEE_string_addch(lit, SEE_hexstr_lowercase[(c >>12) & 0xf]); SEE_string_addch(lit, SEE_hexstr_lowercase[(c >> 8) & 0xf]); SEE_string_addch(lit, SEE_hexstr_lowercase[(c >> 4) & 0xf]); SEE_string_addch(lit, SEE_hexstr_lowercase[ c & 0xf]); } } } SEE_string_addch(lit, '\"'); return lit; } /* * Frees a string. The caller must know that the string data is not in * use in any other place. That includes by substring references, and * the piggybacking side effects of SEE_string_concat. */ void SEE_string_free(interp, sp) struct SEE_interpreter *interp; struct SEE_string **sp; { if (*sp) { SEE_free(interp, (void **)&(*sp)->data); SEE_free(interp, (void **)sp); } } /* * Returns the number of characters a UTF-8 representation would take. * Does not include the trailing nul */ SEE_size_t SEE_string_utf8_size(interp, s) struct SEE_interpreter *interp; const struct SEE_string *s; { SEE_size_t len; unsigned int i; SEE_char_t ch, ch2; len = 0; for (i = 0; i < s->length; i++) { ch = s->data[i]; if ((ch & 0xff80) == 0) len += 1; else if ((ch & 0xf800) == 0) len += 2; else if ((ch & 0xfc00) != 0xd800) len += 3; else { if (i == s->length - 1) SEE_error_throw_string(interp, interp->Error, STR(bad_utf16_string)); ch2 = s->data[++i]; if ((ch2 & 0xfc00) != 0xdc00) SEE_error_throw_string(interp, interp->Error, STR(bad_utf16_string)); len += 4; } } return len; } /* * Converts a SEE string into a UTF8 buffer. * Throws a RangeError if the decoded string, including terminating nul, * would exceed the size of the given buffer. * If the string itself is illegally formed, a generic Error is thrown. */ void SEE_string_toutf8(interp, buf, buflen, s) struct SEE_interpreter *interp; char *buf; SEE_size_t buflen; const struct SEE_string *s; { unsigned int i; SEE_char_t ch, ch2; #define OUTPUT(c) do { \ if (buflen <= 1) goto toolong; \ *buf++ = (c); \ buflen--; \ } while (0) for (i = 0; i < s->length; i++) { ch = s->data[i]; if ((ch & 0xff80) == 0) OUTPUT(ch & 0x7f); else if ((ch & 0xf800) == 0) { OUTPUT(0xc0 | ((ch >> 6) & 0x1f)); OUTPUT(0x80 | (ch & 0x3f)); } else if ((ch & 0xfc00) != 0xd800) { OUTPUT(0xe0 | ((ch >> 12) & 0x0f)); OUTPUT(0x80 | ((ch >> 6) & 0x3f)); OUTPUT(0x80 | (ch & 0x3f)); } else { if (i == s->length - 1) SEE_error_throw_string(interp, interp->Error, STR(bad_utf16_string)); ch2 = s->data[++i]; if ((ch2 & 0xfc00) != 0xdc00) SEE_error_throw_string(interp, interp->Error, STR(bad_utf16_string)); ch = (ch & 0x03ff) + 0x0040; OUTPUT(0xf0 | ((ch >> 8) & 0x07)); OUTPUT(0x80 | ((ch >> 2) & 0x3f)); OUTPUT(0x80 | ((ch & 0x3) << 4) | ((ch2 & 0x03c0) >> 6)); OUTPUT(0x80 | (ch2 & 0x3f)); } } if (buflen < 1) goto toolong; *buf = '\0'; return; toolong: SEE_error_throw_string(interp, interp->RangeError, STR(string_limit_reached)); } #undef OUTPUT /* * Extends a string, marking the original string as ungrowable. */ static struct SEE_string * simple_concat(interp, a, b) struct SEE_interpreter *interp; struct simple_string *a; const struct SEE_string *b; { struct simple_string *cp; cp = SEE_NEW(interp, struct simple_string); memcpy(cp, a, sizeof (struct simple_string)); MAKE_UNGROWABLE(&a->string); SEE_string_append(&cp->string, b); return (struct SEE_string *)cp; } /* * Concatenates two strings together and return the resulting string. * May return one of the original strings, or a new string altogether. * May modify a. String b will not be modified, but it may be returned. */ struct SEE_string * SEE_string_concat(interp, a, b) struct SEE_interpreter *interp; struct SEE_string *a, *b; { struct SEE_string *s; if (a->length == 0) return b; if (b->length == 0) return a; if (a->stringclass == &simple_stringclass) return simple_concat(interp, (struct simple_string *)a, b); s = SEE_string_new(interp, a->length + b->length); if (a->length) memcpy(s->data, a->data, a->length * sizeof (SEE_char_t)); if (b->length) memcpy(s->data + a->length, b->data, b->length * sizeof (SEE_char_t)); s->length = a->length + b->length; return s; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/stringdefs.c��������������������������������������������������������������0000664�0000000�0000000�00000003523�12660066715�0017661�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: stringdefs.c 751 2004-12-02 11:24:25Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #include "see_type.h" #include "see_string.h" /* The static string tables are generated by string.pl. */ #include "see_stringdefs.h" #include "see_stringdefs.inc" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/system.c������������������������������������������������������������������0000664�0000000�0000000�00000016651�12660066715�0017043�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2005 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id$ */ #include "see_type.h" #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <stdlib.h> #endif #if HAVE_TIME # if TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> # else # if HAVE_SYS_TIME_H # include <sys/time.h> # else # include <time.h> # endif # endif #endif #if HAVE_GC_H # include "gc/gc.h" #else # if HAVE_GC_MALLOC extern void *GC_malloc(int); # endif # if HAVE_GC_MALLOC_ATOMIC extern void *GC_malloc_atomic(int); # endif # if HAVE_GC_FREE extern void GC_free(void *); # endif #endif #include "see_interpreter.h" #include "see_system.h" #include "see_dprint.h" #include "see_platform.h" /* Prototypes */ static unsigned int simple_random_seed(void); #if HAVE_GC_MALLOC static void *simple_gc_malloc(struct SEE_interpreter *, SEE_size_t); static void *simple_gc_malloc_string(struct SEE_interpreter *, SEE_size_t); static void *simple_gc_malloc_finalize(struct SEE_interpreter *, SEE_size_t, void (*)(struct SEE_interpreter *, void *, void *), void *); static void simple_gc_free(struct SEE_interpreter *, void *); static void simple_finalizer(GC_PTR, GC_PTR); static void simple_gc_gcollect(struct SEE_interpreter *); #else static void *simple_malloc(struct SEE_interpreter *, SEE_size_t); static void *simple_malloc_finalize(struct SEE_interpreter *, SEE_size_t, void (*)(struct SEE_interpreter *, void *, void *), void *); static void simple_free(struct SEE_interpreter *, void *); #endif static void simple_mem_exhausted(struct SEE_interpreter *) SEE_dead; /* * System defaults. This structure should be not be modified after * interpreters are created. */ struct SEE_system SEE_system = { NULL, /* default_locale */ -1, /* default_recursion_limit */ NULL, /* default_trace */ SEE_COMPAT_262_3B, /* default_compat_flags */ simple_random_seed, /* random_seed */ _SEE_platform_abort, /* abort */ NULL, /* periodic */ #if HAVE_GC_MALLOC simple_gc_malloc, /* malloc */ simple_gc_malloc_finalize, /* malloc_finalize */ simple_gc_malloc_string, /* malloc_string */ simple_gc_free, /* free */ simple_mem_exhausted, /* mem_exhausted */ simple_gc_gcollect, /* gcollect */ #else simple_malloc, /* malloc */ simple_malloc_finalize, /* malloc_finalize */ simple_malloc, /* malloc_string */ simple_free, /* free */ simple_mem_exhausted, /* mem_exhausted */ NULL, /* gcollect */ #endif NULL /* transit_sec_domain */ }; /* * A simple random number seed generator. It is not thread safe. */ static unsigned int simple_random_seed() { static unsigned int counter = 0; unsigned int r; r = counter++; #if HAVE_TIME r += (unsigned int)time(0); #endif return r; } /* * A simple memory exhausted handler. */ static void simple_mem_exhausted(interp) struct SEE_interpreter *interp; { SEE_ABORT(interp, "memory exhausted"); } #if HAVE_GC_MALLOC /* * Memory allocator using Boehm GC */ static void * simple_gc_malloc(interp, size) struct SEE_interpreter *interp; SEE_size_t size; { return GC_malloc(size); } /* * A private structure to hold finalization info. This is appended onto * objects that are allocated with finalization requirements. */ struct finalize_info { struct SEE_interpreter *interp; void (*finalizefn)(struct SEE_interpreter *, void *, void *); void *closure; }; static void simple_finalizer(p, cd) GC_PTR p, cd; { struct finalize_info *info = (struct finalize_info *)cd; (*info->finalizefn)(info->interp, (void *)p, info->closure); } static void * simple_gc_malloc_finalize(interp, size, finalizefn, closure) struct SEE_interpreter *interp; SEE_size_t size; void (*finalizefn)(struct SEE_interpreter *, void *, void *); void *closure; { SEE_size_t padsz; void *data; struct finalize_info *info; /* Round up to align the finalize_info */ padsz = size; padsz += sizeof (struct finalize_info) - 1; padsz -= padsz % sizeof (struct finalize_info); /* Allocate, with space for the finalize_info */ data = GC_malloc(padsz + sizeof (struct finalize_info)); /* Fill in the finalize_info now */ info = (struct finalize_info *)((char *)data + padsz); info->interp = interp; info->finalizefn = finalizefn; info->closure = closure; /* Ask the GC to call the finalizer when data is unreachable */ GC_register_finalizer(data, simple_finalizer, info, NULL, NULL); return data; } /* * Non-pointer memory allocator using Boehm GC */ static void * simple_gc_malloc_string(interp, size) struct SEE_interpreter *interp; SEE_size_t size; { # if HAVE_GC_MALLOC_ATOMIC return GC_malloc_atomic(size); # else return GC_malloc(size); # endif } /* * Non-pointer memory allocator using Boehm GC */ static void simple_gc_free(interp, ptr) struct SEE_interpreter *interp; void *ptr; { # if HAVE_GC_FREE GC_free(ptr); # endif } static void simple_gc_gcollect(interp) struct SEE_interpreter *interp; { # if HAVE_GC_GCOLLECT GC_gcollect(); # endif } #else /* !HAVE_GC_MALLOC */ /* * Memory allocator using system malloc(). * Note: most mallocs do not get freed! * System strongly assumes a garbage collector. * This is a stub function. */ static void * simple_malloc(interp, size) struct SEE_interpreter *interp; SEE_size_t size; { #ifndef NDEBUG static int warning_printed = 0; if (!warning_printed) { warning_printed++; dprintf("WARNING: SEE is using non-release malloc\n"); } #endif return malloc(size); } static void * simple_malloc_finalize(interp, size, finalizefn, closure) struct SEE_interpreter *interp; SEE_size_t size; void (*finalizefn)(struct SEE_interpreter *, void *, void *); void *closure; { #ifndef NDEBUG static int warning_printed = 0; if (!warning_printed) { warning_printed++; dprintf("WARNING: SEE is using non-finalize malloc\n"); } #endif return malloc(size); } /* * Memory deallocator using system free(). */ static void simple_free(interp, ptr) struct SEE_interpreter *interp; void *ptr; { free(ptr); } #endif /* !HAVE_GC_MALLOC */ ���������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/tokens.c������������������������������������������������������������������0000664�0000000�0000000�00000016460�12660066715�0017020�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: tokens.c 988 2006-01-31 01:51:50Z d $ */ /* * Token tables for the lexical analyser. * * The textual form of keywords and punctuators are * kept here. See lex.c for how the tables are used. */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> #endif #if HAVE_STRING_H # include <string.h> #endif #include "see_type.h" #include "see_string.h" #include "see_stringdefs.h" #include "see_lex.h" #include "see_tokens.h" #define lengthof(a) (sizeof a / sizeof a[0]) struct strtoken SEE_tok_keywords[] = { { STR(synchronized), tRESERVED }, { STR(eleven_filler), tRESERVED }, /* hack */ { STR(implements), tRESERVED }, { STR(instanceof), tINSTANCEOF }, { STR(transient), tRESERVED }, { STR(protected), tRESERVED }, { STR(interface), tRESERVED }, { STR(volatile), tRESERVED }, { STR(debugger), tRESERVED }, { STR(function), tFUNCTION }, { STR(continue), tCONTINUE }, { STR(abstract), tRESERVED }, { STR(private), tRESERVED }, { STR(package), tRESERVED }, { STR(extends), tRESERVED }, { STR(boolean), tRESERVED }, { STR(finally), tFINALLY }, { STR(default), tDEFAULT }, { STR(native), tRESERVED }, { STR(export), tRESERVED }, { STR(typeof), tTYPEOF }, { STR(switch), tSWITCH }, { STR(return), tRETURN }, { STR(throws), tRESERVED }, { STR(import), tRESERVED }, { STR(static), tRESERVED }, { STR(delete), tDELETE }, { STR(public), tRESERVED }, { STR(double), tRESERVED }, { STR(float), tRESERVED }, { STR(super), tRESERVED }, { STR(short), tRESERVED }, { STR(const), tRESERVED }, { STR(class), tRESERVED }, { STR(while), tWHILE }, { STR(final), tRESERVED }, { STR(throw), tTHROW }, { STR(catch), tCATCH }, { STR(break), tBREAK }, { STR(false), tFALSE }, { STR(with), tWITH }, { STR(long), tRESERVED }, { STR(null), tNULL }, { STR(true), tTRUE }, { STR(void), tVOID }, { STR(else), tELSE }, { STR(goto), tRESERVED }, { STR(enum), tRESERVED }, { STR(this), tTHIS }, { STR(byte), tRESERVED }, { STR(case), tCASE }, { STR(char), tRESERVED }, { STR(new), tNEW }, { STR(try), tTRY }, { STR(int), tRESERVED }, { STR(for), tFOR }, { STR(var), tVAR }, { STR(in), tIN }, { STR(do), tDO }, { STR(if), tIF }, }; int SEE_tok_nkeywords = lengthof(SEE_tok_keywords); static struct token operators1[] = { { {'?'}, '?' }, { {'{'}, '{' }, { {'}'}, '}' }, { {'('}, '(' }, { {')'}, ')' }, { {'['}, '[' }, { {']'}, ']' }, { {'.'}, '.' }, { {';'}, ';' }, { {','}, ',' }, { {'<'}, '<' }, { {'>'}, '>' }, { {':'}, ':' }, { {'='}, '=' }, { {'|'}, '|' }, { {'^'}, '^' }, { {'!'}, '!' }, { {'~'}, '~' }, { {'*'}, '*' }, { {'-'}, '-' }, { {'+'}, '+' }, { {'%'}, '%' }, { {'&'}, '&' }, { {0}, 0 } }, operators2[] = { { {'-','-'}, tMINUSMINUS }, { {'<','<'}, tLSHIFT }, { {'>','>'}, tRSHIFT }, { {'&','&'}, tANDAND }, { {'|','|'}, tOROR }, { {'+','='}, tPLUSEQ }, { {'-','='}, tMINUSEQ }, { {'*','='}, tSTAREQ }, { {'%','='}, tMODEQ }, { {'&','='}, tANDEQ }, { {'|','='}, tOREQ }, { {'^','='}, tXOREQ }, { {'<','='}, tLE }, { {'>','='}, tGE }, { {'=','='}, tEQ }, { {'!','='}, tNE }, { {'+','+'}, tPLUSPLUS }, { {0}, 0 } }, operators3[] = { { {'>','>','='}, tRSHIFTEQ }, { {'<','<','='}, tLSHIFTEQ }, { {'>','>','>'}, tURSHIFT }, { {'=','=','='}, tSEQ }, { {'!','=','='}, tSNE }, { {0}, 0 } }, operators4[] = { { {'<','!','-','-'}, tSGMLCOMMENT }, { {'>','>','>','='}, tURSHIFTEQ }, { {0}, 0 } }; struct token *SEE_tok_operators[] = { NULL, operators1, operators2, operators3, operators4 }; int SEE_tok_noperators = lengthof(SEE_tok_operators); static struct { const char *name; int token; } tok_names[] = { { "end of file", tEND }, { "a comment", tCOMMENT }, { "a line break", tLINETERMINATOR }, { "'/='", tDIVEQ }, { "'/'", tDIV }, { "a number", tNUMBER }, { "a string", tSTRING }, { "an identifier", tIDENT }, { "a regular expression",tREGEX }, { "a reserved word", tRESERVED }, { "'instanceof'", tINSTANCEOF }, { "'function'", tFUNCTION }, { "'continue'", tCONTINUE }, { "'finally'", tFINALLY }, { "'default'", tDEFAULT }, { "'typeof'", tTYPEOF }, { "'switch'", tSWITCH }, { "'return'", tRETURN }, { "'delete'", tDELETE }, { "'while'", tWHILE }, { "'throw'", tTHROW }, { "'catch'", tCATCH }, { "'break'", tBREAK }, { "'with'", tWITH }, { "'void'", tVOID }, { "'else'", tELSE }, { "'this'", tTHIS }, { "'case'", tCASE }, { "'new'", tNEW }, { "'try'", tTRY }, { "'for'", tFOR }, { "'var'", tVAR }, { "'in'", tIN }, { "'do'", tDO }, { "'if'", tIF }, { "'>>>='", tURSHIFTEQ }, { "'<!--'", tSGMLCOMMENT }, { "'>>='", tRSHIFTEQ }, { "'<<='", tLSHIFTEQ }, { "'>>>'", tURSHIFT }, { "'==='", tSEQ }, { "'!=='", tSNE }, { "'--'", tMINUSMINUS }, { "'<<'", tLSHIFT }, { "'>>'", tRSHIFT }, { "'&&'", tANDAND }, { "'||'", tOROR }, { "'+='", tPLUSEQ }, { "'-='", tMINUSEQ }, { "'*='", tSTAREQ }, { "'%='", tMODEQ }, { "'&='", tANDEQ }, { "'|='", tOREQ }, { "'^='", tXOREQ }, { "'<='", tLE }, { "'>='", tGE }, { "'=='", tEQ }, { "'!='", tNE }, { "'++'", tPLUSPLUS }, { "'true'", tTRUE }, { "'false'", tFALSE }, { "'null'", tNULL } }; const char * SEE_tokenname(token) int token; { static char buf[30]; SEE_tokenname_buf(token, buf, sizeof buf); return buf; } void SEE_tokenname_buf(token, buf, buflen) int token; char *buf; int buflen; { int i; char tokch[4]; const char *name; int namelen; for (i = 0; i < lengthof(tok_names); i++) if (tok_names[i].token == token) { name = tok_names[i].name; break; } else if (token >= ' ' && token <= '~') { tokch[0] = '\''; tokch[1] = (unsigned char)token; tokch[2] = '\''; tokch[3] = 0; name = tokch; } else name = "<bad token>"; namelen = strlen(name); if (namelen > buflen - 1) namelen = buflen - 1; memcpy(buf, name, namelen); buf[namelen] = 0; return; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/try.c���������������������������������������������������������������������0000664�0000000�0000000�00000010702�12660066715�0016324�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: try.c 1081 2006-05-07 05:58:32Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <stdlib.h> #endif #include "see_type.h" #include "see_value.h" #include "see_try.h" #include "see_object.h" #include "see_string.h" #include "see_debug.h" #include "see_interpreter.h" #include "see_system.h" #include "see_stringdefs.h" #include "see_dprint.h" /* * Exception handling * * This implementation of exceptions uses the C stack and * C's setjmp/longjmp to implement exceptions. The TRY macro * is a sets up and tests a setjmp, and the THROW macros * just do a longjmp. (That is why a garbage collector is * needed!) * * NOTE: I had considered using a special-return mechanism * for exceptions, but the complexity, performance and annoyance * of the vast number of 'return checking' required and the * small number of expected actual exceptions during normal * operation made this mechanism far more favourable. Also, * setjmp/longjmp is part of standard POSIX and ANSI C, so * portability is not really lost. */ /** * Handles an uncatchable exception by aborting. * * This can happen when a SEE_THROW occurs outside of any SEE_TRY context, * or when an error occurs during low-level throw handling. (See * SEE_error_throw(), for instance). */ void SEE_throw_abort(interp, v, file, line) struct SEE_interpreter *interp; const struct SEE_value *v; const char *file; int line; { #ifndef NDEBUG dprintf("%s:%d: threw uncatchable exception\n", file, line); if (v != NULL) { SEE_try_context_t ctx; dprintf(" exception: "); SEE_TRY(interp, ctx) dprintv(interp, v); if (SEE_CAUGHT(ctx)) dprintf("<error printing value>"); dprintf("\n"); } #endif SEE_ABORT(interp, "exception thrown but no TRY block"); } /** * Returns a growable string containing a location in the * form "program.js:23: ", or empty if loc is NULL. * This string is useful as a prefix for forming messages generated * by exceptions. */ struct SEE_string * SEE_location_string(interp, loc) struct SEE_interpreter *interp; struct SEE_throw_location *loc; { struct SEE_string *s; s = SEE_string_new(interp, 0); if (loc == NULL) return s; SEE_string_append(s, loc->filename ? loc->filename : STR(unknown_file)); SEE_string_addch(s, ':'); SEE_string_append_int(s, loc->lineno); SEE_string_addch(s, ':'); SEE_string_addch(s, ' '); return s; } #ifndef NDEBUG /** * A dummy function for debugging. * This function exists solely for debuggers to break on. * It is called immediately before the longjmp takes effect. */ void SEE_throw() { } #endif /** * Handles a longjmp failure by calling the interpreter abort hook. * This function is provided by ANSI for catching problems with * longjmp (eg, corrupted jmp_buf). Defining it here occludes any * system definition (which on unix is just a call to abort()). */ void longjmperror() { SEE_ABORT(NULL, "longjmp error"); } ��������������������������������������������������������������silverjuke-16.2.3/src/see/unicase.c�����������������������������������������������������������������0000664�0000000�0000000�00000005377�12660066715�0017151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2005 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id$ */ #if HAVE_CONFIG_H # include <config.h> #endif # include "see_unicode.h" #if !WITH_UNICODE_TABLES #warning "Unicode tables are omitted; library will not be ECMA-262 compliant" #else /* WITH_UNICODE_TABLES */ struct case_map { SEE_char_t from, to; }; /* Prototypes */ static SEE_char_t search(struct case_map *, unsigned int, unsigned int); # include "see_unicase.inc" # define lengthof(a) (sizeof a / sizeof (a)[0]) /* Binary search a map for the character. Usually done in 9 steps. */ static SEE_char_t search(map, ch, maplen) struct case_map *map; unsigned int ch; /* promoted from SEE_char_t */ unsigned int maplen; { unsigned int a, b, m; a = 0; b = maplen; for (;;) { m = (a + b) / 2; if (map[m].from == ch) return map[m].to; if (map[m].from > ch) { if (b == m) break; b = m; } else { if (a == m) break; a = m; } } return ch; } SEE_char_t SEE_unicase_tolower(ch) unsigned int ch; /* promoted from SEE_char_t */ { return search(lowercase_map, ch, lengthof(lowercase_map)); } SEE_char_t SEE_unicase_toupper(ch) unsigned int ch; /* promoted from SEE_char_t */ { return search(uppercase_map, ch, lengthof(uppercase_map)); } #endif /* WITH_UNICODE_TABLES */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/unicode.c�����������������������������������������������������������������0000664�0000000�0000000�00000003433�12660066715�0017137�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2005 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id$ */ #include "see_type.h" #if HAVE_CONFIG_H # include <config.h> #endif #if WITH_UNICODE_TABLES # include "see_unicode.h" # include "see_unicode.inc" #else #warning "Unicode tables are omitted; library will not be ECMA-262 compliant" #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see/value.c�������������������������������������������������������������������0000664�0000000�0000000�00000023645�12660066715�0016634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2003 * David Leonard. 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 Mr Leonard nor the names of the contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID LEONARD 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 DAVID LEONARD 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. */ /* $Id: value.c 1021 2006-02-08 15:40:35Z d $ */ #if HAVE_CONFIG_H # include <config.h> #endif #if STDC_HEADERS # include <stdio.h> # include <string.h> #endif #include "see_mem.h" #include "see_type.h" #include "see_value.h" #include "see_string.h" #include "see_object.h" #include "see_input.h" #include "see_error.h" #include "see_interpreter.h" #include "see_lex.h" #include "see_stringdefs.h" #include "see_dtoa.h" #include "see_nmath.h" /* * Value type-converters and some numeric constants. */ /* IEEE-754 constants */ const unsigned char # if WORDS_BIGENDIAN SEE_literal_NaN[8] = { 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, SEE_literal_Inf[8] = { 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, SEE_literal_Max[8] = { 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, SEE_literal_Min[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }; # else /* little endian */ SEE_literal_NaN[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, SEE_literal_Inf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f }, SEE_literal_Max[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f }, SEE_literal_Min[8] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; # endif /* little endian */ /* Convenience array for generating hexadecimal numbers */ char SEE_hexstr_lowercase[16] = { '0','1','2','3','4','5','6','7', '8','9','a','b','c','d','e','f' }; char SEE_hexstr_uppercase[16] = { '0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F' }; /* 9.1 */ void SEE_ToPrimitive(interp, val, type, res) struct SEE_interpreter *interp; struct SEE_value *val, *type, *res; { if (SEE_VALUE_GET_TYPE(val) == SEE_OBJECT) SEE_OBJECT_DEFAULTVALUE(interp, val->u.object, type, res); else SEE_VALUE_COPY(res, val); } /* 9.2 */ void SEE_ToBoolean(interp, val, res) struct SEE_interpreter *interp; struct SEE_value *val, *res; { switch (SEE_VALUE_GET_TYPE(val)) { case SEE_UNDEFINED: case SEE_NULL: SEE_SET_BOOLEAN(res, 0); break; case SEE_BOOLEAN: SEE_VALUE_COPY(res, val); break; case SEE_NUMBER: if (val->u.number == 0 || SEE_NUMBER_ISNAN(val)) SEE_SET_BOOLEAN(res, 0); else SEE_SET_BOOLEAN(res, 1); break; case SEE_STRING: if (val->u.string->length == 0) SEE_SET_BOOLEAN(res, 0); else SEE_SET_BOOLEAN(res, 1); break; case SEE_OBJECT: if (SEE_COMPAT_JS(interp, <=, JS12)) { /* In JS <= 1.2, Boolean instances convert to bool */ extern struct SEE_objectclass _SEE_boolean_inst_class; struct SEE_object *bo = val->u.object; if (bo->objectclass == &_SEE_boolean_inst_class) { struct SEE_value vo; SEE_OBJECT_GET(interp, bo, STR(valueOf), &vo); if (SEE_VALUE_GET_TYPE(&vo) == SEE_OBJECT && SEE_OBJECT_HAS_CALL(vo.u.object)) { SEE_OBJECT_CALL(interp, vo.u.object, bo, 0, NULL, res); if (SEE_VALUE_GET_TYPE(res) == SEE_BOOLEAN) break; } } } SEE_SET_BOOLEAN(res, 1); break; default: SEE_error_throw_string(interp, interp->TypeError, STR(toboolean_bad)); } } /* 9.3 */ void SEE_ToNumber(interp, val, res) struct SEE_interpreter *interp; struct SEE_value *val, *res; { switch (SEE_VALUE_GET_TYPE(val)) { case SEE_UNDEFINED: SEE_SET_NUMBER(res, SEE_NaN); break; case SEE_NULL: SEE_SET_NUMBER(res, 0.0); break; case SEE_BOOLEAN: SEE_SET_NUMBER(res, val->u.boolean ? 1.0 : 0.0); break; case SEE_NUMBER: SEE_VALUE_COPY(res, val); break; case SEE_STRING: { /* Use the scanner to evaluate a StrNumericLiteral */ if (!SEE_lex_number(interp, val->u.string, res)) SEE_SET_NUMBER(res, SEE_NaN); break; } case SEE_OBJECT: { struct SEE_value hint, primitive; SEE_SET_OBJECT(&hint, interp->Number); SEE_ToPrimitive(interp, val, &hint, &primitive); SEE_ToNumber(interp, &primitive, res); break; } default: SEE_error_throw_string(interp, interp->TypeError, STR(tonumber_bad)); } } /* 9.4 */ void SEE_ToInteger(interp, val, res) struct SEE_interpreter *interp; struct SEE_value *val, *res; { SEE_ToNumber(interp, val, res); if (SEE_NUMBER_ISNAN(res)) res->u.number = 0.0; else if (SEE_NUMBER_ISINF(res) || res->u.number == 0.0) ; /* nothing */ else res->u.number = NUMBER_copysign(floor( NUMBER_copysign(res->u.number, 1.0)), res->u.number); } /* 9.5 */ SEE_int32_t SEE_ToInt32(interp, val) struct SEE_interpreter *interp; struct SEE_value *val; { return (SEE_int32_t)SEE_ToUint32(interp, val); } /* 9.6 */ SEE_uint32_t SEE_ToUint32(interp, val) struct SEE_interpreter *interp; struct SEE_value *val; { struct SEE_value i; SEE_ToInteger(interp, val, &i); if (SEE_NUMBER_ISINF(&i) || i.u.number == 0.0) return 0; else { i.u.number = fmod(i.u.number, 4294967296.0); /* 2^32 */ if (i.u.number < 0) i.u.number += 4294967296.0; return (SEE_uint32_t)i.u.number; } } /* 9.7 */ SEE_uint16_t SEE_ToUint16(interp, val) struct SEE_interpreter *interp; struct SEE_value *val; { struct SEE_value i; /* NB: slightly different to standard, but equivalent */ SEE_ToInteger(interp, val, &i); if (SEE_NUMBER_ISINF(&i) || i.u.number == 0.0) return 0; else { i.u.number = fmod(i.u.number, 65536.0); /* 2^16 */ if (i.u.number < 0) return (SEE_uint16_t)(i.u.number + 65536.0); else return (SEE_uint16_t)i.u.number; } } /* 9.8 */ void SEE_ToString(interp, val, res) struct SEE_interpreter *interp; struct SEE_value *val, *res; { switch (SEE_VALUE_GET_TYPE(val)) { case SEE_UNDEFINED: SEE_SET_STRING(res, STR(undefined)); break; case SEE_NULL: SEE_SET_STRING(res, STR(null)); break; case SEE_BOOLEAN: SEE_SET_STRING(res, val->u.boolean ? STR(true) : STR(false)); break; case SEE_NUMBER: /* 9.8.1 */ if (SEE_NUMBER_ISNAN(val)) { SEE_SET_STRING(res, STR(NaN)); } else if (val->u.number == 0) { SEE_SET_STRING(res, STR(zero_digit)); } else if (val->u.number < 0) { struct SEE_value neg, negstr; SEE_SET_NUMBER(&neg, -(val->u.number)); SEE_ToString(interp, &neg, &negstr); SEE_SET_STRING(res, SEE_string_concat(interp, STR(minus), negstr.u.string)); } else if (SEE_NUMBER_ISPINF(val)) { SEE_SET_STRING(res, STR(Infinity)); } else { char *a, *endstr; struct SEE_string *s; int sign, k, n, i, exponent; a = SEE_dtoa(val->u.number, DTOA_MODE_SHORT_SW, 31, &n, &sign, &endstr); k = (int)(endstr - a); s = SEE_string_new(interp, 0); SEE_ASSERT(interp, !sign); if (k <= n && n <= 21) { for (i = 0; i < k; i++) SEE_string_addch(s, a[i]); for (i = 0; i < n-k; i++) SEE_string_addch(s, '0'); } else if (0 < n && n <= 21) { for (i = 0; i < n; i++) SEE_string_addch(s, a[i]); SEE_string_addch(s, '.'); for (; i < k; i++) SEE_string_addch(s, a[i]); } else if (-6 < n && n <= 0) { SEE_string_addch(s, '0'); SEE_string_addch(s, '.'); for (i = 0; i < -n; i++) SEE_string_addch(s, '0'); for (i = 0; i < k; i++) SEE_string_addch(s, a[i]); } else if (k == 1) { SEE_string_addch(s, a[0]); goto add_exponent; } else { SEE_string_addch(s, a[0]); SEE_string_addch(s, '.'); for (i = 1; i < k; i++) SEE_string_addch(s, a[i]); add_exponent: SEE_string_addch(s, 'e'); exponent = n - 1; if (exponent > 0) SEE_string_addch(s, '+'); SEE_string_append_int(s, exponent); } SEE_SET_STRING(res, s); SEE_freedtoa(a); } break; case SEE_STRING: SEE_VALUE_COPY(res, val); break; case SEE_OBJECT: { struct SEE_value prim; struct SEE_value hint; SEE_SET_OBJECT(&hint, interp->String); SEE_ToPrimitive(interp, val, &hint, &prim); SEE_ToString(interp, &prim, res); break; } default: SEE_error_throw_string(interp, interp->TypeError, STR(tostring_bad)); } } /* 9.9 */ void SEE_ToObject(interp, val, res) struct SEE_interpreter *interp; struct SEE_value *val, *res; { struct SEE_object *obj; struct SEE_value *arg[1]; switch (SEE_VALUE_GET_TYPE(val)) { case SEE_UNDEFINED: SEE_error_throw_string(interp, interp->TypeError, STR(toobject_undefined)); case SEE_NULL: SEE_error_throw_string(interp, interp->TypeError, STR(toobject_null)); case SEE_OBJECT: SEE_VALUE_COPY(res, val); return; case SEE_BOOLEAN: obj = interp->Boolean; break; case SEE_NUMBER: obj = interp->Number; break; case SEE_STRING: obj = interp->String; break; default: SEE_error_throw_string(interp, interp->TypeError, STR(toobject_bad)); } arg[0] = val; SEE_OBJECT_CONSTRUCT(interp, obj, obj, 1, arg, res); } �������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0016201�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/obj_Database.cpp������������������������������������������������������0000664�0000000�0000000�00000015415�12660066715�0021251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_Database.cpp * Authors: Björn Petersen * Purpose: The Database class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include "sj_see.h" #include "sj_see_helpers.h" // data used by our object struct database_object { SEE_native native; // MUST be first! wxSqltDb* db; wxSqlt* sql; }; static void database_finalize(SEE_interpreter* interpr, void* ptr, void* closure) { database_object* dbo = (database_object*)ptr; delete dbo->sql; delete dbo->db; } static database_object* alloc_database_object(SEE_interpreter* interpr) { database_object* dbo = (database_object*)SEE_malloc_finalize(interpr, sizeof(database_object), database_finalize, NULL); memset(dbo, 0, sizeof(database_object)); return dbo; } static database_object* toDatabase(SEE_interpreter* interpr, SEE_object* o); /******************************************************************************* * Database methods ******************************************************************************/ IMPLEMENT_FUNCTION(database, construct) { RETURN_OBJECT( HOST_DATA->Database_new(ARG_STRING(0)) ); } IMPLEMENT_FUNCTION(database, openQuery) { database_object* dbo = toDatabase(interpr_, this_); RETURN_BOOL( dbo->sql->Query(ARG_STRING(0)) ); } IMPLEMENT_FUNCTION(database, nextRecord) { database_object* dbo = toDatabase(interpr_, this_); RETURN_BOOL( dbo->sql->Next() ); } IMPLEMENT_FUNCTION(database, getFieldCount) { database_object* dbo = toDatabase(interpr_, this_); RETURN_LONG( dbo->sql->GetFieldCount() ); } IMPLEMENT_FUNCTION(database, getField) { database_object* dbo = toDatabase(interpr_, this_); long n = ARG_LONG(0); if( n == -2 ) { RETURN_LONG( dbo->sql->GetChangedRows() ); } else if( n == -1 ) { RETURN_LONG( dbo->sql->GetInsertId() ); } else if( n < 0 || n >= dbo->sql->GetFieldCount() ) { SEE_error_throw(interpr_, interpr_->RangeError, "bad index"); } else { if( dbo->sql->IsSet( n ) ) RETURN_STRING( dbo->sql->GetString( n ) ); else RETURN_UNDEFINED; } } IMPLEMENT_FUNCTION(database, closeQuery) { database_object* dbo = toDatabase(interpr_, this_); dbo->sql->CloseQuery(); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(database, getFile) { database_object* dbo = toDatabase(interpr_, this_); wxSqltDb* db = dbo->db? dbo->db : wxSqltDb::GetDefault(); if( db ) RETURN_STRING( db->GetFile() ); else RETURN_UNDEFINED; } /******************************************************************************* * Database statics ******************************************************************************/ IMPLEMENT_FUNCTION(database, update) { if( g_mainFrame ) RETURN_BOOL( g_mainFrame->UpdateIndex(g_mainFrame, ARG_BOOL(0)) ); else RETURN_FALSE; } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for Database.prototype and database instances */ static SEE_objectclass database_inst_class = { "Database", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for Database constructor */ static SEE_objectclass database_constructor_class = { "DatabaseConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ database_construct, /* Construct */ NULL /* Call */ }; void SjSee::Database_init() { SEE_value temp; // Create the "Database.prototype" object, this is used as a template for the instances m_Database_prototype = (SEE_object *)alloc_database_object(m_interpr); SEE_native_init((SEE_native *)m_Database_prototype, m_interpr, &database_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_Database_prototype, database, openQuery, 0); PUT_FUNC(m_Database_prototype, database, nextRecord, 0); PUT_FUNC(m_Database_prototype, database, getFieldCount, 0); PUT_FUNC(m_Database_prototype, database, getField, 0); PUT_FUNC(m_Database_prototype, database, closeQuery, 0); PUT_FUNC(m_Database_prototype, database, getFile, 0); // create the "Database" object SEE_object* Database = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)Database, m_interpr, &database_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(Database, str_prototype, m_Database_prototype) PUT_FUNC(Database, database, update, 0); // static function // now we can add the globals PUT_OBJECT(m_interpr->Global, str_Database, Database); } SEE_object* SjSee::Database_new(const wxString& name) { database_object* obj = alloc_database_object(m_interpr); SEE_native_init(&obj->native, m_interpr, &database_inst_class, m_Database_prototype); if( !name.IsEmpty() ) { obj->db = new wxSqltDb(name); } obj->sql = new wxSqlt(obj->db); return (SEE_object *)obj; } static database_object* toDatabase(SEE_interpreter* interpr, SEE_object* o) { if( o->objectclass != &database_inst_class ) SEE_error_throw(interpr, interpr->TypeError, NULL); return (database_object *)o; } #endif // SJ_USE_SCRIPTS ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/obj_Dialog.cpp��������������������������������������������������������0000664�0000000�0000000�00000036752�12660066715�0020753�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_Dialog.cpp * Authors: Björn Petersen * Purpose: The Dialog class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <sjtools/console.h> #include <sjtools/msgbox.h> #include <sjmodules/advsearch.h> #include <sjmodules/openfiles.h> #include <see_dom/sj_see.h> #include <see_dom/sj_see_helpers.h> // data used by our object class SjApiDlg : public SjDialog { public: SjApiDlg (struct dialog_object* dlo, wxWindow* parent, SjDialogMode mode); void DoReallyClose (); SjDialogMode m_mode; long m_lastButtonIndex; private: struct dialog_object* m_dlo; void OnAnyButton (wxCommandEvent&); void OnClose (wxCloseEvent&) { wxCommandEvent fwd(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); OnAnyButton(fwd); } DECLARE_EVENT_TABLE () }; struct dialog_object { SEE_native m_native; // MUST be first!!! SjSee* m_see; SjDlgControls* m_controls; SjApiDlg* m_window; #define MAX_CONTROLS 1024 SEE_object* m_callbacks[MAX_CONTROLS]; // here they are handled by the garbage collection :-) }; static void dialog_finalize_(SEE_interpreter* interpr, void* ptr, void* closure) { // this function is also used as the "unexpected exit" for persistent objects; // as this is followed by the "normal finalizer", set all pointers to zero dialog_object* obj = ((dialog_object*)ptr); if( obj->m_window && obj->m_window->m_mode == SJ_MODELESS ) { obj->m_window->Destroy(); obj->m_window = NULL; } if( obj->m_controls ) { delete obj->m_controls; obj->m_controls = NULL; } } static dialog_object* alloc_dialog_object(SEE_interpreter* interpr) { dialog_object* dlo = (dialog_object*)SEE_malloc_finalize(interpr, sizeof(dialog_object), dialog_finalize_, NULL); memset(dlo, 0, sizeof(dialog_object)); dlo->m_controls = new SjDlgControls(); dlo->m_see = (SjSee*)interpr->host_data; return dlo; } static dialog_object* get_dialog_object(SEE_interpreter* interpr, SEE_object* o); /******************************************************************************* * Constructing ******************************************************************************/ IMPLEMENT_FUNCTION(dialog, construct) { RETURN_OBJECT( HOST_DATA->Dialog_new() ); } IMPLEMENT_FUNCTION(dialog, addTextCtrl) { dialog_object* dlo = get_dialog_object(interpr_, this_); dlo->m_controls->AddTextCtrl(ARG_STRING(0), ARG_STRING(1), ARG_STRING(2), wxT(""), 0); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, addMultilineCtrl) { dialog_object* dlo = get_dialog_object(interpr_, this_); dlo->m_controls->AddTextCtrl(ARG_STRING(0), ARG_STRING(1), ARG_STRING(2), wxT(""), wxTE_MULTILINE); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, addPasswordCtrl) { dialog_object* dlo = get_dialog_object(interpr_, this_); dlo->m_controls->AddTextCtrl(ARG_STRING(0), ARG_STRING(1), ARG_STRING(2), wxT(""), wxTE_PASSWORD); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, addSelectCtrl) { dialog_object* dlo = get_dialog_object(interpr_, this_); wxArrayString options; for( int o = 3; o < argc_; o++ ) options.Add(ARG_STRING(o)); dlo->m_controls->AddSelectCtrl(ARG_STRING(0), ARG_STRING(1), ARG_LONG(2), 0, options); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, addCheckCtrl) { dialog_object* dlo = get_dialog_object(interpr_, this_); dlo->m_controls->AddCheckCtrl(ARG_STRING(0), ARG_STRING(1), ARG_LONG(2), 0); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, addStaticText) { dialog_object* dlo = get_dialog_object(interpr_, this_); wxString id, label; if( argc_>=2 ) { id = ARG_STRING(0); label = ARG_STRING(1); } else { label = ARG_STRING(0); } dlo->m_controls->AddStatic(id, label); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, addButton) { dialog_object* dlo = get_dialog_object(interpr_, this_); SjDlgCtrl* ctrl = dlo->m_controls->AddButton(ARG_STRING(0), ARG_STRING(1)); if( ctrl->m_index < MAX_CONTROLS ) dlo->m_callbacks[ctrl->m_index] = ARG_CALLBACK(2); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, getValue) { dialog_object* dlo = get_dialog_object(interpr_, this_); wxString value = dlo->m_controls->GetValue(dlo->m_controls->Id2Index(ARG_STRING(0))); RETURN_STRING( value ); } IMPLEMENT_FUNCTION(dialog, setValue) { dialog_object* dlo = get_dialog_object(interpr_, this_); dlo->m_controls->SetValue(dlo->m_controls->Id2Index(ARG_STRING(0)), ARG_STRING(1)); RETURN_UNDEFINED; } /******************************************************************************* * Dialog Handling ******************************************************************************/ #define IDC_USER_BUTTON (IDM_FIRSTPRIVATE+3) BEGIN_EVENT_TABLE(SjApiDlg, SjDialog) EVT_BUTTON (IDC_USER_BUTTON, SjApiDlg::OnAnyButton ) EVT_BUTTON (wxID_OK, SjApiDlg::OnAnyButton ) EVT_BUTTON (wxID_CANCEL, SjApiDlg::OnAnyButton ) EVT_CLOSE ( SjApiDlg::OnClose ) END_EVENT_TABLE() SjApiDlg::SjApiDlg(dialog_object* dlo, wxWindow* parent, SjDialogMode mode) : SjDialog(parent, dlo->m_see->GetFineName(), mode, SJ_NEVER_RESIZEABLE) { dlo->m_see->AddPersistentObject((SEE_object*)dlo, SJ_PERSISTENT_OTHER, NULL, dialog_finalize_); m_dlo = dlo; m_mode = mode; m_lastButtonIndex = -1; dlo->m_window = this; // if there is no "ok" button, add "ok" and "cancel" if( dlo->m_controls->Id2Index(wxT("ok")) == -1 ) { dlo->m_controls->AddButton(wxT("ok"), wxT("")); if( dlo->m_controls->Id2Index(wxT("cancel")) == -1 ) dlo->m_controls->AddButton(wxT("cancel"), wxT("")); } // create the dialog ... wxSizer* sizer1 = new wxBoxSizer(wxVERTICAL); SetSizer(sizer1); // ... the controls wxSizer* sizer2 = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("")), wxVERTICAL); sizer1->Add(sizer2, 1, wxGROW|wxALL, SJ_DLG_SPACE); wxString defOkTitle, defCancelTitle; long defButtons = dlo->m_controls->Render(this, sizer2, IDC_USER_BUTTON, &defOkTitle, &defCancelTitle); // ... the default buttons sizer1->Add(CreateButtons(defButtons, defOkTitle, defCancelTitle), 0, wxGROW|wxLEFT|wxTOP|wxRIGHT|wxBOTTOM, SJ_DLG_SPACE); sizer1->SetSizeHints(this); CentreOnParent(); } void SjApiDlg::OnAnyButton(wxCommandEvent& event) { switch( event.GetId() ) { case wxID_OK: m_lastButtonIndex = m_dlo->m_controls->Id2Index(wxT("ok")); break; case wxID_CANCEL: m_lastButtonIndex = m_dlo->m_controls->Id2Index(wxT("cancel")); break; default: { wxWindow* button = (wxWindow*)event.GetEventObject(); m_lastButtonIndex = (long)button->GetClientData(); } break; } if( m_lastButtonIndex >= 0 && m_lastButtonIndex < MAX_CONTROLS && m_dlo->m_callbacks[m_lastButtonIndex] ) { // the script part may call close() which will close the dialog then SeeCallCallback(m_dlo->m_see->m_interpr, m_dlo->m_callbacks[m_lastButtonIndex], // function (SEE_object*)m_dlo // context ); } else { DoReallyClose(); // this may destroy the object through the garbage collection! } } void SjApiDlg::DoReallyClose() { // REALLY close the dialog wxASSERT( m_dlo->m_window == this ); m_dlo->m_controls->Unrender(); if( m_mode == SJ_MODELESS ) { Hide(); Destroy(); } else { EndModal(m_lastButtonIndex); } m_dlo->m_window = NULL; m_dlo->m_see->RemovePersistentObject((SEE_object*)m_dlo); } IMPLEMENT_FUNCTION(dialog, showModal) { dialog_object* dlo = get_dialog_object(interpr_, this_); if( dlo->m_window == NULL ) { wxWindow* parent = SjDialog::GetSuitableDlgParent(); SJ_WINDOW_DISABLER(parent); SjApiDlg dlg(dlo, parent, SJ_MODAL); long index = dlg.ShowModal(); wxASSERT( dlo->m_window == NULL ); SjDlgCtrl* ctrl = dlo->m_controls->GetCtrl(index); if( ctrl ) { RETURN_STRING( ctrl->m_id ); return; } } RETURN_UNDEFINED; } extern SEE_objectclass dialog_constructor_class; IMPLEMENT_FUNCTION(dialog, show) { if( this_->objectclass == &dialog_constructor_class ) { // use as static function wxString dlgName = ARG_STRING(0); dlgName.MakeLower(); if( dlgName == wxT("console") ) { SjLogGui::OpenManually(); } else if( dlgName == wxT("settings") ) { g_mainFrame->OpenSettings(ARG_STRING(1), ARG_LONG(2), ARG_LONG(3)); } else if( dlgName == wxT("musicsel") ) { g_advSearchModule->OpenDialog(); } else if( dlgName == wxT("openfiles") ) { g_openFilesModule->OpenDialog(ARG_BOOL(1)); } else if( dlgName == wxT("saveplaylist") ) { g_mainFrame->m_player.m_queue.SaveAsDlg(g_mainFrame); } } else { // use as instance function dialog_object* dlo = get_dialog_object(interpr_, this_); if( dlo->m_window == NULL ) { dlo->m_window = new SjApiDlg(dlo, g_mainFrame, SJ_MODELESS); dlo->m_window->Show(); } dlo->m_window->Raise(); } RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, close) { dialog_object* dlo = get_dialog_object(interpr_, this_); if( dlo->m_window ) { dlo->m_window->DoReallyClose(); } RETURN_UNDEFINED; } /******************************************************************************* * Globals ******************************************************************************/ IMPLEMENT_FUNCTION(dialog, alert) { wxWindow* parent = SjDialog::GetSuitableDlgParent(); SjMessageBox(ARG_STRING(0), HOST_DATA->GetFineName(), wxOK, parent); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, confirm) { wxWindow* parent = SjDialog::GetSuitableDlgParent(); bool ret = SjMessageBox(ARG_STRING(0), HOST_DATA->GetFineName(), wxYES_NO, parent)==wxYES; RETURN_BOOL( ret ); } IMPLEMENT_FUNCTION(dialog, prompt) { wxWindow* parent = SjDialog::GetSuitableDlgParent(); SJ_WINDOW_DISABLER(parent); wxTextEntryDialog textEntry(parent, ARG_STRING(0), HOST_DATA->GetFineName(), ARG_STRING(1)); if( textEntry.ShowModal() == wxID_OK ) RETURN_STRING( textEntry.GetValue() ); else RETURN_FALSE; } IMPLEMENT_FUNCTION(dialog, fileSel) { wxWindow* parent = SjDialog::GetSuitableDlgParent(); SJ_WINDOW_DISABLER(parent); wxFileDialog fileDlg(parent, HOST_DATA->GetFineName(ARG_STRING(0)), wxT(""), ARG_STRING(1), wxString(_("All files")) + wxT(" (*.*)|*.*"), wxFD_CHANGE_DIR | (ARG_LONG(2)? wxFD_SAVE : wxFD_OPEN)); if( fileDlg.ShowModal() == wxID_OK ) RETURN_STRING( fileDlg.GetPath() ); else RETURN_FALSE; } IMPLEMENT_FUNCTION(dialog, logError) { wxString msg = ARG_STRING(0); wxLogError(wxT("%s [%s]"), msg.c_str(), HOST_DATA->m_executionScope.c_str()); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, logWarning) { wxString msg = ARG_STRING(0); wxLogWarning(wxT("%s [%s]"), msg.c_str(), HOST_DATA->m_executionScope.c_str()); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(dialog, print) { wxString msg = ARG_STRING(0); wxLogInfo(wxT("%s [%s]"), msg.c_str(), HOST_DATA->m_executionScope.c_str()); RETURN_UNDEFINED; } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for Dialog.prototype and dialog instances */ static SEE_objectclass dialog_inst_class = { "Dialog", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for Dialog constructor */ SEE_objectclass dialog_constructor_class = { "DialogConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ dialog_construct, /* Construct */ NULL /* Call */ }; void SjSee::Dialog_init() { SEE_value temp; // Create the "Dialog.prototype" object, this is used as a template for the instances m_Dialog_prototype = (SEE_object *)alloc_dialog_object(m_interpr); SEE_native_init((SEE_native *)m_Dialog_prototype, m_interpr, &dialog_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_Dialog_prototype, dialog, addTextCtrl, 0); PUT_FUNC(m_Dialog_prototype, dialog, addMultilineCtrl, 0); PUT_FUNC(m_Dialog_prototype, dialog, addPasswordCtrl, 0); PUT_FUNC(m_Dialog_prototype, dialog, addSelectCtrl, 0); PUT_FUNC(m_Dialog_prototype, dialog, addCheckCtrl, 0); PUT_FUNC(m_Dialog_prototype, dialog, addStaticText, 0); PUT_FUNC(m_Dialog_prototype, dialog, addButton, 0); PUT_FUNC(m_Dialog_prototype, dialog, getValue, 0); PUT_FUNC(m_Dialog_prototype, dialog, setValue, 0); PUT_FUNC(m_Dialog_prototype, dialog, showModal, 0); PUT_FUNC(m_Dialog_prototype, dialog, show, 0); // as instance function PUT_FUNC(m_Dialog_prototype, dialog, close, 0); // create the "Dialog" object SEE_object* Dialog = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)Dialog, m_interpr, &dialog_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(Dialog, str_prototype, m_Dialog_prototype) PUT_FUNC(Dialog, dialog, show, 0); // as static function // now we can add the globals PUT_OBJECT(m_interpr->Global, str_Dialog, Dialog); PUT_FUNC(m_interpr->Global, dialog, alert, 0); PUT_FUNC(m_interpr->Global, dialog, confirm, 0); PUT_FUNC(m_interpr->Global, dialog, prompt, 0); PUT_FUNC(m_interpr->Global, dialog, fileSel, 0); PUT_FUNC(m_interpr->Global, dialog, logError, 0); PUT_FUNC(m_interpr->Global, dialog, logWarning, 0); PUT_FUNC(m_interpr->Global, dialog, print, 0); } SEE_object* SjSee::Dialog_new() { dialog_object* obj = alloc_dialog_object(m_interpr); SEE_native_init(&obj->m_native, m_interpr, &dialog_inst_class, m_Dialog_prototype); return (SEE_object *)obj; } static dialog_object* get_dialog_object(SEE_interpreter* interpr, SEE_object* o) { if( o->objectclass != &dialog_inst_class ) SEE_error_throw(interpr, interpr->TypeError, NULL); return (dialog_object *)o; } #endif // SJ_USE_SCRIPTS ����������������������silverjuke-16.2.3/src/see_dom/obj_File.cpp����������������������������������������������������������0000664�0000000�0000000�00000027530�12660066715�0020425�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_File.cpp * Authors: Björn Petersen * Purpose: The File class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <tagger/tg_bytefile.h> #include <see_dom/sj_see.h> #include <see_dom/sj_see_helpers.h> // data used by our object struct file_object { SEE_native native; // MUST be first!!! SEE_value name_; bool binary_; long backupPos; wxFSFile* fsFile; SjByteFile* byteFile; }; static void file_finalize(SEE_interpreter* interpr, void* ptr, void* closure) { file_object* fo = (file_object*)ptr; delete fo->byteFile; delete fo->fsFile; } static file_object* alloc_file_object(SEE_interpreter* interpr, SEE_value* name_, bool binary_) { file_object* fo = (file_object*)SEE_malloc_finalize(interpr, sizeof(file_object), file_finalize, NULL); memset(fo, 0, sizeof(file_object)); if( name_ ) SEE_VALUE_COPY(&fo->name_, name_); fo->binary_ = binary_; return fo; } static file_object* toFile(SEE_interpreter* interpr, SEE_object* o, int init); /******************************************************************************* * File Object Functions ******************************************************************************/ IMPLEMENT_FUNCTION(file, construct) { RETURN_OBJECT( HOST_DATA->File_new( argc_>=1? argv_[0] : NULL, /*name*/ ARG_LONG(1)!=0 /*binary?*/ ) ); } IMPLEMENT_FUNCTION(file, read) { file_object* fo = toFile(interpr_, this_, 1/*init*/); if( fo->byteFile == NULL ) { RETURN_STRING(wxT("")); return; } // find out the number of bytes to read long bytesToRead; if( argc_ >= 1 ) { bytesToRead = ARG_LONG(0); } else { long startPos = fo->byteFile->Tell(); long endPos = fo->byteFile->Find((unsigned char)'\n', startPos); if( endPos == -1 ) endPos = fo->byteFile->Length(); else endPos++; bytesToRead = endPos-startPos; fo->byteFile->Seek(startPos); } if( bytesToRead <= 0 ) { RETURN_STRING(wxT("")); return; } // read the data SjByteVector src = fo->byteFile->ReadBlock(bytesToRead); // convert the data to a string for SEE if( fo->binary_ ) { long srcBytes = src.size(), i; const unsigned char* srcPtr = src.getReadableData(); SEE_string* dest = SEE_string_new(interpr_, srcBytes); // the object is freed in the garbage collection SEE_char_t* destPtr = dest->data; for( i = 0; i < srcBytes; i++ ) destPtr[i] = srcPtr[i]; dest->length = srcBytes; SEE_SET_STRING(res_, dest); } else { wxString dest = src.toString(SJ_UTF8); RETURN_STRING( dest ); } } IMPLEMENT_FUNCTION(file, write) { file_object* fo = toFile(interpr_, this_, 2/*init+create*/); if( fo->byteFile == NULL ) SEE_error_throw(interpr_, interpr_->Error, "cannot write"); if( argc_>=1 && argv_[0] ) { if( SEE_VALUE_GET_TYPE(argv_[0]) == SEE_STRING ) { SEE_string* src = argv_[0]->u.string; if( fo->binary_ ) { SEE_string* src = argv_[0]->u.string; long srcLen = src->length, i; SEE_char_t* srcPtr = src->data; SjByteVector dest((SjUint)srcLen); unsigned char* destPtr = dest.getWriteableData(); for( i = 0; i < srcLen; i++ ) destPtr[i] = (unsigned char)srcPtr[i]; fo->byteFile->WriteBlock(dest); } else { SEE_size_t srcLen = SEE_string_utf8_size(interpr_, src) + 1/*SEE_string_utf8_size() does not add a nullbytes, but SEE_string_toutf8() does*/; SjByteVector dest((SjUint)srcLen); unsigned char* destPtr = dest.getWriteableData(); SEE_string_toutf8(interpr_, (char*)destPtr, srcLen, src); dest.resize(srcLen - 1/*do not write the implicit null-byte*/); fo->byteFile->WriteBlock(dest); } } else { SjByteVector dest; dest.appendChar((unsigned char)ARG_LONG(0), 1); fo->byteFile->WriteBlock(dest); } } RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(file, flush) { file_object* fo = toFile(interpr_, this_, 0/*no init*/); if( fo->byteFile ) { fo->backupPos = fo->byteFile->Tell(); delete fo->byteFile; fo->byteFile = NULL; delete fo->fsFile; fo->fsFile = NULL; } RETURN_UNDEFINED; } /******************************************************************************* * File Object Properties ******************************************************************************/ IMPLEMENT_HASPROPERTY(file) { if( VAL_PROPERTY( length ) || VAL_PROPERTY( pos ) ) { RETURN_HAS; } else { RETURN_HASNOT; } } IMPLEMENT_GET(file) { if( VAL_PROPERTY( length ) ) { file_object* fo = toFile(interpr_, this_, 1/*init*/); if( fo->byteFile ) RETURN_LONG( fo->byteFile->Length() ); else RETURN_LONG( 0 ); } else if( VAL_PROPERTY( pos ) ) { file_object* fo = toFile(interpr_, this_, 1/*init*/); if( fo->byteFile ) RETURN_LONG( fo->byteFile->Tell() ); else RETURN_LONG( 0 ); } else { RETURN_GET_DEFAULTS; } } IMPLEMENT_PUT(file) { if( VAL_PROPERTY( length ) ) { long l = VAL_LONG; file_object* fo = toFile(interpr_, this_, 2/*init+create*/); if( fo->byteFile == NULL || l < 0 ) SEE_error_throw(interpr_, interpr_->Error, "cannot set length"); fo->byteFile->Truncate(l); fo->byteFile->Seek(l, SJ_SEEK_BEG); } else if( VAL_PROPERTY( pos ) ) { long l = VAL_LONG; file_object* fo = toFile(interpr_, this_, 2/*init+create*/); if( fo->byteFile == NULL ) SEE_error_throw(interpr_, interpr_->Error, "cannot seek"); if( l >= 0 ) fo->byteFile->Seek(l, SJ_SEEK_BEG); else fo->byteFile->Seek(l, SJ_SEEK_END); // not: "Seek(l*-1, SJ_SEEK_END)", to move in-file, SJ_SEEK_END expects negative values, see http://www.silverjuke.net/forum/topic-2630.html } else { DO_PUT_DEFAULTS; } } /******************************************************************************* * Statics ******************************************************************************/ IMPLEMENT_FUNCTION(file, exists) { wxString f(ARG_STRING(0)); RETURN_BOOL( ::wxFileExists(f) || ::wxDirExists(f) ); } IMPLEMENT_FUNCTION(file, isdir) { RETURN_BOOL( ::wxDirExists(ARG_STRING(0)) ); } IMPLEMENT_FUNCTION(file, dir) { wxArrayString ret; wxString path = ARG_STRING(0); if( !path.IsEmpty() ) { if( path.Last()!=wxT('/') && path.Last()!=wxT('\\') ) path += wxT('/'); wxFileSystem fs; fs.ChangePathTo(path); int what = wxFILE; switch( ARG_LONG(1) ) { case 1: what = wxDIR; break; case 2: what = 0;/*both*/ break; } path = fs.FindFirst(wxT("*"), what); while( !path.IsEmpty() ) { ret.Add(path); path = fs.FindNext(); } } RETURN_ARRAY_STRING( ret ); } IMPLEMENT_FUNCTION(file, mkdir) { RETURN_BOOL( ::wxMkdir(ARG_STRING(0)) ); } IMPLEMENT_FUNCTION(file, copy) { RETURN_BOOL( SjTools::CopyFile(ARG_STRING(0), ARG_STRING(1)) ); } IMPLEMENT_FUNCTION(file, rename) { RETURN_BOOL( ::wxRenameFile(ARG_STRING(0), ARG_STRING(1)) ); } IMPLEMENT_FUNCTION(file, remove) { wxString f(ARG_STRING(0)); if( ::wxDirExists(f) ) RETURN_BOOL( ::wxRmdir(f) ); else RETURN_BOOL( ::wxRemoveFile(f) ); } IMPLEMENT_FUNCTION(file, time) { RETURN_LONG( ::wxFileModificationTime(ARG_STRING(0)) ); } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for File.prototype and file instances */ static SEE_objectclass file_inst_class = { "File", /* Class */ file_get, /* Get */ file_put, /* Put */ SEE_native_canput, /* CanPut */ file_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for File constructor */ static SEE_objectclass file_constructor_class = { "FileConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ file_construct, /* Construct */ NULL /* Call */ }; void SjSee::File_init() { SEE_value temp; // Create the "File.prototype" object, this is used as a template for the instances m_File_prototype = (SEE_object*)alloc_file_object(m_interpr, NULL, false); SEE_native_init((SEE_native *)m_File_prototype, m_interpr, &file_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_File_prototype, file, read, 0); PUT_FUNC(m_File_prototype, file, write, 0); PUT_FUNC(m_File_prototype, file, flush, 0); // create the "File" object SEE_object* File = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)File, m_interpr, &file_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(File, str_prototype, m_File_prototype) PUT_FUNC(File, file, exists, 0); // static function PUT_FUNC(File, file, isdir, 0); // static function PUT_FUNC(File, file, dir, 0); // static function PUT_FUNC(File, file, mkdir, 0); // static function PUT_FUNC(File, file, copy, 0); // static function PUT_FUNC(File, file, rename, 0); // static function PUT_FUNC(File, file, remove, 0); // static function PUT_FUNC(File, file, time, 0); // static function // now we can add the globals PUT_OBJECT(m_interpr->Global, str_File, File); } SEE_object* SjSee::File_new(SEE_value* name, bool binary) { file_object* obj = alloc_file_object(m_interpr, name, binary); SEE_native_init(&obj->native, m_interpr, &file_inst_class, m_File_prototype); return (SEE_object *)obj; } static file_object* toFile(SEE_interpreter* interpr, SEE_object* o, int init) { if( o->objectclass != &file_inst_class ) SEE_error_throw(interpr, interpr->TypeError, NULL); file_object* fo = (file_object*)o; if( init && fo->byteFile == NULL ) { // alloc fsFile, this may fail wxASSERT( fo->fsFile == NULL ); wxFileSystem fs; wxString name = SeeValueToWxString(interpr, &fo->name_); fo->fsFile = fs.OpenFile(name, wxFS_READ|wxFS_SEEKABLE); if( fo->fsFile == NULL && init == 2 ) { // create the file physically and try again { wxFile file; file.Create(name); } fo->fsFile = fs.OpenFile(name, wxFS_READ|wxFS_SEEKABLE); } if( fo->fsFile ) { // create byteFile, seek to old position if flush() was called before fo->byteFile = new SjByteFile("", fo->fsFile->GetStream()); if( fo->backupPos ) fo->byteFile->Seek(fo->backupPos, SJ_SEEK_BEG); } } return (file_object *)o; } #endif // SJ_USE_SCRIPTS ������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/obj_HttpRequest.cpp���������������������������������������������������0000664�0000000�0000000�00000024604�12660066715�0022035�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_HttpRequest.cpp * Authors: Björn Petersen * Purpose: The HttpRequest class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <see_dom/sj_see.h> #include <see_dom/sj_see_helpers.h> #include <wx/socket.h> // data used by our object class SjHttpEvtHandler; struct httprequest_object { SEE_native m_native; // MUST be first!!! SjSee* m_see; SjSSHash* m_requestHeader; // objects involved into processing and responsing SjHttp* m_sjHttp; SjHttpEvtHandler* m_sjHttpEvtHandler; SEE_object* m_persistentCallback; }; static void httprequest_freeAll_(httprequest_object* hro, bool removePersistance); static void httprequest_finalize_(SEE_interpreter* interpr, void* ptr, void* closure) { httprequest_object* hro = ((httprequest_object*)ptr); httprequest_freeAll_(hro, true /*remove persistance*/); } static void httprequest_unexpected_unpersistent_(SEE_interpreter* interpr, void* ptr, void* closure) { httprequest_object* hro = ((httprequest_object*)ptr); httprequest_freeAll_(hro, false /*remove persistance*/); } static httprequest_object* alloc_httprequest_object_(SEE_interpreter* interpr) { httprequest_object* hro = (httprequest_object*)SEE_malloc_finalize(interpr, sizeof(httprequest_object), httprequest_finalize_, NULL); memset(hro, 0, sizeof(httprequest_object)); hro->m_see = (SjSee*)interpr->host_data; return hro; } static httprequest_object* get_httprequest_object_(SEE_interpreter* interpr, SEE_object* o); /******************************************************************************* * The Little Event Handler ******************************************************************************/ class SjHttpEvtHandler : public wxEvtHandler { public: SjHttpEvtHandler(httprequest_object* hro) { m_hro = hro; } void OnSocketDone(wxSocketEvent& e) { wxASSERT( wxThread::IsMain() ); if( m_hro && m_hro->m_see && m_hro->m_sjHttp ) { SjGcLocker gclocker; if( m_hro->m_persistentCallback ) { SEE_object* cb = m_hro->m_persistentCallback; m_hro->m_persistentCallback = NULL; m_hro->m_see->RemovePersistentObject((SEE_object*)m_hro); SeeCallCallback(m_hro->m_see->m_interpr, cb, // function, SeeCallCallback() checks for NULL (SEE_object*)m_hro // context ); } } } httprequest_object* m_hro; DECLARE_EVENT_TABLE() }; #define IDO_SEESOCKET (IDM_FIRSTPRIVATE+1) BEGIN_EVENT_TABLE(SjHttpEvtHandler, wxEvtHandler) EVT_SOCKET(IDO_SEESOCKET, SjHttpEvtHandler::OnSocketDone) END_EVENT_TABLE() static void httprequest_freeResponse_(httprequest_object* hro, bool removePersistance) { // this function is also used as the "unexpected exit" for persistent objects; // as this is followed by the "normal finalizer", set all pointers to zero wxASSERT( wxThread::IsMain() ); if( hro->m_sjHttpEvtHandler ) { hro->m_sjHttpEvtHandler->m_hro = NULL; delete hro->m_sjHttpEvtHandler; hro->m_sjHttpEvtHandler = NULL; } if( hro->m_sjHttp ) { delete hro->m_sjHttp; hro->m_sjHttp = NULL; } if( hro->m_persistentCallback ) { hro->m_persistentCallback = NULL; if( removePersistance ) hro->m_see->RemovePersistentObject((SEE_object*)hro); } } static void httprequest_freeAll_(httprequest_object* hro, bool removePersistance) { httprequest_freeResponse_(hro, removePersistance); if( hro->m_requestHeader ) { delete hro->m_requestHeader; hro->m_requestHeader = NULL; } } /******************************************************************************* * Functions ******************************************************************************/ IMPLEMENT_FUNCTION(httprequest, construct) { RETURN_OBJECT( HOST_DATA->HttpRequest_new() ); } IMPLEMENT_FUNCTION(httprequest, setRequestHeader) { httprequest_object* hro = get_httprequest_object_(interpr_, this_); if( hro->m_requestHeader == NULL ) hro->m_requestHeader = new SjSSHash(); if( argc_ == 0 ) hro->m_requestHeader->Clear(); else hro->m_requestHeader->Insert(ARG_STRING(0), ARG_STRING(1)); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(httprequest, getResponseHeader) { httprequest_object* hro = get_httprequest_object_(interpr_, this_); wxString ret; if( hro->m_sjHttp ) ret = hro->m_sjHttp->GetHttpResponseHeader(ARG_STRING(0)); RETURN_STRING(ret); } IMPLEMENT_FUNCTION(httprequest, request) { // free previous HTTP object (if any) httprequest_object* hro = get_httprequest_object_(interpr_, this_); httprequest_freeResponse_(hro, true); // get the callback if( argc_ < 2 ) SEE_error_throw(interpr_, interpr_->Error, "too few parameters"); if( argc_ > 3 ) SEE_error_throw(interpr_, interpr_->Error, "too many parameters"); SEE_object* callback = ARG_CALLBACK(argc_-1); if( callback == NULL ) SEE_error_throw(interpr_, interpr_->TypeError, "no callback given"); // get the post buffer (if any) wxString postBuffer; if( argc_ > 2 ) postBuffer = ARG_STRING(1); // set object persistent, remember the callback (always the last parameter) hro->m_see->AddPersistentObject((SEE_object*)hro, SJ_PERSISTENT_OTHER, NULL, httprequest_unexpected_unpersistent_); hro->m_persistentCallback = callback; // create a new HTTP object hro->m_sjHttp = new SjHttp(); hro->m_sjHttpEvtHandler = new SjHttpEvtHandler(hro); hro->m_sjHttp->Init(hro->m_sjHttpEvtHandler, IDO_SEESOCKET); hro->m_sjHttp->OpenFile(ARG_STRING(0), &wxConvUTF8, hro->m_requestHeader, postBuffer); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(httprequest, abort) { httprequest_object* hro = get_httprequest_object_(interpr_, this_); httprequest_freeResponse_(hro, true); RETURN_UNDEFINED; } /******************************************************************************* * Properties ******************************************************************************/ IMPLEMENT_HASPROPERTY(httprequest) { if( VAL_PROPERTY( status ) || VAL_PROPERTY( responseText ) ) { RETURN_HAS; } else { RETURN_HASNOT; } } IMPLEMENT_GET(httprequest) { httprequest_object* hro = get_httprequest_object_(interpr_, this_); if( VAL_PROPERTY( status ) ) { long status = 400; // bad request/nothing loaded yet if( hro->m_sjHttp ) status = hro->m_sjHttp->GetHttpStatusCode(); RETURN_LONG( status ); } else if( VAL_PROPERTY( responseText ) ) { wxString text; if( hro->m_sjHttp ) text = hro->m_sjHttp->GetString(); RETURN_STRING( text ); } else { RETURN_GET_DEFAULTS; } } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for HttpRequest.prototype and httprequest instances */ static SEE_objectclass httprequest_inst_class = { "HttpRequest", /* Class */ httprequest_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ httprequest_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for HttpRequest constructor */ SEE_objectclass httprequest_constructor_class = { "HttpRequestConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ httprequest_construct, /* Construct */ NULL /* Call */ }; void SjSee::HttpRequest_init() { SEE_value temp; // Create the "HttpRequest.prototype" object, this is used as a template for the instances m_HttpRequest_prototype = (SEE_object *)alloc_httprequest_object_(m_interpr); SEE_native_init((SEE_native *)m_HttpRequest_prototype, m_interpr, &httprequest_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_HttpRequest_prototype, httprequest, setRequestHeader, 0); PUT_FUNC(m_HttpRequest_prototype, httprequest, getResponseHeader, 0); PUT_FUNC(m_HttpRequest_prototype, httprequest, request, 0); PUT_FUNC(m_HttpRequest_prototype, httprequest, abort, 0); // create the "HttpRequest" object SEE_object* HttpRequest = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)HttpRequest, m_interpr, &httprequest_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(HttpRequest, str_prototype, m_HttpRequest_prototype); // now we can add the globals PUT_OBJECT(m_interpr->Global, str_HttpRequest, HttpRequest); } SEE_object* SjSee::HttpRequest_new() { httprequest_object* obj = alloc_httprequest_object_(m_interpr); SEE_native_init(&obj->m_native, m_interpr, &httprequest_inst_class, m_HttpRequest_prototype); return (SEE_object *)obj; } static httprequest_object* get_httprequest_object_(SEE_interpreter* interpr, SEE_object* o) { wxASSERT( wxThread::IsMain() ); if( o->objectclass != &httprequest_inst_class ) SEE_error_throw(interpr, interpr->TypeError, NULL); return (httprequest_object *)o; } #endif // SJ_USE_SCRIPTS ����������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/obj_Player.cpp��������������������������������������������������������0000664�0000000�0000000�00000033376�12660066715�0021007�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_Player.cpp * Authors: Björn Petersen * Purpose: The Player class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <sjbase/browser.h> #include <see_dom/sj_see.h> #include <see_dom/sj_see_helpers.h> // data used by our object struct player_object { SEE_native m_native; // MUST be first! SEE_object* m_onTrackChange; SEE_object* m_onPlaybackDone; }; static player_object* alloc_player_object(SEE_interpreter* interpr) { player_object* po = (player_object*)SEE_malloc(interpr, sizeof(player_object)); memset(po, 0, sizeof(player_object)); return po; } static player_object* get_player_object(SEE_interpreter* interpr, SEE_object* o); /******************************************************************************* * play, pause(), next() etc. ******************************************************************************/ IMPLEMENT_FUNCTION(player, construct) { RETURN_OBJECT( HOST_DATA->Player_new() ); } IMPLEMENT_FUNCTION(player, play) { g_mainFrame->Play( ARG_LONG(0)/*offset*/ ); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, pause) { g_mainFrame->Pause(); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, stop) { g_mainFrame->Stop(); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, prev) { g_mainFrame->GotoPrev(); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, next) { if( g_mainFrame->HasNextIgnoreAP() || !ARG_LONG(0) ) g_mainFrame->GotoNextRegardAP(false); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, isPlaying) { RETURN_BOOL( g_mainFrame->IsPlaying() ); } IMPLEMENT_FUNCTION(player, isPaused) { RETURN_BOOL( g_mainFrame->IsPaused() ); } IMPLEMENT_FUNCTION(player, isStopped) { RETURN_BOOL( g_mainFrame->IsStopped() ); } IMPLEMENT_FUNCTION(player, hasPrev) { RETURN_BOOL( g_mainFrame->HasPrev() ); } IMPLEMENT_FUNCTION(player, hasNext) { if( !ARG_LONG(0) ) { RETURN_BOOL( g_mainFrame->HasNextRegardAP() ); } else { RETURN_BOOL( g_mainFrame->HasNextIgnoreAP() ); } } /******************************************************************************* * queuePos, addAtPos() etc. ******************************************************************************/ #define ARG_POS ARG_LONG_OR_DEF(0,-1) IMPLEMENT_FUNCTION(player, getUrlAtPos) { RETURN_STRING( g_mainFrame->GetQueueUrl(ARG_POS)); } IMPLEMENT_FUNCTION(player, getAutoplayAtPos) { RETURN_BOOL( (g_mainFrame->GetQueueInfo(ARG_POS).GetFlags()&SJ_PLAYLISTENTRY_AUTOPLAY)!=0 ); } IMPLEMENT_FUNCTION(player, getPlayCountAtPos) { RETURN_LONG( g_mainFrame->GetQueueInfo(ARG_POS).GetPlayCount() ); } IMPLEMENT_FUNCTION(player, getArtistAtPos) { RETURN_STRING( g_mainFrame->GetQueueInfo(ARG_POS).GetLeadArtistName() ); } IMPLEMENT_FUNCTION(player, getAlbumAtPos) { RETURN_STRING( g_mainFrame->GetQueueInfo(ARG_POS).GetAlbumName() ); } IMPLEMENT_FUNCTION(player, getTitleAtPos) { RETURN_STRING( g_mainFrame->GetQueueInfo(ARG_POS).GetTrackName() ); } IMPLEMENT_FUNCTION(player, getDurationAtPos) { RETURN_LONG( g_mainFrame->GetQueueInfo(ARG_POS).GetPlaytimeMs() ); } IMPLEMENT_FUNCTION(player, addAtPos) { g_mainFrame->Enqueue(ARG_STRING(1), ARG_POS, false/*verified?*/, ARG_BOOL(2)/*autoplay?*/, false/*uiChecks?*/); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, removeAtPos) { g_mainFrame->UnqueueByPos(ARG_POS); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(player, removeAll) { g_mainFrame->UnqueueAll(); g_mainFrame->m_browser->RefreshSelection(); RETURN_UNDEFINED; } /******************************************************************************* * Properties ******************************************************************************/ IMPLEMENT_HASPROPERTY(player) { if( VAL_PROPERTY( time ) || VAL_PROPERTY( duration ) || VAL_PROPERTY( queueLength ) || VAL_PROPERTY( queuePos ) || VAL_PROPERTY( volume ) || VAL_PROPERTY( onTrackChange ) || VAL_PROPERTY( onPlaybackDone ) || VAL_PROPERTY( repeat ) || VAL_PROPERTY( shuffle ) || VAL_PROPERTY( stopAfterThisTrack ) || VAL_PROPERTY( stopAfterEachTrack ) || VAL_PROPERTY( removePlayed ) || VAL_PROPERTY( avoidBoredom ) ) { RETURN_HAS; } else { RETURN_HASNOT; } } IMPLEMENT_GET(player) { player_object* po = get_player_object(interpr_, this_); if( g_mainFrame == NULL ) { RETURN_GET_DEFAULTS; // may happen, noticed first in Silverjuke 3.x } else if( VAL_PROPERTY( time ) ) { RETURN_LONG( g_mainFrame->GetElapsedTime() ); } else if( VAL_PROPERTY( duration ) ) { RETURN_LONG( g_mainFrame->GetTotalTime() ); } else if( VAL_PROPERTY( queueLength ) ) { RETURN_LONG( g_mainFrame->GetQueueCount() ); } else if( VAL_PROPERTY( queuePos ) ) { RETURN_LONG( g_mainFrame->GetQueuePos() ); } else if( VAL_PROPERTY( volume ) ) { RETURN_LONG( g_mainFrame->GetMainVol() ); } else if( VAL_PROPERTY( onTrackChange ) ) { if( po->m_onTrackChange ) RETURN_OBJECT(po->m_onTrackChange); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( onPlaybackDone ) ) { if( po->m_onPlaybackDone ) RETURN_OBJECT(po->m_onPlaybackDone); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( repeat ) ) { RETURN_LONG( (long)g_mainFrame->GetRepeat() ); } else if( VAL_PROPERTY( shuffle ) ) { RETURN_BOOL( g_mainFrame->GetShuffle() ); } else if( VAL_PROPERTY( stopAfterThisTrack ) ) { RETURN_BOOL( g_mainFrame->m_player.StopAfterThisTrack() ); } else if( VAL_PROPERTY( stopAfterEachTrack ) ) { RETURN_BOOL( g_mainFrame->m_player.StopAfterEachTrack() ); } else if( VAL_PROPERTY( removePlayed ) ) { long queueFlags = g_mainFrame->m_player.m_queue.GetQueueFlags(); RETURN_BOOL( (queueFlags&SJ_QUEUEF_REMOVE_PLAYED)!=0 ); } else if( VAL_PROPERTY( avoidBoredom ) ) { long queueFlags = g_mainFrame->m_player.m_queue.GetQueueFlags(); queueFlags &= SJ_QUEUEF_BOREDOM_TRACKS|SJ_QUEUEF_BOREDOM_ARTISTS; RETURN_LONG( queueFlags ); } else { RETURN_GET_DEFAULTS; } } IMPLEMENT_PUT(player) { player_object* po = get_player_object(interpr_, this_); if( VAL_PROPERTY( time ) ) { g_mainFrame->m_player.SeekAbs( VAL_LONG ); g_mainFrame->UpdateDisplay(); } else if( VAL_PROPERTY( queuePos ) ) { g_mainFrame->GotoAbsPos( VAL_LONG ); g_mainFrame->UpdateDisplay(); } else if( VAL_PROPERTY( volume ) ) { g_mainFrame->SetAbsMainVol( VAL_LONG ); } else if( VAL_PROPERTY( onTrackChange ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onTrackChange); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onTrackChange = newCallback; } else if( VAL_PROPERTY( onPlaybackDone ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onPlaybackDone); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onPlaybackDone = newCallback; } else if( VAL_PROPERTY( repeat ) ) { g_mainFrame->SetRepeat( (SjRepeat)VAL_LONG ); } else if( VAL_PROPERTY( shuffle ) ) { g_mainFrame->SetShuffle( VAL_BOOL ); } else if( VAL_PROPERTY( stopAfterThisTrack ) ) { g_mainFrame->StopAfterThisTrack( VAL_BOOL ); // do not use g_mainFrame->m_player->StopAfterThisTrack(), see http://www.silverjuke.net/forum/post.php?p=10381#10381 } else if( VAL_PROPERTY( stopAfterEachTrack ) ) { g_mainFrame->StopAfterEachTrack( VAL_BOOL ); // - " - } else if( VAL_PROPERTY( removePlayed ) ) { long queueFlags, b1, b2; g_mainFrame->m_player.m_queue.GetQueueFlags(queueFlags, b1, b2); SjTools::SetFlag(queueFlags, SJ_QUEUEF_REMOVE_PLAYED, VAL_BOOL); g_mainFrame->m_player.m_queue.SetQueueFlags(queueFlags, b1, b2); g_mainFrame->SetSkinTargetValue(IDT_TOGGLE_REMOVE_PLAYED, (queueFlags&SJ_QUEUEF_REMOVE_PLAYED)? 1 : 0); } else if( VAL_PROPERTY( avoidBoredom ) ) { long queueFlags, b1, b2; g_mainFrame->m_player.m_queue.GetQueueFlags(queueFlags, b1, b2); queueFlags &= ~(SJ_QUEUEF_BOREDOM_TRACKS|SJ_QUEUEF_BOREDOM_ARTISTS); queueFlags |= VAL_LONG; g_mainFrame->m_player.m_queue.SetQueueFlags(queueFlags, b1, b2); } else { DO_PUT_DEFAULTS; } } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for Player.prototype and player instances */ static SEE_objectclass player_inst_class = { "Player", /* Class */ player_get, /* Get */ player_put, /* Put */ SEE_native_canput, /* CanPut */ player_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for Player constructor */ static SEE_objectclass player_constructor_class = { "PlayerConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ player_construct, /* Construct */ NULL /* Call */ }; void SjSee::Player_init() { SEE_value temp; // Create the "Player.prototype" object, this is used as a template for the instances m_Player_prototype = (SEE_object *)alloc_player_object(m_interpr); SEE_native_init((SEE_native *)m_Player_prototype, m_interpr, &player_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_Player_prototype, player, play, 0); PUT_FUNC(m_Player_prototype, player, pause, 0); PUT_FUNC(m_Player_prototype, player, stop, 0); PUT_FUNC(m_Player_prototype, player, prev, 0); PUT_FUNC(m_Player_prototype, player, next, 0); PUT_FUNC(m_Player_prototype, player, isPlaying, 0); PUT_FUNC(m_Player_prototype, player, isPaused, 0); PUT_FUNC(m_Player_prototype, player, isStopped, 0); PUT_FUNC(m_Player_prototype, player, hasPrev, 0); PUT_FUNC(m_Player_prototype, player, hasNext, 0); PUT_FUNC(m_Player_prototype, player, getUrlAtPos, 0); PUT_FUNC(m_Player_prototype, player, getAutoplayAtPos, 0); PUT_FUNC(m_Player_prototype, player, getPlayCountAtPos, 0); PUT_FUNC(m_Player_prototype, player, getArtistAtPos, 0); PUT_FUNC(m_Player_prototype, player, getAlbumAtPos, 0); PUT_FUNC(m_Player_prototype, player, getTitleAtPos, 0); PUT_FUNC(m_Player_prototype, player, getDurationAtPos, 0); PUT_FUNC(m_Player_prototype, player, addAtPos, 0); PUT_FUNC(m_Player_prototype, player, removeAtPos, 0); PUT_FUNC(m_Player_prototype, player, removeAll, 0); // create the "Player" object SEE_object* Player = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)Player, m_interpr, &player_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(Player, str_prototype, m_Player_prototype) // now we can add the globals PUT_OBJECT(m_interpr->Global, str_Player, Player); m_player = Player_new(); PUT_OBJECT(m_interpr->Global, str_player, m_player); } SEE_object* SjSee::Player_new() { player_object* obj = alloc_player_object(m_interpr); SEE_native_init(&obj->m_native, m_interpr, &player_inst_class, m_Player_prototype); return (SEE_object *)obj; } static player_object* get_player_object(SEE_interpreter* interpr, SEE_object* o) { if( o->objectclass != &player_inst_class ) SEE_error_throw(interpr, interpr->TypeError, NULL); return (player_object *)o; } void SjSee::Player_receiveMsg(int msg) { if( m_interprInitialized ) { if( msg == IDMODMSG_TRACK_ON_AIR_CHANGED ) { SeeCallCallback(m_interpr, ((player_object*)m_player)->m_onTrackChange, m_player); } } } void SjSee::Player_onPlaybackDone(const wxString& url__) { SjGcLocker gclocker; SEE_value* arg0 = NULL; SjSee* curSee = s_first; player_object* curPlayer; while( curSee ) { if( curSee->m_interprInitialized ) { curPlayer = (player_object*)curSee->m_player; if( curPlayer ) { if( curPlayer->m_onPlaybackDone ) { if( arg0 == NULL ) { arg0 = (SEE_value*)SEE_malloc(curSee->m_interpr, sizeof(SEE_value)); SEE_string* s = WxStringToSeeString(curSee->m_interpr, url__); SEE_SET_STRING(arg0, s); } SeeCallCallback(curSee->m_interpr, curPlayer->m_onPlaybackDone, (SEE_object*)curPlayer, arg0); } } } curSee = curSee->m_next; } } #endif // SJ_USE_SCRIPTS ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/obj_Program.cpp�������������������������������������������������������0000664�0000000�0000000�00000071005�12660066715�0021151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_Program.cpp * Authors: Björn Petersen * Purpose: The Program class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <sjbase/browser.h> #include <sjbase/browser_list.h> #include <sjmodules/cinterface.h> #include <sjmodules/kiosk/kiosk.h> #include <sjmodules/advsearch.h> #include <sjmodules/vis/vis_module.h> #include <see_dom/sj_see.h> #include <see_dom/sj_see_helpers.h> // data used by our object struct program_object { SEE_native m_native; // MUST be first! SEE_object* m_onLoad; SEE_object* m_onUnload; SEE_object* m_onKioskStarting; SEE_object* m_onKioskStarted; SEE_object* m_onKioskEnding; SEE_object* m_onKioskEnded; SEE_object* m_onTimeout; }; static program_object* alloc_program_object(SEE_interpreter* interpr) { program_object* po = (program_object*)SEE_malloc(interpr, sizeof(program_object)); memset(po, 0, sizeof(program_object)); return po; } /******************************************************************************* * Constructor ******************************************************************************/ IMPLEMENT_FUNCTION(program, construct) { RETURN_OBJECT( HOST_DATA->Program_new() ); } /******************************************************************************* * Embedding ******************************************************************************/ void SjSee::Program_getGlobalEmbed(SjSeePersistent scope, wxArrayString& ret) const { persistent_object* cur = m_persistentAnchor->m_next; while( cur ) { if( cur->m_scope == scope ) { ret.Add(SeeValueToWxString(m_interpr, cur->m_param2)); } cur = cur->m_next; } } bool SjSee::Program_onGlobalEmbed(SjSeePersistent scope, int index) { persistent_object* cur = m_persistentAnchor->m_next; while( cur ) { if( cur->m_scope == scope ) { if( index == 0 ) { SeeCallCallback(m_interpr, cur->m_object, cur->m_object); return true; } index--; } cur = cur->m_next; } return false; } static void addEntry(SEE_interpreter* interpr_, SjSeePersistent scope, int argc_, SEE_value** argv_, SEE_value* res_) { bool success = false; SEE_object* callback = ARG_CALLBACK(1); if( argc_ >= 2 && callback ) { // add entry SEE_value* param2 = (SEE_value*)SEE_malloc(interpr_, sizeof(SEE_value)); SEE_VALUE_COPY(param2, argv_[0]); HOST_DATA->AddPersistentObject(callback, scope, param2); success = true; } else if( argc_ >= 1 && SEE_VALUE_GET_TYPE(argv_[0]) == SEE_STRING ) { // remove entry by name persistent_object* cur = HOST_DATA->m_persistentAnchor->m_next; while( cur ) { if( cur->m_scope == scope && cur->m_param2 && SEE_VALUE_GET_TYPE(cur->m_param2) == SEE_STRING && SEE_string_cmp(cur->m_param2->u.string, argv_[0]->u.string)==0 ) { HOST_DATA->RemovePersistentObject(cur->m_object); success = true; break; } cur = cur->m_next; } } else { // remove entry by type persistent_object *cur = HOST_DATA->m_persistentAnchor->m_next, *next; while( cur ) { next = cur->m_next; if( cur->m_scope == scope ) { HOST_DATA->RemovePersistentObject(cur->m_object); success = true; // no break - there may be several entries! } cur = next; } } RETURN_BOOL( success ); } IMPLEMENT_FUNCTION(program, addMenuEntry) { addEntry(interpr_, SJ_PERSISTENT_MENU_ENTRY, argc_, argv_, res_); g_mainFrame->UpdateMainMenu(); } IMPLEMENT_FUNCTION(program, addConfigButton) { addEntry(interpr_, SJ_PERSISTENT_CONFIG_BUTTON, argc_, argv_, res_); g_mainFrame->UpdateMainMenu(); } IMPLEMENT_FUNCTION(program, addSkinsButton) /*deprecated*/ { addEntry(interpr_, SJ_PERSISTENT_CONFIG_BUTTON, argc_, argv_, res_); g_mainFrame->UpdateMainMenu(); } IMPLEMENT_FUNCTION(program, addExitOption) /*deprecated*/ { addEntry(interpr_, SJ_PERSISTENT_EXIT_OPTION_deprecated, argc_, argv_, res_); } /******************************************************************************* * Timers ******************************************************************************/ SjProgramTimer::SjProgramTimer(SEE_interpreter* interpr, program_object* po) { interpr_ = interpr; m_po = po; m_inTimer = false; } void SjProgramTimer::Notify() { wxASSERT( (SEE_object*)m_po == HOST_DATA->m_program ); wxASSERT( wxThread::IsMain() ); if( !m_inTimer ) { m_inTimer = true; SEE_object* callback = m_po->m_onTimeout; if( IsOneShot() ) { HOST_DATA->RemovePersistentObject( m_po->m_onTimeout ); m_po->m_onTimeout = NULL; } if( callback ) { SeeCallCallback(interpr_, callback, (SEE_object*)m_po); } m_inTimer = false; } } IMPLEMENT_FUNCTION(program, setTimeout) { program_object* po = (program_object*)HOST_DATA->m_program; SEE_object* callback = ARG_CALLBACK(0); long timeout = ARG_LONG(1); // stop any timer if( HOST_DATA->m_timer ) { HOST_DATA->m_timer->Stop(); } // remove any previous callbacks if( po->m_onTimeout ) { HOST_DATA->RemovePersistentObject( po->m_onTimeout ); po->m_onTimeout = NULL; } // set and start new timer (if any - you can also assign "undefined" as the new callback, AddPersistenObject handles this) if( callback && timeout > 0 ) { po->m_onTimeout = callback; HOST_DATA->AddPersistentObject(po->m_onTimeout, SJ_PERSISTENT_OTHER, NULL); if( HOST_DATA->m_timer == NULL ) HOST_DATA->m_timer = new SjProgramTimer(interpr_, po); HOST_DATA->m_timer->Start(timeout, ARG_LONG(2)? wxTIMER_CONTINUOUS : wxTIMER_ONE_SHOT); } } /******************************************************************************* * Import / Export ******************************************************************************/ IMPLEMENT_FUNCTION(program, exportFunction) { SEE_object* function = ARG_CALLBACK(0); if( function == NULL ) SEE_error_throw(interpr_, interpr_->TypeError, "no function"); HOST_DATA->AddPersistentObject(function, SJ_PERSISTENT_EXPORT, NULL); } static void copyVal(SEE_interpreter* srcInterpr, const SEE_value* srcVal, SEE_interpreter* destInterpr, SEE_value* destVal) { switch( SEE_VALUE_GET_TYPE(srcVal) ) { case SEE_STRING: SEE_SET_STRING(destVal, SEE_string_dup(destInterpr, srcVal->u.string)); break; case SEE_BOOLEAN: SEE_SET_BOOLEAN(destVal, srcVal->u.boolean); break; case SEE_NUMBER: SEE_SET_NUMBER(destVal, srcVal->u.number); break; case SEE_NULL: SEE_SET_NULL(destVal); break; default: // objects cannot be copied this way! SEE_SET_UNDEFINED(destVal); break; } } IMPLEMENT_FUNCTION(program, callExported) { if( argc_ < 1 || SEE_VALUE_GET_TYPE(argv_[0]) != SEE_STRING ) { SEE_error_throw(interpr_, interpr_->TypeError, "no function"); } SEE_string *wantedFuncName = argv_[0]->u.string, *otherFuncName; SjSee* otherSee = SjSee::s_first; while( otherSee ) { persistent_object* otherPer = otherSee->m_persistentAnchor->m_next; while( otherPer ) { if( otherPer->m_scope == SJ_PERSISTENT_EXPORT ) { otherFuncName = SEE_function_getname(otherSee->m_interpr, otherPer->m_object); if( SEE_string_cmp(wantedFuncName, otherFuncName) == 0 ) { // make a copy of all arguments int otherArgc = argc_-1, i; SEE_value** otherArgv = (SEE_value**)SEE_malloc(otherSee->m_interpr, sizeof(SEE_value*)*(otherArgc+1)); SEE_value otherResult; for( i = 0; i < otherArgc; i++ ) { otherArgv[i] = (SEE_value*)SEE_malloc(otherSee->m_interpr, sizeof(SEE_value)); copyVal(interpr_, argv_[i+1], otherSee->m_interpr, otherArgv[i]); } // call the exported function SEE_OBJECT_CALL(otherSee->m_interpr, otherPer->m_object, otherPer->m_object, otherArgc, otherArgv, &otherResult); // copy back the result to our scope copyVal(otherSee->m_interpr, &otherResult, interpr_, res_); return; } } otherPer = otherPer->m_next; } otherSee = otherSee->m_next; } SEE_error_throw(interpr_, interpr_->Error, "export not found"); } IMPLEMENT_FUNCTION(program, callPlugin) { SjCPlugin* p = HOST_DATA->m_plugin; if( p == NULL ) SEE_error_throw(interpr_, interpr_->Error, "no plugin"); SJPARAM ret = p->CallPlugin(SJ_PLUGIN_CALL, p->EncodeString(ARG_STRING(0)), p->EncodeString(ARG_STRING(1)), p->EncodeString(ARG_STRING(2)) ); if( ret == 0 || ret == 1 ) RETURN_BOOL( ret ); else RETURN_STRING( p->DecodeString(ret) ); RETURN_BOOL( FALSE ); } /******************************************************************************* * Misc. ******************************************************************************/ IMPLEMENT_FUNCTION(program, selectAll) { bool doSelect = argc_>0? ARG_BOOL(0) : true; g_mainFrame->m_columnMixer.SelectAll(doSelect); g_mainFrame->m_browser->RefreshSelection(); if( !doSelect ) { // as getSelection also returns URLs selected in the display, g_mainFrame->m_display.ClearDisplaySelection(); // they should be cleared as well. For "select all" this is not needed as } // they are included in the workspace. RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, getSelection) { wxArrayString selUrls; SjSelectedUrlsScope scope; switch( ARG_LONG(0) ) { default: /*skipped or 0*/ scope = SJ_SEL_URLS_SMART; break; case 1: scope = SJ_SEL_URLS_WORKSPACE; break; case 2: scope = SJ_SEL_URLS_DISPLAY; break; } g_mainFrame->m_columnMixer.GetSelectedUrls(selUrls, scope); RETURN_ARRAY_STRING( selUrls ); } IMPLEMENT_FUNCTION(program, getMusicSels) { wxArrayString musicSels; if( g_advSearchModule ) { long i, iCount = g_advSearchModule->GetSearchCount(); for( i = 0; i < iCount; i++ ) musicSels.Add(g_advSearchModule->GetSearchByIndex(i, false).GetName()); } RETURN_ARRAY_STRING( musicSels ); } IMPLEMENT_FUNCTION(program, run) { if( !::wxExecute(ARG_STRING(0), wxEXEC_ASYNC) ) SEE_error_throw(interpr_, interpr_->Error, "cannot run"); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, launchBrowser) { g_tools->ExploreUrl(ARG_STRING(0)); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, iniRead) { wxString ret; if( !ARG_IS_STRING(0) ) { RETURN_UNDEFINED; return; } wxString key = ARG_STRING(0); wxConfigBase::EntryType keyType = g_tools->m_config->GetEntryType(key); double valDouble; switch( keyType ) { case wxConfigBase::Type_Boolean: RETURN_BOOL( g_tools->m_config->Read(key, ARG_BOOL(1)) ); break; case wxConfigBase::Type_Integer: RETURN_LONG( g_tools->m_config->Read(key, ARG_LONG(1)) ); break; case wxConfigBase::Type_Float: valDouble = ARG_DOUBLE(1); g_tools->m_config->Read(key, &valDouble); RETURN_DOUBLE( valDouble ); break; default: RETURN_STRING( g_tools->m_config->Read(key, ARG_STRING(1)) ); break; } } IMPLEMENT_FUNCTION(program, iniWrite) { if( !ARG_IS_STRING(0) ) { RETURN_UNDEFINED; return; } wxString key = ARG_STRING(0); wxConfigBase::EntryType keyType = g_tools->m_config->GetEntryType(key); if( ( keyType == wxConfigBase::Type_Integer || keyType == wxConfigBase::Type_Boolean || keyType == wxConfigBase::Type_Unknown ) && ( ARG_IS_BOOL(1) || ARG_STRING(1) == wxString::Format(wxT("%i"), (int)ARG_LONG(1)) ) ) { // keep/write long g_tools->m_config->Write(key, ARG_LONG(1)); } else { // convert to string g_tools->m_config->Write(key, ARG_STRING(1)); } RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, setDisplayMsg) { g_mainFrame->SetDisplayMsg(ARG_STRING(0), ARG_LONG_OR_DEF(1, 10000)); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, setSkinText) { g_mainFrame->SetSkinText(ARG_STRING(0), ARG_STRING(1)); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, refreshWindows) { if( g_mainFrame ) { // what to update (this is a bitfield, bit #0: update display, bit #1: update workspace, // if this parameter is skipped, update the display for historical reasons) long what = 0x01; if( argc_ >= 1 ) what = ARG_LONG(0); // do the update if( what & 0x01 ) { g_mainFrame->UpdateDisplay(); } if( what & 0x02 ) { g_mainFrame->m_browser->ReloadColumnMixer(); } g_mainFrame->Refresh(); } RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, shutdown) { SjMainApp::DoShutdownEtc((SjShutdownEtc)ARG_LONG(0)); RETURN_UNDEFINED; } IMPLEMENT_FUNCTION(program, gc) { SjGcDoCleanup(); RETURN_UNDEFINED; } /******************************************************************************* * Properties ******************************************************************************/ IMPLEMENT_HASPROPERTY(program) { if( VAL_PROPERTY( version ) || VAL_PROPERTY( os ) || VAL_PROPERTY( locale ) || VAL_PROPERTY( loaded ) || VAL_PROPERTY( zoom ) || VAL_PROPERTY( viewMode ) || VAL_PROPERTY( listModeColumns ) || VAL_PROPERTY( listModeOrder ) || VAL_PROPERTY( memory ) || VAL_PROPERTY( memoryPeak ) || VAL_PROPERTY( hwnd ) || VAL_PROPERTY( onLoad ) || VAL_PROPERTY( onUnload ) || VAL_PROPERTY( onKioskStarting ) || VAL_PROPERTY( onKioskStarted ) || VAL_PROPERTY( onKioskEnding ) || VAL_PROPERTY( onKioskEnded ) || VAL_PROPERTY( kioskMode ) || VAL_PROPERTY( visMode ) || VAL_PROPERTY( sleepMode ) || VAL_PROPERTY( sleepMinutes ) || VAL_PROPERTY( autoPlay ) || VAL_PROPERTY( musicSel ) || VAL_PROPERTY( search ) || VAL_PROPERTY( layout ) || VAL_PROPERTY( lastUserInput ) ) { RETURN_HAS; } else { RETURN_HASNOT; } } IMPLEMENT_GET(program) { program_object* po = (program_object*)HOST_DATA->m_program; if( VAL_PROPERTY( loaded ) ) { RETURN_BOOL( !g_mainFrame->InConstruction() ); } else if( VAL_PROPERTY( version ) ) { RETURN_LONG( ((SJ_VERSION_MAJOR<<24)|(SJ_VERSION_MINOR<<16)|(SJ_VERSION_REVISION<<8)) ); } else if( VAL_PROPERTY( os ) ) { #if defined(__WXMSW__) RETURN_STRING(wxT("win")); #elif defined(__WXMAC__) RETURN_STRING(wxT("mac")); #elif defined(__WXGTK__) RETURN_STRING(wxT("gtk")); #else #error Your OS here! #endif } else if( VAL_PROPERTY( locale ) ) { RETURN_STRING( g_mainFrame->m_locale.GetCanonicalName() ); } else if( VAL_PROPERTY( zoom ) ) { RETURN_LONG( g_mainFrame->GetZoom() ); } else if( VAL_PROPERTY( viewMode ) ) { RETURN_LONG( g_mainFrame->m_browser->GetView() ); } else if( VAL_PROPERTY( listModeColumns ) ) { SjListBrowser* listBrowser = g_mainFrame->m_browser->GetListBrowser(); RETURN_ARRAY_LONG( listBrowser->GetColumns() ); } else if( VAL_PROPERTY( listModeOrder ) ) { SjListBrowser* listBrowser = g_mainFrame->m_browser->GetListBrowser(); long sortField; bool desc; listBrowser->GetOrder(sortField, desc); if( desc ) sortField = sortField*-1; RETURN_LONG( sortField ); } else if( VAL_PROPERTY( memory ) ) { RETURN_LONG( g_gc_system.curSize ); } else if( VAL_PROPERTY( memoryPeak ) ) { RETURN_LONG( g_gc_system.peakSize ); } else if( VAL_PROPERTY( hwnd ) ) { RETURN_LONG( (long)g_mainFrame->GetHandle() ); } else if( VAL_PROPERTY( onLoad ) ) { if( po->m_onLoad ) RETURN_OBJECT(po->m_onLoad); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( onUnload ) ) { if( po->m_onUnload ) RETURN_OBJECT(po->m_onUnload); else RETURN_UNDEFINED; } // kiosk else if( VAL_PROPERTY( onKioskStarting ) ) { if( po->m_onKioskStarting ) RETURN_OBJECT(po->m_onKioskStarting); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( onKioskStarted ) ) { if( po->m_onKioskStarted ) RETURN_OBJECT(po->m_onKioskStarted); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( onKioskEnding ) ) { if( po->m_onKioskEnding ) RETURN_OBJECT(po->m_onKioskEnding); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( onKioskEnded ) ) { if( po->m_onKioskEnded ) RETURN_OBJECT(po->m_onKioskEnded); else RETURN_UNDEFINED; } else if( VAL_PROPERTY( kioskMode ) ) { RETURN_BOOL( g_mainFrame->IsKioskStarted() ); } // get vis. mode else if( VAL_PROPERTY( visMode ) ) { if( g_visModule ) RETURN_BOOL( g_visModule->IsVisStarted() ); else RETURN_FALSE; } // get sleep mode else if( VAL_PROPERTY( sleepMode ) || VAL_PROPERTY( sleepMinutes ) ) { bool enabled, doFade; SjShutdownEtc action; long timemode, minutes, fadeSeconds; g_mainFrame->m_autoCtrl.GetSleepSettings(enabled, action, timemode, minutes, doFade, fadeSeconds); if( VAL_PROPERTY( sleepMode ) ) { RETURN_BOOL( enabled ); } else if( VAL_PROPERTY( sleepMinutes ) && timemode!=SJ_SLEEPMODE_TIMEMODE_AT && timemode!=SJ_SLEEPMODE_TIMEMODE_ALWAYS_AT ) { RETURN_LONG( minutes ); } else { RETURN_UNDEFINED; } } // get auto play else if( VAL_PROPERTY( autoPlay ) ) { bool enabled; enabled = (g_mainFrame->m_autoCtrl.m_flags&SJ_AUTOCTRL_AUTOPLAY_ENABLED) != 0; RETURN_BOOL( enabled ); } // search else if( VAL_PROPERTY( search ) ) { if( g_advSearchModule ) { const SjSearch* search = g_mainFrame->GetSearch(); if( search->m_simple.IsSet() ) { RETURN_STRING(search->m_simple.GetWords()); return; } } RETURN_UNDEFINED; } // music sel else if( VAL_PROPERTY( musicSel ) ) { if( g_advSearchModule ) { const SjSearch* search = g_mainFrame->GetSearch(); if( search->m_adv.IsSet() ) { RETURN_STRING(search->m_adv.GetName()); return; } } RETURN_UNDEFINED; } // get the current layout else if( VAL_PROPERTY( layout ) ) { if( g_mainFrame ) { SjSkinLayout* currLayout = g_mainFrame->GetLayout(); if( currLayout ) { RETURN_STRING( currLayout->GetName() ); return; } } RETURN_UNDEFINED; } // get the last user input timestamp else if( VAL_PROPERTY( lastUserInput ) ) { if( g_mainFrame ) { RETURN_LONG( SjTimestampDiff(g_mainFrame->LastInputFromUser(), SjTools::GetMsTicks()) ); } else { RETURN_LONG( 0 ); } } else { RETURN_GET_DEFAULTS; } } IMPLEMENT_PUT(program) { program_object* po = (program_object*)HOST_DATA->m_program; if( VAL_PROPERTY( zoom ) ) { g_mainFrame->m_browser->SetZoom_(VAL_LONG); } else if( VAL_PROPERTY( viewMode ) ) { g_mainFrame->m_browser->SetView_(VAL_LONG, true, true); } else if( VAL_PROPERTY( listModeColumns ) ) { SjListBrowser* listBrowser = g_mainFrame->m_browser->GetListBrowser(); listBrowser->SetColumns(VAL_ARRAY_LONG); } else if( VAL_PROPERTY( listModeOrder ) ) { SjListBrowser* listBrowser = g_mainFrame->m_browser->GetListBrowser(); long sortField = VAL_LONG; bool desc = false; if( sortField < 0 ) {sortField*=-1; desc=true;} listBrowser->SetOrder(sortField, desc); } else if( VAL_PROPERTY( onLoad ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onLoad); if( g_mainFrame->InConstruction() ) { HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); po->m_onLoad = newCallback; } else { SeeCallCallback(interpr_, newCallback, (SEE_object*)po); } } else if( VAL_PROPERTY( onUnload ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onUnload); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onUnload = newCallback; } // kiosk else if( VAL_PROPERTY( onKioskStarting ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onKioskStarting); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onKioskStarting = newCallback; } else if( VAL_PROPERTY( onKioskStarted ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onKioskStarted); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onKioskStarted = newCallback; } else if( VAL_PROPERTY( onKioskEnding ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onKioskEnding); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onKioskEnding = newCallback; } else if( VAL_PROPERTY( onKioskEnded ) ) { SEE_object* newCallback = VAL_CALLBACK; HOST_DATA->RemovePersistentObject(po->m_onKioskEnding); HOST_DATA->AddPersistentObject(newCallback, SJ_PERSISTENT_OTHER); // you can also assign "undefined" as the new callback, AddPersistenObject handles this po->m_onKioskEnded = newCallback; } else if( VAL_PROPERTY( kioskMode ) ) { if( !g_mainFrame->InConstruction() ) { if( VAL_LONG ) g_kioskModule->StartRequest(true/*forceNoQueryConfig*/); else g_kioskModule->ExitRequest(0, NULL, true/*forceSimpleExit*/); } } // set vis. mode else if( VAL_PROPERTY( visMode ) ) { if( g_visModule ) { if( VAL_BOOL ) g_visModule->StartVis(); else g_visModule->StopVis(); } } // set sleep mode else if( VAL_PROPERTY( sleepMode ) || VAL_PROPERTY( sleepMinutes ) ) { bool enabled, doFade, putBack = false; SjShutdownEtc action; long timemode, minutes, fadeSeconds; g_mainFrame->m_autoCtrl.GetSleepSettings(enabled, action, timemode, minutes, doFade, fadeSeconds); if( VAL_PROPERTY( sleepMode ) ) { enabled = VAL_BOOL; putBack = true; } else if( VAL_PROPERTY( sleepMinutes ) && timemode!=SJ_SLEEPMODE_TIMEMODE_AT && timemode!=SJ_SLEEPMODE_TIMEMODE_ALWAYS_AT ) { minutes = VAL_LONG; putBack = true; } if( putBack ) { g_mainFrame->m_autoCtrl.SetSleepSettings(enabled, action, timemode, minutes, doFade, fadeSeconds); g_mainFrame->m_autoCtrl.SaveAutoCtrlSettings(); } } // set auto play else if( VAL_PROPERTY( autoPlay ) ) { bool enabled = VAL_BOOL; long old = g_mainFrame->m_autoCtrl.m_flags; SjTools::SetFlag(g_mainFrame->m_autoCtrl.m_flags, SJ_AUTOCTRL_AUTOPLAY_ENABLED, enabled); if( g_mainFrame->m_autoCtrl.m_flags != old ) g_mainFrame->m_autoCtrl.SaveAutoCtrlSettings(); } // search else if( VAL_PROPERTY( search ) ) { if( g_advSearchModule && !g_mainFrame->InConstruction() ) { wxString words = VAL_STRING; if( !words.IsEmpty() ) { g_mainFrame->SetSearch(SJ_SETSEARCH_SETSIMPLE, words); } else { g_mainFrame->SetSearch(SJ_SETSEARCH_CLEARSIMPLE); } } } // music sel else if( VAL_PROPERTY( musicSel ) ) { if( g_advSearchModule && !g_mainFrame->InConstruction() ) { wxString name = VAL_STRING; if( !name.IsEmpty() ) { SjAdvSearch advSearch = g_advSearchModule->GetSearchByName(name); g_mainFrame->SetSearch(SJ_SETSEARCH_CLEARSIMPLE|SJ_SETSEARCH_SETADV, wxT(""), &advSearch); } else { g_mainFrame->SetSearch(SJ_SETSEARCH_CLEARSIMPLE|SJ_SETSEARCH_CLEARADV); } } } // set the current layout else if( VAL_PROPERTY( layout ) ) { if( g_mainFrame ) { wxString newLayoutName = VAL_STRING; SjSkinLayout* currLayout = g_mainFrame->GetLayout(); SjSkinLayout* newLayout = g_mainFrame->GetLayout(newLayoutName); if( currLayout != newLayout ) { g_mainFrame->LoadLayout(newLayout); } } } // set the last user input timestamp else if( VAL_PROPERTY( lastUserInput ) ) { if( g_mainFrame ) { g_mainFrame->GotInputFromUser(); } } else { DO_PUT_DEFAULTS; } } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for Program.prototype and program instances */ static SEE_objectclass program_inst_class = { "Program", /* Class */ program_get, /* Get */ program_put, /* Put */ SEE_native_canput, /* CanPut */ program_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for Program constructor */ static SEE_objectclass program_constructor_class = { "ProgramConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ program_construct, /* Construct */ NULL /* Call */ }; void SjSee::Program_init() { SEE_value temp; // Create the "Program.prototype" object, this is used as a template for the instances m_Program_prototype = (SEE_object *)alloc_program_object(m_interpr); SEE_native_init((SEE_native *)m_Program_prototype, m_interpr, &program_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_Program_prototype, program, addMenuEntry, 0); PUT_FUNC(m_Program_prototype, program, addConfigButton, 0); PUT_FUNC(m_Program_prototype, program, addSkinsButton, 0); PUT_FUNC(m_Program_prototype, program, addExitOption, 0); PUT_FUNC(m_Program_prototype, program, setTimeout, 0); PUT_FUNC(m_Program_prototype, program, setDisplayMsg, 0); PUT_FUNC(m_Program_prototype, program, setSkinText, 0); PUT_FUNC(m_Program_prototype, program, refreshWindows, 0); PUT_FUNC(m_Program_prototype, program, selectAll, 0); PUT_FUNC(m_Program_prototype, program, getSelection, 0); PUT_FUNC(m_Program_prototype, program, getMusicSels, 0); PUT_FUNC(m_Program_prototype, program, run, 0); PUT_FUNC(m_Program_prototype, program, launchBrowser, 0); PUT_FUNC(m_Program_prototype, program, iniRead, 0); PUT_FUNC(m_Program_prototype, program, iniWrite, 0); PUT_FUNC(m_Program_prototype, program, exportFunction, 0); PUT_FUNC(m_Program_prototype, program, callExported, 0); PUT_FUNC(m_Program_prototype, program, callPlugin, 0); PUT_FUNC(m_Program_prototype, program, shutdown, 0); PUT_FUNC(m_Program_prototype, program, gc, 0); // create the "Program" object SEE_object* Program = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)Program, m_interpr, &program_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(Program, str_prototype, m_Program_prototype) // now we can add the globals PUT_OBJECT(m_interpr->Global, str_Program, Program); m_program = Program_new(); PUT_OBJECT(m_interpr->Global, str_program, m_program); } SEE_object* SjSee::Program_new() { program_object* obj = alloc_program_object(m_interpr); SEE_native_init(&obj->m_native, m_interpr, &program_inst_class, m_Program_prototype); return (SEE_object *)obj; } void SjSee::Program_receiveMsg(int msg) { if( m_interprInitialized ) { program_object* po = (program_object*)m_program; switch( msg ) { case IDMODMSG_KIOSK_STARTING: SeeCallCallback(m_interpr, po->m_onKioskStarting, m_program); break; case IDMODMSG_KIOSK_STARTED: SeeCallCallback(m_interpr, po->m_onKioskStarted, m_program); break; case IDMODMSG_KIOSK_ENDING: SeeCallCallback(m_interpr, po->m_onKioskEnding, m_program); break; case IDMODMSG_KIOSK_ENDED: SeeCallCallback(m_interpr, po->m_onKioskEnded, m_program); break; case IDMODMSG_PROGRAM_LOADED: SeeCallCallback(m_interpr, po->m_onLoad, m_program); RemovePersistentObject(po->m_onLoad); po->m_onLoad = NULL; break; case IDMODMSG_WINDOW_BEFORE_CLOSE_HIDE_N_STOP: SeeCallCallback(m_interpr, po->m_onUnload, m_program); RemovePersistentObject(po->m_onUnload); po->m_onUnload = NULL; break; case IDMODMSG_TRACK_ON_AIR_CHANGED: Player_receiveMsg(msg); break; } } } #endif // SJ_USE_SCRIPTS ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/obj_Rights.cpp��������������������������������������������������������0000664�0000000�0000000�00000015624�12660066715�0021007�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: obj_Rights.cpp * Authors: Björn Petersen * Purpose: The Rights class for SEE * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <sjmodules/kiosk/kiosk.h> #include <sjbase/browser.h> #include <see_dom/sj_see.h> #include <see_dom/sj_see_helpers.h> // data used by our object struct rights_object { SEE_native native; }; /******************************************************************************* * Misc. ******************************************************************************/ IMPLEMENT_FUNCTION(rights, construct) { RETURN_OBJECT( HOST_DATA->Rights_new() ); } IMPLEMENT_FUNCTION(rights, viewMode) { RETURN_BOOL( g_mainFrame->m_browser->IsViewAvailable(ARG_LONG(0)) ); } /******************************************************************************* * Properties ******************************************************************************/ IMPLEMENT_HASPROPERTY(rights) { if( VAL_PROPERTY( all ) || VAL_PROPERTY( credits ) || VAL_PROPERTY( useCredits ) || VAL_PROPERTY( play ) || VAL_PROPERTY( pause ) || VAL_PROPERTY( stop ) || VAL_PROPERTY( editQueue ) || VAL_PROPERTY( multiEnqueue ) || VAL_PROPERTY( search ) || VAL_PROPERTY( startVis ) || VAL_PROPERTY( volume ) || VAL_PROPERTY( prelisten ) || VAL_PROPERTY( zoom ) ) { RETURN_HAS; } else { RETURN_HASNOT; } } IMPLEMENT_GET(rights) { if( VAL_PROPERTY( all ) ) { RETURN_BOOL( g_mainFrame->IsAllAvailable() ); } else if( VAL_PROPERTY( credits ) ) { RETURN_LONG( g_kioskModule->m_creditBase.GetCredit() ); } else if( VAL_PROPERTY( useCredits ) ) { RETURN_BOOL( g_kioskModule->m_creditBase.IsCreditSystemEnabled() ); } else if( VAL_PROPERTY( play ) || VAL_PROPERTY( pause ) || VAL_PROPERTY( stop ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_PLAYPAUSE) ); } else if( VAL_PROPERTY( editQueue ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_EDIT_QUEUE) ); } else if( VAL_PROPERTY( unqueue ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_UNQUEUE) ); } else if( VAL_PROPERTY( multiEnqueue ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE) ); } else if( VAL_PROPERTY( search ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_SEARCH) ); } else if( VAL_PROPERTY( startVis ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_STARTVIS) ); } else if( VAL_PROPERTY( volume ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_MAIN_VOL) ); } else if( VAL_PROPERTY( prelisten ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_PRELISTEN) ); } else if( VAL_PROPERTY( zoom ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_ZOOM) ); } else if( VAL_PROPERTY( repeat ) ) { RETURN_BOOL( g_mainFrame->IsOpAvailable(SJ_OP_REPEAT) ); } else { RETURN_GET_DEFAULTS; } } IMPLEMENT_PUT(rights) { long opToChange = 0; if( VAL_PROPERTY( credits ) ) { g_kioskModule->m_creditBase.AddCredit(VAL_LONG, SJ_ADDCREDIT_SET_TO_NULL_BEFORE_ADD); } else if( VAL_PROPERTY( editQueue ) ) { opToChange = SJ_OP_EDIT_QUEUE; } else if( VAL_PROPERTY( unqueue ) ) { opToChange = SJ_OP_UNQUEUE; } else if( VAL_PROPERTY( multiEnqueue ) ) { opToChange = SJ_OP_MULTI_ENQUEUE; } else { DO_PUT_DEFAULTS; } // change a flag, added in 2.52beta2, see also http://www.silverjuke.net/forum/topic-2204.html if( opToChange != 0 && !g_mainFrame->IsAllAvailable() ) { SjTools::SetFlag(g_mainFrame->m_availOp, opToChange, VAL_BOOL); g_mainFrame->UpdateDisplay(); } } /******************************************************************************* * Let SEE know about this class (this part is a little more complicated) ******************************************************************************/ /* object class for Rights.prototype and rights instances */ static SEE_objectclass rights_inst_class = { "Rights", /* Class */ rights_get, /* Get */ rights_put, /* Put */ SEE_native_canput, /* CanPut */ rights_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ NULL, /* Construct */ NULL, /* Call */ NULL /* HasInstance */ }; /* object class for Rights constructor */ static SEE_objectclass rights_constructor_class = { "RightsConstructor", /* Class */ SEE_native_get, /* Get */ SEE_native_put, /* Put */ SEE_native_canput, /* CanPut */ SEE_native_hasproperty, /* HasProperty */ SEE_native_delete, /* Delete */ SEE_native_defaultvalue, /* DefaultValue */ SEE_native_enumerator, /* DefaultValue */ rights_construct, /* Construct */ NULL /* Call */ }; void SjSee::Rights_init() { SEE_value temp; // Create the "Rights.prototype" object, this is used as a template for the instances m_Rights_prototype = (SEE_object *)SEE_malloc(m_interpr, sizeof(rights_object)); SEE_native_init((SEE_native *)m_Rights_prototype, m_interpr, &rights_inst_class, m_interpr->Object_prototype); PUT_FUNC(m_Rights_prototype, rights, viewMode, 0); // create the "Rights" object SEE_object* Rights = (SEE_object *)SEE_malloc(m_interpr, sizeof(SEE_native)); SEE_native_init((SEE_native *)Rights, m_interpr, &rights_constructor_class, m_interpr->Object_prototype); PUT_OBJECT(Rights, str_prototype, m_Rights_prototype) // now we can add the globals PUT_OBJECT(m_interpr->Global, str_Rights, Rights); PUT_OBJECT(m_interpr->Global, str_rights, Rights_new()); } SEE_object* SjSee::Rights_new() { rights_object* obj = (rights_object*)SEE_malloc(m_interpr, sizeof(rights_object)); SEE_native_init(&obj->native, m_interpr, &rights_inst_class, m_Rights_prototype); return (SEE_object *)obj; } #endif // SJ_USE_SCRIPTS ������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/sj_see.cpp������������������������������������������������������������0000664�0000000�0000000�00000045157�12660066715�0020171�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: sj_see.cpp * Authors: Björn Petersen * Purpose: Our Interpreter * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_SCRIPTS #include <see_dom/sj_see.h> #define SJ_IMPLEMENT_HELPERS #include <see_dom/sj_see_helpers.h> /******************************************************************************* * Callbacks for SEE_system ******************************************************************************/ static void SjSee_abort(SEE_interpreter* interpr_, const char* msgPtr) SEE_dead; static void SjSee_abort(SEE_interpreter* interpr_, const char* msgPtr) { wxString msgStr(msgPtr, wxConvUTF8); wxLogError(wxT("Fatal: %s [%s]"), msgStr.c_str(), HOST_DATA->m_executionScope.c_str()); SjMainApp::FatalError(); abort(); } static void* SjSee_malloc(SEE_interpreter* interpr, SEE_size_t size) { return SjGcAlloc(size, (interpr?0:SJ_GC_ALLOC_STATIC)); } static void* SjSee_malloc_string(SEE_interpreter* interpr, SEE_size_t size) { return SjGcAlloc(size, (interpr?0:SJ_GC_ALLOC_STATIC) | SJ_GC_ALLOC_STRING); } static void* SjSee_malloc_finalize(SEE_interpreter* interpr, SEE_size_t size, void (*finalizefn)(SEE_interpreter*, void*, void*), void* closure) { return SjGcAlloc(size, (interpr?0:SJ_GC_ALLOC_STATIC), (SJ_GC_PROC)finalizefn, interpr, closure); } static void SjSee_free(SEE_interpreter* interpr, void* ptr) { SjGcUnref(ptr); } /******************************************************************************* * SjSee constructor / destructor ******************************************************************************/ SjSee* SjSee::s_first = NULL; SjSee::SjSee() { SjGcLocker gclocker; // allocate interpreter structure // (initialization is delayed to the first call to Execute() - this allows us // to create SjSee objects very fast even if they may be not needed. m_plugin = NULL; m_interpr = (SEE_interpreter*)SjGcAlloc(sizeof(SEE_interpreter), SJ_GC_ALLOC_STATIC|SJ_GC_ZERO); m_interpr->host_data = this; m_interprInitialized = false; m_executeResult = (SEE_value*)SjGcAlloc(sizeof(SEE_value), SJ_GC_ALLOC_STATIC|SJ_GC_ZERO); m_persistentAnchor = (persistent_object*)SjGcAlloc(sizeof(persistent_object), SJ_GC_ALLOC_STATIC|SJ_GC_ZERO); m_persistentAnchor->m_object= (SEE_object*)m_persistentAnchor; m_timer = NULL; wxASSERT( m_executeResult->_type == SEE_UNDEFINED ); // add to list m_next = s_first; s_first = this; } SjSee::~SjSee() { SjGcLocker gclocker; // stop and free the timer if( m_timer ) { wxASSERT( wxThread::IsMain() ); m_timer->m_inTimer = true; m_timer->Stop(); delete m_timer; m_timer = NULL; } // call all "unexpected unpersistent" functions { persistent_object *cur = m_persistentAnchor->m_next; while( cur ) { if( cur->m_unexpectedUnpersistent ) cur->m_unexpectedUnpersistent(m_interpr, cur->m_object, NULL); cur = cur->m_next; } } // free interpreter structure SjGcUnref(m_interpr); SjGcUnref(m_executeResult); SjGcUnref(m_persistentAnchor); // remove from list { #ifdef __WXDEBUG__ bool dbg_removed = false; long dbg_oldCnt = 0; { SjSee* dbg_cur = s_first; while( dbg_cur ) { dbg_oldCnt++; dbg_cur = dbg_cur->m_next; } } #endif SjSee *cur = s_first, **prev = &s_first; while( cur ) { if( cur==this ) { #ifdef __WXDEBUG__ dbg_removed = true; #endif *prev = m_next; break; } prev = &cur->m_next; cur = cur->m_next; } #ifdef __WXDEBUG__ wxASSERT( dbg_removed ); { long dbg_newCnt = 0; SjSee* dbg_cur = s_first; while( dbg_cur ) { dbg_newCnt++; dbg_cur = dbg_cur->m_next; } wxASSERT( dbg_newCnt == dbg_oldCnt - 1 ); } #endif } } /******************************************************************************* * SjSee - embedding and events ******************************************************************************/ void SjSee::ReceiveMsg(int msg) { SjGcLocker gclocker; SjSee* cur = s_first; while( cur ) { cur->Program_receiveMsg(msg); cur = cur->m_next; } } bool SjSee::HasGlobalEmbeddings(SjSeePersistent embedId) const { wxArrayString strings; Program_getGlobalEmbed(embedId, strings); return !strings.IsEmpty(); } wxArrayString SjSee::GetGlobalEmbeddings(SjSeePersistent embedId) { wxArrayString strings; SjSee* cur = s_first; while( cur ) { cur->Program_getGlobalEmbed(embedId, strings); cur = cur->m_next; } return strings; } bool SjSee::OnGlobalEmbedding(SjSeePersistent embedId, int globalIndex, SjSee* doDefaultAction) { SjGcLocker gclocker; int localIndexStart = 0, localCount; wxArrayString strings; SjSee* cur = s_first; while( cur ) { strings.Empty(); cur->Program_getGlobalEmbed(embedId, strings); localCount = strings.GetCount(); if( (globalIndex >= localIndexStart && globalIndex < localIndexStart+localCount) || doDefaultAction == cur ) { return cur->Program_onGlobalEmbed(embedId, doDefaultAction? 0 : globalIndex-localIndexStart); } cur = cur->m_next; localIndexStart += localCount; } return false; } /******************************************************************************* * SjSee - execute scripts ******************************************************************************/ static void SeeLogErrorObj(SEE_interpreter* interpr_, SEE_value* errorValue) { // is the value an object? if( errorValue==NULL || SEE_VALUE_GET_TYPE(errorValue) != SEE_OBJECT ) return; // is the object an array? SEE_object* errorObj = errorValue->u.object; if( errorObj == NULL ) return; // get what to get ... wxString errorName, errorMsg, tempStr; long lineno = -1; // ... get the error name SEE_value tempVal; SEE_OBJECT_GET(interpr_, errorObj, str_name, &tempVal); if( SEE_VALUE_GET_TYPE(&tempVal) == SEE_STRING ) errorName = SeeValueToWxString(interpr_, &tempVal); errorName.Trim(true); errorName.Trim(false); if( errorName.IsEmpty() ) errorName = wxT("Error"); // ... get the error message, this is formatted as "<string>:<lineno>:msg" SEE_OBJECT_GET(interpr_, errorObj, str_message, &tempVal); if( SEE_VALUE_GET_TYPE(&tempVal) == SEE_STRING ) { errorMsg = SeeValueToWxString(interpr_, &tempVal); if( errorMsg.Find(wxT(":")) >= 0 ) { tempStr = errorMsg.BeforeFirst(wxT(':')); errorMsg = errorMsg.AfterFirst(wxT(':')); } if( errorMsg.Find(wxT(":")) >= 0 ) { tempStr = errorMsg.BeforeFirst(wxT(':')); if( !tempStr.ToLong(&lineno, 10) ) lineno = -1; errorMsg = errorMsg.AfterFirst(wxT(':')); } errorMsg.Trim(true); errorMsg.Trim(false); } if( errorMsg.IsEmpty() ) errorMsg = wxT("Unknown error"); // ... get the line number if( lineno >= 1 ) tempStr.Printf(wxT("%i"), (int)lineno); else tempStr = wxT("?"); // ... format the line wxLogError(wxT("Line %s: %s: %s [%s]"), tempStr.c_str(), errorName.c_str(), errorMsg.c_str(), HOST_DATA->m_executionScope.c_str() ); // old stuff #if 0 { SEE_value errorObjAsStr; SEE_ToString(interpr_, errorValue, &errorObjAsStr); wxString error = ::SeeValueToWxString(interpr_, &errorObjAsStr); if( error.IsEmpty() ) error = wxT("Unknown error."); wxLogError(wxT("%s [%s]"), error.c_str(), HOST_DATA->m_executionScope.c_str()); } #endif } bool SjSee::Execute(const wxString& script__) { wxASSERT( !m_executionScope.IsEmpty() ); // very first, do some garbarge collection (if needed) // this must be done _before_ we create SjGcLocker /*if( SjGcNeedsCleanup() ) { SjGcCleanup(); -- done in SjGcLocker }*/ // lock the garbage collector SjGcLocker gclocker; // init the interpreter, if not yet done if( !m_interprInitialized ) { // init some global function pointers static bool SEE_system_initialized = false; if( !SEE_system_initialized ) { SEE_system.abort = SjSee_abort; SEE_system.malloc = SjSee_malloc; SEE_system.malloc_string = SjSee_malloc_string; SEE_system.malloc_finalize = SjSee_malloc_finalize; SEE_system.free = SjSee_free; SEE_system_initialized = true; SEE_system_add_my_strings (); } // init the interpreter instance and our objects SEE_interpreter_init(m_interpr); Player_init(); Program_init(); Rights_init(); Dialog_init(); Database_init(); File_init(); HttpRequest_init(); m_interprInitialized = true; } // do what to do bool success = true; SEE_input* input; SEE_try_context_t tryContext; /* Create an input stream that provides program text */ { wxString script(script__); if( script.Find(wxT("\r")) != -1 ) // no "\r" - otherwise, the line numbers get out of order { if( script.Find(wxT("\n")) != -1 ) script.Replace(wxT("\r"), wxT(" ")); else script.Replace(wxT("\r"), wxT("\n")); } input = SEE_input_string(m_interpr, WxStringToSeeString(m_interpr, script)); } /* Establish an exception context */ SEE_TRY(m_interpr, tryContext) { /* Call the program evaluator */ SEE_Global_eval(m_interpr, input, m_executeResult); } /* Finally: */ SEE_INPUT_CLOSE(input); /* Catch any exceptions */ SEE_value* errorObj; if( (errorObj=SEE_CAUGHT(tryContext)) ) { SeeLogErrorObj(m_interpr, errorObj); success = false; } return success; } bool SjSee::ExecuteAsFunction(const wxString& script) { wxASSERT( !m_executionScope.IsEmpty() ); // add the function, if not yet done // this is a little hack as long as we have no real DOM for the skinning tree static long s_cnt = 29275837; long l = m_dynFunc.Lookup(script); if( l == 0 ) { l = s_cnt++; wxString declare = wxString::Format(wxT("function dynfunc%i(){%s}"), (int)l, script.c_str()); Execute(declare); m_dynFunc.Insert(script, l); } return Execute(wxString::Format(wxT("dynfunc%i()"), (int)l)); } bool SjSee::IsResultDefined() { return SEE_VALUE_GET_TYPE(m_executeResult)!=SEE_UNDEFINED; } wxString SjSee::GetResultString() { SjGcLocker gcLocker; wxASSERT( wxThread::IsMain() ); wxString ret; SEE_try_context_t tryContext; if( m_interprInitialized ) { // Establish an exception context SEE_TRY(m_interpr, tryContext) { ret = ::SeeValueToWxString(m_interpr, m_executeResult); } // Catch any exceptions if( SEE_CAUGHT(tryContext) ) { ret.Empty(); } } // done return ret; } double SjSee::GetResultDouble() { SjGcLocker gcLocker; wxASSERT( wxThread::IsMain() ); double ret = 0.0; SEE_value tempValue; SEE_try_context_t tryContext; if( m_interprInitialized ) { // Establish an exception context SEE_TRY(m_interpr, tryContext) { SEE_ToNumber(m_interpr, m_executeResult, &tempValue); ret = tempValue.u.number; } // Catch any exceptions if( SEE_CAUGHT(tryContext) ) { ret = 0.0; } } // done return ret; } long SjSee::GetResultLong() { SjGcLocker gcLocker; wxASSERT( wxThread::IsMain() ); long ret = 0; SEE_try_context_t tryContext; if( m_interprInitialized ) { // Establish an exception context SEE_TRY(m_interpr, tryContext) { ret = SEE_ToInt32(m_interpr, m_executeResult); } // Catch any exceptions if( SEE_CAUGHT(tryContext) ) { ret = 0; } } // done return ret; } wxString SjSee::GetFineName(const wxString& scope, const wxString& append) { wxString fineName(scope); if( fineName.Find(wxT('/')) != -1 || fineName.Find(wxT('\\')) != -1 || fineName.Find(wxT(':')) != -1 ) { // strip path fineName = SjTools::GetFileNameFromUrl(fineName, NULL, true); // replace some special characters fineName.Replace(wxT("_"), wxT(" ")); fineName.Replace(wxT("-"), wxT(" ")); // make first letter uppercase int p = -1; fineName = fineName.Mid(p+1, 1).Upper() + fineName.Mid(p+2); } // append extra string if( !append.IsEmpty() ) { fineName += wxT(" - ") + append; } return fineName; } /******************************************************************************* * Some Tools as declared in sj_see_helper.h ******************************************************************************/ wxString SeeValueToWxString(SEE_interpreter* interpr, SEE_value* value) { SEE_string* ret = NULL; SEE_value tempValue; if( value != NULL && SEE_VALUE_GET_TYPE(value) != SEE_UNDEFINED ) { SEE_ToString(interpr, value, &tempValue); ret = tempValue.u.string; } if( ret ) { #ifdef __WXMSW__ wxASSERT( sizeof(SEE_char_t) == sizeof(wxChar) ); return wxString((const wxChar *) ret->data, ret->length); // (const wxChar *) added on VC2008 migration #else SEE_char_t* retPtr = ret->data; long i, iCount = (long)ret->length; wxChar* wxBase = (wxChar*)malloc((iCount+1)*sizeof(wxChar)); if( wxBase == NULL ) { return wxEmptyString; } wxChar* wxPtr = wxBase; for( i = 0; i < iCount; i++ ) wxPtr[i] = (wxChar)retPtr[i]; wxPtr[iCount] = 0; wxString wx(wxBase); free(wxBase); return wx; #endif } else { return wxT(""); } } wxArrayLong SeeValueToWxArrayLong(SEE_interpreter* interpr, SEE_value* value) { wxArrayLong ret; // is the value an object? if( value==NULL || SEE_VALUE_GET_TYPE(value) != SEE_OBJECT ) return ret; // is the object an array? SEE_object* object = value->u.object; if( object == NULL || !SEE_is_Array(object) ) return ret; // is the array length > 0? SEE_uint32_t i, length = SEE_Array_length(interpr, object); if( length <= 0 ) return ret; // initialize the return value to the length ret.Add(0, length); // go through all properties and add them to the correct index SEE_enum *e; SEE_string *s; SEE_value item; int flags; e = SEE_OBJECT_ENUMERATOR(interpr, object); while ((s = SEE_ENUM_NEXT(interpr, e, &flags))) { if( SEE_to_array_index(s, &i) && i >= 0 && i < length ) { SEE_OBJECT_GET(interpr, object, s, &item); ret[i] = SEE_ToInt32(interpr, &item); } } // success return ret; } double SeeValueToDouble(SEE_interpreter* interpr, SEE_value* value) { if( value != NULL ) { if( SEE_VALUE_GET_TYPE(value) == SEE_NUMBER ) return value->u.number; SEE_value tempValue; SEE_ToNumber(interpr, value, &tempValue); return tempValue.u.number; } return 0.0; } SEE_string* WxStringToSeeString(SEE_interpreter* interpr, const wxString& src) { long srcLen = src.Len(), i; const wxChar* srcPtr = static_cast<const wxChar*>(src.c_str()); SEE_string* dest = SEE_string_new(interpr, srcLen); // the object is freed in the garbage collection SEE_char_t* destPtr = dest->data; for( i = 0; i < srcLen; i++ ) destPtr[i] = srcPtr[i]; dest->length = srcLen; return dest; } SEE_object* WxArrayStringToSeeObject(SEE_interpreter* interpr, const wxArrayString& wx) { // construct an array to A SEE_value temp; _SEE_OBJECT_CONSTRUCT(interpr, interpr->Array, interpr->Array, 0, NULL, &temp); SEE_object* A = temp.u.object; // add all strings to A int i, iCount = wx.GetCount(); for( i = 0; i < iCount; i++ ) { SEE_SET_STRING(&temp, WxStringToSeeString(interpr, wx[i])); SEE_Array_push(interpr, A, &temp); } return A; } SEE_object* WxArrayLongToSeeObject(SEE_interpreter* interpr, const wxArrayLong& wx) { // construct an array to A SEE_value temp; _SEE_OBJECT_CONSTRUCT(interpr, interpr->Array, interpr->Array, 0, NULL, &temp); SEE_object* A = temp.u.object; // add all longs to A int i, iCount = wx.GetCount(); for( i = 0; i < iCount; i++ ) { SEE_SET_NUMBER(&temp, (double)wx[i]); SEE_Array_push(interpr, A, &temp); } return A; } SEE_object* SeeValueToSeeCallback(SEE_interpreter* interpr, SEE_value* value) { wxASSERT( SjGcIsValidPtr(interpr) ); if( value ) { if( SEE_VALUE_GET_TYPE(value) == SEE_OBJECT ) { SEE_object* fnObj = value->u.object; if( SEE_OBJECT_HAS_CALL(fnObj) ) { wxASSERT( SjGcIsValidPtr(fnObj) ); return fnObj; } } } return NULL; } void SeeCallCallback(SEE_interpreter* interpr_, SEE_object* fnObj, SEE_object* fnContext, SEE_value* arg0) { SjGcLocker gcLocker; wxASSERT( interpr_ ); wxASSERT( SjGcIsValidPtr(interpr_) ); if( fnObj ) { wxASSERT( SEE_OBJECT_HAS_CALL(fnObj) ); int argc = 0; SEE_value* argv[16]; SEE_value result; SEE_try_context_t tryContext; // set parameters if( arg0 ) { argv[0] = arg0; argc++; } // call SEE_TRY(interpr_, tryContext) { SEE_OBJECT_CALL(interpr_, fnObj, fnContext, argc, argv, &result); } SEE_value* errorObj; if( (errorObj=SEE_CAUGHT(tryContext)) ) { SeeLogErrorObj(interpr_, errorObj); } } } void SjSee::AddPersistentObject(SEE_object* newObj, SjSeePersistent scope, SEE_value* param2, SJ_UNEXPECTED_UNPERSISTENT_PROC unexpectedUnpersistent) { if( newObj ) { persistent_object* cur = (persistent_object*)SjGcAlloc(sizeof(persistent_object), SJ_GC_ZERO); cur->m_object = newObj; cur->m_scope = scope; cur->m_param2 = param2; cur->m_unexpectedUnpersistent = unexpectedUnpersistent; // add as last object (little slower as adding as first, but we need this eg. for proper menu ordering) persistent_object* test = m_persistentAnchor; while( test->m_next ) { test = test->m_next; } test->m_next = cur; } } void SjSee::RemovePersistentObject(SEE_object* oldObj) { if( oldObj ) { bool dbg_removed = false; persistent_object *cur = m_persistentAnchor, *prev = NULL; while( cur ) { if( cur->m_object == oldObj ) { wxASSERT( prev ); // as we have a "dummy" anchor, prev should always be valid here prev->m_next = cur->m_next; dbg_removed = true; break; } prev = cur; cur = cur->m_next; } wxASSERT( dbg_removed ); } } #endif // SJ_USE_SCRIPTS �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/sj_see.h��������������������������������������������������������������0000664�0000000�0000000�00000013646�12660066715�0017634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: sj_see.h * Authors: Björn Petersen * Purpose: Our Interpreter * ******************************************************************************/ #ifndef __SJ_SEE_H__ #define __SJ_SEE_H__ #if SJ_USE_SCRIPTS struct SEE_object; struct SEE_interpreter; struct SEE_value; class SjCPlugin; enum SjSeePersistent { SJ_PERSISTENT_OTHER , SJ_PERSISTENT_MENU_ENTRY , SJ_PERSISTENT_CONFIG_BUTTON , SJ_PERSISTENT_EXIT_OPTION_deprecated , SJ_PERSISTENT_EXPORT }; typedef void (*SJ_UNEXPECTED_UNPERSISTENT_PROC)(SEE_interpreter* interpr, void* ptr, void* userData2); struct persistent_object { persistent_object* m_next; SEE_object* m_object; SjSeePersistent m_scope; SEE_value* m_param2; SJ_UNEXPECTED_UNPERSISTENT_PROC m_unexpectedUnpersistent; }; // our little timer class - internal use only! class SjProgramTimer : public wxTimer { public: SjProgramTimer(SEE_interpreter* interpr, struct program_object* po); void Notify(); SEE_interpreter* interpr_; struct program_object* m_po; bool m_inTimer; }; class SjSee { public: // constructor / destructor SjSee (); ~SjSee (); // very simple interface to execute a script void SetExecutionScope (const wxString& scope) {m_executionScope=scope;} bool Execute (const wxString& script); bool ExecuteAsFunction (const wxString& script); bool IsResultDefined (); wxString GetResultString (); double GetResultDouble (); long GetResultLong (); // process events and callbacks // ---------------------------- bool HasGlobalEmbeddings (SjSeePersistent) const; static wxArrayString GetGlobalEmbeddings (SjSeePersistent); static bool OnGlobalEmbedding (SjSeePersistent, int index, SjSee* doDefaultAction=NULL); static void ReceiveMsg (int msg); // from here on, public only to SEE! // --------------------------------- // the interpreter object SEE_interpreter* m_interpr; bool m_interprInitialized; // persistent objects are objects that are not necessarily global // but may be used through the GUI - eg. event functions persistent_object* m_persistentAnchor; void AddPersistentObject (SEE_object* newObj, SjSeePersistent param1, SEE_value* param2=NULL, SJ_UNEXPECTED_UNPERSISTENT_PROC unexpectedUnpersistent=NULL); void RemovePersistentObject (SEE_object* oldObj); // some predefined objects and classes void Player_init (); SEE_object* Player_new (); void Player_receiveMsg (int msg); static void Player_onPlaybackDone (const wxString& url); SEE_object* m_Player_prototype; SEE_object* m_player; void Program_init (); SEE_object* Program_new (); void Program_receiveMsg (int msg); void Program_getGlobalEmbed (SjSeePersistent, wxArrayString& ret) const; bool Program_onGlobalEmbed (SjSeePersistent, int index); SEE_object* m_Program_prototype; SEE_object* m_program; void Rights_init (); SEE_object* Rights_new (); SEE_object* m_Rights_prototype; void Dialog_init (); SEE_object* Dialog_new (); SEE_object* m_Dialog_prototype; void Database_init (); SEE_object* Database_new (const wxString& name); SEE_object* m_Database_prototype; void File_init (); SEE_object* File_new (SEE_value* name, bool binary); SEE_object* m_File_prototype; void HttpRequest_init (); SEE_object* HttpRequest_new (); SEE_object* m_HttpRequest_prototype; // only for the "script to C" bridge SjCPlugin* m_plugin; // misc wxString m_executionScope; SEE_value* m_executeResult; SjSLHash m_dynFunc; wxString GetFineName (const wxString& append=wxT("")) const {return GetFineName(m_executionScope, append);} static wxString GetFineName (const wxString& path, const wxString& append); // single-chainged list static SjSee* s_first; SjSee* m_next; // handling the timer SjProgramTimer* m_timer; }; #endif // SJ_USE_SCRIPTS #endif // __SJ_SEE_H__ ������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/sj_see_helpers.h������������������������������������������������������0000664�0000000�0000000�00000016453�12660066715�0021355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: sj_see_helpers.h * Authors: Björn Petersen * Purpose: Global strings and tool for our interpreters * ******************************************************************************/ #ifndef __SJ_SEE_HELPERS_H__ #define __SJ_SEE_HELPERS_H__ #include <sjtools/gcalloc.h> #include "../see/see_see.h" extern "C" { #include "../see/see_array.h" #include "../see/see_function.h" }; /******************************************************************************* * tools ******************************************************************************/ wxString SeeValueToWxString (SEE_interpreter*, SEE_value*); wxArrayLong SeeValueToWxArrayLong (SEE_interpreter*, SEE_value*); double SeeValueToDouble (SEE_interpreter*, SEE_value*); SEE_object* SeeValueToSeeCallback (SEE_interpreter*, SEE_value*); SEE_string* WxStringToSeeString (SEE_interpreter*, const wxString&); SEE_object* WxArrayStringToSeeObject(SEE_interpreter*, const wxArrayString&); SEE_object* WxArrayLongToSeeObject (SEE_interpreter*, const wxArrayLong&); void SeeCallCallback (SEE_interpreter*, SEE_object* fn, SEE_object* context, SEE_value* arg0=NULL); /******************************************************************************* * macros ******************************************************************************/ // class member functions, use as follows // // IMPLEMENT_FUNCTION(myClass, multBy2) { // long l = ARG(0); // RETURN_LONG( l * 2 ); // } #define IMPLEMENT_FUNCTION(objname, funcname) \ static void objname##_##funcname(SEE_interpreter* interpr_, SEE_object* self_, \ SEE_object* this_, int argc_, SEE_value** argv_, SEE_value* res_) #define HOST_DATA ((SjSee*)interpr_->host_data) #define ARG_LONG(i) (argc_>i? SEE_ToInt32(interpr_, argv_[i]) : 0) #define ARG_LONG_OR_DEF(i, d) (argc_>i? SEE_ToInt32(interpr_, argv_[i]) : d) #define ARG_DOUBLE(i) SeeValueToDouble(interpr_, argc_>i? argv_[i] : NULL) #define ARG_IS_BOOL(i) (argc_>i && SEE_VALUE_GET_TYPE(argv_[i])==SEE_BOOLEAN) #define ARG_BOOL(i) (argc_>i? SEE_ToInt32(interpr_, argv_[i]) : 0)!=0 #define ARG_IS_STRING(i) (argc_>i && SEE_VALUE_GET_TYPE(argv_[i])==SEE_STRING) #define ARG_STRING(i) SeeValueToWxString(interpr_, argc_>i? argv_[i] : NULL) #define ARG_CALLBACK(i) SeeValueToSeeCallback(interpr_, argc_>i? argv_[i] : NULL) #define RETURN_STRING(s) SEE_SET_STRING (res_, WxStringToSeeString(interpr_, s)) #define RETURN_ARRAY_STRING(a) SEE_SET_OBJECT (res_, WxArrayStringToSeeObject(interpr_, a)) #define RETURN_ARRAY_LONG(a) SEE_SET_OBJECT (res_, WxArrayLongToSeeObject(interpr_, a)) #define RETURN_LONG(v) SEE_SET_NUMBER (res_, (double)v) #define RETURN_DOUBLE(v) SEE_SET_NUMBER (res_, v) #define RETURN_BOOL(b) SEE_SET_BOOLEAN (res_, b) #define RETURN_TRUE SEE_SET_BOOLEAN (res_, true) #define RETURN_FALSE SEE_SET_BOOLEAN (res_, false) #define RETURN_OBJECT(o) SEE_SET_OBJECT (res_, o) #define RETURN_VALUE(v) SEE_VALUE_COPY (res_, v) #define RETURN_UNDEFINED SEE_SET_UNDEFINED (res_) // class properties, use as follow // // IMPLEMTENT_HASPROPERTY(myClass) // { // if( ARG_PROPERTY(isImportant) ) // RETURN_HAS; // else // RETURN_HASNOT; // } // // IMPLEMENT_GET(myClass) { // if( ARG_PROPERTY(isImportant) ) // RETURN_TRUE; // or whatever using the RETURN_* macros from above // else // RETURN_GET_DEFAULTS; // } // // IMPLEMENT_PUT(myClass) { // if( ARG_PROPERTY(isImportant) ) // // do what to do ... // else // DO_PUT_DEFAULTS; // } #define IMPLEMENT_HASPROPERTY(objname) \ static int objname##_hasproperty(SEE_interpreter* interpr_, \ SEE_object *this_, SEE_string *prop_) #define IMPLEMENT_GET(objname) \ static void objname##_get(SEE_interpreter *interpr_, \ SEE_object *this_, SEE_string *prop_, SEE_value *res_) #define IMPLEMENT_PUT(objname) \ static void objname##_put(SEE_interpreter *interpr_, \ SEE_object *this_, SEE_string *prop_, SEE_value *val_, int flags_) #define VAL_PROPERTY(s) (SEE_string_cmp(prop_, str_##s)==0) #define VAL_LONG (SEE_ToInt32(interpr_, val_)) #define VAL_BOOL (SEE_ToInt32(interpr_, val_)!=0) #define VAL_CALLBACK SeeValueToSeeCallback(interpr_, val_) #define VAL_STRING SeeValueToWxString(interpr_, val_) #define VAL_ARRAY_LONG SeeValueToWxArrayLong(interpr_, val_) #define RETURN_HAS return 1 #define RETURN_HASNOT return SEE_native_hasproperty(interpr_, this_, prop_) #define RETURN_GET_DEFAULTS SEE_native_get(interpr_, this_, prop_, res_) #define DO_PUT_DEFAULTS SEE_native_put(interpr_, this_, prop_, val_, flags_) // Class construction helpers #define PUT_OBJECT(parent, name, obj) \ SEE_SET_OBJECT(&temp, obj); \ SEE_OBJECT_PUT(m_interpr, parent, name, &temp, SEE_ATTR_DEFAULT); #define PUT_FUNC(parent, namePrefix, name, len) \ SEE_SET_OBJECT(&temp, SEE_cfunction_make(m_interpr, namePrefix##_##name, str_##name, len)); \ SEE_OBJECT_PUT(m_interpr, parent, str_##name, &temp, SEE_ATTR_DEFAULT); #define PUT_CONSTANT(parent, name, val) \ SEE_SET_NUMBER(&temp, val); \ SEE_OBJECT_PUT(m_interpr, parent, str_##name, &temp, SEE_ATTR_DONTENUM | SEE_ATTR_DONTDELETE | SEE_ATTR_READONLY); /******************************************************************************* * global strings ******************************************************************************/ // We add our well-known strings to the global string hash of SEE. // This has the advantage, that there are no need of multiple instances of // these strings. moreover, SEE can (and will) do a very fast comparison // of such strings (just a pointer comparison) // declare the string object - the strings itself are placed in sj_see_strings.inc #define STR(a) , *str_##a #ifndef SJ_IMPLEMENT_HELPERS extern #endif SEE_string *str_prototype #include "sj_see_strings.inc" ; // define the strings (on modifications, just copy the block from above) #ifdef SJ_IMPLEMENT_HELPERS #undef STR #define STR(a) str_##a = SEE_intern_global(#a); static void SEE_system_add_my_strings() { STR( prototype ) #include "sj_see_strings.inc" } #endif #undef STR #endif // __SJ_SEE_HELPERS_H__ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/see_dom/sj_see_strings.inc����������������������������������������������������0000664�0000000�0000000�00000005347�12660066715�0021726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������STR( Program ) // classes STR( Player ) STR( Rights ) STR( Dialog ) STR( Database ) STR( File ) STR( HttpRequest ) STR( program ) // predefined objects STR( player ) STR( rights ) STR( version ) // program methods and properties STR( os ) STR( locale ) STR( loaded ) STR( viewMode ) STR( zoom ) STR( listModeColumns ) STR( listModeOrder ) STR( musicSel ) STR( getMusicSels ) STR( onLoad ) STR( onUnload ) STR( onKioskStarting ) STR( onKioskStarted ) STR( onKioskEnding ) STR( onKioskEnded ) STR( kioskMode ) STR( visMode ) STR( sleepMode ) STR( sleepMinutes ) STR( autoPlay ) STR( memory ) STR( memoryPeak ) STR( hwnd ) STR( addMenuEntry ) STR( addConfigButton ) STR( addSkinsButton ) STR( addExitOption ) STR( refreshWindows ) STR( setTimeout ) STR( setDisplayMsg ) STR( setSkinText ) STR( selectAll ) STR( getSelection ) STR( run ) STR( launchBrowser ) STR( iniRead ) STR( iniWrite ) STR( exportFunction ) STR( callExported ) STR( callPlugin ) STR( shutdown ) STR( gc ) STR( layout ) STR( lastUserInput ) STR( time ) // player methods and properties STR( duration ) STR( volume ) STR( prelisten ) STR( onTrackChange ) STR( onPlaybackDone ) STR( play ) STR( pause ) STR( stop ) STR( stopAfterThisTrack ) STR( stopAfterEachTrack ) STR( prev ) STR( next ) STR( isPlaying ) STR( isPaused ) STR( isStopped ) STR( hasPrev ) STR( hasNext ) STR( queueLength ) STR( queuePos ) STR( getUrlAtPos ) STR( getAutoplayAtPos ) STR( getPlayCountAtPos ) STR( getArtistAtPos ) STR( getAlbumAtPos ) STR( getTitleAtPos ) STR( getDurationAtPos ) STR( addAtPos ) STR( removeAtPos ) STR( removeAll ) STR( removePlayed ) STR( avoidBoredom ) STR( repeat ) STR( shuffle ) STR( all ) // rights methods and properties STR( credits ) STR( useCredits ) STR( editQueue ) STR( unqueue ) STR( multiEnqueue ) STR( search ) STR( startVis ) STR( addTextCtrl ) // dialog methods and properties STR( addMultilineCtrl ) STR( addPasswordCtrl ) STR( addSelectCtrl ) STR( addCheckCtrl ) STR( addStaticText ) STR( addButton ) STR( getValue ) STR( setValue ) STR( show ) STR( showModal ) STR( close ) STR( alert ) STR( confirm ) STR( prompt ) STR( fileSel ) STR( logError ) STR( logWarning ) STR( print ) STR( openQuery ) // database methods and properties STR( nextRecord ) STR( getFieldCount ) STR( getField ) STR( closeQuery ) STR( getFile ) STR( update ) STR( read ) // file methods and properties STR( write ) STR( flush ) STR( pos ) STR( length ) STR( exists ) STR( isdir ) STR( dir ) STR( mkdir ) STR( copy ) STR( rename ) STR( remove ) STR( request ) // HTTP request methods and properties STR( abort ) STR( setRequestHeader ) STR( getResponseHeader ) STR( status ) STR( responseText ) STR( name ) // stuff needed to access error objects STR( message ) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/�����������������������������������������������������������������������0000775�0000000�0000000�00000000000�12660066715�0016035�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/autoctrl.cpp�����������������������������������������������������������0000664�0000000�0000000�00000103664�12660066715�0020410�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: autoctrl.cpp * Authors: Björn Petersen * Purpose: Silverjuke * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/autoctrl.h> #include <sjbase/browser.h> #include <sjmodules/advsearch.h> #include <sjmodules/vis/vis_module.h> /******************************************************************************* * SjAutoFader - fade the main volume ******************************************************************************/ enum SjFadeDir { SJ_FADEDIR_IN ,SJ_FADEDIR_OUT }; class SjAutoFader : public wxTimer { public: SjAutoFader (long secondsToFade, SjFadeDir dir); void Notify (); virtual void OnFadingDone (); long GetOrgVolume () const { return m_orgVol; } bool WasAborted () const { return m_aborted; } private: void FadingDone (bool aborted); unsigned long m_startFadingTimestamp; unsigned long m_endFadingTimestamp; long m_orgVol, m_startFadingVol, m_lastVol; bool m_inNotify; bool m_aborted; }; SjAutoFader::SjAutoFader(long secondsToFade, SjFadeDir dir) : wxTimer() { m_aborted = FALSE; m_inNotify = FALSE; m_startFadingTimestamp = SjTools::GetMsTicks(); m_endFadingTimestamp = m_startFadingTimestamp + secondsToFade*1000; m_orgVol = m_startFadingVol = m_lastVol = g_mainFrame->GetMainVol(); Start(100/*ms*/, wxTIMER_CONTINUOUS); } void SjAutoFader::Notify() { if( !m_inNotify && g_mainFrame && !SjMainApp::IsInShutdown() ) { m_inNotify = TRUE; unsigned long thisTimestamp = SjTools::GetMsTicks(); // volume changed by the user in between? if( m_lastVol != g_mainFrame->GetMainVol() ) { m_startFadingTimestamp = thisTimestamp; m_startFadingVol = g_mainFrame->GetMainVol(); if( g_mainFrame->IsAllAvailable() ) { FadingDone(TRUE/*aborted*/); return; } } else if( g_mainFrame->m_lastUserInputTimestamp > m_startFadingTimestamp && (g_mainFrame->m_autoCtrl.m_sleepTimemode==SJ_SLEEPMODE_TIMEMODE_AFTER || g_mainFrame->m_autoCtrl.m_sleepTimemode==SJ_SLEEPMODE_TIMEMODE_ALWAYS_AFTER ) ) { if( !g_mainFrame->IsOpAvailable(SJ_OP_MAIN_VOL) ) { g_mainFrame->SetAbsMainVol(m_orgVol); } FadingDone(TRUE/*aborted*/); return; } // calculate the total fading time unsigned long totalFadingMs = SjTimestampDiff(m_startFadingTimestamp, m_endFadingTimestamp); unsigned long doneFadingMs = SjTimestampDiff(m_startFadingTimestamp, thisTimestamp); // calculate the available volume steps long totalSteps = m_startFadingVol; if( totalSteps <= 0 || thisTimestamp >= m_endFadingTimestamp ) { FadingDone(FALSE/*aborted*/); return; } // calculate the ms for each step double msPerVolStep = ((double)totalFadingMs) / ((double)totalSteps); // calculate the new volume if( msPerVolStep > 0 ) { long newVol = (long)((double)(totalFadingMs-doneFadingMs) / msPerVolStep); g_mainFrame->SetAbsMainVol(newVol); wxLogDebug(wxT("new vol: %i"), (int)newVol); } m_lastVol = g_mainFrame->GetMainVol(); m_inNotify = FALSE; } } void SjAutoFader::FadingDone(bool aborted) { m_aborted = aborted; Stop(); OnFadingDone(); } void SjAutoFader::OnFadingDone() { g_mainFrame->m_autoCtrl.m_stateTriggerSleep = TRUE; } /******************************************************************************* * SjAutoCtrl - sleep ******************************************************************************/ void SjAutoCtrl::GetSleepSettings(bool& enabled, SjShutdownEtc& action, long& timemode, long& minutes, bool& doFade, long& fadeSeconds) { enabled = (m_flags&SJ_AUTOCTRL_SLEEP)!=0; action = m_sleepAction; timemode = m_sleepTimemode; minutes = m_sleepMinutes; doFade = (m_flags&SJ_AUTOCTRL_SLEEP_FADE)!=0; fadeSeconds = m_sleepFadeSeconds; } void SjAutoCtrl::SetSleepSettings(bool enabled, SjShutdownEtc action, long timemode, long minutes, bool doFade, long fadeSeconds) { // if the sleep settings were changed, reset the "sleep enabled" timestamp bool setDisplayMsg = FALSE; if( (m_flags&SJ_AUTOCTRL_SLEEP) != (enabled? SJ_AUTOCTRL_SLEEP : 0) || m_sleepAction != action || m_sleepTimemode!= timemode || m_sleepMinutes != minutes ) { setDisplayMsg = TRUE; m_stateTriggerSleep = FALSE; m_stateSleepWaitTimestamp = enabled? SjTools::GetMsTicks() : 0; if( m_stateSleepAutoFader ) { delete m_stateSleepAutoFader; m_stateSleepAutoFader = NULL; } } bool editDoFade = FALSE; if( enabled ) // else leave the flag "as is" { editDoFade = TRUE; } if( (editDoFade && ((m_flags&SJ_AUTOCTRL_SLEEP_FADE) != (doFade? SJ_AUTOCTRL_SLEEP_FADE : 0))) || m_sleepFadeSeconds != fadeSeconds ) { setDisplayMsg = TRUE; } // save the settings SjTools::SetFlag(m_flags, SJ_AUTOCTRL_SLEEP, enabled); m_sleepAction = action; m_sleepTimemode = timemode; m_sleepMinutes = minutes; if( editDoFade ) SjTools::SetFlag(m_flags, SJ_AUTOCTRL_SLEEP_FADE, doFade); m_sleepFadeSeconds = fadeSeconds; // update display? if( setDisplayMsg ) { g_mainFrame->SetDisplayMsg(enabled? _("Sleep mode activated.") : _("Sleep mode deactivated."), 5000); } } /******************************************************************************* * SjAutoCtrl ******************************************************************************/ void SjAutoCtrl::LoadAutoCtrlSettings() { // load the settings, as this may reset some sleep flags, // this function should only be called once at startups #ifdef __WXDEBUG__ static bool s_debugLoaded = FALSE; wxASSERT( s_debugLoaded == FALSE ); s_debugLoaded = TRUE; #endif wxConfigBase* c = g_tools->m_config; m_flags = c->Read(wxT("autoctrl/flags"), SJ_AUTOCTRL_DEF_FLAGS); m_followPlaylistMinutes = c->Read(wxT("autoctrl/followPlaylist"), SJ_AUTOCTRL_DEF_FOLLOWPLAYLISTMINUTES); m_resetViewMinutes = c->Read(wxT("autoctrl/resetView"), SJ_AUTOCTRL_DEF_RESETVIEWMINUTES); m_resetViewTo = c->Read(wxT("autoctrl/resetViewTo"), SJ_BROWSER_ALBUM_VIEW); m_startVisMinutes = c->Read(wxT("autoctrl/startVis"), SJ_AUTOCTRL_DEF_STARTVISMINUTES); m_stopVisMinutes = c->Read(wxT("autoctrl/stopVis"), SJ_AUTOCTRL_DEF_STOPVISMINUTES); m_autoPlayWaitMinutes = c->Read(wxT("autoctrl/autoPlay"), SJ_AUTOCTRL_DEF_AUTOPLAYWAITMINUTES); m_autoPlayNumTracks = c->Read(wxT("autoctrl/autoPlayTracks"), SJ_AUTOCTRL_DEF_AUTOPLAYNUMTRACKS); m_autoPlayMusicSelId = c->Read(wxT("autoctrl/autoPlayId"), 0L/*=current view*/); m_autoPlayMusicSelIgnoreId = c->Read(wxT("autoctrl/autoPlayIgnoreId"), 0L/*=none*/); m_limitPlayTimeSeconds = c->Read(wxT("autoctrl/limitPlayTime"), SJ_AUTOCTRL_DEF_LIMITPLAYTIMESECONDS); m_sleepMinutes = c->Read(wxT("autoctrl/sleepMinutes"), SJ_SLEEPMODE_DEF_MINUTES); m_sleepFadeSeconds = c->Read(wxT("autoctrl/sleepFadeSeconds"), SJ_SLEEPMODE_DEF_FADE_SECONDS); long sleepFlags = c->Read(wxT("autoctrl/sleepFlags"), SJ_SLEEPMODE_DEF_FLAGS); m_sleepAction = (SjShutdownEtc)(sleepFlags&SJ_SLEEPMODE_ACTION_MASK); m_sleepTimemode = sleepFlags&SJ_SLEEPMODE_TIMEMODE_MASK; m_jingleFlags = c->Read(wxT("autoctrl/jingleFlags"), 0L); m_jingleEvery = c->Read(wxT("autoctrl/jingleEvery"), SJ_JINGLE_DEF_MINUTES); m_jingleEveryMusicSelId = c->Read(wxT("autoctrl/jingleEveryId"), 0L/*=none*/); m_jingleEveryTriggerTimestamp = SjTools::GetMsTicks(); // do as if a jingle was played on program startup for( int i = 0; i < SJ_JINGLE_AT_CNT; i++ ) { m_jingleAt[i] = c->Read(wxString::Format("autoctrl/jingleAt%i", i), 0L); m_jingleAtMusicSelId[i] = c->Read(wxString::Format("autoctrl/jingleAtId%i", i), 0L/*=none*/); m_jingleAtTriggerTimestamp[i] = 0; // not: SjTools::GetMsTicks() - this will force the first trigger without any timeouts } m_stateStartVisTimestamp = 0; m_stateStopVisTimestamp = 0; m_stateGotoCurrClickedTimestamp = 0; m_stateAutoPlayTracksLeft = 0; m_stateAutoPlayLastPlaybackTimestamp= SjTools::GetMsTicks(); // force the timeout also at program start# m_stateLastAutoPlayQueueId = 0; m_stateOpenDialogTimestamp = 0; m_stateLastUnqueueId = 0; m_stateHaltedBySleep = FALSE; m_haltAutoPlay = 0; m_lastCleanupTimestamp = SjTools::GetMsTicks(); // validate the settings ValidateSettings(); // check if we have to reset some sleep flags if( m_flags & SJ_AUTOCTRL_SLEEP ) { if( m_sleepTimemode < SJ_SLEEPMODE_TIMEMODE_ALWAYS_IN ) { m_flags &= ~SJ_AUTOCTRL_SLEEP; } } m_stateTriggerSleep = FALSE; m_stateSleepWaitTimestamp = (m_flags&SJ_AUTOCTRL_SLEEP)? SjTools::GetMsTicks() : 0; m_stateSleepAutoFader = NULL; } SjAutoCtrl::~SjAutoCtrl() { if( m_stateSleepAutoFader ) { delete m_stateSleepAutoFader; m_stateSleepAutoFader = NULL; } } void SjAutoCtrl::SaveAutoCtrlSettings() { ValidateSettings(); wxConfigBase* c = g_tools->m_config; c->Write(wxT("autoctrl/flags"), m_flags); c->Write(wxT("autoctrl/followPlaylist"), m_followPlaylistMinutes); c->Write(wxT("autoctrl/resetView"), m_resetViewMinutes); c->Write(wxT("autoctrl/resetViewTo"), m_resetViewTo); c->Write(wxT("autoctrl/startVis"), m_startVisMinutes); c->Write(wxT("autoctrl/stopVis"), m_stopVisMinutes); c->Write(wxT("autoctrl/autoPlay"), m_autoPlayWaitMinutes); c->Write(wxT("autoctrl/autoPlayTracks"), m_autoPlayNumTracks); c->Write(wxT("autoctrl/autoPlayId"), m_autoPlayMusicSelId); c->Write(wxT("autoctrl/autoPlayIgnoreId"), m_autoPlayMusicSelIgnoreId); c->Write(wxT("autoctrl/limitPlayTime"), m_limitPlayTimeSeconds); c->Write(wxT("autoctrl/sleepMinutes"), m_sleepMinutes); c->Write(wxT("autoctrl/sleepFlags"), m_sleepAction|m_sleepTimemode); c->Write(wxT("autoctrl/sleepFadeSeconds"), m_sleepFadeSeconds); c->Write(wxT("autoctrl/jingleFlags"), m_jingleFlags); c->Write(wxT("autoctrl/jingleEvery"), m_jingleEvery); c->Write(wxT("autoctrl/jingleEveryId"), m_jingleEveryMusicSelId); for( int i = 0; i < SJ_JINGLE_AT_CNT; i++ ) { c->Write(wxString::Format("autoctrl/jingleAt%i", i), m_jingleAt[i]); c->Write(wxString::Format("autoctrl/jingleAtId%i", i), m_jingleAtMusicSelId[i]); } // if the previous number of tracks to play was larger than the new one, // align the number of left tracks if( m_stateAutoPlayTracksLeft > m_autoPlayNumTracks ) { m_stateAutoPlayTracksLeft = m_autoPlayNumTracks; } // wait from now on m_stateAutoPlayLastPlaybackTimestamp = SjTools::GetMsTicks(); } void SjAutoCtrl::ValidateSettings() { // these values are set to defaults if out of range // (loading errors, there should be no need to use very large or very small values) if( m_followPlaylistMinutes < SJ_AUTOCTRL_MIN_FOLLOWPLAYLISTMINUTES || m_followPlaylistMinutes > SJ_AUTOCTRL_MAX_FOLLOWPLAYLISTMINUTES ) { m_followPlaylistMinutes = SJ_AUTOCTRL_DEF_FOLLOWPLAYLISTMINUTES; } if( m_resetViewMinutes < SJ_AUTOCTRL_MIN_RESETVIEWMINUTES || m_resetViewMinutes > SJ_AUTOCTRL_MAX_RESETVIEWMINUTES ) { m_resetViewMinutes = SJ_AUTOCTRL_DEF_RESETVIEWMINUTES; } if( m_resetViewTo < 0 || m_resetViewTo >= SJ_BROWSER_VIEW_COUNT ) { m_resetViewTo = SJ_BROWSER_ALBUM_VIEW; } if( m_startVisMinutes < SJ_AUTOCTRL_MIN_STARTVISMINUTES || m_startVisMinutes > SJ_AUTOCTRL_MAX_STARTVISMINUTES ) { m_startVisMinutes = SJ_AUTOCTRL_DEF_STARTVISMINUTES; } if( m_stopVisMinutes < SJ_AUTOCTRL_MIN_STOPVISMINUTES || m_stopVisMinutes > SJ_AUTOCTRL_MAX_STOPVISMINUTES ) { m_stopVisMinutes = SJ_AUTOCTRL_DEF_STOPVISMINUTES; } if( m_limitPlayTimeSeconds < SJ_AUTOCTRL_MIN_LIMITPLAYTIMESECONDS || m_limitPlayTimeSeconds > SJ_AUTOCTRL_MAX_LIMITPLAYTIMESECONDS ) { m_limitPlayTimeSeconds = SJ_AUTOCTRL_DEF_LIMITPLAYTIMESECONDS; } // for these values, set to min/max as the user may enter very large or // very slow values to get a special effect if( m_autoPlayWaitMinutes < SJ_AUTOCTRL_MIN_AUTOPLAYWAITMINUTES ) m_autoPlayWaitMinutes = SJ_AUTOCTRL_MIN_AUTOPLAYWAITMINUTES; if( m_autoPlayWaitMinutes > SJ_AUTOCTRL_MAX_AUTOPLAYWAITMINUTES ) m_autoPlayWaitMinutes = SJ_AUTOCTRL_MAX_AUTOPLAYWAITMINUTES; if( m_autoPlayNumTracks < SJ_AUTOCTRL_MIN_AUTOPLAYNUMTRACKS ) m_autoPlayNumTracks = SJ_AUTOCTRL_MIN_AUTOPLAYNUMTRACKS; if( m_autoPlayNumTracks > SJ_AUTOCTRL_MAX_AUTOPLAYNUMTRACKS ) m_autoPlayNumTracks = SJ_AUTOCTRL_MAX_AUTOPLAYNUMTRACKS; // sleep mode if( m_sleepMinutes < SJ_SLEEPMODE_MIN_MINUTES ) m_sleepMinutes = SJ_SLEEPMODE_MIN_MINUTES; if( m_sleepMinutes > SJ_SLEEPMODE_MAX_MINUTES ) m_sleepMinutes = SJ_SLEEPMODE_MAX_MINUTES; if( m_sleepFadeSeconds < SJ_SLEEPMODE_MIN_FADE_SECONDS ) m_sleepFadeSeconds = SJ_SLEEPMODE_MIN_FADE_SECONDS; if( m_sleepFadeSeconds > SJ_SLEEPMODE_MAX_FADE_SECONDS ) m_sleepFadeSeconds = SJ_SLEEPMODE_MAX_FADE_SECONDS; // jingles if( m_jingleEvery < SJ_JINGLE_MIN_MINUTES || m_jingleEvery > SJ_JINGLE_MAX_MINUTES ) { m_jingleEvery = SJ_JINGLE_DEF_MINUTES; } for( int i = 0; i < SJ_JINGLE_AT_CNT; i++ ) { if( m_jingleAt[i] < 0 || m_jingleAt[i] >= 24*60 ) { m_jingleAt[i] = 0; } } } void SjAutoCtrl::OnOneSecondTimer() { static bool s_inHere = FALSE; if( !s_inHere ) { s_inHere = TRUE; unsigned long thisTimestamp = SjTools::GetMsTicks(); g_mainFrame->m_player.OneSecondTimer(); // automatic control: do cleanup temp? ////////////////////////////////////////////////////////////////////////////////////////////// { unsigned long refTimestamp = g_mainFrame->m_lastUserInputTimestamp; #define IDLE_MINUTES 2 #define MIN_IN_BETWEEN_MINUTES 15 #define MAX_IN_BETWEEN_MINUTES 120 if( ( thisTimestamp > refTimestamp+IDLE_MINUTES*60*1000 && thisTimestamp > m_lastCleanupTimestamp+MIN_IN_BETWEEN_MINUTES*60*1000 ) || thisTimestamp > m_lastCleanupTimestamp+MAX_IN_BETWEEN_MINUTES*60*1000 ) { if( !g_mainFrame->m_mainApp->IsInShutdown() && g_mainFrame->IsEnabled() && !SjBusyInfo::InYield() ) { g_tools->m_cache.CleanupOldFiles(); } m_lastCleanupTimestamp = thisTimestamp; } } // automatic control: do follow playlist? ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_FOLLOW_PLAYLIST) && g_mainFrame->IsPlaying() ) { unsigned long refTimestamp = g_mainFrame->m_lastUserBrowserInputTimestamp; if( m_stateOpenDialogTimestamp > refTimestamp ) refTimestamp = m_stateOpenDialogTimestamp; if( m_stateGotoCurrClickedTimestamp > refTimestamp ) refTimestamp = 0; if( thisTimestamp > (refTimestamp+m_followPlaylistMinutes*60*1000) ) { wxString currUrl = g_mainFrame->m_player.m_queue.GetUrlByPos(-1); if( currUrl != m_stateFollowPlaylistUrlFollowed ) { if( g_mainFrame->IsAnyDialogOpened() ) // IsAnyDialogOpened() may be rather slow, so this is checked last { m_stateOpenDialogTimestamp = thisTimestamp; } else { SwitchToDefLayout(); m_stateFollowPlaylistUrlFollowed = currUrl; g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDO_GOTOCURRAUTO)); } } } } // automatic control: do reset the view? ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_RESET_VIEW) && g_mainFrame->m_browser != NULL && g_mainFrame->m_browser->GetView() != m_resetViewTo ) { unsigned long refTimestamp = g_mainFrame->m_lastUserBrowserInputTimestamp; if( m_stateOpenDialogTimestamp > refTimestamp ) refTimestamp = m_stateOpenDialogTimestamp; if( m_stateGotoCurrClickedTimestamp > refTimestamp ) refTimestamp = 0; if( thisTimestamp > (refTimestamp+m_resetViewMinutes*60*1000) ) { g_mainFrame->m_browser->SetView_(m_resetViewTo, TRUE, TRUE); } } // automatic control: do start vis? ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_START_VIS) && g_mainFrame->IsPlaying() && !g_visModule->IsVisStarted() ) { unsigned long refTimestamp = g_mainFrame->m_lastUserInputTimestamp; if( m_stateOpenDialogTimestamp > refTimestamp ) refTimestamp = m_stateOpenDialogTimestamp; if( m_stateStopVisTimestamp > refTimestamp ) refTimestamp = m_stateStopVisTimestamp; if( thisTimestamp > (refTimestamp+m_startVisMinutes*60*1000) ) { wxWindow* focusWindow = wxWindow::FindFocus(); if( focusWindow ) { focusWindow = SjDialog::FindTopLevel(focusWindow); if( focusWindow == g_mainFrame ) { if( g_mainFrame->IsAnyDialogOpened() ) // IsAnyDialogOpened() may be rather slow, so this is checked last { m_stateOpenDialogTimestamp = thisTimestamp; } else { if( IsCurrTrackCloseToEnd() == 0 ) { SwitchToDefLayout(); g_visModule->StartVis(); } } } else { m_stateStopVisTimestamp = thisTimestamp; // reset timeout as the Silverjuke window is not the top-level window } } else { m_stateStopVisTimestamp = thisTimestamp; // reset timeout as the Silverjuke window is not the top-level window } } } // automatic control: do stop vis? ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_STOP_VIS) && g_visModule->IsVisStarted() ) { if( thisTimestamp > (m_stateStartVisTimestamp+m_stopVisMinutes*60*1000) ) { g_visModule->StopVis(); } } // automatic control: jingles ////////////////////////////////////////////////////////////////////////////////////////////// if( m_jingleFlags&(SJ_JINGLE_EVERY|SJ_JINGLE_AT0|SJ_JINGLE_AT1) && !g_mainFrame->m_inConstruction && !g_mainFrame->m_mainApp->IsInShutdown() ) { if( m_jingleFlags&SJ_JINGLE_EVERY // the normal jingles are only played if the jukebox is playing. && g_mainFrame->IsPlaying() ) { unsigned long nextTimestamp = m_jingleEveryTriggerTimestamp+m_jingleEvery*60*1000; if( thisTimestamp > nextTimestamp ) { m_jingleEveryTriggerTimestamp = thisTimestamp; SjAdvSearch advSearch = g_advSearchModule->GetSearchById(m_jingleEveryMusicSelId); if( advSearch.GetId()==0 ) { SjTools::SetFlag(m_jingleFlags, SJ_JINGLE_EVERY, false); SaveAutoCtrlSettings(); } wxString url = advSearch.GetRandomUrl(); if( !url.IsEmpty() ) { g_mainFrame->Enqueue(url, -2/*enqueue next*/, TRUE/*verified*/); } } } for( int i = 0; i < SJ_JINGLE_AT_CNT; i++ ) { if( m_jingleFlags&(SJ_JINGLE_AT0<<i) ) // the jingles at conctrete times are played even if the jukebox is paused/stopped. { wxDateTime now = wxDateTime::Now(); long thisMinuteOfToday = now.GetHour()*60 + now.GetMinute(); if( m_jingleAt[i] == thisMinuteOfToday && thisTimestamp > m_jingleAtTriggerTimestamp[i]+70*1000 ) { m_jingleAtTriggerTimestamp[i] = thisTimestamp; SjAdvSearch advSearch = g_advSearchModule->GetSearchById(m_jingleAtMusicSelId[i]); if( advSearch.GetId()==0 || (m_jingleFlags&(SJ_JINGLE_AT0_DAILY<<i))==0 ) { SjTools::SetFlag(m_jingleFlags, SJ_JINGLE_AT0<<i, false); SaveAutoCtrlSettings(); } wxString url = advSearch.GetRandomUrl(); if( !url.IsEmpty() ) { g_mainFrame->Enqueue(url, (m_jingleFlags&(SJ_JINGLE_AT0_WAIT<<i))? -2 : -3, TRUE/*verified*/); } } } } } // automatic control: limit play time ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_LIMIT_PLAY_TIME) && !g_mainFrame->m_inConstruction && !g_mainFrame->m_mainApp->IsInShutdown() && !SjBusyInfo::InYield() && IsCurrTrackCloseToEnd() != 1 /*limit if we're "not close to end" or if "we don't know"*/ && g_mainFrame->IsPlaying() ) { long elapsedMs = g_mainFrame->GetElapsedTime(); if( elapsedMs > m_limitPlayTimeSeconds*1000 ) { g_mainFrame->SetDisplayMsg(_("Play time exceeded"), 5000); // should be set before GotoNextRegardAP() to avoid flickering if( !g_mainFrame->GotoNextRegardAP(true /*fade to next*/, false /*do not ignore timeouts (leave a gap of some minutes if desired*/) ) { g_mainFrame->Stop(); g_mainFrame->m_haltedManually = false; /*set to "true" in Stop() - but this was no manual stop, we want the autoplay to start over*/ } } } // automatic control: check auto-play ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_AUTOPLAY_ENABLED) && !g_mainFrame->m_inConstruction && !g_mainFrame->m_mainApp->IsInShutdown() && !SjBusyInfo::InYield() && m_haltAutoPlay == 0 ) { if( g_mainFrame->IsStopped() ) { // the player is currently stopped... // ...see if we have to add an auto-play URL if( !g_mainFrame->m_haltedManually && !m_stateHaltedBySleep ) { if( m_stateAutoPlayTracksLeft > 0 && LastTrackWasAutoPlay() ) { EnqueueAutoPlayUrl(); m_stateAutoPlayTracksLeft--; } else if( (thisTimestamp > (m_stateAutoPlayLastPlaybackTimestamp+m_autoPlayWaitMinutes*60*1000)) || (m_stateLastUnqueueId!=0 && m_stateLastUnqueueId==m_stateLastAutoPlayQueueId) ) { wxASSERT( m_autoPlayNumTracks > 0 ); m_stateAutoPlayTracksLeft = m_autoPlayNumTracks; EnqueueAutoPlayUrl(); m_stateAutoPlayTracksLeft--; } } } else { // the player is currently playing or pause... - auto-enqueing is done by SjPlayer by calling DoAutoPlayIfEnabled() m_stateHaltedBySleep = FALSE; // ...remember the last time sth. was played m_stateAutoPlayLastPlaybackTimestamp = thisTimestamp; /*// ...see if we have to add an auto-play URL, // we do this only if the player is not paused if( IsCurrTrackCloseToEnd() != 0 && !g_mainFrame->IsPaused() && !g_mainFrame->HasNextIgnoreAP() ) // HasNext() seems only to work exactly if playing, so better check m_haltedManually in the stopped-condtion above { if( m_stateAutoPlayTracksLeft > 0 && LastTrackWasAutoPlay() ) { EnqueueAutoPlayUrl(); m_stateAutoPlayTracksLeft--; } else if( m_autoPlayWaitMinutes == 0 ) { wxASSERT( m_autoPlayNumTracks > 0 ); m_stateAutoPlayTracksLeft = m_autoPlayNumTracks; EnqueueAutoPlayUrl(); m_stateAutoPlayTracksLeft--; } }*/ } } // automatic control: sleep mode ////////////////////////////////////////////////////////////////////////////////////////////// if( (m_flags & SJ_AUTOCTRL_SLEEP) && !g_mainFrame->m_inConstruction && !g_mainFrame->m_mainApp->IsInShutdown() ) { #ifdef __WXDEBUG__ if( m_stateTriggerSleep ) { wxLogDebug(wxT("Sleep triggered...")); } #endif if( m_stateSleepWaitTimestamp ) { // sleep mode is enabled by not yet triggered: check the timeouts ... switch( m_sleepTimemode ) { case SJ_SLEEPMODE_TIMEMODE_IN: case SJ_SLEEPMODE_TIMEMODE_ALWAYS_IN: if( thisTimestamp > (m_stateSleepWaitTimestamp+m_sleepMinutes*60*1000) ) { m_stateTriggerSleep = TRUE; } break; case SJ_SLEEPMODE_TIMEMODE_AFTER: case SJ_SLEEPMODE_TIMEMODE_ALWAYS_AFTER: if( thisTimestamp > (g_mainFrame->m_lastUserInputTimestamp+m_sleepMinutes*60*1000) ) { m_stateTriggerSleep = TRUE; } break; case SJ_SLEEPMODE_TIMEMODE_AT: case SJ_SLEEPMODE_TIMEMODE_ALWAYS_AT: { static unsigned long s_thisTriggerTimestamp = 0; wxDateTime now = wxDateTime::Now(); long thisMinuteOfToday = now.GetHour()*60 + now.GetMinute(); if( m_sleepMinutes == thisMinuteOfToday && (s_thisTriggerTimestamp == 0 || (thisTimestamp>s_thisTriggerTimestamp+70*1000)) ) { m_stateTriggerSleep = TRUE; s_thisTriggerTimestamp = thisTimestamp; } } break; } if( m_stateTriggerSleep ) { g_mainFrame->SetDisplayMsg(_("Sleep mode activated."), 5000); m_stateSleepWaitTimestamp = 0; if( m_flags&SJ_AUTOCTRL_SLEEP_FADE && g_mainFrame->IsPlaying() ) { m_stateTriggerSleep = FALSE; if( m_stateSleepAutoFader ) { delete m_stateSleepAutoFader; m_stateSleepAutoFader = NULL; } m_stateSleepAutoFader = new SjAutoFader(m_sleepFadeSeconds, SJ_FADEDIR_OUT); } } } else if( m_stateTriggerSleep ) { // sleep mode is triggered and an (optional) fadeout is done ... do what to do long orgVol = -1; bool aborted = FALSE; m_stateTriggerSleep = FALSE; if( m_stateSleepAutoFader ) { orgVol = m_stateSleepAutoFader->GetOrgVolume(); aborted = m_stateSleepAutoFader->WasAborted(); delete m_stateSleepAutoFader; m_stateSleepAutoFader = NULL; } if( m_sleepTimemode < SJ_SLEEPMODE_TIMEMODE_ALWAYS_IN ) { m_flags &= ~SJ_AUTOCTRL_SLEEP; // no need to save this setting as it is also changed when Silverjuke is loaded } if( !aborted ) { SjMainApp::DoShutdownEtc(m_sleepAction, orgVol); g_mainFrame->m_haltedManually = FALSE; m_stateHaltedBySleep = TRUE; } else { g_mainFrame->SetDisplayMsg(_("Sleep mode deactivated."), 3000); } // start over if SJ_AUTOCTRL_SLEEPMODE is not cleared above m_stateSleepWaitTimestamp = SjTools::GetMsTicks(); } } // any pending events? ////////////////////////////////////////////////////////////////////////////////////////////// if( m_pendingEvents.GetCount() && !SjBusyInfo::InYield() ) { int i, iCount = m_pendingEvents.GetCount(); for( i = 0; i < iCount; i++ ) { wxEvent* event = (wxEvent*)m_pendingEvents[i]; if( event ) { g_mainFrame->GetEventHandler()->QueueEvent(event); } } m_pendingEvents.Clear(); } s_inHere = FALSE; } } bool SjAutoCtrl::DoAutoPlayIfEnabled(bool ignoreTimeouts) { bool ret = false; if( (m_flags & SJ_AUTOCTRL_AUTOPLAY_ENABLED) ) { if( ignoreTimeouts || m_autoPlayWaitMinutes == 0 ) { m_stateAutoPlayTracksLeft = m_autoPlayNumTracks; } else if( m_stateAutoPlayTracksLeft <= 0 ) { wxASSERT( m_stateAutoPlayTracksLeft == 0 ); return false; } ret = EnqueueAutoPlayUrl(); m_stateAutoPlayTracksLeft--; } return ret; } bool SjAutoCtrl::EnqueueAutoPlayUrl() { wxASSERT( SJ_AUTOCTRL_MIN_AUTOPLAYNUMTRACKS > 0 ); wxASSERT( m_stateAutoPlayTracksLeft > 0 ); // get the URL to play wxString url = GetAutoPlayUrl(); if( url.IsEmpty() ) { return false; } // enqueue this URL long oldQueueCount = g_mainFrame->GetQueueCount(); g_mainFrame->Enqueue(url, -1, TRUE/*verified*/, TRUE/*autoplay*/); // remember the ID of the URL just enqueued long newQueueCount = g_mainFrame->GetQueueCount(); wxASSERT( oldQueueCount == newQueueCount-1 ); if( oldQueueCount == newQueueCount-1 ) { m_stateLastAutoPlayQueueId = g_mainFrame->m_player.m_queue.GetIdByPos(newQueueCount-1); return true; } else { return false; } } bool SjAutoCtrl::LastTrackWasAutoPlay() { long queueCount = g_mainFrame->GetQueueCount(); if( queueCount > 0 && g_mainFrame->m_player.m_queue.GetIdByPos(queueCount-1) == m_stateLastAutoPlayQueueId ) { return TRUE; } else { return FALSE; } } int SjAutoCtrl::IsCurrTrackCloseToEnd() // returns 0, 1 or -1 for unknown { long remainingMs = g_mainFrame->GetRemainingTime(); wxASSERT( remainingMs >= -1 ); if( remainingMs < 0 ) { return -1; // dont'know } long crossfadeMs = g_mainFrame->m_player.GetAutoCrossfade()? g_mainFrame->m_player.m_autoCrossfadeMs : 0; wxASSERT( remainingMs >= 0 ); wxASSERT( crossfadeMs >= 0 ); #define headroomMs 10000L // 10 seconds before anythings starts; the player itself prepares a new stream 5 seconds before the end of the previous one if( remainingMs < (crossfadeMs+headroomMs) ) { return 1; // we're close to end } return 0; // we're not close to end } wxString SjAutoCtrl::GetAutoPlayUrl() { wxArrayLong trackIdsArray; long trackIdsCount = 0; // get an array of available track IDs ////////////////////////////////////// { // collect the track IDs to ignore SjLLHash ignoreIdsHash; long ignoreIdsCount = 0; if( m_flags & SJ_AUTOCTRL_AUTOPLAY_IGNORE ) { SjAdvSearch advSearch = g_advSearchModule->GetSearchById(m_autoPlayMusicSelIgnoreId); if( advSearch.GetId()==0 ) { // the adv. search to ignore was deleted; disable the ignore function m_flags &= ~SJ_AUTOCTRL_AUTOPLAY_IGNORE; SaveAutoCtrlSettings(); } wxString dummySelectSql; advSearch.GetAsSql(&ignoreIdsHash, dummySelectSql); ignoreIdsCount = ignoreIdsHash.GetCount(); } // collect the possible track IDs SjLLHash trackIdsHash; if( m_autoPlayMusicSelId == 0 ) { // get the IDs currently in view - this is // - an adv. search // - a simple search, // - an adv. plus a simple search // - all tracks g_mainFrame->m_libraryModule->GetIdsInView(&trackIdsHash, TRUE/*ignoreSimpleSearchIfNull*/, TRUE/*ignoreAdvSearchIfNull*/); } else { // get the adv. search to use SjAdvSearch advSearch = g_advSearchModule->GetSearchById(m_autoPlayMusicSelId); if( advSearch.GetId()==0 ) { // the adv. search to use was deleted; disable the auto-play // functionality until the user selects a valid adv. search to use m_autoPlayMusicSelId = 0; // reset to "current view" m_flags &= ~SJ_AUTOCTRL_AUTOPLAY_ENABLED; SaveAutoCtrlSettings(); return wxT(""); } // get all track IDs in this adv. search wxString dummySelectSql; advSearch.GetAsSql(&trackIdsHash, dummySelectSql); } // convert hash to array long tempTrackId; long maxTrackIdsCount = trackIdsHash.GetCount(); if( maxTrackIdsCount < 16 ) maxTrackIdsCount = 16; trackIdsArray.Alloc(maxTrackIdsCount); SjHashIterator iterator; while( (trackIdsHash.Iterate(iterator, &tempTrackId)) ) { if( ignoreIdsCount==0L || ignoreIdsHash.Lookup(tempTrackId)==0L ) { trackIdsArray.Add(tempTrackId); trackIdsCount++; } } if( trackIdsCount <= 0 ) { // there are no tracks in this music selection; however, DO NOT // disable auto-play therefore as the music selection may be dynamic // eg. sth. like "tracks played today" return wxEmptyString; } } // select a random track ID from the available track IDs //////////////////////////////////////////////////////// #define MAX_REMEMBER_IDS 32 #define MAX_ITERATIONS 1000 wxSqlt sql; unsigned long now = SjTools::GetMsTicks(); long selectedTrackId = 0; for( int iterations = 0; iterations < MAX_ITERATIONS; iterations++ ) { long testIndex = SjTools::Rand(trackIdsCount); wxASSERT( testIndex >= 0 && testIndex < trackIdsCount); wxASSERT( trackIdsCount <= (long)trackIdsArray.GetCount() ); selectedTrackId = trackIdsArray[testIndex]; if( m_autoPlayedTrackIds.Index(selectedTrackId)==wxNOT_FOUND ) { // not in internal cache, // also check agains the "avoid boredom" settings, see http://www.silverjuke.net/forum/topic-2998.html sql.Query(wxString::Format(wxT("SELECT leadartistname, trackname FROM tracks WHERE id=%lu;"), selectedTrackId)); if( !sql.Next() ) break; // okay, fine track found if( !g_mainFrame->m_player.m_queue.IsBoring(sql.GetString(0), sql.GetString(1), now) ) break; // okay, fine track found } // remove the test index from trackIdsArray trackIdsCount--; if( trackIdsCount <= 0 ) break; // nothing found, nevertheless, use selectedTrackId trackIdsArray[testIndex] = trackIdsArray[trackIdsCount /*one substracted above!*/]; } // done, add the track to the internal cache that avoids playing the same tracks too often // (this cache is used in addition to "avoid boredom") m_autoPlayedTrackIds.Add(selectedTrackId); if( m_autoPlayedTrackIds.GetCount() > MAX_REMEMBER_IDS ) { m_autoPlayedTrackIds.RemoveAt(0); } // done, get the URL from the track id return g_mainFrame->m_libraryModule->GetUrl(selectedTrackId); } void SjAutoCtrl::SwitchToDefLayout() { if( g_mainFrame && g_mainFrame->IsKioskStarted() ) { SjSkinLayout* currLayout = g_mainFrame->GetLayout(); SjSkinLayout* kioskLayout = g_mainFrame->GetLayout(wxT("kiosk")); if( currLayout != kioskLayout && kioskLayout != NULL ) { g_mainFrame->LoadLayout(kioskLayout); } } } /******************************************************************************* * help class for setting m_haltAutoPlay ******************************************************************************/ SjHaltAutoPlay::SjHaltAutoPlay() { g_mainFrame->m_autoCtrl.m_haltAutoPlay++; } SjHaltAutoPlay::~SjHaltAutoPlay() { g_mainFrame->m_autoCtrl.m_haltAutoPlay--; } ����������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/autoctrl.h�������������������������������������������������������������0000664�0000000�0000000�00000020312�12660066715�0020041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: autoctrl.h * Authors: Björn Petersen * Purpose: Silverjuke automatic control routines * ******************************************************************************/ #ifndef __SJ_AUTOCTRL_H__ #define __SJ_AUTOCTRL_H__ enum SjShutdownEtc; class SjAutoFader; class SjAutoCtrl { public: // settings ~SjAutoCtrl (); #define SJ_AUTOCTRL_FOLLOW_PLAYLIST 0x00010000L #define SJ_AUTOCTRL_RESET_VIEW 0x00020000L #define SJ_AUTOCTRL_LIMIT_PLAY_TIME 0x00040000L #define SJ_AUTOCTRL_START_VIS 0x00100000L #define SJ_AUTOCTRL_STOP_VIS 0x00200000L #define SJ_AUTOCTRL_AUTOPLAY_ENABLED 0x01000000L #define SJ_AUTOCTRL_SLEEP 0x02000000L #define SJ_AUTOCTRL_SLEEP_FADE 0x00000001L #define SJ_AUTOCTRL_AUTOPLAY_MAN_ENQ_INTERRUPT 0x08000000L #define SJ_AUTOCTRL_AUTOPLAY_IGNORE 0x10000000L #define SJ_AUTOCTRL_DEF_FLAGS 0x0000FFFFL long m_flags; #define SJ_AUTOCTRL_DEF_LIMITPLAYTIMESECONDS 180L #define SJ_AUTOCTRL_MIN_LIMITPLAYTIMESECONDS 10L #define SJ_AUTOCTRL_MAX_LIMITPLAYTIMESECONDS 3600L long m_limitPlayTimeSeconds; #define SJ_AUTOCTRL_DEF_FOLLOWPLAYLISTMINUTES 5L #define SJ_AUTOCTRL_MIN_FOLLOWPLAYLISTMINUTES 1L #define SJ_AUTOCTRL_MAX_FOLLOWPLAYLISTMINUTES 999L long m_followPlaylistMinutes; #define SJ_AUTOCTRL_DEF_RESETVIEWMINUTES 6L #define SJ_AUTOCTRL_MIN_RESETVIEWMINUTES 1L #define SJ_AUTOCTRL_MAX_RESETVIEWMINUTES 999L long m_resetViewMinutes; long m_resetViewTo; #define SJ_AUTOCTRL_DEF_STARTVISMINUTES 10L #define SJ_AUTOCTRL_MIN_STARTVISMINUTES 1L #define SJ_AUTOCTRL_MAX_STARTVISMINUTES 999L long m_startVisMinutes; #define SJ_AUTOCTRL_DEF_STOPVISMINUTES 10L #define SJ_AUTOCTRL_MIN_STOPVISMINUTES 1L #define SJ_AUTOCTRL_MAX_STOPVISMINUTES 999L long m_stopVisMinutes; #define SJ_AUTOCTRL_DEF_AUTOPLAYWAITMINUTES 3L #define SJ_AUTOCTRL_MIN_AUTOPLAYWAITMINUTES 0L #define SJ_AUTOCTRL_MAX_AUTOPLAYWAITMINUTES 999L long m_autoPlayWaitMinutes; #define SJ_AUTOCTRL_DEF_AUTOPLAYNUMTRACKS 2L #define SJ_AUTOCTRL_MIN_AUTOPLAYNUMTRACKS 1L #define SJ_AUTOCTRL_MAX_AUTOPLAYNUMTRACKS 999L long m_autoPlayNumTracks; long m_autoPlayMusicSelId; long m_autoPlayMusicSelIgnoreId; bool HasInterruptibleAutoPlay () const { return (m_flags&(SJ_AUTOCTRL_AUTOPLAY_ENABLED|SJ_AUTOCTRL_AUTOPLAY_MAN_ENQ_INTERRUPT)) == (SJ_AUTOCTRL_AUTOPLAY_ENABLED|SJ_AUTOCTRL_AUTOPLAY_MAN_ENQ_INTERRUPT); } #define SJ_JINGLE_EVERY 0x10000000L #define SJ_JINGLE_AT0 0x00000001L #define SJ_JINGLE_AT1 0x00000002L #define SJ_JINGLE_AT0_DAILY 0x00000100L #define SJ_JINGLE_AT1_DAILY 0x00000200L #define SJ_JINGLE_AT0_WAIT 0x00010000L #define SJ_JINGLE_AT1_WAIT 0x00020000L long m_jingleFlags; #define SJ_JINGLE_AT_CNT 2 #define SJ_JINGLE_DEF_MINUTES 30 #define SJ_JINGLE_MIN_MINUTES 1 #define SJ_JINGLE_MAX_MINUTES 999 long m_jingleEvery; long m_jingleEveryMusicSelId; unsigned long m_jingleEveryTriggerTimestamp; long m_jingleAt[SJ_JINGLE_AT_CNT]; long m_jingleAtMusicSelId[SJ_JINGLE_AT_CNT]; unsigned long m_jingleAtTriggerTimestamp[SJ_JINGLE_AT_CNT]; // pending events: events are added to this array for some events that // happen eg. while an database update. They should be delayed until // there is no longer a BusyInfo dialog present wxArrayPtrVoid m_pendingEvents; // sleepin' public: void GetSleepSettings (bool& enabled, SjShutdownEtc& action, long& timemode, long& minutes, bool& doFade, long& fadeSeconds); void SetSleepSettings (bool enabled, SjShutdownEtc action, long timemode, long minutes, bool doFade, long fadeSeconds); bool m_stateTriggerSleep;// public to SjAutoFader private: #define SJ_SLEEPMODE_ACTION_MASK 0x000000FFL // see SJ_SHUTDOWN_* #define SJ_SLEEPMODE_TIMEMODE_MASK 0x00000F00L #define SJ_SLEEPMODE_TIMEMODE_IN 0x00000000L #define SJ_SLEEPMODE_TIMEMODE_AFTER 0x00000100L #define SJ_SLEEPMODE_TIMEMODE_AT 0x00000200L #define SJ_SLEEPMODE_TIMEMODE_ALWAYS_IN 0x00000300L #define SJ_SLEEPMODE_TIMEMODE_ALWAYS_AFTER 0x00000400L #define SJ_SLEEPMODE_TIMEMODE_ALWAYS_AT 0x00000500L #define SJ_SLEEPMODE_DEF_FLAGS 0x00000000L #define SJ_SLEEPMODE_TIMEMODE_BASIC_COUNT 3 SjShutdownEtc m_sleepAction; long m_sleepTimemode; #define SJ_SLEEPMODE_DEF_MINUTES 60 // 60 minutes or 01:00 o'clock #define SJ_SLEEPMODE_MIN_MINUTES 1 #define SJ_SLEEPMODE_MAX_MINUTES 99999 long m_sleepMinutes; #define SJ_SLEEPMODE_DEF_FADE_SECONDS 60L #define SJ_SLEEPMODE_MIN_FADE_SECONDS 1L #define SJ_SLEEPMODE_MAX_FADE_SECONDS 999L long m_sleepFadeSeconds; unsigned long m_stateSleepWaitTimestamp; SjAutoFader* m_stateSleepAutoFader; bool m_stateHaltedBySleep; // misc public: void LoadAutoCtrlSettings(); void SaveAutoCtrlSettings(); void ValidateSettings (); // validation is done automatically on load/save // performing actions void OnOneSecondTimer (); bool DoAutoPlayIfEnabled (bool ignoreTimeouts); void SetAutoPlayUnqueueId(long id) { m_stateLastUnqueueId = id; } // public states unsigned long m_stateStartVisTimestamp; unsigned long m_stateStopVisTimestamp; unsigned long m_stateGotoCurrClickedTimestamp; private: // switch to default kiosk layout, if need void SwitchToDefLayout (); // private states wxString m_stateFollowPlaylistUrlFollowed; unsigned long m_stateOpenDialogTimestamp; unsigned long m_lastCleanupTimestamp; // auto-play wxArrayLong m_autoPlayedTrackIds; long m_stateAutoPlayTracksLeft; unsigned long m_stateAutoPlayLastPlaybackTimestamp; long m_stateLastAutoPlayQueueId; long m_stateLastUnqueueId; bool EnqueueAutoPlayUrl (); wxString GetAutoPlayUrl (); bool LastTrackWasAutoPlay(); int IsCurrTrackCloseToEnd(); // returns 0, 1 or -1 for unknown // auto play is only performed if m_haltAutoPlay == 0 int m_haltAutoPlay; friend class SjHaltAutoPlay; friend class SjAutoFader; }; class SjHaltAutoPlay { public: // helper for setting m_haltAutoPlay SjHaltAutoPlay(); ~SjHaltAutoPlay(); }; #endif // __SJ_AUTOCTRL_H__ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/backend.cpp������������������������������������������������������������0000664�0000000�0000000�00000006112�12660066715�0020130�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: backend.cpp * Authors: Björn Petersen * Purpose: Backend base class, derived classes implement engines as Xine, * GStreamer, BASS, DirectShow etc. * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/backend.h> SjBackend::SjBackend(SjBackendId id) { wxASSERT( wxThread::IsMain() ); m_id = id; } SjBackend::~SjBackend() { wxASSERT( wxThread::IsMain() ); // if crossfading takes place and is not yet finished, there may be a pending stream at this moment. // however, as we're on shutdown, I think, we can safely ignore this situaltion. } wxString SjBackend::GetName() const { if(m_id==SJBE_ID_STDOUTPUT ) { return "stdoutput"; } else if(m_id==SJBE_ID_PRELISTEN ) { return "prelisten"; } else { return "unknown"; } } SjBackendStream::SjBackendStream(const wxString& url, SjBackend* backend, SjBackendCallback* cb, SjBackendUserdata* userdata) { wxASSERT( wxThread::IsMain() ); m_url = url; m_cb = cb; m_cbp.samplerate = 44100; m_cbp.channels = 2; m_cbp.startingTime = wxDateTime::Now().GetAsDOS(); m_cbp.buffer = NULL; m_cbp.bytes = 0; m_cbp.backend = backend; m_cbp.stream = this; m_userdata = userdata; // we keep a list of all streams created on the backend; may be useful for the implementations backend->m_allStreams.Add(this); // inform the user about the new stream, can be used to set up m_userdata_* // startingTime is set while samplerate/channels are still invalid! m_cbp.msg = SJBE_MSG_CREATE; m_cb(&m_cbp); } SjBackendStream::~SjBackendStream() { wxASSERT( wxThread::IsMain() ); // inform the user that the userdata can be destroyed now; it's up to the user what to do. m_cbp.msg = SJBE_MSG_DESTROY_USERDATA; m_cb(&m_cbp); // remove stream from list wxArrayPtrVoid* allStreams = &m_cbp.backend->m_allStreams; size_t i, iCnt = allStreams->GetCount(); for( i = 0; i < iCnt; i++ ) { if( allStreams->Item(i) == this ) { allStreams->RemoveAt(i); break; } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/backend.h��������������������������������������������������������������0000664�0000000�0000000�00000012036�12660066715�0017577�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: backend.h * Authors: Björn Petersen * Purpose: Backend base class, derived classes implement engines as Xine, * GStreamer, BASS, DirectShow etc. * ******************************************************************************/ #ifndef __SJ_BACKEND_H__ #define __SJ_BACKEND_H__ class SjBackendStream; class SjBackendUserdata; enum SjBackendId { SJBE_ID_STDOUTPUT = 0, SJBE_ID_PRELISTEN = 1 }; enum SjBackendState { SJBE_STATE_CLOSED = 0, SJBE_STATE_PLAYING, SJBE_STATE_PAUSED }; enum SjBackendMsg { SJBE_MSG_CREATE = 1, // send by the base on stream creation (in fact, CreateStream() may still fail) before the first SJBE_MSG_DSP, // may be used to init some data. Do not expect samplerate/channels/etc. to contain correct data at this moment. SJBE_MSG_VIDEO_DETECTED, // must be send by the implementation if the stream contains video data SJBE_MSG_DSP, // must be send by the implementation SJBE_MSG_END_OF_STREAM, // must be send by the implementation SJBE_MSG_DESTROY_USERDATA // send by the base }; struct SjBackendCallbackParam { SjBackendMsg msg; float* buffer; long bytes; int samplerate; int channels; uint32_t startingTime; SjBackend* backend; SjBackendStream* stream; }; typedef void (SjBackendCallback)(SjBackendCallbackParam*); class SjBackend { public: // The following function must be added by the backend implementation. // - after construction the device should be CLOSED // - to switch from CLOSED to PLAYING, use CreateStream(). CreateStream() is not called if the device is PAUSED. // - then, the state can be changed using SetDeviceState() - the user makes sure, all streams are deleted before CLOSING it again. Pleasant, isn't it? SjBackend (SjBackendId id); // The device is in the CLOSED state after construction virtual ~SjBackend (); virtual void GetLittleOptions (SjArrayLittleOption&) = 0; virtual SjBackendStream* CreateStream (const wxString& url, long seekMs, SjBackendCallback*, SjBackendUserdata*) = 0; virtual SjBackendState GetDeviceState () const = 0; virtual void SetDeviceState (SjBackendState state) = 0; virtual void SetDeviceVol (double gain) = 0; // 0.0 - 1.0, only called on opened devices // higher-level functions bool IsDeviceOpened () const { return (GetDeviceState()!=SJBE_STATE_CLOSED); } SjBackendId GetId () const { return m_id; }; wxString GetName () const; const wxArrayPtrVoid& GetAllStreams () const { return m_allStreams; } bool WantsVideo () const { return (m_id==SJBE_ID_STDOUTPUT); } private: SjBackendId m_id; wxArrayPtrVoid m_allStreams; friend class SjBackendStream; }; class SjBackendStream { // The following function must be added by the backend implementation. // The user creates stream using SjBackend::CreateStream(). protected: SjBackendStream (const wxString& url, SjBackend* backend, SjBackendCallback* cb, SjBackendUserdata*); public: virtual ~SjBackendStream (); virtual void GetTime (long& totalMs, long& elapsedMs) = 0; // -1=unknown virtual void SeekAbs (long ms) = 0; // higher-level functions wxString GetUrl () const { return m_url; } uint32_t GetStartingTime () const { return m_cbp.startingTime; } // these fields may be used by user for any purposes; must _not_ be used by derived classes! SjBackendUserdata* m_userdata; // the following fiels should be treated as "private" to SjBackendStream and derived classes, // howver, they're declared as public to be usable from callbacks (for speed reasons, this avoids one level of iteration) wxString m_url; SjBackendCallback* m_cb; SjBackendCallbackParam m_cbp; }; #endif // __SJ_BACKEND_H__ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/backend_gstreamer.cpp��������������������������������������������������0000664�0000000�0000000�00000040725�12660066715�0022211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: backend_gstreamer.cpp * Authors: Björn Petersen * Purpose: GSteamer Backend * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_GSTREAMER #include <sjbase/backend_gstreamer.h> #include <sjmodules/vis/vis_vidout_module.h> #include <gst/video/videooverlay.h> /******************************************************************************* * Tools and Internals ******************************************************************************/ #define GST_TO_WXSTRING(a) \ wxString a##WxStr = wxString((a), wxConvUTF8); #define WXSTRING_TO_GST(a) \ const wxCharBuffer a##__tempCharBuf = (a).mb_str(wxConvUTF8); \ const char* a##GstStr = a##__tempCharBuf.data(); #define MILLISEC_TO_NANOSEC_FACTOR 1000000L #define NANOSEC_TO_MILLISEC_DIVISOR 1000000L void SjGstreamerBackendStream::set_pipeline_state(GstState s) { if( !m_pipeline ) { return; // not ready } if( gst_element_set_state(m_pipeline, s) == GST_STATE_CHANGE_ASYNC ) { gst_element_get_state(m_pipeline, NULL, NULL, 3000*MILLISEC_TO_NANOSEC_FACTOR /*async change, wait max. 3 seconds*/); } } GstBusSyncReply on_bus_sync_handler(GstBus* bus, GstMessage* msg, gpointer user_data) { // ignore anything but 'prepare-window-handle' element messages if( !gst_is_video_overlay_prepare_window_handle_message(msg) ) return GST_BUS_PASS; if( !g_vidoutModule || !g_vidoutModule->m_os_window_handle ) { wxLogError("GStreamer Error: Window for embedding not ready."); return GST_BUS_PASS; // normally, the video is shown in a separate window now. } // set window to use for video output, see // http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideooverlay.html gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(msg)), (guintptr)g_vidoutModule->m_os_window_handle); gst_message_unref(msg); // success, we can drop the message from the asynchronous message pipe return GST_BUS_DROP; } gboolean on_bus_message(GstBus* bus, GstMessage* msg, gpointer userdata) { SjGstreamerBackendStream* stream = (SjGstreamerBackendStream*)userdata; if( stream == NULL ) { return true; } bool prepareNext = false; switch( GST_MESSAGE_TYPE(msg) ) { case GST_MESSAGE_ERROR: // there may be series of error messages for one stream. // error messages are normally not followed by a GST_MESSAGE_EOS error { // get information about the error GError* error = NULL; gchar* debug = NULL; gst_message_parse_error(msg, &error, &debug); // log the error const gchar* errormessage = error->message; GST_TO_WXSTRING(errormessage); const gchar* objname = GST_OBJECT_NAME(msg->src); GST_TO_WXSTRING(objname); wxString debugStr; if( debug ) { GST_TO_WXSTRING(debug); debugStr = " (" + debugWxStr + ")"; } wxLogError("GStreamer Error: %s: %s%s", objnameWxStr.c_str(), errormessageWxStr.c_str(), debugStr.c_str()); g_free(debug); g_error_free(error); prepareNext = true; } break; case GST_MESSAGE_EOS: // we go here if we reach the end of the stream prepareNext = true; break; default: break; } if( prepareNext ) { if( prepareNext && !stream->m_eosSend ) { stream->m_cbp.msg = SJBE_MSG_END_OF_STREAM; stream->m_cb(&stream->m_cbp); stream->m_eosSend = true; } } return true; } void on_pad_added(GstElement* decodebin, GstPad* newSourcePad, gpointer userdata) { // a new pad appears in the "decodebin" element - link this to the // element with the name "sjAudioEntry" SjGstreamerBackendStream* stream = (SjGstreamerBackendStream*)userdata; if( stream == NULL ) { return; } // find out the type of the pad bool isVideoPad = false; { GstCaps* caps = gst_pad_get_current_caps(newSourcePad); if( !caps ) { return; /*error*/ } GstStructure* s = gst_caps_get_structure(caps, 0); // no need to free or unref the structure, it belongs to the GstCaps. const gchar* name = gst_structure_get_name (s); // sth. like "audio/x-raw" or "video/x-raw" GST_TO_WXSTRING(name); if( nameWxStr.StartsWith("video") ) { stream->m_cbp.msg = SJBE_MSG_VIDEO_DETECTED; stream->m_cb(&stream->m_cbp); isVideoPad = true; } gst_caps_unref(caps); } if( isVideoPad ) { // create video sink and connect the pad to it if( stream->m_backend->WantsVideo() ) { GError* error = NULL; GstElement* videosink = gst_parse_bin_from_description(stream->m_backend->m_iniVideoPipeline, true, &error); if( error ) { const gchar* errormessage = error->message; GST_TO_WXSTRING(errormessage); wxLogError("GStreamer Error: %s. Please check the video configuration at Settings/Advanced.", errormessageWxStr.c_str()); g_error_free(error); } // no else - we may be an error and a valid return object if( !videosink ) { wxLogError("GStream Error: Cannot create video sink."); return; } gst_bin_add(GST_BIN(stream->m_pipeline), videosink); GstPad* destSinkPad = gst_element_get_static_pad(videosink, "sink"); if( !destSinkPad ) { wxLogError("GStream Error: Cannot get pad of video sink."); return; } GstPadLinkReturn linkret = gst_pad_link(newSourcePad, destSinkPad); if( linkret!=GST_PAD_LINK_OK ) { wxLogError("GStreamer error: Cannot link video."); } gst_element_sync_state_with_parent(videosink); } } else { // add audio pad to our audio sink GstElement* audioEntry = gst_bin_get_by_name(GST_BIN(stream->m_pipeline), "sjAudioEntry"); if( audioEntry ) { // get sink pad of the "audio entry element" GstPad* destSinkPad = gst_element_get_static_pad(audioEntry, "sink"); // link the new source pad to the "audio entry element" GstPadLinkReturn linkret = gst_pad_link(newSourcePad, destSinkPad); if( linkret!=GST_PAD_LINK_OK ) { wxLogError("GStreamer error: Cannot link audio."); } gst_object_unref(audioEntry); } } } GstPadProbeReturn on_pad_data(GstPad* pad, GstPadProbeInfo* info, gpointer userdata) { SjGstreamerBackendStream* stream = (SjGstreamerBackendStream*)userdata; if( stream == NULL ) { return GST_PAD_PROBE_OK; } // on the first call on a new stream, correct the "channels" and "samplerate" if( !stream->m_capsChecked ) { stream->m_capsChecked = true; GstCaps* caps = gst_pad_get_current_caps(pad); if( caps ) { GstStructure* s = gst_caps_get_structure(caps, 0); // no need to free or unref the structure, it belongs to the GstCaps. if( s ) { gint v; if( gst_structure_get_int(s, "rate", &v) ) { if( v >= 1000 && v <= 1000000 ) { stream->m_cbp.samplerate = v; } } if( gst_structure_get_int(s, "channels", &v) ) { if( v >= 1 && v <= 32 ) { stream->m_cbp.channels = v; } } } gst_caps_unref(caps); } } // forward the buffer to the given callback GstBuffer* buffer = GST_PAD_PROBE_INFO_BUFFER(info); buffer = gst_buffer_make_writable(buffer); GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_WRITE); stream->m_cbp.msg = SJBE_MSG_DSP; stream->m_cbp.buffer = (float*)map.data; stream->m_cbp.bytes = map.size; stream->m_cb(&stream->m_cbp); gst_buffer_unmap(buffer, &map); GST_PAD_PROBE_INFO_DATA(info) = buffer; return GST_PAD_PROBE_OK; } /******************************************************************************* * Public Backend Implementation ******************************************************************************/ SjGstreamerBackend::SjGstreamerBackend(SjBackendId id) : SjBackend(id) { // load settings // some pipeline examples: // audioecho delay=500000000 intensity=0.6 feedback=0.4 ! autoaudiosink // pulsesink // filesink location=/tmp/raw #define AUDIOPIPELINE_ININAME "gstreamer/"+GetName()+"AudioPipeline" #define AUDIOPIPELINE_DEFAULT "autoaudiosink" #define VIDEOPIPELINE_ININAME "gstreamer/"+GetName()+"VideoPipeline" #define VIDEOPIPELINE_DEFAULT "autovideosink" wxConfigBase* c = g_tools->m_config; m_iniAudioPipeline = c->Read(AUDIOPIPELINE_ININAME, AUDIOPIPELINE_DEFAULT); if( WantsVideo() ) { m_iniVideoPipeline = c->Read(VIDEOPIPELINE_ININAME, VIDEOPIPELINE_DEFAULT); } // init, log version information static bool s_initialized = false; if( !s_initialized ) { gst_init(NULL, NULL); s_initialized = true; guint major, minor, micro, nano; gst_version(&major, &minor, µ, &nano); wxLogInfo("Using GStreamer %i.%i.%i.%i with pipeline \"%s\" (\"%s\")", (int)major, (int)minor, (int)micro, (int)nano, m_iniAudioPipeline.c_str(), m_iniVideoPipeline.c_str()); } } void SjGstreamerBackend::GetLittleOptions(SjArrayLittleOption& lo) { lo.Add(new SjLittleStringSel("GStreamer-Pipeline", &m_iniAudioPipeline, AUDIOPIPELINE_DEFAULT, AUDIOPIPELINE_ININAME, SJ_ICON_MODULE)); if( WantsVideo() ) { lo.Add(new SjLittleStringSel("GStreamer-Video-Pipeline", &m_iniVideoPipeline, VIDEOPIPELINE_DEFAULT, VIDEOPIPELINE_ININAME, SJ_ICON_MODULE)); } } SjBackendStream* SjGstreamerBackend::CreateStream(const wxString& uri, long seekMs, SjBackendCallback* cb, SjBackendUserdata* userdata) { SjGstreamerBackendStream* stream = new SjGstreamerBackendStream(uri, this, cb, userdata); if( stream == NULL ) { return NULL; } /* .--> audioconvert --> capsfilter --> (X) volume -> audiosink decodebin --> | : '--> videosink : : here we add our DSP handler */ // create objects // NB: is is the far faster part, on my computer creating the pipeline takes 4 ms while starting the stream takes 40 ms - // if there are no other problems on recreating the pipeline on every call, there is no need to change this - esp. as there are some advantages as easier cleaning up, different samplerates etc. GError* error = NULL; stream->m_pipeline = gst_pipeline_new ( "sjPlayer" ); GstElement* decodebin = gst_element_factory_make("uridecodebin", "sjSource" ); GstElement* audioconvert = gst_element_factory_make("audioconvert", "sjAudioEntry"); GstElement* capsfilter = gst_element_factory_make("capsfilter", NULL ); GstElement* volume = gst_element_factory_make("volume", "sjVolume" ); GstElement* audiosink = gst_parse_bin_from_description(m_iniAudioPipeline, true, &error); if( error ) { const gchar* errormessage = error->message; GST_TO_WXSTRING(errormessage); wxLogError("GStreamer Error: %s. Please check the audio configuration at Settings/Advanced.", errormessageWxStr.c_str()); g_error_free(error); } // no "return", no "else" - it may be possible, the pipeline is created even on errors, see http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstParse.html#gst-parse-launch if( !stream->m_pipeline || !decodebin || !audioconvert || !capsfilter || !volume || !audiosink ) { wxLogError("GStreamer error: Cannot create objects."); delete stream; return NULL; // error } // create pipeline gst_bin_add_many(GST_BIN(stream->m_pipeline), decodebin, audioconvert, capsfilter, volume, audiosink, NULL); // NULL marks end of list gst_element_link_many(audioconvert, capsfilter, volume, audiosink, NULL); g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), stream /*userdata*/); // add a message handler GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(stream->m_pipeline)); stream->m_bus_watch_id = gst_bus_add_watch(bus, on_bus_message, stream /*userdata*/); gst_bus_set_sync_handler(bus, on_bus_sync_handler, stream /*userdata*/, NULL); gst_object_unref(bus); // setup capsfilter and dsp callback GstCaps* caps = gst_caps_new_simple("audio/x-raw", "format", G_TYPE_STRING, "F32LE", // or S16LE, U8, ... "layout", G_TYPE_STRING, "interleaved", // LRLRLRLRLRLRLR ... //"rate", G_TYPE_INT, info->rate, // if we set a fixed rate, we must probably add a resampler to the pipeline, however, currently this is not needed //"channels", G_TYPE_INT, 2, // enable this to force a fixed number of channels, currently not needed NULL); g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL); gst_caps_unref(caps); GstPad* pad = gst_element_get_static_pad(volume, "src"); gulong probeid = gst_pad_add_probe(pad, (GstPadProbeType)(GST_PAD_PROBE_TYPE_BUFFER), on_pad_data, (gpointer)stream/*userdata*/, NULL); if( probeid==0 ) { wxLogError("GStreamer Error: Cannot add probe callback."); } gst_object_unref(pad); // open stream stream->set_pipeline_state(GST_STATE_READY); GstElement* source = gst_bin_get_by_name(GST_BIN(stream->m_pipeline), "sjSource"); if( source ) { WXSTRING_TO_GST(uri); g_object_set(G_OBJECT(source), "uri", uriGstStr, NULL /*NULL marks end of list*/); } stream->set_pipeline_state(GST_STATE_PLAYING); if( seekMs > 0 ) { gst_element_seek_simple(stream->m_pipeline, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_KEY_UNIT), seekMs*MILLISEC_TO_NANOSEC_FACTOR); } return stream; } SjBackendState SjGstreamerBackend::GetDeviceState() const { const wxArrayPtrVoid& allStreams = GetAllStreams(); size_t i, iCnt = allStreams.GetCount(); if( iCnt == 0 ) { return SJBE_STATE_CLOSED; } for( i = 0; i < iCnt; i++ ) { SjGstreamerBackendStream* stream = (SjGstreamerBackendStream*)allStreams.Item(i); GstState state; if( gst_element_get_state(stream->m_pipeline, &state, NULL, 3000*MILLISEC_TO_NANOSEC_FACTOR /*wait max. 3 seconds*/) != GST_STATE_CHANGE_SUCCESS ) { return SJBE_STATE_PLAYING; // we assume, a stream is coming very soon } if( state != GST_STATE_PAUSED ) { return SJBE_STATE_PLAYING; } } return SJBE_STATE_PAUSED; } void SjGstreamerBackend::SetDeviceState(SjBackendState state) { if( state == SJBE_STATE_CLOSED ) { return; } // close a device by removing all streams on it const wxArrayPtrVoid& allStreams = GetAllStreams(); size_t i, iCnt = allStreams.GetCount(); for( i = 0; i < iCnt; i++ ) { SjGstreamerBackendStream* stream = (SjGstreamerBackendStream*)allStreams.Item(i); stream->set_pipeline_state(state==SJBE_STATE_PLAYING? GST_STATE_PLAYING : GST_STATE_PAUSED); } } void SjGstreamerBackend::SetDeviceVol(double gain) { const wxArrayPtrVoid& allStreams = GetAllStreams(); size_t i, iCnt = allStreams.GetCount(); for( i = 0; i < iCnt; i++ ) { SjGstreamerBackendStream* stream = (SjGstreamerBackendStream*)allStreams.Item(i); // this does not set the "main" volume but the volume of the stream; // we cannot get louder than the OS-setting this way, however, this may be useful for our crossfading. GstElement* volumeElem = gst_bin_get_by_name(GST_BIN(stream->m_pipeline), "sjVolume"); if( volumeElem ) { g_object_set(G_OBJECT(volumeElem), "volume", (gdouble)gain /*0: mute, 1.0: 100%, >1.0: additional gain*/, NULL /*NULL marks end of list*/); } } } void SjGstreamerBackendStream::GetTime(long& totalMs, long& elapsedMs) { totalMs = -1; // unknown total time elapsedMs = -1; // unknown elapsed time gint64 ns; if( gst_element_query_duration(m_pipeline, GST_FORMAT_TIME, &ns) ) { totalMs = ns/NANOSEC_TO_MILLISEC_DIVISOR; } if( gst_element_query_position(m_pipeline, GST_FORMAT_TIME, &ns) ) { elapsedMs = ns/NANOSEC_TO_MILLISEC_DIVISOR; } } void SjGstreamerBackendStream::SeekAbs(long seekMs) { gst_element_seek_simple(m_pipeline, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_KEY_UNIT), seekMs*MILLISEC_TO_NANOSEC_FACTOR); } SjGstreamerBackendStream::~SjGstreamerBackendStream() { set_pipeline_state(GST_STATE_NULL); gst_object_unref(GST_OBJECT(m_pipeline)); m_pipeline = NULL; g_source_remove(m_bus_watch_id); m_bus_watch_id = 0; } #endif // SJ_USE_GSTREAMER �������������������������������������������silverjuke-16.2.3/src/sjbase/backend_gstreamer.h����������������������������������������������������0000664�0000000�0000000�00000006124�12660066715�0021651�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: backend_gstreamer.h * Authors: Björn Petersen * Purpose: GSteamer Backend * ******************************************************************************/ #ifndef __SJ_BACKEND_GSTREAMER_H__ #define __SJ_BACKEND_GSTREAMER_H__ #include <sjbase/backend.h> #include <gst/gst.h> class SjGstreamerBackendStream; class SjGstreamerBackend : public SjBackend { public: SjGstreamerBackend (SjBackendId); ~SjGstreamerBackend () { SetDeviceState(SJBE_STATE_CLOSED); } void GetLittleOptions (SjArrayLittleOption&); SjBackendStream* CreateStream (const wxString& url, long seekMs, SjBackendCallback*, SjBackendUserdata* userdata); SjBackendState GetDeviceState () const; void SetDeviceState (SjBackendState); void SetDeviceVol (double gain); protected: wxString m_iniAudioPipeline; wxString m_iniVideoPipeline; friend void on_pad_added (GstElement*, GstPad*, gpointer); }; class SjGstreamerBackendStream : public SjBackendStream { public: ~SjGstreamerBackendStream (); void GetTime (long& totalMs, long& elapsedMs); // -1=unknown void SeekAbs (long ms); protected: SjGstreamerBackendStream(const wxString& url, SjGstreamerBackend* backend, SjBackendCallback* cb, SjBackendUserdata* userdata) : SjBackendStream(url, backend, cb, userdata) { m_backend = backend; m_pipeline = NULL; m_bus_watch_id = 0; m_capsChecked = false; m_eosSend = false; } GstElement* m_pipeline; guint m_bus_watch_id; SjGstreamerBackend* m_backend; bool m_capsChecked; bool m_eosSend; void set_pipeline_state (GstState s); friend class SjGstreamerBackend; friend void on_pad_added (GstElement*, GstPad*, gpointer); friend GstPadProbeReturn on_pad_data (GstPad*, GstPadProbeInfo*, gpointer); friend gboolean on_bus_message(GstBus*, GstMessage*, gpointer); }; #endif // __SJ_BACKEND_GSTREAMER_H__ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/backend_xine.cpp�������������������������������������������������������0000664�0000000�0000000�00000022335�12660066715�0021160�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: backend_xine.cpp * Authors: Björn Petersen * Purpose: Player xine1 implementation, link with `-lxine` * ******************************************************************************* * * Docs: * - xdg-open /usr/share/doc/libxine-dev/hackersguide/hackersguide.html & * - xdg-open /usr/include/xine.h & * - http://sourceforge.net/p/xine/mailman/search/ * * Howto set audio volume: * - XINE_PARAM_AUDIO_VOLUME sets internally AO_PROP_MIXER_VOL, this seems not to be the system volume * * About the config-files: * - https://bugs.launchpad.net/ubuntu/+source/xine-ui/+bug/231507 * ******************************************************************************/ #include <sjbase/base.h> #if SJ_USE_XINE #include <sjbase/backend_xine.h> /******************************************************************************* * Configuration ******************************************************************************/ class SjLittleReplayEnum : public SjLittleEnumStr { public: SjLittleReplayEnum(const wxString& name, const wxString& valuesNoptions, wxString* value, const wxString& defaultValue, const wxString& ini=wxEmptyString, SjIcon icon=SJ_ICON_LITTLEDEFAULT, bool saveToObject=TRUE) : SjLittleEnumStr(name, valuesNoptions, value, defaultValue, ini, icon, saveToObject) { } void OnFeedback() { g_mainFrame->ReplayIfPlaying(); } }; void SjXineBackend::GetLittleOptions(SjArrayLittleOption& lo) { if( !s_xine ) { return; // error } wxString options = "auto|" + wxString(_("Default")), currOption; const char* const* pl = xine_list_audio_output_plugins(s_xine); if( pl ) { while( *pl ) { currOption = wxString(*pl, wxConvUTF8); if( !currOption.IsEmpty() ) { options += "|" + currOption + "|" + currOption; } pl++; } } #define DEVICE_ININAME "xine/"+GetName()+"device" #define DEVICE_DEFAULT "auto" lo.Add(new SjLittleReplayEnum( _("Device"), options, &m_iniDevice, DEVICE_DEFAULT, DEVICE_ININAME, SJ_ICON_MODULE)); } /******************************************************************************* * Public Backend Implementation ******************************************************************************/ xine_t* SjXineBackend::s_xine = NULL; int SjXineBackend::s_xine_usage = 0; SjXineBackend::SjXineBackend(SjBackendId device) : SjBackend(device) { m_ao_port = NULL; m_currStream = NULL; // load options from INI wxConfigBase* c = g_tools->m_config; m_iniDevice = c->Read(DEVICE_ININAME, DEVICE_DEFAULT); // TODO: XInitThreads may be needed (for videos only?), see hackersguide.html /* if (!XInitThreads()) { wxLogError("Xine Error: XInitThreads() failed."); return; } */ // preinit xine s_xine_usage++; if( s_xine_usage == 1 ) { s_xine = xine_new(); if( s_xine ) { // load xine config file and init xine // TODO: this may also be possible by //xine_config_load(m_xine, "$HOME/.xine/config"); // postinit xine xine_init(s_xine); // show version information wxString version(xine_get_version_string()); wxLogInfo("Loading xine %s using output \"%s\".", version.c_str(), m_iniDevice.c_str()); } else { wxLogError("Xine Error: Cannot init."); } } } SjXineBackend::~SjXineBackend() { SetDeviceState(SJBE_STATE_CLOSED); s_xine_usage--; if( s_xine_usage == 0 ) { if( s_xine ) { xine_exit(s_xine); } } delete this; } static void xine_event_listener_cb(void* user_data, const xine_event_t* event) { SjXineBackendStream* stream = (SjXineBackendStream*)user_data; if( stream == NULL ) { return; } switch( event->type ) { case XINE_EVENT_UI_PLAYBACK_FINISHED: // start the next stream, NOTE: we're in a non-main thread here! stream->m_cbp.msg = SJBE_MSG_END_OF_STREAM; stream->m_cb(&stream->m_cbp); break; } } SjBackendStream* SjXineBackend::CreateStream(const wxString& url, long seekMs, SjBackendCallback* cb, SjBackendUserdata* userdata) { if( !s_xine ) { wxLogError("Xine Error: Initialization falied."); return NULL; } if( m_currStream ) { wxLogError("Xine Error: There is already a stream on this lane."); return NULL;} // open audio port if( !m_ao_port ) { m_ao_port = xine_open_audio_driver(s_xine , static_cast<const char*>(m_iniDevice.mb_str(wxConvUTF8)), NULL); if( !m_ao_port ) { wxLogError("Xine Error: xine_open_audio_driver() failed."); return NULL; } } // create stream objects SjXineBackendStream* newStream = new SjXineBackendStream(url, this, cb, userdata); if( !newStream ) { wxLogError("Xine Error: new SjXineBackendStream() failed."); return NULL; } newStream->m_xine_stream = xine_stream_new(s_xine, m_ao_port, NULL); if( newStream->m_xine_stream == NULL ) { delete newStream; wxLogError("Xine Error: xine_stream_new() failed."); return NULL; } // add event listener to stream newStream->m_event_queue = xine_event_new_queue(newStream->m_xine_stream); if( newStream->m_event_queue == NULL ) { delete newStream; wxLogError("Xine Error: xine_event_new_queue() failed."); return NULL; } xine_event_create_listener_thread(newStream->m_event_queue, xine_event_listener_cb, (void*)newStream); // open URL for this stream if( !xine_open(newStream->m_xine_stream, static_cast<const char*>(url.mb_str(wxConvUTF8))) ) { // failed, as xine is compatible to file:-URLs, this URL may be http, ZIP or sth. like that. // try over by copying the URL to a local file bool failed = true; wxString tryOver = SjTempNCache::GetAsLocalFile(url); if( !tryOver.IsEmpty() ) { if( xine_open(newStream->m_xine_stream, static_cast<const char*>(tryOver.mb_str(wxConvUTF8))) ) { failed = false; } } if( failed ) { delete newStream; wxLogError("Xine Error: xine_open() failed."); return NULL; } } // finally, play if( !xine_play(newStream->m_xine_stream, 0, seekMs) ) { delete newStream; wxLogError("Xine Error: xine_play() failed."); return NULL; } // success m_currStream = newStream; return newStream; } SjBackendState SjXineBackend::GetDeviceState() const { if( !s_xine || !m_ao_port ) { return SJBE_STATE_CLOSED; } if( !m_currStream || !m_currStream->m_xine_stream ) { return SJBE_STATE_PLAYING; // the stream should appear every moment } if( xine_get_param(m_currStream->m_xine_stream,XINE_PARAM_SPEED) == XINE_SPEED_PAUSE ) { return SJBE_STATE_PAUSED; } return SJBE_STATE_PLAYING; } void SjXineBackend::SetDeviceState(SjBackendState state) { if( !s_xine || !m_currStream || !m_currStream->m_xine_stream ) { return; } switch( state ) { case SJBE_STATE_CLOSED: xine_close_audio_driver(s_xine, m_ao_port); m_ao_port = NULL; break; case SJBE_STATE_PLAYING: xine_set_param(m_currStream->m_xine_stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL); break; case SJBE_STATE_PAUSED: xine_set_param(m_currStream->m_xine_stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE); break; } } void SjXineBackend::SetDeviceVol(double gain) { if( !s_xine || !m_currStream || !m_currStream->m_xine_stream ) { return; } int v; v = (int)((double)100*gain); if( v < 0 ) v = 0; if( v > 100 ) v = 0; xine_set_param(m_currStream->m_xine_stream, XINE_PARAM_AUDIO_VOLUME, v); // XINE_PARAM_AUDIO_VOLUME sets internally AO_PROP_MIXER_VOL, } void SjXineBackendStream::GetTime(long& totalMs, long& elapsedMs) { totalMs = -1; elapsedMs = -1; if( !m_xine_stream ) { return; } int pos_stream = -1, pos_time_ms = -1, length_time_ms = -1; if( xine_get_pos_length(m_xine_stream, &pos_stream, &pos_time_ms, &length_time_ms) ) { // for HTTP-streams, xine sometimes returns bad values as 1083696000 or 285440000 for the length, // so, do not allow length > 1 day if( length_time_ms >= 0 && length_time_ms < (24*60*60*1000) ) { totalMs = length_time_ms; } if( pos_time_ms >= 0 ) { elapsedMs = pos_time_ms; } } } void SjXineBackendStream::SeekAbs(long seekMs) { if( !m_xine_stream ) { return; } xine_play(m_xine_stream, 0, seekMs); } SjXineBackendStream::~SjXineBackendStream() { if( m_backend ) { if( m_backend->m_currStream == this ) { m_backend->m_currStream = NULL; } } if( m_event_queue ) { xine_event_dispose_queue(m_event_queue); m_event_queue = NULL; } if( m_xine_stream ) { xine_dispose(m_xine_stream); m_xine_stream = NULL; } delete this; } #endif // SJ_USE_XINE ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/backend_xine.h���������������������������������������������������������0000664�0000000�0000000�00000005224�12660066715�0020623�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: backend_xine.h * Authors: Björn Petersen * Purpose: Xine Backend * ******************************************************************************/ #ifndef __SJ_BACKEND_XINE_H__ #define __SJ_BACKEND_XINE_H__ #include <sjbase/backend.h> #include <xine.h> class SjXineBackendStream; class SjXineBackend : public SjBackend { public: SjXineBackend (SjBackendId); ~SjXineBackend (); void GetLittleOptions (SjArrayLittleOption&); SjBackendStream* CreateStream (const wxString& url, long seekMs, SjBackendCallback*, SjBackendUserdata*); SjBackendState GetDeviceState () const; void SetDeviceState (SjBackendState); void SetDeviceVol (double gain); protected: static int s_xine_usage; static xine_t* s_xine; xine_audio_port_t* m_ao_port; SjXineBackendStream* m_currStream; wxString m_iniDevice; friend SjXineBackendStream; }; class SjXineBackendStream : public SjBackendStream { public: ~SjXineBackendStream(); void GetTime (long& totalMs, long& elapsedMs); // -1=unknown void SeekAbs (long ms); protected: SjXineBackend* m_backend; xine_stream_t* m_xine_stream; xine_event_queue_t* m_event_queue; SjXineBackendStream(const wxString& url, SjXineBackend* backend, SjBackendCallback* cb, SjBackendUserdata* userdata) : SjBackendStream(url, backend, cb, userdata) { m_backend = backend; m_xine_stream = NULL; m_event_queue = NULL; } friend class SjXineBackend; }; #endif // __SJ_BACKEND_XINE_H__ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/base.h�����������������������������������������������������������������0000664�0000000�0000000�00000006623�12660066715�0017127�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: basesj.h * Authors: Björn Petersen * Purpose: This file includes the most common headers and may be useful to * generate precompiles headers * ******************************************************************************/ #ifndef __SJ_BASE_H__ #define __SJ_BASE_H__ #ifdef __cplusplus // Needed as Xcode includes this file for C-Sources as a precompiled header /******************************************************************************* * standard and wxWidgets includes ******************************************************************************/ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdint.h> #include <wx/wx.h> #include <wx/file.h> #include <wx/filesys.h> #include <wx/stream.h> #include <wx/confbase.h> #include <wx/imaglist.h> #include <wx/regex.h> #include <wx/dnd.h> #include <wx/dragimag.h> #include <wx/display.h> /******************************************************************************* * compatibility macros ******************************************************************************/ #ifndef wxT_2 // the wxT_2 macro is available since wxWidgets 2.8.12, define it if we're using an older or very new version #if wxCHECK_VERSION(3,0,0) #define wxT_2(x) x #else #define wxT_2(x) wxT(x) #endif #endif #if !wxCHECK_VERSION(3,0,0) // not really sure about the version, in 2.8.12, wxRasterOperationMode is missing, in 3.0.2 it is defined #define wxRasterOperationMode int #endif /******************************************************************************* * basic silverjuke includes ******************************************************************************/ #include <sjbase/compileoptions.h> #include <sjtools/sqlt.h> #include <sjtools/types.h> #include <sjbase/ids.h> #include <sjtools/normalise.h> #include <sjtools/dialog.h> #include <sjtools/busyinfo.h> #include <sjtools/tooltips.h> #include <sjtools/tools.h> #include <sjtools/http.h> #include <sjtools/ext_list.h> #include <sjtools/wavework.h> #include <sjbase/search.h> #include <sjbase/playlist.h> #include <sjbase/skin.h> #include <sjtools/littleoption.h> #include <sjmodules/modulebase.h> #include <sjbase/queue.h> #include <sjbase/player.h> #include <sjbase/mainapp.h> #include <sjbase/autoctrl.h> #include <sjbase/columnmixer.h> #include <sjbase/display.h> #include <sjbase/mainframe.h> #include <sjmodules/library.h> #include <sjmodules/accel.h> #endif // __cplusplus #endif // __SJ_BASE_H__ �������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser.cpp������������������������������������������������������������0000664�0000000�0000000�00000077265�12660066715�0020245�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser.cpp * Authors: Björn Petersen * Purpose: Silverjuke main browser * ******************************************************************************/ #include <sjbase/base.h> #include <sjtools/imgthread.h> #include <sjbase/browser.h> #include <sjbase/browser_album.h> #include <sjbase/browser_cover.h> #include <sjbase/browser_list.h> #include <sjmodules/kiosk/virtkeybd.h> #include <sjmodules/vis/vis_module.h> #include <sjbase/columnmixer.h> BEGIN_EVENT_TABLE(SjBrowserWindow, wxWindow) EVT_PAINT ( SjBrowserWindow::OnPaint ) EVT_IMAGE_THERE ( SjBrowserWindow::OnImageThere ) EVT_ERASE_BACKGROUND ( SjBrowserWindow::OnEraseBackground ) EVT_SIZE ( SjBrowserWindow::OnSize ) EVT_LEFT_DOWN ( SjBrowserWindow::OnMouseLeftDown ) EVT_LEFT_UP ( SjBrowserWindow::OnMouseLeftUp ) EVT_MOUSE_CAPTURE_LOST ( SjBrowserWindow::OnMouseCaptureLost ) EVT_LEFT_DCLICK ( SjBrowserWindow::OnMouseLeftDClick ) EVT_ENTER_WINDOW ( SjBrowserWindow::OnMouseEnter ) EVT_MOTION ( SjBrowserWindow::OnMouseMotion ) EVT_MOUSEWHEEL ( SjBrowserWindow::OnMouseWheel ) EVT_CONTEXT_MENU ( SjBrowserWindow::OnMouseRight ) EVT_MIDDLE_UP ( SjBrowserWindow::OnMouseMiddleUp ) EVT_KEY_DOWN ( SjBrowserWindow::OnKeyDown ) END_EVENT_TABLE() void SjBrowserWindow::OnMouseLeftDown(wxMouseEvent& event) { if( g_accelModule == NULL || m_currView == NULL ) return; g_mainFrame->GotBrowserInputFromUser(); g_mainFrame->m_display.ClearDisplaySelection(); /* capture mouse */ #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif SetFocus(); CaptureMouse(); /* give the event to the current view */ m_currView->OnMouseLeftDown(event); } void SjBrowserWindow::OnMouseLeftUp(wxMouseEvent& event) { if( g_accelModule == NULL || m_currView == NULL ) return; g_mainFrame->GotBrowserInputFromUser(); // drag'n'drop: end (wxDragImage uses its own mouse capturing) if( m_mouseAction == SJ_ACTION_DRAGNDROP ) { m_mouseAction = SJ_ACTION_NONE; g_mainFrame->DragNDrop(SJ_DND_DROP, this, event.GetPosition(), NULL, &m_dragUrls); return; // done } // release the mouse if it was captured before if( HasCapture() ) { ReleaseMouse(); } else { return; // mouse was not captured } /* give the event to the current view */ m_currView->OnMouseLeftUp(event); } void SjBrowserWindow::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { if( g_accelModule == NULL || m_currView == NULL ) return; wxLogDebug(wxT("~~~~~~~~~~~~~~~~~~~~~~~~~~ CAPTURE LOST!")); wxASSERT( m_mouseAction != SJ_ACTION_DRAGNDROP ); // should not be true - capture is handled by the Drag'n'Drop classes themselves! m_currView->OnMouseCaptureLost(event); } void SjBrowserWindow::OnMouseLeftDClick(wxMouseEvent& event) { if( g_accelModule == NULL || m_currView == NULL ) return; g_mainFrame->GotBrowserInputFromUser(); /* give the event to the current view */ if( !m_currView->OnMouseLeftDClick(event) ) { // click not used -> toggle view g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDT_WORKSPACE_TOGGLE_VIEW)); } } void SjBrowserWindow::OnMouseEnter(wxMouseEvent& event) { // if the mouse enters this window, send a mouse leave // message to the parent window GetParent()->GetEventHandler()->QueueEvent(new wxMouseEvent(wxEVT_LEAVE_WINDOW)); if( !HasCapture() ) ResetCursor(); } void SjBrowserWindow::ResetCursor() { if( m_cursorChanged ) { SetCursor(SjVirtKeybdModule::GetStandardCursor()); m_cursorChanged = false; } } void SjBrowserWindow::OnMouseMotion(wxMouseEvent& event) { if( g_accelModule == NULL || m_currView == NULL ) return; if( !HasCapture() ) { #if SJ_USE_TOOLTIPS m_toolTipProvider.m_xPos = event.GetX(); m_toolTipProvider.m_yPos = event.GetY(); g_tools->m_toolTipManager.SetToolTipProvider(&m_toolTipProvider); #endif m_currView->OnMouseMotion(event); return; } #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif g_mainFrame->GotBrowserInputFromUser(); /* give the event to the current view */ m_currView->OnMouseMotion(event); } void SjBrowserWindow::OnMouseWheel(wxMouseEvent& event) { if( g_accelModule == NULL || m_mouseAction == SJ_ACTION_DRAGNDROP || m_mouseAction == SJ_ACTION_COLUMNWIDTH || m_mouseAction == SJ_ACTION_COLUMNMOVE || m_currView == NULL ) return; #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif // get information about the mouse wheel event bool scrollVert = event.GetWheelAxis() == wxMOUSE_WHEEL_HORIZONTAL? false : true; if( ((event.AltDown() || event.ShiftDown() || event.CmdDown() || event.ControlDown()) && g_accelModule->m_flags&SJ_ACCEL_WHEEL_MODIFIER_AXIS_TOGGLE) || (event.RightIsDown() && g_accelModule->m_flags&SJ_ACCEL_WHEEL_RMOUSE_AXIS_TOGGLE) ) { scrollVert = !scrollVert; } if( event.RightIsDown() && g_accelModule->m_flags&SJ_ACCEL_WHEEL_RMOUSE_AXIS_TOGGLE ) { m_skipContextMenuEvent = 1; // skip WM_RBUTTONUP and WM_CONTEXTMENU } int mouseX, mouseY; ::wxGetMousePosition(&mouseX, &mouseY); g_mainFrame->ScreenToClient(&mouseX, &mouseY); int targetId = g_mainFrame->FindTargetId(mouseX, mouseY); // for some targets, the mouse wheel does some (optional) special things if( (targetId>=IDT_DISPLAY_LINE_FIRST && targetId<=IDT_DISPLAY_LINE_LAST) || targetId==IDT_DISPLAY_UP || targetId==IDT_DISPLAY_DOWN || targetId==IDT_DISPLAY_V_SCROLL ) { if( scrollVert ) { static SjWheelHelper s_dispWheelHelper; long actions, dir; s_dispWheelHelper.PushRotationNPopAction(event, actions, dir); while( actions-- ) { SjSkinValue dummy; g_mainFrame->OnSkinTargetEvent(dir>0?IDT_DISPLAY_UP:IDT_DISPLAY_DOWN, dummy, 0); } } return; } else if( g_accelModule->m_flags&SJ_ACCEL_WHEEL_VALUE_INPUT ) { if( targetId==IDT_MAIN_VOL_UP || targetId==IDT_MAIN_VOL_DOWN || targetId==IDT_MAIN_VOL_SLIDER || targetId==IDT_MAIN_VOL_MUTE ) { if( scrollVert ) { static SjWheelHelper s_volWheelHelper; long actions, dir; s_volWheelHelper.PushRotationNPopAction(event, actions, dir); while( actions-- ) { SjSkinValue dummy; g_mainFrame->OnSkinTargetEvent(dir>0?IDT_MAIN_VOL_UP:IDT_MAIN_VOL_DOWN, dummy, 0); } } return; } else if( (targetId>=IDT_WORKSPACE_GOTO_A && targetId<=IDT_WORKSPACE_GOTO_0_9) || targetId==IDT_WORKSPACE_GOTO_PREV_AZ || targetId==IDT_WORKSPACE_GOTO_NEXT_AZ ) { if( scrollVert ) { static SjWheelHelper s_azWheelHelper; long actions, dir; s_azWheelHelper.PushRotationNPopAction(event, actions, dir); while( actions-- ) { SjSkinValue dummy; g_mainFrame->OnSkinTargetEvent(dir>0?IDT_WORKSPACE_GOTO_PREV_AZ:IDT_WORKSPACE_GOTO_NEXT_AZ, dummy, 0); } } return; } else if( targetId == IDT_WORKSPACE_H_SCROLL || targetId == IDT_WORKSPACE_LINE_LEFT || targetId == IDT_WORKSPACE_LINE_RIGHT || targetId == IDT_WORKSPACE_PAGE_LEFT || targetId == IDT_WORKSPACE_PAGE_RIGHT ) { if( scrollVert ) { static SjWheelHelper s_hscrollWheelHelper; long actions, dir; s_hscrollWheelHelper.PushRotationNPopAction(event, actions, dir); while( actions-- ) { SjSkinValue dummy; g_mainFrame->OnSkinTargetEvent(dir>0?IDT_WORKSPACE_LINE_LEFT:IDT_WORKSPACE_LINE_RIGHT, dummy, 0); } return; } } else if( targetId == IDT_WORKSPACE_V_SCROLL || targetId == IDT_WORKSPACE_LINE_UP || targetId == IDT_WORKSPACE_LINE_DOWN || targetId == IDT_WORKSPACE_PAGE_UP || targetId == IDT_WORKSPACE_PAGE_DOWN ) { if( scrollVert ) { static SjWheelHelper s_vscrollWheelHelper; long actions, dir; s_vscrollWheelHelper.PushRotationNPopAction(event, actions, dir); while( actions-- ) { SjSkinValue dummy; g_mainFrame->OnSkinTargetEvent(dir>0?IDT_WORKSPACE_LINE_UP:IDT_WORKSPACE_LINE_DOWN, dummy, 0); // needed to allow vertical scrolling if SJ_ACCEL_WHEEL_HORZ_IN_ALBUMVIEW is set } return; } } } // give the event to the current view g_mainFrame->GotBrowserInputFromUser(); m_currView->OnMouseWheel(event, scrollVert); } void SjBrowserWindow::OnMouseRight(wxContextMenuEvent& event) { #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif if( m_mouseAction == SJ_ACTION_DRAGSCROLL || m_mouseAction == SJ_ACTION_DRAGNDROP || m_mouseAction == SJ_ACTION_COLUMNWIDTH || m_mouseAction == SJ_ACTION_COLUMNMOVE || m_currView == NULL ) { return; } g_mainFrame->GotBrowserInputFromUser(); g_mainFrame->m_display.ClearDisplaySelection(); if( m_skipContextMenuEvent ) { m_skipContextMenuEvent = 0; return; // no right button up this pass } /* give the event to the current view */ wxPoint clickPoint = ScreenToClient(event.GetPosition()); m_currView->OnContextMenu(clickPoint.x, clickPoint.y); } void SjBrowserWindow::OnModuleUserId(int id) { m_currView->OnContextMenuSelect(id); } void SjBrowserWindow::OnMouseMiddleUp(wxMouseEvent& event) { #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif if( m_mouseAction == SJ_ACTION_DRAGSCROLL || m_mouseAction == SJ_ACTION_DRAGNDROP || m_mouseAction == SJ_ACTION_COLUMNWIDTH || m_mouseAction == SJ_ACTION_COLUMNMOVE || m_currView == NULL ) { return; } g_mainFrame->GotBrowserInputFromUser(); g_mainFrame->m_display.ClearDisplaySelection(); /* give the event to the current view */ m_currView->OnMouseMiddleUp(event); } void SjBrowserWindow::OnKeyDown(wxKeyEvent& event) { if( g_accelModule == NULL || m_mouseAction == SJ_ACTION_DRAGNDROP || m_mouseAction == SJ_ACTION_COLUMNWIDTH || m_mouseAction == SJ_ACTION_COLUMNMOVE ) { return; } #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif long accelFlags = (event.ShiftDown()? wxACCEL_SHIFT : 0); int targetId = g_accelModule->KeyEvent2CmdId(event, SJA_MAIN); if( targetId == 0 && accelFlags ) { // try again without shift wxKeyEvent eventWithoutShift = event; eventWithoutShift.m_shiftDown = false; targetId = g_accelModule->KeyEvent2CmdId(eventWithoutShift, SJA_MAIN); } if( targetId ) { SjSkinValue dummy; g_mainFrame->OnSkinTargetEvent(targetId, dummy, accelFlags); } else { event.Skip(); } // from here ... } void SjBrowserWindow::OnSkinTargetEvent (int targetId, SjSkinValue& value, long accelFlags) { // ... we may get here eg. for cursor presses g_mainFrame->GotBrowserInputFromUser(); g_mainFrame->m_display.ClearDisplaySelection(); if( targetId == IDT_WORKSPACE_TOGGLE_VIEW ) { // toggle the view for( int test = 1; test <= SJ_BROWSER_VIEW_COUNT; test ++ ) { int newView = (GetView()+test)%SJ_BROWSER_VIEW_COUNT; if( IsViewAvailable(newView) ) { g_visModule->StopVisIfOverWorkspace(); SetView_(newView, true, true); break; } } } else if( targetId == IDT_WORKSPACE_ALBUM_VIEW ) { if( IsViewAvailable(SJ_BROWSER_ALBUM_VIEW) ) g_visModule->StopVisIfOverWorkspace(); SetView_(SJ_BROWSER_ALBUM_VIEW, true, true); // needed anyway for button updates; if the view is not available, nothing happen } else if( targetId == IDT_WORKSPACE_COVER_VIEW ) { if( IsViewAvailable(SJ_BROWSER_COVER_VIEW) ) g_visModule->StopVisIfOverWorkspace(); SetView_(SJ_BROWSER_COVER_VIEW, true, true); // needed anyway for button updates; if the view is not available, nothing happen } else if( targetId == IDT_WORKSPACE_LIST_VIEW ) { if( IsViewAvailable(SJ_BROWSER_LIST_VIEW) ) g_visModule->StopVisIfOverWorkspace(); SetView_(SJ_BROWSER_LIST_VIEW, true, true); // needed anyway for button updates; if the view is not available, nothing happen } else if( m_currView ) { if( targetId == IDT_WORKSPACE_SHOW_COVERS ) { // toggle covers if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) ) { g_visModule->StopVisIfOverWorkspace(); SjTools::ToggleFlag(m_currView->m_flags, SJ_BROWSER_VIEW_COVER); RefreshAll(); if( g_mainFrame->m_viewMenu ) { g_mainFrame->m_viewMenu->Check(IDT_WORKSPACE_SHOW_COVERS, AreCoversShown()); } } } else { // forward to the current view if( !m_currView->OnSkinTargetEvent(targetId, value, accelFlags) ) { if( targetId == IDT_WORKSPACE_ENTER ) { // "enter" not used by the current view, play/enqueue the files int action = IDT_ENQUEUE_LAST; if( g_mainFrame->IsOpAvailable(SJ_OP_EDIT_QUEUE) && (g_accelModule->m_flags&SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK) ) { action = IDT_ENQUEUE_NOW; } SjSkinValue v; g_mainFrame->OnSkinTargetEvent(action, v, accelFlags); } else if( targetId == IDT_WORKSPACE_GOTO_PREV_AZ || targetId == IDT_WORKSPACE_GOTO_NEXT_AZ ) { // default handling for "goto prev/next letter" // find out the current letter selection int initialId = -1; int thisTestId = -1; int thisTestDir = (targetId == IDT_WORKSPACE_GOTO_PREV_AZ)? -1 : +1; for( int i = IDT_WORKSPACE_GOTO_A; i <= IDT_WORKSPACE_GOTO_0_9; i ++ ) { if( g_mainFrame->GetSkinTargetValue(i).value ) { initialId = i; thisTestId = i + thisTestDir; break; } } if( thisTestId == -1 ) { thisTestId = IDT_WORKSPACE_GOTO_A; thisTestDir = +1; } // test test loop SjSkinValue fwd; fwd.value = 1; while( 1 ) { if( thisTestId < IDT_WORKSPACE_GOTO_A || thisTestId > IDT_WORKSPACE_GOTO_0_9 ) break; // done m_currView->OnSkinTargetEvent(thisTestId, fwd, 0); if( initialId == -1 || !g_mainFrame->GetSkinTargetValue(initialId).value ) break; // done - the original id is no longer selected thisTestId += thisTestDir; } } else if( targetId == IDT_ZOOM_IN || targetId == IDT_ZOOM_OUT || targetId == IDT_ZOOM_NORMAL ) { g_mainFrame->GotBrowserInputFromUser(); if( g_mainFrame->IsOpAvailable(SJ_OP_ZOOM) ) { SetZoom_(targetId); } } } } } } void SjBrowserWindow::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); bool drawStub = false; wxString stubText; // anything to draw? if( g_mainFrame->m_libraryModule ) { if( g_mainFrame->m_columnMixer.GetMaskedColCount() == 0 ) { drawStub = true; if( g_mainFrame->m_libraryModule->GetUnmaskedTrackCount() <= 0 || !g_mainFrame->HasAnySearch() ) { // the condition above is not perfect, however it works in most cases // (not if the windows is redrawn during the _first_ update with any search set) stubText = _("Drag folders with music here."); } else { stubText = g_mainFrame->GetSkinTargetValue(IDT_SEARCH_INFO).string; } } } else { drawStub = true; } if( m_currView == NULL ) drawStub = true; if( drawStub ) { // draw the background dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(0, 0, m_clientW, m_clientH); // get text to show - check if the text is not empty (the text is empty // if the library modules is not yet available; in this case, also the fonts are not yet set) if( stubText.Len() ) { // get font wxFont font = g_mainFrame->m_currBoldFont; font.SetPointSize(font.GetPointSize()*2); dc.SetFont(font); // calculate the text position wxCoord x, y, w, h; dc.GetTextExtent(stubText, &w, &h); x = m_clientW/2 - w/2; if( x<8 ) x = 8; y = m_clientH/2 - h/2; if( y<8 ) y = 8; // draw the text dc.SetTextBackground(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgColour); dc.SetTextForeground(g_mainFrame->m_workspaceColours[g_mainFrame->m_workspaceColours[SJ_COLOUR_STUBTEXT].fgSet? SJ_COLOUR_STUBTEXT : SJ_COLOUR_NORMAL].fgColour); dc.DrawText(stubText, x, y); } } else { // forward to the module m_currView->DoPaint(dc); } } void SjBrowserWindow::OnImageThere(SjImageThereEvent& event) { // forward to the current view if( m_currView ) m_currView->OnImageThere(event); } void SjBrowserWindow::OnSize(wxSizeEvent& event) { wxSize clientSize = GetClientSize(); m_clientW = clientSize.x; if( m_clientW < 0 /*seen on OS X*/ ) { m_clientW = 0; } m_clientH = clientSize.y; if( m_clientH < 0 /*seen on OS X*/ ) { m_clientH = 0; } if( m_currView ) m_currView->OnSize(event); } bool SjBrowserWindow::IsVScrollAbottom() { const SjSkinValue& value = g_mainFrame->GetSkinTargetValue(IDT_WORKSPACE_V_SCROLL); if( value.value + value.thumbSize >= value.vmax ) { return TRUE; } else { return FALSE; } } void SjBrowserWindow::DropImage(SjDataObject* data, int mouseX, int mouseY) { if( m_currView ) m_currView->OnDropImage(data, mouseX, mouseY); } #if SJ_USE_TOOLTIPS wxString SjBrowserToolTipProvider::GetText(long& flags) { if( m_browserWindow->m_currView ) return m_browserWindow->m_currView->GetToolTipText(m_xPos, m_yPos, flags); return wxT(""); } wxRect SjBrowserToolTipProvider::GetLocalRect() { if( m_browserWindow->m_currView ) return m_browserWindow->m_currView->GetToolTipRect(m_xPos, m_yPos); return wxRect(-1000, -1000, 1, 1); } #endif bool SjBrowserWindow::GotoUrl(const wxString& url) { return m_currView? m_currView->GotoUrl(url) : false; } void SjBrowserWindow::GotoPos(const wxString& guid, long viewOffset) { if( m_currView ) m_currView->GotoPos(guid, viewOffset); } wxString SjBrowserWindow::GetFirstVisiblePos() { if( m_currView ) return m_currView->GetFirstVisiblePos(); return wxEmptyString; } wxString SjBrowserWindow::GetFirstSelectedOrVisiblePos(long& retViewOffset) { if( m_currView ) return m_currView->GetFirstSelectedOrVisiblePos(retViewOffset); return wxEmptyString; } bool SjBrowserWindow::ChangeSelection(long dir, bool shiftSelection) { if( m_currView ) return m_currView->DoChangeSelection(dir, shiftSelection); return false; } void SjBrowserWindow::ReloadColumnMixer(bool keepColIndex) { // this function reloads the SjColumnMixer depending stuff // and updates the window. an extra call to ReloadView() // is not needed! for( int i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { if( m_currView == m_views[i] ) { m_currView->Realize(true, keepColIndex); m_currView->__needsColumnMixerReload = false; } else { m_views[i]->__needsColumnMixerReload = true; } } Refresh(); // no Update() - this avoids flickering if eg. GotoColumn() is // called just after ReloadColumnMixer() } void SjBrowserWindow::RefreshAll() { // this function should be called to update the browser window contents, // the SjColumnMixer depending stuff IS NOT reloaded, use // ReloadColumnMixer() for this purpose. if( m_currView ) { m_currView->Realize(m_currView->__needsColumnMixerReload, true /*keep col index*/); m_currView->__needsColumnMixerReload = false; } Refresh(); Update(); } void SjBrowserWindow::RefreshSelection() { if( m_currView ) { m_currView->RefreshSelection(); } } int SjBrowserWindow::GetView() const { for( int i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { if( m_views[i] == m_currView ) { return i; } } return 0; // may happen on startup (eg. if called by a script or implicit via InitMainMenu()) } bool SjBrowserWindow::IsViewAvailable(int i) { if( (i == SJ_BROWSER_ALBUM_VIEW && !g_mainFrame->IsOpAvailable(SJ_OP_ALBUM_VIEW)) || (i == SJ_BROWSER_COVER_VIEW && !g_mainFrame->IsOpAvailable(SJ_OP_COVER_VIEW)) || (i == SJ_BROWSER_LIST_VIEW && !g_mainFrame->IsOpAvailable(SJ_OP_LIST_VIEW)) ) { return false; } return true; } void SjBrowserWindow::SetView_(int i, bool keepPosition, bool redraw) { wxString viewPos; long viewOffset = 0, j; SjSkinValue value; // corect index if( i < 0 || i >= SJ_BROWSER_VIEW_COUNT ) { i = SJ_BROWSER_ALBUM_VIEW; } // is the requested view available? anything to change? if( IsViewAvailable(i) && m_currView != m_views[i] ) { // get the old position if( m_currView == NULL ) { keepPosition = false; } if( keepPosition ) { viewPos = m_currView->GetFirstSelectedOrVisiblePos(viewOffset); } // set the new view m_currView = m_views[i]; // set the zoom g_mainFrame->SetZoom__(m_currView->m_zoom, redraw); m_currView->Realize(m_currView->__needsColumnMixerReload, true /*keep col index*/); m_currView->__needsColumnMixerReload = false; // reset the old position if( keepPosition && !viewPos.IsEmpty() ) { m_currView->GotoPos(viewPos, viewOffset); } if( redraw ) { Refresh(); Update(); } } // set the skin target values - do this even if the view is not changed as this may // be needed by a delayed button refresh wxASSERT( IDT_WORKSPACE_ALBUM_VIEW == IDT_WORKSPACE_ALBUM_VIEW+SJ_BROWSER_ALBUM_VIEW ); wxASSERT( IDT_WORKSPACE_COVER_VIEW == IDT_WORKSPACE_ALBUM_VIEW+SJ_BROWSER_COVER_VIEW ); wxASSERT( IDT_WORKSPACE_LIST_VIEW == IDT_WORKSPACE_ALBUM_VIEW+SJ_BROWSER_LIST_VIEW ); for( j = 0; j < SJ_BROWSER_VIEW_COUNT; j++ ) { value.value = m_currView == m_views[j]? 1 : 0; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_ALBUM_VIEW+j, value); } } void SjBrowserWindow::SetZoom_(int targetIdOrAbs) { wxASSERT( IDT_ZOOM_IN > SJ_ZOOM_MAX ); wxASSERT( IDT_ZOOM_OUT > SJ_ZOOM_MAX ); wxASSERT( IDT_ZOOM_NORMAL > SJ_ZOOM_MAX ); long newZoom; if( targetIdOrAbs == IDT_ZOOM_IN ) { newZoom = m_currView->m_zoom + 1; } else if( targetIdOrAbs == IDT_ZOOM_OUT ) { newZoom = m_currView->m_zoom - 1; } else if( targetIdOrAbs == IDT_ZOOM_NORMAL ) { newZoom = SJ_ZOOM_DEF; /*default*/ } else { newZoom = targetIdOrAbs; } newZoom = SjMainFrame::CorrectZoom(newZoom); // CorrectZoom() added in 2.10beta5; we forgot this in 10beta3+4 when we implemented different zooms for the views m_currView->m_zoom = newZoom; if( g_accelModule->m_flags & SJ_ACCEL_SAME_ZOOM_IN_ALL_VIEWS ) { for( int i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { m_views[i]->m_zoom = newZoom; } } g_mainFrame->SetZoom__(newZoom); } void SjBrowserWindow::AddItemsToColMenu(SjMenu* m) { if( m_currView ) { m_currView->AddItemsToColMenu(m); } } /******************************************************************************* * Constructor / Destructor ******************************************************************************/ SjBrowserWindow::SjBrowserWindow(SjMainFrame* mainFrame) : wxWindow(mainFrame, -1, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE) { g_mainFrame = mainFrame; #if SJ_USE_TOOLTIPS m_toolTipProvider.m_browserWindow = this; #endif m_clientW = 0; m_clientH = 0; m_mouseAction = SJ_ACTION_NONE; m_skipContextMenuEvent = 0; m_cursorChanged = false; // create the views m_views[0] = new SjAlbumBrowser(this); m_views[1] = new SjCoverBrowser(this); m_views[2] = new SjListBrowser(this); m_currView = NULL; // load the view flags and the zoom int i; SjStringSerializer ser(g_tools->m_config->Read(wxT("main/browserFlags"), wxT(""))); for( i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { m_views[i]->m_flags = ser.GetLong(); if( ser.HasErrors() ) m_views[i]->m_flags = SJ_BROWSER_VIEW_DEFAULT_FLAGS; } for( i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { m_views[i]->m_zoom = SjMainFrame::CorrectZoom(ser.GetLong()); if( ser.HasErrors() ) { m_views[i]->m_zoom = 3; // default } } } bool SjBrowserWindow::AreCoversShown() const { if( m_currView && (m_currView->m_flags&SJ_BROWSER_VIEW_COVER) ) { return true; } return false; } #ifdef __WXDEBUG__ static bool s_exitCalled = false; #endif void SjBrowserWindow::Exit() { #ifdef __WXDEBUG__ wxASSERT( !s_exitCalled ); s_exitCalled = true; #endif SjStringSerializer ser; int i; for( i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { ser.AddLong(m_views[i]->m_flags); } for( i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { ser.AddLong(m_views[i]->m_zoom); m_views[i]->Exit(); } g_tools->m_config->Write(wxT("main/browserFlags"), ser.GetResult()); } SjBrowserWindow::~SjBrowserWindow() { #ifdef __WXDEBUG__ wxASSERT( s_exitCalled ); #endif for( int i = 0; i < SJ_BROWSER_VIEW_COUNT; i++ ) { delete m_views[i]; } } /******************************************************************************* * Tools for our friends :-) ******************************************************************************/ SjImgThreadObj* SjBrowserWindow::RequireImage(const wxString& url, long w) { SjImgOp op; op.LoadFromDb(url); // the ID may be NULL which is okay op.m_flags |= SJ_IMGOP_RESIZE|SJ_IMGOP_BORDER; if( g_mainFrame->m_skinFlags&SJ_SKIN_IMG_SMOOTH ) { op.m_flags |= SJ_IMGOP_SMOOTH; } op.m_resizeW = w? w : g_mainFrame->m_currCoverWidth; op.m_resizeH = w? w : g_mainFrame->m_currCoverHeight; return g_mainFrame->m_imgThread->RequireImage(this, url, op); } void SjBrowserWindow::PaintCover(wxDC& dc, SjImgThreadObj* obj, long x, long y, long w) { bool error = TRUE; long coverW = w? w : g_mainFrame->m_currCoverWidth, coverH = w? w : g_mainFrame->m_currCoverHeight; dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMALODD].bgBrush); if( obj == NULL ) { // no cover there - this is a normal situation as the object is rendered asynchron; // just draw the background dc.DrawRectangle(x, y, coverW, coverH); return; } // hide the drag image bool dragImageHidden = false; if( g_mainFrame->m_dragImage ) { wxRect scrRect(x, y, coverW, coverH); ClientToScreen(&scrRect.x, &scrRect.y); if( g_mainFrame->m_dragRect.Intersects(scrRect) ) { g_mainFrame->m_dragImage->Hide(); dragImageHidden = true; } } // draw ... wxBitmap* bitmap = obj->CreateBitmap(); if( bitmap ) { int bitmapWidth = bitmap->GetWidth(); int bitmapHeight = bitmap->GetHeight(); bool clippingRegionSet = FALSE; if( bitmapWidth != coverW || bitmapHeight != coverH ) { #if 1 // Draw bitmap of incorrect size using borders aright and abottom. if( bitmapWidth < (coverW/2) ) { dc.DrawRectangle(x, y, coverW, coverH); // bitmap is too small, wait for correct bitmap } else { if( bitmapWidth > coverW || bitmapHeight > coverH ) { dc.SetClippingRegion(x, y, coverW, coverH); clippingRegionSet = TRUE; } if( bitmapWidth < coverW ) // draw whitespace right of image (if any) { dc.DrawRectangle(x+bitmapWidth, y, coverW-bitmapWidth, coverH); } if( bitmapHeight < coverH ) // draw whitespace abottom of image (if any) { dc.DrawRectangle(x, y+bitmapHeight, coverW, coverH-bitmapHeight); } dc.DrawBitmap(*bitmap, x, y, FALSE /*not transparent*/); } #else // Draw bitmap of incorrect size using resizing. // This is no good idea as the resizing takes as much time // as the correct bitmap arrives from the image thread. wxImage image = bitmap->ConvertToImage(); image.Scale(width, height); wxBitmap newBitmap(image); dc.DrawBitmap(newBitmap, x, y, FALSE /*not transparent*/); #endif } else { // Draw bitmap of correct size dc.DrawBitmap(*bitmap, x, y, FALSE /*not transparent*/); } delete bitmap; // destroy clipping (if set) if( clippingRegionSet ) { dc.DestroyClippingRegion(); } error = FALSE; } // error? if( error ) { dc.DrawRectangle(x, y, coverW, coverH); wxRect tempRect(x+2, y+2, coverW-2, coverH-2); g_tools->DrawText(dc, obj->m_errors, tempRect, g_mainFrame->m_currSmallFont, g_mainFrame->m_currSmallFont, g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMALODD].fgColour); } // show the drag image again if( dragImageHidden && g_mainFrame->m_dragImage ) { g_mainFrame->m_dragImage->Show(); } } void SjBrowserWindow::DrawUpText(wxDC& dc, const wxString& textup, long x, long y, long w, long h) { // draw vertical text aleft of column // (we're using a rotated offscreen DC instead of wxDC::DrawRotatedText() // as the latter has problems with non-true-type fonts and is not present // on all operating systems) wxFont& upFont = g_mainFrame->m_currBoldFont; dc.SetFont(upFont); wxCoord textw, texth; dc.GetTextExtent(textup, &textw, &texth); texth++; textw += 2; if( texth > w ) { texth = w; } if( textw > h ) { textw = h; } wxBitmap memBitmap1(textw, texth); wxMemoryDC memDc; memDc.SelectObject(memBitmap1); if( memDc.IsOk() ) { memDc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); memDc.SetPen(*wxTRANSPARENT_PEN); memDc.DrawRectangle(0, 0, textw, texth); memDc.SetFont(upFont); memDc.SetTextBackground(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgColour); memDc.SetTextForeground(g_mainFrame->m_workspaceColours[SJ_COLOUR_VERTTEXT].fgColour); memDc.DrawText(textup, 0, 0); wxImage memImage = memBitmap1.ConvertToImage(); if( memImage.IsOk() ) { memImage = memImage.Rotate90(FALSE/*not clockwise*/); if( memImage.IsOk() ) { wxBitmap memBitmap2(memImage); if( memBitmap2.IsOk() ) { dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.SetPen(*wxTRANSPARENT_PEN); #if 0 // right-aligned if( w > texth ) dc.DrawRectangle(x, y, w-texth, h); dc.DrawBitmap(memBitmap2, x+(w-texth), y); #else // centered long spaceRight = (w-texth)/2; long spaceLeft = (w-texth)-spaceRight; if( spaceLeft > 0 ) dc.DrawRectangle(x, y, spaceLeft, h); dc.DrawBitmap(memBitmap2, x+spaceLeft, y); if( spaceRight > 0 ) dc.DrawRectangle(x+spaceLeft+texth, y, spaceRight, h); #endif // space abottom if( h > textw ) { dc.DrawRectangle(x, y+textw, w, h-textw); } } } } memDc.SelectObject(wxNullBitmap); } } void SjBrowserWindow::GetFonts(int roughType, wxFont** font1, wxFont** font2, bool isEnqueued) { wxASSERT(font1); wxASSERT(font2); if( roughType == SJ_RRTYPE_TITLE1 || roughType == SJ_RRTYPE_TITLE2 ) { *font1 = &(g_mainFrame->m_currBoldFont); *font2 = &(g_mainFrame->m_currSmallBoldFont); } else if( roughType == SJ_RRTYPE_TITLE3 ) { *font1 = &(g_mainFrame->m_currBoldItalicFont); *font2 = &(g_mainFrame->m_currBoldItalicFont); } else { *font1 = /*isEnqueued? &(g_mainFrame->m_currItalicFont) :*/ &(g_mainFrame->m_currStdFont); *font2 = &(g_mainFrame->m_currSmallFont); } } void SjBrowserWindow::GetFontPxSizes(wxDC& dc, int& fontVDiff, // this is the difference in height between the small and the normal font int& fontSpace, // this is the space between the left/mid/right columns int& fontStdHeight) { if( g_mainFrame->m_currStdFont.IsOk() ) { wxCoord w1, w2, h2; dc.SetFont(g_mainFrame->m_currStdFont); dc.GetTextExtent(wxT("Ag"), &w1, &fontStdHeight); dc.SetFont(g_mainFrame->m_currSmallFont); dc.GetTextExtent(wxT("Ag"), &w2, &h2); fontSpace = h2 / 2; fontVDiff = fontStdHeight - h2; if( fontVDiff < 0 ) { fontVDiff = 0; } } else { fontStdHeight = 12; fontSpace = 4; fontVDiff = 4; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser.h��������������������������������������������������������������0000664�0000000�0000000�00000022716�12660066715�0017701�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser.h * Authors: Björn Petersen * Purpose: Silverjuke main browser * ******************************************************************************/ #ifndef __SJ_BROWSER_H__ #define __SJ_BROWSER_H__ class SjMainFrame; class SjBrowserWindow; enum SjBrowserAction { SJ_ACTION_NONE ,SJ_ACTION_DRAGSCROLL ,SJ_ACTION_DRAGNDROP ,SJ_ACTION_COLUMNWIDTH ,SJ_ACTION_COLUMNMOVE }; #if SJ_USE_TOOLTIPS class SjBrowserToolTipProvider : public SjToolTipProvider { public: SjBrowserToolTipProvider () { } wxString GetText (long& flags); wxWindow* GetWindow () { return (wxWindow*)m_browserWindow; } wxRect GetLocalRect (); private: SjBrowserWindow* m_browserWindow; long m_xPos, m_yPos; friend class SjBrowserWindow; }; #endif class SjBrowserBase; class SjListBrowser; class SjBrowserWindow : public wxWindow { public: // Constructor and destructor SjBrowserWindow (SjMainFrame* parent); ~SjBrowserWindow (); // Exit() is be called sooner than the destructor is called for save-freeing pointers. void Exit (); // Reload/redraw (parts) of the browser void RefreshSelection (); // fast void RefreshAll (); // ... void ReloadColumnMixer (bool keepColIndex=true); // slow // Call these functions for void OnModuleUserId (int id); bool IsVScrollAbottom (); // Are covers shown? bool AreCoversShown () const; // handling target events void OnSkinTargetEvent (int targetId, SjSkinValue& value, long accelFlags); // Goto specific columns, GotoPos() may only be used for positions // returned by GetFirstVisiblePos() or GetFirstSelectedOrVisiblePos() bool GotoUrl (const wxString& url); void GotoPos (const wxString& guid, long viewOffset = 0); wxString GetFirstVisiblePos (); wxString GetFirstSelectedOrVisiblePos(long& retViewOffset); // Change Selection #define SJ_SEL_UP 1 #define SJ_SEL_DOWN 2 #define SJ_SEL_LEFT 3 #define SJ_SEL_RIGHT 4 #define SJ_SEL_PREV 5 // SJ_SEL_UP or SJ_SEL_LEFT if "up" is impossible #define SJ_SEL_NEXT 6 // SJ_SEL_DOWN or SJ_SEL_RIGHT if "down" is impossible bool ChangeSelection (long dir, bool shiftSelection=FALSE); // Dropping images onto the browser // (the coordinated may be outside the browser window) void DropImage (SjDataObject*, int mouseX, int mouseY); // switching the views #define SJ_BROWSER_ALBUM_VIEW 0L #define SJ_BROWSER_COVER_VIEW 1L #define SJ_BROWSER_LIST_VIEW 2L #define SJ_BROWSER_VIEW_COUNT 3L int GetView () const; void SetView_ (int, bool keepPosition, bool redraw); bool IsViewAvailable (int); SjListBrowser* GetListBrowser () const {return (SjListBrowser*)m_views[SJ_BROWSER_LIST_VIEW];} void SetZoom_ (int targetIdOrAbs); void OnMouseWheel (wxMouseEvent&); // menu void AddItemsToColMenu (SjMenu*); private: // events void OnPaint (wxPaintEvent&); void OnEraseBackground (wxEraseEvent&) {} void OnSize (wxSizeEvent&); void OnImageThere (SjImageThereEvent&); void OnMouseLeftDown (wxMouseEvent&); void OnMouseLeftUp (wxMouseEvent&); void OnMouseCaptureLost (wxMouseCaptureLostEvent&); void OnMouseLeftDClick (wxMouseEvent&); void OnMouseMotion (wxMouseEvent&); void OnMouseEnter (wxMouseEvent&); void OnMouseRight (wxContextMenuEvent&); void OnMouseMiddleUp (wxMouseEvent&); void OnMouseSelect (wxMouseEvent&); void OnKeyDown (wxKeyEvent&); // misc long m_clientW, m_clientH; #define DRAGSCROLL_DELTA 8 SjBrowserAction m_mouseAction; wxArrayString m_dragUrls; #if SJ_USE_TOOLTIPS SjBrowserToolTipProvider m_toolTipProvider; #endif SjBrowserBase* m_views[SJ_BROWSER_VIEW_COUNT]; SjBrowserBase* m_currView; int m_skipContextMenuEvent; // set if the right mouse button was used eg. for // scrolling by the mouse wheel to avoid appearing // the context menu on release DECLARE_EVENT_TABLE () // tools for our friends SjImgThreadObj* RequireImage(const wxString& url, long w=0); void PaintCover(wxDC&, SjImgThreadObj*, long x, long y, long w=0); void GetFonts(int roughtType, wxFont** font1, wxFont** font2, bool isEnqueued); void GetFontPxSizes(wxDC& dc, int& fontVDiff, // this is the difference in height between the small and the normal font int& fontSpace, // this is the space between the left/mid/right columns int& fontStdHeight); #if 0 wxDragImage* GetCoverDragNDropBitmap(SjCol*, wxRect& retSize); #endif bool m_cursorChanged; void ResetCursor(); void DrawUpText(wxDC& dc, const wxString& textup, long x, long y, long w, long h); friend class SjBrowserToolTipProvider; friend class SjAlbumBrowser; friend class SjListBrowser; friend class SjCoverBrowser; }; class SjBrowserBase { public: // this is a pure-virtual base class defining a browser view // currently implemented classes are SjAlbumBrowser, SjCoverBrowser and SjListBrowser SjBrowserBase (SjBrowserWindow* b) { m_window = b; __needsColumnMixerReload = true; } virtual ~SjBrowserBase () { } // Exit() is be called sooner than the destructor is called for save-freeing pointers. virtual void Exit () = 0; // called to show the browser, after this function is called // the derived class should be ready to process paint events! virtual void Realize (bool reloadColumnMixer, bool keepColIndex) = 0; // mouse handling virtual void OnMouseLeftDown (wxMouseEvent& event) = 0; virtual void OnMouseLeftUp (wxMouseEvent& event) = 0; virtual void OnMouseCaptureLost (wxMouseCaptureLostEvent&) = 0; virtual bool OnMouseLeftDClick (wxMouseEvent& event) = 0; // return true if the click was used virtual void OnMouseMiddleUp (wxMouseEvent& event) = 0; virtual void OnMouseMotion (wxMouseEvent& event) = 0; virtual void OnMouseWheel (wxMouseEvent& event, bool scrollVert) = 0; virtual void OnDropImage (SjDataObject* data, int mouseX, int mouseY) = 0; virtual void OnContextMenu (int clickX, int clickY) = 0; virtual void OnContextMenuSelect (int id) = 0; virtual wxRect GetToolTipRect (int mouseX, int mouseY) = 0; virtual wxString GetToolTipText (int mouseX, int mouseY, long &flags) = 0; // add items to the columns menu virtual void AddItemsToColMenu (SjMenu*) = 0; // selection handling & scrolling virtual bool OnSkinTargetEvent (int targetId, SjSkinValue& value, long accelFlags) = 0; // return true if the key/event was used virtual bool DoChangeSelection (long dir, bool shiftSelection) = 0; virtual void RefreshSelection () = 0; virtual bool GotoUrl (const wxString& url) = 0; virtual void GotoPos (const wxString& guid, long viewOffset) = 0; virtual wxString GetFirstVisiblePos () = 0; virtual wxString GetFirstSelectedOrVisiblePos(long& retViewOffset) = 0; // do paint the window, paint-related events virtual void DoPaint (wxDC&) = 0; virtual void OnSize (wxSizeEvent& event) = 0; virtual void OnImageThere (SjImageThereEvent& event) = 0; // used by SjBrowserWindow, should not be used by classes derived from SjBrowserBase bool __needsColumnMixerReload; // the following flags are mainly for SjBrowserBase derived classes // which can check these values and decide eg. if covers should be shown or not #define SJ_BROWSER_VIEW_COVER 0x00000001L #define SJ_BROWSER_VIEW_DEFAULT_FLAGS 0x0000FFFFL long m_flags; long m_zoom; protected: // stuff that may be used by derived classes SjBrowserWindow* m_window; }; #endif // __SJ_BROWSER_H__ ��������������������������������������������������silverjuke-16.2.3/src/sjbase/browser_album.cpp������������������������������������������������������0000664�0000000�0000000�00000177052�12660066715�0021420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser_album.cpp * Authors: Björn Petersen * Purpose: Silverjuke album browser * ******************************************************************************/ #include <sjbase/base.h> #include <sjtools/imgthread.h> #include <sjbase/browser.h> #include <sjbase/browser_album.h> #include <sjbase/columnmixer.h> #include <sjmodules/kiosk/virtkeybd.h> #include <sjmodules/vis/vis_module.h> SjAlbumBrowser::SjAlbumBrowser(SjBrowserWindow* w) : SjBrowserBase(w) { memset(m_applCol, 0, MAX_COL_COUNT*sizeof(SjCol*)); m_applColCount = 0; m_applColIndex = 0; m_visibleColCount = -1; m_allocatedColCount = 0; m_maxBottom = 0; m_scrollX = 0; m_scrollY = 0; m_dragStartX = 0; m_dragStartY = 0; m_dragscrollCurrX = 0; m_dragscrollCurrY = 0; m_fontVDiff = 0; m_fontSpace = 0; m_lastClickedCol = NULL; m_lastClickedRow = NULL; } void SjAlbumBrowser::Exit() { int i; for( i = 0; i < m_allocatedColCount; i++ ) { if( m_applCol[i] ) { if( m_applCol[i] == m_lastClickedCol ) { m_lastClickedCol = NULL; m_lastClickedRow = NULL; } delete m_applCol[i]; } } m_allocatedColCount = 0; m_visibleColCount = 0; m_applColCount = 0; m_applColIndex = 0; } void SjAlbumBrowser::Realize(bool reloadColumnMixer, bool keepColIndex) { if( reloadColumnMixer ) { m_scrollY = 0; m_scrollX = 0; m_applColCount = g_mainFrame->m_columnMixer.GetMaskedColCount(); } if( m_applColIndex >= m_applColCount-m_visibleColCount ) { m_applColIndex = m_applColCount-m_visibleColCount; } if( m_applColIndex < 0 || !keepColIndex ) { m_applColIndex = 0; } CalcPositions(); SetHScrollInfo(); if( m_scrollY+m_window->m_clientH > m_maxBottom ) { m_scrollY = m_maxBottom - m_window->m_clientH; if( m_scrollY < 0 ) { m_scrollY = 0; } } SetVScrollInfo(); m_lastTooltipCol = NULL; m_lastTooltipRow = NULL; } /******************************************************************************* * Mouse Handling ******************************************************************************/ void SjAlbumBrowser::OnMouseSelect(wxMouseEvent& event) { bool multiEnqueueAvailable = g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE); /* (de-)select the item under the mouse (if any) */ SjCol* col; SjRow* row; long found = FindRow(event.GetX(), event.GetY(), &col, &row); if( found == FOUND_ROW ) { if( row->IsSelectable() ) { if( multiEnqueueAvailable && event.ShiftDown() ) { if( row->IsSelectable()==2 ) { g_mainFrame->m_columnMixer.SelectShifted(row); RefreshSelection(); } } else if( multiEnqueueAvailable && event.ControlDown() ) { row->Select(!row->IsSelected()); RefreshSelection(); } else { g_mainFrame->m_columnMixer.SelectAll(false); row->Select(true); RefreshSelection(); } } } else if( found == FOUND_COVER_ARROW ) { g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDT_WORKSPACE_SHOW_COVERS)); } else if( !event.ShiftDown() && !event.ControlDown() && g_mainFrame->m_columnMixer.IsAnythingSelected() ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); RefreshSelection(); } } void SjAlbumBrowser::OnMouseLeftDown(wxMouseEvent& event) { /* prepare dragscroll and object dragging */ m_window->m_mouseAction = SJ_ACTION_NONE; m_dragStartX = event.GetX(); /* client coordinates */ m_dragStartY = event.GetY(); /* client coordinates */ /* perform selection */ m_mouseSelectionOnDown = FALSE; SjCol* col; SjRow* row; if( g_accelModule->m_selDragNDrop == 1 && FindRow(m_dragStartX, m_dragStartY, &col, &row) == FOUND_ROW && row->IsSelectable() == 2 && !row->IsSelected() ) { OnMouseSelect(event); m_mouseSelectionOnDown = TRUE; } } void SjAlbumBrowser::OnMouseLeftUp(wxMouseEvent& event) { // dragscroll: restore cursor if changed by dragscroll if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { m_window->m_mouseAction = SJ_ACTION_NONE; return; // done } // nothing in view if( g_mainFrame->m_columnMixer.GetMaskedColCount() == 0 ) { g_mainFrame->EndOneSearch(); return; // done } // perform selection if( !m_mouseSelectionOnDown ) { OnMouseSelect(event); } } void SjAlbumBrowser::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { // dragscroll: restore cursor if changed by dragscroll if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { m_window->m_mouseAction = SJ_ACTION_NONE; return; // done } } bool SjAlbumBrowser::OnMouseLeftDClick(wxMouseEvent& event) { SjCol* col; SjRow* row; long found = FindRow(event.GetX(), event.GetY(), &col, &row); if( found == FOUND_ROW ) { row->OnDoubleClick(event.ShiftDown() || event.ControlDown()); return true; // click used } else if( found == FOUND_COVER_ARROW ) { return true; // click used (avoid toggle the view by fast clicks on the cover toggler) } return false; // click not used } void SjAlbumBrowser::OnMouseMiddleUp(wxMouseEvent& event) { SjCol* col; SjRow* row; bool skip = TRUE; int xPos = event.GetX(); int yPos = event.GetY(); if( FindRow(xPos, yPos, &col, &row) == FOUND_ROW ) { int usesMiddleClick = row->UsesMiddleClick(); if( usesMiddleClick ) { if( usesMiddleClick == 2 && row->IsSelectable() ) { if( !row->IsSelected() ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); row->Select(TRUE); RefreshSelection(); } skip = FALSE; } if( row->OnMiddleClick(event.ShiftDown() || event.ControlDown()) ) { skip = FALSE; } } } if( skip ) { event.Skip(); } } void SjAlbumBrowser::OnMouseMotion(wxMouseEvent& event) { if( !m_window->HasCapture() ) return; long hDifference; long vDifference; long oldColIndex, oldScrollX, oldScrollY; long xPos = event.GetX(); /* client coordinates */ long yPos = event.GetY(); /* client coordinates */ // start dragscroll or object dragging? if( m_window->m_mouseAction == SJ_ACTION_NONE ) { hDifference = xPos - m_dragStartX; vDifference = yPos - m_dragStartY; if( hDifference > DRAGSCROLL_DELTA || hDifference < -DRAGSCROLL_DELTA || vDifference > DRAGSCROLL_DELTA || vDifference < -DRAGSCROLL_DELTA ) { SjCol* col; SjRow* row; if( g_accelModule->m_selDragNDrop && FindRow(m_dragStartX, m_dragStartY, &col, &row) == FOUND_ROW && row->IsSelected() ) { // do object dragging m_window->m_dragUrls.Clear(); g_mainFrame->m_columnMixer.GetSelectedUrls(m_window->m_dragUrls); if( g_accelModule->m_flags&SJ_ACCEL_USE_DND_IMAGES ) { g_mainFrame->m_dragImage = new wxDragImage(GetDragNDropBitmap(m_dragStartX, m_dragStartY, g_mainFrame->m_dragHotspot, g_mainFrame->m_dragRect)); } if( g_mainFrame->DragNDrop(SJ_DND_ENTER, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) ) { m_window->m_mouseAction = SJ_ACTION_DRAGNDROP; } } else if( g_accelModule->m_flags&SJ_ACCEL_CONTENT_DRAG && m_applColCount ) { // start dragscroll m_window->m_mouseAction = SJ_ACTION_DRAGSCROLL; m_dragscrollCurrX = xPos; m_dragscrollCurrY = yPos; } } } // in drag'n'drop? if( m_window->m_mouseAction == SJ_ACTION_DRAGNDROP ) { if( !g_mainFrame->DragNDrop(SJ_DND_MOVE, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) ) { m_window->m_mouseAction = SJ_ACTION_NONE; } } // in dragscroll? if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { oldScrollX = m_scrollX; oldScrollY = m_scrollY; oldColIndex = m_applColIndex; // horizontal scrolling hDifference = xPos - m_dragscrollCurrX; m_dragscrollCurrX = xPos; if( hDifference ) { if( hDifference > g_mainFrame->m_currColumnWidth ) { hDifference = g_mainFrame->m_currColumnWidth; } else if( hDifference < 0 - g_mainFrame->m_currColumnWidth ) { hDifference = 0 - g_mainFrame->m_currColumnWidth; } m_scrollX -= hDifference; if( m_scrollX < 0 ) { // decrease application column position if possible if( m_applColIndex > 0 ) { m_scrollX += g_mainFrame->m_currColumnWidth + g_mainFrame->m_currColumnXSpace; m_applColIndex--; CalcPositions(); SetHScrollInfo(); if( m_scrollY+m_window->m_clientH > m_maxBottom ) { m_scrollY = m_maxBottom - m_window->m_clientH; if( m_scrollY < 0 ) { m_scrollY = 0; } } SetVScrollInfo(); } else { m_scrollX = 0; } } else if( m_scrollX >= g_mainFrame->m_currColumnWidth + g_mainFrame->m_currColumnXSpace ) { // increase application column position if possible if( m_applColIndex < m_applColCount-m_visibleColCount ) { m_scrollX -= g_mainFrame->m_currColumnWidth + g_mainFrame->m_currColumnXSpace; m_applColIndex++; CalcPositions(); SetHScrollInfo(); if( m_scrollY+m_window->m_clientH > m_maxBottom ) { m_scrollY = m_maxBottom - m_window->m_clientH; if( m_scrollY < 0 ) { m_scrollY = 0; } } SetVScrollInfo(); } else { m_scrollX = g_mainFrame->m_currColumnWidth + g_mainFrame->m_currColumnXSpace; } } else if( m_allocatedColCount*(g_mainFrame->m_currColumnWidth+g_mainFrame->m_currColumnXSpace)-m_scrollX < m_window->m_clientW ) { // a new column will fit on the right if( m_applColIndex+m_visibleColCount < m_applColCount ) { CalcPositions(); if( m_scrollY+m_window->m_clientH > m_maxBottom ) { m_scrollY = m_maxBottom - m_window->m_clientH; if( m_scrollY < 0 ) { m_scrollY = 0; } } SetVScrollInfo(); } } } // vertical scrolling vDifference = yPos - m_dragscrollCurrY; m_dragscrollCurrY = yPos; if( vDifference ) { if( !OnVScroll(IDT_WORKSPACE_V_SCROLL, m_scrollY + vDifference*-1, FALSE/*redraw*/) ) { vDifference = 0; } } // update window if( hDifference || vDifference ) { if( g_mainFrame->m_imgThread->HasWaitingImages() ) { // if there are waiting images, invalidate the whole rectangle as // some areas are no yet okay m_window->Refresh(); } else { hDifference = (oldColIndex*(g_mainFrame->m_currColumnWidth+g_mainFrame->m_currColumnXSpace) + oldScrollX) - (m_applColIndex*(g_mainFrame->m_currColumnWidth+g_mainFrame->m_currColumnXSpace) + m_scrollX); vDifference = oldScrollY - m_scrollY; m_window->ScrollWindow(hDifference, vDifference, NULL); m_window->Update(); } } } } void SjAlbumBrowser::OnMouseWheel(wxMouseEvent& event, bool scrollVert) { long rotation = event.GetWheelRotation(); if( rotation != 0 ) { if( g_accelModule->m_flags&SJ_ACCEL_WHEEL_HORZ_IN_ALBUMVIEW ) { scrollVert = !scrollVert; } if( scrollVert ) { OnVScroll(IDT_WORKSPACE_V_SCROLL, m_scrollY + rotation*-1, TRUE/*redraw*/); } else { // add multiple small rotations (smaller than the delta to take action) to bigger ones static SjWheelHelper s_albumWheelHelper; long rotateCols, dir; s_albumWheelHelper.PushRotationNPopAction(event, rotateCols, dir); if( rotateCols != 0 ) { if( g_accelModule->m_flags&SJ_ACCEL_WHEEL_HORZ_IN_ALBUMVIEW ) { dir *= -1; // simulate the old behaviour of Silverjuke 2.x - not compatible with modern scroll wheels with more than one axis! } OnHScroll(IDT_WORKSPACE_H_SCROLL, m_applColIndex + rotateCols*dir, TRUE/*redraw*/); } } } } void SjAlbumBrowser::OnDropImage(SjDataObject* data, int mouseX, int mouseY) { SjCol* col; SjRow* row; if( FindRow(mouseX, mouseY, &col, &row) != FOUND_ROW ) { return; } wxASSERT( col && row ); if( row->OnDropData(data) ) { Realize(false, true /*keep col index*/); m_window->Refresh(); m_window->Update(); } } void SjAlbumBrowser::OnContextMenu(int clickX, int clickY) { SjMenu mainMenu(0); // add module items to menu SjCol* col; SjRow* row; if( FindRow(clickX, clickY, &col, &row) == FOUND_ROW ) { // select the item under the mouse if( row->IsSelectable() && !row->IsSelected() ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); row->Select(TRUE); RefreshSelection(); } // create context menu for the item under the mouse row->CreateContextMenu(mainMenu); m_lastClickedCol = col; m_lastClickedRow = row; } else { // no item under the mouse m_lastClickedCol = NULL; m_lastClickedRow = NULL; } // add main items to menu g_mainFrame->CreateContextMenu_(mainMenu); // show menu if( mainMenu.GetMenuItemCount() ) { m_window->PopupMenu(&mainMenu); } } #define IDC_L_FIRST (IDM_LASTPRIVATE-17) // range start #define IDC_L_SHOWDOUBLETRACKS (IDM_LASTPRIVATE-16) #define IDC_L_SHOWTRACKNR (IDM_LASTPRIVATE-15) #define IDC_L_AUTOMTRACKNR (IDM_LASTPRIVATE-14) #define IDC_L_SHOWDISKNR (IDM_LASTPRIVATE-13) #define IDC_L_SHOWLEADARTISTNAME (IDM_LASTPRIVATE-12) #define IDC_L_SHOWDIFFLEADARTISTNAME (IDM_LASTPRIVATE-11) #define IDC_L_SHOWORGARTISTNAME (IDM_LASTPRIVATE-10) #define IDC_L_SHOWCOMPOSERNAME (IDM_LASTPRIVATE-9) #define IDC_L_SHOWALBUMNAME (IDM_LASTPRIVATE-8) #define IDC_L_SHOWDIFFALBUMNAME (IDM_LASTPRIVATE-7) #define IDC_L_SHOWTIME (IDM_LASTPRIVATE-6) #define IDC_L_SHOWYEAR (IDM_LASTPRIVATE-5) #define IDC_L_SHOWCOMMENT (IDM_LASTPRIVATE-4) #define IDC_L_SHOWGENRE (IDM_LASTPRIVATE-3) #define IDC_L_SHOWRATING (IDM_LASTPRIVATE-2) #define IDC_L_LAST (IDM_LASTPRIVATE-1) // range end void SjAlbumBrowser::OnContextMenuSelect(int id) { SjCol* col; SjRow* row; if( id >= IDC_L_FIRST && id <= IDC_L_LAST ) { long flags = g_mainFrame->m_libraryModule->GetFlags(); if( id == IDC_L_SHOWDOUBLETRACKS ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWDOUBLETRACKS); } if( id == IDC_L_SHOWTRACKNR ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWTRACKNR); } if( id == IDC_L_AUTOMTRACKNR ) { SjTools::ToggleFlag(flags, SJ_LIB_AUTOMTRACKNR); } if( id == IDC_L_SHOWDISKNR ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWDISKNR); } if( id == IDC_L_SHOWLEADARTISTNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWLEADARTISTNAME); } if( id == IDC_L_SHOWDIFFLEADARTISTNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWDIFFLEADARTISTNAME); } if( id == IDC_L_SHOWORGARTISTNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWORGARTISTNAME); } if( id == IDC_L_SHOWCOMPOSERNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWCOMPOSERNAME); } if( id == IDC_L_SHOWALBUMNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWALBUMNAME); } if( id == IDC_L_SHOWDIFFALBUMNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWDIFFALBUMNAME); } if( id == IDC_L_SHOWTIME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWTIME); } if( id == IDC_L_SHOWYEAR ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWYEAR); } if( id == IDC_L_SHOWCOMMENT ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWCOMMENT); } if( id == IDC_L_SHOWGENRE ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWGENRE); } if( id == IDC_L_SHOWRATING ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWRATING); } g_mainFrame->m_libraryModule->SetFlags(flags); g_mainFrame->m_browser->RefreshAll(); UpdateItemsInColMenu(g_mainFrame->m_viewMenu); } else if( m_lastClickedCol && m_lastClickedRow ) { m_lastClickedRow->OnContextMenu(id); } else if( FindSelectedRowInView(&col, &row) ) { wxASSERT(col && row); row->OnContextMenu(id); } } wxRect SjAlbumBrowser::GetToolTipRect(int mouseX, int mouseY) { wxRect retRect; SjCol* col; SjRow* row; long found = FindRow(mouseX, mouseY, &col, &row, &retRect); if( found == FOUND_ROW || found == FOUND_COVER_ARROW ) { ; // rect is set up by FindRow } else { retRect.x = -1000; retRect.y = -1000; retRect.width = 1; retRect.height = 1; } return retRect; } wxString SjAlbumBrowser::GetToolTipText(int mouseX, int mouseY, long &flags) { wxString retString; SjCol* col; SjRow* row; long found = FindRow(mouseX, mouseY, &col, &row); if( found == FOUND_ROW ) { if( col!=m_lastTooltipCol || row!=m_lastTooltipRow) { retString = row->GetToolTip(flags); m_lastTooltipCol = col; m_lastTooltipRow = row; } } else { if( found == FOUND_COVER_ARROW ) retString = _("Show covers"); m_lastTooltipCol = NULL; m_lastTooltipRow = NULL; } return retString; } void SjAlbumBrowser::AddItemsToColMenu(SjMenu* m) { m->AppendSeparator(); m->AppendCheckItem(IDC_L_SHOWTIME, _("Duration")); m->AppendCheckItem(IDC_L_SHOWLEADARTISTNAME, _("Artist")); m->AppendCheckItem(IDC_L_SHOWORGARTISTNAME, _("Original artist")); m->AppendCheckItem(IDC_L_SHOWCOMPOSERNAME, _("Composer")); m->AppendCheckItem(IDC_L_SHOWALBUMNAME, _("Album")); m->AppendCheckItem(IDC_L_SHOWTRACKNR, _("Track number")); m->AppendCheckItem(IDC_L_AUTOMTRACKNR, _("Automatic track number")); m->AppendCheckItem(IDC_L_SHOWDISKNR, _("Disk number")); m->AppendCheckItem(IDC_L_SHOWGENRE, _("Genre")); m->AppendCheckItem(IDC_L_SHOWYEAR, _("Year")); m->AppendCheckItem(IDC_L_SHOWRATING, _("Rating")); m->AppendCheckItem(IDC_L_SHOWCOMMENT, _("Comment")); m->AppendSeparator(); m->AppendCheckItem(IDC_L_SHOWDOUBLETRACKS, _("Show double tracks")); m->AppendCheckItem(IDC_L_SHOWDIFFLEADARTISTNAME, _("Show different artist names")); m->AppendCheckItem(IDC_L_SHOWDIFFALBUMNAME, _("Show different album names")); UpdateItemsInColMenu(m); } void SjAlbumBrowser::UpdateItemsInColMenu(SjMenu* m) { long flags = g_mainFrame->m_libraryModule->GetFlags(); m->Check(IDC_L_SHOWTIME, (flags&SJ_LIB_SHOWTIME)!=0); m->Check(IDC_L_SHOWLEADARTISTNAME, (flags&SJ_LIB_SHOWLEADARTISTNAME)!=0); m->Check(IDC_L_SHOWORGARTISTNAME, (flags&SJ_LIB_SHOWORGARTISTNAME)!=0); m->Check(IDC_L_SHOWCOMPOSERNAME, (flags&SJ_LIB_SHOWCOMPOSERNAME)!=0); m->Check(IDC_L_SHOWALBUMNAME, (flags&SJ_LIB_SHOWALBUMNAME)!=0); m->Check(IDC_L_SHOWTRACKNR, (flags&SJ_LIB_SHOWTRACKNR)!=0); m->Check(IDC_L_AUTOMTRACKNR, (flags&SJ_LIB_AUTOMTRACKNR)!=0); m->Check(IDC_L_SHOWDISKNR, (flags&SJ_LIB_SHOWDISKNR)!=0); m->Check(IDC_L_SHOWGENRE, (flags&SJ_LIB_SHOWGENRE)!=0); m->Check(IDC_L_SHOWYEAR, (flags&SJ_LIB_SHOWYEAR)!=0); m->Check(IDC_L_SHOWRATING, (flags&SJ_LIB_SHOWRATING)!=0); m->Check(IDC_L_SHOWCOMMENT, (flags&SJ_LIB_SHOWCOMMENT)!=0); m->Check(IDC_L_SHOWDOUBLETRACKS, (flags&SJ_LIB_SHOWDOUBLETRACKS)!=0); m->Check(IDC_L_SHOWDIFFLEADARTISTNAME, (flags&SJ_LIB_SHOWDIFFLEADARTISTNAME)!=0); m->Check(IDC_L_SHOWDIFFALBUMNAME, (flags&SJ_LIB_SHOWDIFFALBUMNAME)!=0); } /******************************************************************************* * selection handling & scrolling ******************************************************************************/ bool SjAlbumBrowser::OnSkinTargetEvent(int targetId, SjSkinValue& value, long accelFlags) { bool shiftSelection = g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE)? ((accelFlags&wxACCEL_SHIFT)!=0) : false; if( targetId >= IDT_WORKSPACE_GOTO_A && targetId <= IDT_WORKSPACE_GOTO_0_9 ) { g_visModule->StopVisIfOverWorkspace(); g_mainFrame->EndSimpleSearch(); if(!GotoColumn(g_mainFrame->m_columnMixer.GetMaskedColIndexByAz(targetId))) CalcPositions(); // needed to reset the correct a-z button m_window->SetFocus(); return true; } else switch( targetId ) { case IDT_WORKSPACE_GOTO_RANDOM: g_visModule->StopVisIfOverWorkspace(); g_mainFrame->EndSimpleSearch(); GotoColumn(SjTools::Rand(g_mainFrame->m_columnMixer.GetMaskedColCount()), true); m_window->SetFocus(); return true; case IDT_WORKSPACE_KEY_LEFT: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_LEFT, shiftSelection); return true; case IDT_WORKSPACE_KEY_RIGHT: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_RIGHT, shiftSelection); return true; case IDT_WORKSPACE_KEY_UP: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_UP, shiftSelection); return true; case IDT_WORKSPACE_KEY_DOWN: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_DOWN, shiftSelection); return true; case IDT_WORKSPACE_INSERT: case IDT_WORKSPACE_DELETE: if( !g_mainFrame->IsWorkspaceMovedAway() && g_mainFrame->IsAllAvailable() ) { long numDeletedTracks = g_mainFrame->m_columnMixer.DelInsSelection(targetId==IDT_WORKSPACE_DELETE); if( numDeletedTracks ) { m_window->ReloadColumnMixer(); m_window->Update(); g_mainFrame->UpdateSearchInfo(numDeletedTracks); } } return true; case IDT_WORKSPACE_H_SCROLL: case IDT_WORKSPACE_LINE_LEFT: case IDT_WORKSPACE_LINE_RIGHT: case IDT_WORKSPACE_PAGE_LEFT: case IDT_WORKSPACE_PAGE_RIGHT: OnHScroll(targetId, value.value, TRUE /*redraw*/); return true; case IDT_WORKSPACE_V_SCROLL: case IDT_WORKSPACE_LINE_UP: case IDT_WORKSPACE_LINE_DOWN: case IDT_WORKSPACE_PAGE_UP: case IDT_WORKSPACE_PAGE_DOWN: case IDT_WORKSPACE_MINOR_HOME: OnVScroll(targetId, value.value, TRUE /*redraw*/); return true; case IDT_WORKSPACE_HOME: // the search should stay "as is" case IDT_WORKSPACE_END: OnVScroll(IDT_WORKSPACE_MINOR_HOME, 0, FALSE/*redraw*/); OnHScroll(targetId, 0, TRUE/*redraw*/); return true; } return false; } bool SjAlbumBrowser::OnHScroll(int nScrollCode, int nPos, bool redraw) { wxASSERT( nScrollCode == IDT_WORKSPACE_H_SCROLL || nScrollCode == IDT_WORKSPACE_LINE_LEFT || nScrollCode == IDT_WORKSPACE_LINE_RIGHT || nScrollCode == IDT_WORKSPACE_PAGE_LEFT || nScrollCode == IDT_WORKSPACE_PAGE_RIGHT || nScrollCode == IDT_WORKSPACE_HOME || nScrollCode == IDT_WORKSPACE_END ); long newIndex = m_applColIndex, oldIndex, oldScrollY, abs; bool canUseScroll; if( nScrollCode == IDT_WORKSPACE_HOME ) { newIndex = 0; } else if( nScrollCode == IDT_WORKSPACE_END ) { newIndex = m_applColCount; // sth. substracted below } else if( nScrollCode == IDT_WORKSPACE_LINE_LEFT ) { newIndex--; } else if( nScrollCode == IDT_WORKSPACE_LINE_RIGHT ) { newIndex++; } else if( nScrollCode == IDT_WORKSPACE_PAGE_LEFT ) { newIndex -= m_visibleColCount; } else if( nScrollCode == IDT_WORKSPACE_PAGE_RIGHT ) { newIndex += m_visibleColCount; } else if( nScrollCode == IDT_WORKSPACE_H_SCROLL ) { newIndex = nPos; } if( newIndex > m_applColCount-m_visibleColCount ) { newIndex = m_applColCount-m_visibleColCount; // may get below zero, this is checked below } if( newIndex < 0 ) { newIndex = 0; } if( (newIndex != m_applColIndex) || (newIndex == 0 && m_scrollX != 0) ) { oldIndex = m_applColIndex; canUseScroll = TRUE; if( newIndex == 0 ) { m_scrollX = 0; canUseScroll = FALSE; } m_applColIndex = newIndex; CalcPositions(); SetHScrollInfo(); if( m_scrollY+m_window->m_clientH > m_maxBottom ) { oldScrollY = m_scrollY; m_scrollY = m_maxBottom - m_window->m_clientH; if( m_scrollY < 0 ) { m_scrollY = 0; } if( oldScrollY != m_scrollY ) { canUseScroll = FALSE; } } SetVScrollInfo(); abs = oldIndex - newIndex; if( abs < 0 ) { abs*=-1; } if( abs > m_visibleColCount ) { canUseScroll = FALSE; } if( canUseScroll ) { if( g_mainFrame->m_imgThread->HasWaitingImages() ) { canUseScroll = FALSE; } } if( redraw ) { if( canUseScroll ) { m_window->ScrollWindow((oldIndex - newIndex)*(g_mainFrame->m_currColumnWidth + g_mainFrame->m_currColumnXSpace), 0, NULL); m_window->Update(); } else { m_window->Refresh(); } return true; // sth changed } } return false; // nothing changed } bool SjAlbumBrowser::OnVScroll(int nScrollCode, int nPos, bool redraw) { wxASSERT( nScrollCode == IDT_WORKSPACE_V_SCROLL || nScrollCode == IDT_WORKSPACE_LINE_UP || nScrollCode == IDT_WORKSPACE_LINE_DOWN || nScrollCode == IDT_WORKSPACE_PAGE_UP || nScrollCode == IDT_WORKSPACE_PAGE_DOWN || nScrollCode == IDT_WORKSPACE_MINOR_HOME || nScrollCode == IDT_WORKSPACE_MINOR_END ); // returns TRUE if scrolling appears long newIndex = m_scrollY, oldScrollY; if( nScrollCode == IDT_WORKSPACE_MINOR_HOME ) { newIndex = 0; } else if( nScrollCode == IDT_WORKSPACE_MINOR_END ) { newIndex = m_maxBottom; // sth. substracted below } else if( nScrollCode == IDT_WORKSPACE_LINE_UP ) { newIndex -= g_mainFrame->m_currFontSize*2; } else if( nScrollCode == IDT_WORKSPACE_LINE_DOWN ) { newIndex += g_mainFrame->m_currFontSize*2; } else if( nScrollCode == IDT_WORKSPACE_PAGE_UP ) { newIndex -= m_window->m_clientH; } else if( nScrollCode == IDT_WORKSPACE_PAGE_DOWN ) { newIndex += m_window->m_clientH; } else if( nScrollCode == IDT_WORKSPACE_V_SCROLL ) { newIndex = nPos; } if( newIndex < 0 ) { newIndex = 0; } if( newIndex > m_maxBottom - m_window->m_clientH ) { newIndex = m_maxBottom - m_window->m_clientH; if( newIndex < 0 ) { newIndex = 0; } } if( newIndex != m_scrollY ) { oldScrollY = m_scrollY; m_scrollY = newIndex; SetVScrollInfo(); if( redraw ) { if( g_mainFrame->m_imgThread->HasWaitingImages() ) { // if there are waiting images, invalidate the whole rectangle as // some areas are no yet okay m_window->Refresh(); } else { m_window->ScrollWindow(0, oldScrollY - newIndex, NULL); m_window->Update(); } } return 1; } return 0; } bool SjAlbumBrowser::DoChangeSelection(long dir, bool shiftSelection) { #define findSelectionFromTop (dir==SJ_SEL_UP || dir==SJ_SEL_LEFT || dir==SJ_SEL_PREV) #define findBoundingFromTop (dir!=SJ_SEL_RIGHT) SjCol *oldCol, *newCol = NULL; SjRow *oldRow, *newRow = NULL; long oldColIndex, oldRowIndex; bool redrawAll = FALSE; // Shifted selection? ///////////////////// if( shiftSelection ) { long scopeColIndex, scopeRowIndex; if( g_mainFrame->m_columnMixer.SelectShifted((dir==SJ_SEL_PREV || dir==SJ_SEL_UP || dir==SJ_SEL_LEFT)? -1 : +1, scopeColIndex, scopeRowIndex) ) { // scroll horizontally, if needed if( scopeColIndex < m_applColIndex || scopeColIndex > m_applColIndex+m_visibleColCount ) { OnHScroll(IDT_WORKSPACE_H_SCROLL, scopeColIndex, FALSE/*redraw*/); redrawAll = TRUE; } // set newCol and newRow if( scopeColIndex-m_applColIndex < 0 || scopeColIndex-m_applColIndex >= m_allocatedColCount || m_applCol[scopeColIndex-m_applColIndex] == NULL ) { goto ChangeSelection_FinalRedraw; } newCol = m_applCol[scopeColIndex-m_applColIndex]; if( scopeRowIndex < 0 || scopeRowIndex >= newCol->m_rowCount || newCol->m_rows[scopeRowIndex] == NULL ) { goto ChangeSelection_FinalRedraw; } newRow = newCol->m_rows[scopeRowIndex]; // a real dirty hack... goto ChangeSelection_FinalScroll; } } // Find currently selected row the new row to select. ///////////////////////////////////////////////////// if( !FindSelectedRowInView(&oldCol, &oldRow, &oldColIndex, &oldRowIndex, findSelectionFromTop) ) { // no selected row found - select first/last row if( dir == SJ_SEL_UP || dir==SJ_SEL_DOWN || dir==SJ_SEL_PREV || dir==SJ_SEL_NEXT ) { if( !FindBoundingRowInView(&newCol, &newRow) ) { return FALSE; } } else { if( !FindBoundingRowInView(&oldCol, &oldRow, &oldColIndex, &oldRowIndex, findBoundingFromTop) ) { return FALSE; } } } // Select the row next to the selected row in the given direction. ////////////////////////////////////////////////////////////////// if( newRow == NULL ) { wxASSERT( oldRow && oldCol ); // find out the new row to select... if( dir == SJ_SEL_DOWN || dir == SJ_SEL_NEXT ) { // ...select down if( (newRow=oldCol->FindSelectableRow(oldRowIndex+1, +1))!=NULL ) { newCol = oldCol; } else if( dir != SJ_SEL_NEXT ) { if( (newRow=oldCol->FindSelectableRow(-1, -1))!=NULL ) { newCol = oldCol; } } } else if( dir == SJ_SEL_UP || dir == SJ_SEL_PREV ) { // ...select up if( (newRow=oldCol->FindSelectableRow(oldRowIndex-1, -1))!=NULL ) { newCol = oldCol; } else if( dir != SJ_SEL_PREV ) { if( (newRow=oldCol->FindSelectableRow(0, +1))!=NULL ) { newCol = oldCol; } } } if( dir == SJ_SEL_RIGHT || dir == SJ_SEL_LEFT || (dir == SJ_SEL_NEXT && newRow == NULL) || (dir == SJ_SEL_PREV && newRow == NULL) ) { // ...select left/right: get new column index long newColIndex = oldColIndex + ((dir==SJ_SEL_RIGHT||dir==SJ_SEL_NEXT)? +1 : -1); if( newColIndex < 0 || newColIndex >= m_allocatedColCount || m_applCol[newColIndex] == NULL ) { // the column index is not allocated -> scroll horizontally OnHScroll(newColIndex < 0? IDT_WORKSPACE_LINE_LEFT : IDT_WORKSPACE_LINE_RIGHT, 0, FALSE/*redraw*/); if( !FindSelectedRowInView(&oldCol, &oldRow, &oldColIndex, &oldRowIndex, findSelectionFromTop) ) { if( !FindBoundingRowInView(&oldCol, &oldRow, &oldColIndex, &oldRowIndex, findBoundingFromTop) ) { m_window->Refresh(); return FALSE; } } newColIndex += ((dir==SJ_SEL_RIGHT||dir==SJ_SEL_NEXT)? -1 : +1); if( newColIndex < 0 || newColIndex >= m_allocatedColCount || m_applCol[newColIndex] == NULL ) { m_window->Refresh(); return FALSE; } redrawAll = TRUE; } // ...select left/right: find row at near y-position (for left/right) // or use the first/last row (for prev/next) newCol = m_applCol[newColIndex]; if( dir == SJ_SEL_NEXT ) { newRow = newCol->FindSelectableRow(0, +1); } else if( dir == SJ_SEL_PREV ) { newRow = newCol->FindSelectableRow(-1, -1); } else { long minDiff = 100000L, r; for( r = 0; r < newCol->m_rowCount; r++ ) { if( newCol->m_rows[r]->IsSelectable() == 2 ) { long currDiff = newCol->m_rows[r]->m_top - oldRow->m_top; if( currDiff < 0 ) currDiff *= -1; if( currDiff < minDiff ) { minDiff = currDiff; newRow = newCol->m_rows[r]; if( oldCol->IsFirstSelectableRow(oldRow) ) { break; } } } } } } // new row to select found? if( newRow == NULL ) { return FALSE; // nothing to select / selection not changed } } // change the selection /////////////////////// wxASSERT( newCol && newRow ); g_mainFrame->m_columnMixer.SelectAll(FALSE); newRow->Select(TRUE); // make sure, the new row is visible //////////////////////////////////// ChangeSelection_FinalScroll: wxASSERT( newCol && newRow ); { bool newRowIsFirstRow = newCol->IsFirstSelectableRow(newRow); if( newRow->m_bottom-m_scrollY > m_window->m_clientH ) { // scroll down OnVScroll(IDT_WORKSPACE_V_SCROLL, newRow->m_bottom - m_window->m_clientH, !redrawAll/*redraw*/); } else if( newRow->m_top-m_scrollY < 0 || newRowIsFirstRow ) { // scroll up OnVScroll(IDT_WORKSPACE_V_SCROLL, newRowIsFirstRow? 0 : newRow->m_top, !redrawAll/*redraw*/); } if( newCol->m_textrRight-m_scrollX > m_window->m_clientW ) { // scroll right OnHScroll(IDT_WORKSPACE_LINE_RIGHT, 0, FALSE/*redraw*/); redrawAll = TRUE; } else if( newCol->m_textlLeft-m_scrollX < 0 ) { // scroll left OnHScroll(IDT_WORKSPACE_LINE_LEFT, 0, FALSE/*redraw*/); redrawAll = TRUE; } } // redraw ///////// ChangeSelection_FinalRedraw: if( redrawAll ) { m_window->Refresh(); } else { RefreshSelection(); } m_window->Update(); // without an explicit Update() call, the update may come // very late if eg. a cursor key is held and there are many // scrolling events. return TRUE; } bool SjAlbumBrowser::GotoUrl(const wxString& url) { bool ret = FALSE; long colIndex, rowIndex; SjRow* row; SjCol* col = g_mainFrame->m_columnMixer.GetMaskedCol(url, colIndex); if( col ) { // check index delete col; col = NULL; if( colIndex >= 0 ) { // goto column m_scrollX = 0; m_scrollY = 0; OnHScroll(IDT_WORKSPACE_H_SCROLL, colIndex, FALSE/*redraw*/); SetVScrollInfo(); // select the correct row g_mainFrame->m_columnMixer.SelectAll(FALSE); for( colIndex = 0; colIndex < m_allocatedColCount; colIndex++ ) { col = m_applCol[colIndex]; if( col ) { for( rowIndex = 0; rowIndex < col->m_rowCount; rowIndex++ ) { row = col->m_rows[rowIndex]; if( row->m_url == url ) { if( row->IsSelectable()==2 ) { row->Select(TRUE); if( row->m_bottom > m_window->m_clientH ) { m_scrollY = row->m_bottom - m_window->m_clientH; SetVScrollInfo(); } } ret = TRUE; // URL found! } } } } m_window->Refresh(); m_window->Update(); } } return ret; } bool SjAlbumBrowser::GotoColumn(long offset, bool selectOneInRow) { m_scrollX = 0; m_scrollY = 0; bool sthChanged = OnHScroll(IDT_WORKSPACE_H_SCROLL, offset, FALSE/*redraw*/); if( selectOneInRow ) // only used by "goto random" { g_mainFrame->m_columnMixer.SelectAll(false); if( m_applColCount > 0 && m_allocatedColCount > 0 ) { int selectableCount=0, rowIndex; for( rowIndex = 0; rowIndex < m_applCol[0]->m_rowCount; rowIndex++ ) { SjRow* row = m_applCol[0]->m_rows[rowIndex]; if( row->m_roughType == SJ_RRTYPE_NORMAL ) { if( selectableCount > 8 ) { break; } selectableCount++; } } int doSelect = SjTools::Rand(selectableCount); selectableCount=0; for( rowIndex = 0; rowIndex < m_applCol[0]->m_rowCount; rowIndex++ ) { SjRow* row = m_applCol[0]->m_rows[rowIndex]; if( row->m_roughType == SJ_RRTYPE_NORMAL ) { if( selectableCount == doSelect ) { row->Select(true); break; }; selectableCount++; } } } } SetVScrollInfo(); m_window->Refresh(); m_window->Update(); return sthChanged; } wxString SjAlbumBrowser::GetFirstVisiblePos() { if( m_allocatedColCount > 0 && m_applCol[0] != NULL ) { #if 0 // use column url return m_applCol[0]->m_url; #else // use "real" url SjRow* row = m_applCol[0]->FindSelectableRow(); if( row ) return row->m_url; #endif } return wxEmptyString; } wxString SjAlbumBrowser::GetFirstSelectedOrVisiblePos(long& retViewOffset) { SjCol* col; SjRow* row; if( FindSelectedRowInView(&col, &row, &retViewOffset) ) { wxASSERT( col ); retViewOffset |= (SJ_BROWSER_ALBUM_VIEW<<24); #if 0 // use column url return col->m_url; #else // use "real" url return row->m_url; #endif } else { retViewOffset = 0; return GetFirstVisiblePos(); } } void SjAlbumBrowser::GotoPos(const wxString& guid, long viewOffset_) { #if 0 long colOffset = g_mainFrame->m_columnMixer.GetMaskedColIndexByColUrl(guid); #else long colOffset; { SjCol* col = g_mainFrame->m_columnMixer.GetMaskedCol(guid, colOffset); if( col ) delete col; else colOffset = -1; } #endif if( colOffset < 0 ) { colOffset = 0; } else if( (viewOffset_&0x00FFFFFFL)!=0 && (viewOffset_>>24)==SJ_BROWSER_ALBUM_VIEW ) { colOffset += (viewOffset_&0x00FFFFFFL) * -1; if( colOffset < 0 ) { colOffset = 0; } if( colOffset > m_applColCount-m_visibleColCount ) { colOffset = m_applColCount-m_visibleColCount; } } GotoColumn(colOffset); } void SjAlbumBrowser::SetHScrollInfo() { // this function set the horzontal scrollbar information according to // the max. visible columns in bs->visibleColCount and to the // number of total columns in bs->applColCount SjSkinValue value; value.value = m_applColIndex; value.vmax = m_applColCount; value.thumbSize = m_visibleColCount; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_H_SCROLL, value); } void SjAlbumBrowser::SetVScrollInfo() { // this function set the vertical scrollbar information according to // the logical height of the visible columns in bs->maxBottom // and to the physical window height in bs->clientH. int maxBottom = m_maxBottom; if( m_scrollY+m_window->m_clientH >= maxBottom ) { maxBottom = m_scrollY + m_window->m_clientH; // make sure, the vertical scrollbar is // always present } wxASSERT(g_mainFrame); SjSkinValue value; value.value = m_scrollY; value.vmax = maxBottom; value.thumbSize = m_window->m_clientH; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_V_SCROLL, value); } long SjAlbumBrowser::FindRow(long xPos, long yPos, SjCol** retCol, SjRow** retRow, wxRect* retRect) { int c, r; SjCol* col; SjRow* row; wxRect dummyRect; if( retRect == NULL ) retRect = &dummyRect; wxASSERT(retCol); wxASSERT(retRow); wxASSERT(retRect); *retCol = NULL; *retRow = NULL; xPos += m_scrollX; yPos += m_scrollY; for( c = 0; c < m_allocatedColCount; c++ ) { col = m_applCol[c]; if( col == NULL ) continue; // -- bug fix in 1.15beta7: -- do _not_ return FALSE is simply one column is erroneous if( xPos >= col->m_textlLeft ) { if( xPos < col->m_textrRight ) { for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( yPos >= row->m_top ) { if( yPos < row->m_bottom ) { if( row->m_roughType == SJ_RRTYPE_COVER && (xPos > col->m_textlLeft+g_mainFrame->m_currCoverWidth || !(m_flags&SJ_BROWSER_VIEW_COVER)) ) { return FOUND_NOTHING; } else { *retCol = col; *retRow = row; retRect->x = col->m_textlLeft - m_scrollX; retRect->width = row->m_roughType==SJ_RRTYPE_COVER? g_mainFrame->m_currCoverWidth : (col->m_textrRight - col->m_textlLeft); retRect->y = row->m_top - m_scrollY; retRect->height = row->m_bottom - row->m_top; return FOUND_ROW; // row found at the given postion } } } else { return FOUND_NOTHING; } } return FOUND_NOTHING; } } else { if( xPos >= col->m_textlLeft-g_mainFrame->m_currColumnXSpace && col->m_rowCount > 0 && yPos >= col->m_rows[0]->m_top && yPos < col->m_rows[0]->m_top+m_fontStdHeight && !col->m_textUp.IsEmpty() && g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) ) { retRect->x = (col->m_textlLeft-g_mainFrame->m_currColumnXSpace) - m_scrollX; retRect->width = g_mainFrame->m_currColumnXSpace; retRect->y = col->m_rows[0]->m_top - m_scrollY; retRect->height = m_fontStdHeight; return FOUND_COVER_ARROW; } else { return FOUND_NOTHING; } } } return FOUND_NOTHING; } bool SjAlbumBrowser::FindSelectedRowInView(SjCol** col__, SjRow** row__, long* colIndex__, long* rowIndex__, bool findFromTop) { int c, r; SjCol* col; SjRow* row; long dummy; if( colIndex__ == NULL ) { colIndex__ = &dummy; } if( rowIndex__ == NULL ) { rowIndex__ = &dummy; } wxASSERT(col__); wxASSERT(row__); *col__ = NULL; *row__ = NULL; *colIndex__ = 0; *rowIndex__ = 0; if( findFromTop ) { for( c = 0; c < m_allocatedColCount; c++ ) { col = m_applCol[c]; if( col ) { for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( row->IsSelected() ) { *col__ = col; *row__ = row; *colIndex__ = c; *rowIndex__ = r; return TRUE; } } } } } else { for( c = m_allocatedColCount-1; c >= 0; c-- ) { col = m_applCol[c]; if( col ) { for( r = col->m_rowCount-1; r >= 0; r-- ) { row = col->m_rows[r]; if( row->IsSelected() ) { *col__ = col; *row__ = row; *colIndex__ = c; *rowIndex__ = r; return TRUE; } } } } } return FALSE; } bool SjAlbumBrowser::FindBoundingRowInView(SjCol** col__, SjRow** row__, long* colIndex__, long* rowIndex__, bool findFromTop) { // the function searches the first selectable row // in the first or in the last visible column SjCol* col; long dummy, r; if( colIndex__ == NULL ) { colIndex__ = &dummy; } if( rowIndex__ == NULL ) { rowIndex__ = &dummy; } *col__ = NULL; *row__ = NULL; *colIndex__ = 0; *rowIndex__ = 0; if( m_allocatedColCount <= 0 || m_visibleColCount <= 0 ) { return FALSE; // no columns - no rows } // get column *colIndex__ = findFromTop? 0 : m_visibleColCount-1; col = m_applCol[*colIndex__]; if( col==NULL || col->m_rowCount <= 0 ) { return FALSE; // no rows } // get row for( r = 0; r < col->m_rowCount; r++ ) { if( col->m_rows[r]->IsSelectable() == 2 ) { *col__ = col; *row__ = col->m_rows[r]; *rowIndex__ = r; return TRUE; // use this row } } return FALSE; // no selectable row } /******************************************************************************* * Painting the window ******************************************************************************/ void SjAlbumBrowser::OnSize(wxSizeEvent& event) { CalcPositions(); SetHScrollInfo(); if( m_scrollY+m_window->m_clientH > m_maxBottom ) { m_scrollY = m_maxBottom - m_window->m_clientH; if( m_scrollY < 0 ) { m_scrollY = 0; } } SetVScrollInfo(); } void SjAlbumBrowser::OnImageThere(SjImageThereEvent& event) { SjImgThreadObj* obj = event.GetObj(); int c, r; SjCol* applCol; SjRow* applRow; wxASSERT(obj); for( c = 0; c < m_allocatedColCount; c++ ) { applCol = m_applCol[c]; if( applCol ) { for( r = 0; r < applCol->m_rowCount; r++ ) { applRow = applCol->m_rows[r]; if( applRow->m_roughType == SJ_RRTYPE_COVER && (m_flags&SJ_BROWSER_VIEW_COVER) ) { if( obj->m_url == applRow->m_textm ) { /*#ifdef __WXMAC__ m_window->RefreshRect(wxRect(applCol->m_textlLeft-m_scrollX, applRow->m_top - m_scrollY, g_mainFrame->m_currCoverWidth, g_mainFrame->m_currCoverHeight)); #else*/ wxClientDC dc(m_window); m_window->PaintCover(dc, obj, applCol->m_textlLeft - m_scrollX, applRow->m_top - m_scrollY); /*#endif*/ } break; // break out of inner loop; // continue searching rows that need this // image in the outer loop } } } } g_mainFrame->m_imgThread->ReleaseImage(m_window, obj); } void SjAlbumBrowser::InvalidateNonCovers() { int c, r; SjCol* col; SjRow* row; wxSize size; int left, top, right, bottom; size = m_window->GetClientSize(); left = 0; top = 0; right = size.x; bottom = size.y; for( c = 0; c < m_allocatedColCount; c++ ) { col = m_applCol[c]; if( col ) { left = col->m_textlLeft - m_scrollX; right= col->m_textrRight - m_scrollX; for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( row->m_roughType != SJ_RRTYPE_COVER ) { top = row->m_top - m_scrollY; m_window->RefreshRect(wxRect(left, top, right-left, bottom-top)); break; } } } } } void SjAlbumBrowser::InvalidateCovers() { int c, r; SjCol* col; SjRow* row; wxSize size; int left, top, right, bottom; size = m_window->GetClientSize(); left = 0; top = 0; right = size.x; bottom = size.y; for( c = 0; c < m_allocatedColCount; c++ ) { col = m_applCol[c]; if( col ) { left = col->m_textlLeft - m_scrollX; right= col->m_textrRight - m_scrollX; for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( row->m_roughType == SJ_RRTYPE_COVER ) { bottom = row->m_bottom - m_scrollY; m_window->RefreshRect(wxRect(left, top, right-left, bottom-top)); break; } } } } } wxBitmap SjAlbumBrowser::GetDragNDropBitmap(int mouseX, int mouseY, wxPoint& retHotspot, wxRect& retSize) { // calculate the width and the height of the bitmap long dndLeft=1000000, dndTop=1000000, dndRight=-1000000, dndBottom=-1000000; long dndWidth, dndHeight; int c, r; SjCol* col; SjRow* row; for( c = 0; c < m_allocatedColCount; c++ ) { col = m_applCol[c]; if( col ) { for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( row->IsSelected() ) { if( col->m_textlLeft < dndLeft ) dndLeft = col->m_textlLeft; if( col->m_textrRight> dndRight ) dndRight = col->m_textrRight; if( row->m_top < dndTop ) dndTop = row->m_top; if( row->m_bottom > dndBottom) dndBottom= row->m_bottom; } } } } if( dndLeft>=dndRight || dndTop>=dndBottom ) { return wxNullBitmap; } dndWidth = dndRight-dndLeft; dndHeight = dndBottom-dndTop; retHotspot.x = (mouseX+m_scrollX) - dndLeft; retHotspot.y = (mouseY+m_scrollY) - dndTop; // create an offscreen DC with the given Size wxBitmap imgBitmap(dndWidth, dndHeight); wxMemoryDC imgDc; imgDc.SelectObject(imgBitmap); wxBitmap maskBitmap(dndWidth, dndHeight, 1); wxMemoryDC maskDc; maskDc.SelectObject(maskBitmap); // draw the selected rows to the offscreen dc imgDc.SetPen(*wxTRANSPARENT_PEN); imgDc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMALODD].bgBrush); imgDc.DrawRectangle(0, 0, dndWidth, dndHeight); maskDc.SetPen(*wxTRANSPARENT_PEN); maskDc.SetBrush(*wxBLACK_BRUSH); maskDc.DrawRectangle(0, 0, dndWidth, dndHeight); maskDc.SetBrush(*wxWHITE_BRUSH); wxSize scrollBackup(m_scrollX, m_scrollY); m_scrollX = dndLeft; m_scrollY = dndTop; for( c = 0; c < m_allocatedColCount; c++ ) { col = m_applCol[c]; if( col ) { bool lastRowSelected = FALSE; for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( row->IsSelected() ) { PaintRow(imgDc, col, row, col->m_textlLeft-m_scrollX, row->m_top-m_scrollY, col->m_textrRight-m_scrollX, row->m_bottom-m_scrollY, FALSE, TRUE, lastRowSelected); lastRowSelected = TRUE; maskDc.DrawRectangle(col->m_textlLeft-m_scrollX, row->m_top-m_scrollY, col->m_textrRight-col->m_textlLeft, row->m_bottom-row->m_top); } else { lastRowSelected = FALSE; } } } } m_scrollX = scrollBackup.x; m_scrollY = scrollBackup.y; // done creating the images imgDc.SelectObject(wxNullBitmap); maskDc.SelectObject(wxNullBitmap); // scale the bitmaps down if they are too large #define MAX_W 300 #define MAX_H 300 if( dndWidth>MAX_W || dndHeight>MAX_H ) { // calculate the new width and height long oldWidth = dndWidth, oldHeight = dndHeight; if( dndWidth>MAX_W ) { dndHeight = (dndHeight*MAX_W) / dndWidth; dndWidth = MAX_W; } if( dndHeight>MAX_H ) { dndWidth = (dndWidth*MAX_H) / dndHeight; dndHeight = MAX_H; } // scale down image wxImage img = imgBitmap.ConvertToImage(); //img.Rescale(dndWidth, dndHeight); SjImgOp::DoResize(img, dndWidth, dndHeight, SJ_IMGOP_SMOOTH); imgBitmap = wxBitmap(img); // scale down mask img = maskBitmap.ConvertToImage(); img.Rescale(dndWidth, dndHeight); maskBitmap = wxBitmap(img, 1); // correct hotspot retHotspot.x = (retHotspot.x*dndWidth) / oldWidth; retHotspot.y = (retHotspot.y*dndHeight) / oldHeight; } // done imgBitmap.SetMask(new wxMask(maskBitmap)); retSize.x = 0; retSize.y = 0; retSize.width = dndWidth; retSize.height= dndHeight; return imgBitmap; } void SjAlbumBrowser::PaintRow(wxDC& dc, SjCol* col, SjRow* row, long drawRectLeft, long drawRectTop, long drawRectRight, long drawRectBottom, bool odd, bool rowSelected, bool lastRowSelected) { bool rowEnqueued = g_mainFrame->IsEnqueued(row->m_url); wxFont *font1, *font2; SjSkinColour* colour; wxRect drawRect; if( row->m_roughType == SJ_RRTYPE_COVER ) { // draw cover if( m_flags & SJ_BROWSER_VIEW_COVER ) { SjImgThreadObj* cachedImg = m_window->RequireImage(row->m_textm); // cachedImg may be NULL, but this is okay for PaintCover() and for ReleaseImage() m_window->PaintCover(dc, cachedImg, drawRectLeft, drawRectTop); g_mainFrame->m_imgThread->ReleaseImage(m_window, cachedImg); if( g_mainFrame->m_currCoverWidth < g_mainFrame->m_currColumnWidth ) { dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(drawRectLeft+g_mainFrame->m_currCoverWidth, drawRectTop, g_mainFrame->m_currColumnWidth-g_mainFrame->m_currCoverWidth, g_mainFrame->m_currCoverHeight); } } } else { // get fonts m_window->GetFonts(row->m_roughType, &font1, &font2, rowEnqueued); if( rowSelected ) { dc.SetBrush(g_mainFrame->m_workspaceColours[odd? SJ_COLOUR_SELECTIONODD : SJ_COLOUR_SELECTION].bgBrush); if( lastRowSelected ) { dc.SetPen(g_mainFrame->m_workspaceColours[/*odd? SJ_COLOUR_NORMALODD : */SJ_COLOUR_NORMAL].bgPen); dc.DrawLine(drawRectLeft, drawRectTop, drawRectRight, drawRectTop); dc.SetPen(*wxTRANSPARENT_PEN); } dc.DrawRectangle(drawRectLeft, drawRectTop + (lastRowSelected? 1 : 0), drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); colour = &g_mainFrame->m_workspaceColours[odd? SJ_COLOUR_SELECTIONODD : SJ_COLOUR_SELECTION]; } else { dc.SetBrush(g_mainFrame->m_workspaceColours[odd? SJ_COLOUR_NORMALODD : SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(drawRectLeft, drawRectTop, drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); if( row->m_roughType == SJ_RRTYPE_TITLE1 ) { colour = &g_mainFrame->m_workspaceColours[SJ_COLOUR_TITLE1]; } else if( row->m_roughType == SJ_RRTYPE_TITLE2 ) { colour = &g_mainFrame->m_workspaceColours[SJ_COLOUR_TITLE2]; } else if( row->m_roughType == SJ_RRTYPE_TITLE3 ) { colour = &g_mainFrame->m_workspaceColours[SJ_COLOUR_TITLE3]; } else { colour = &g_mainFrame->m_workspaceColours[odd? SJ_COLOUR_NORMALODD : SJ_COLOUR_NORMAL]; } } wxASSERT(colour); dc.SetTextBackground(colour->bgColour); dc.SetTextForeground(colour->fgColour); // draw mid text if( row->m_roughType < SJ_RRTYPE_TITLE1 || row->m_roughType > SJ_RRTYPE_TITLE3 ) { drawRectLeft = col->m_textmLeft - m_scrollX; drawRectRight = col->m_textmRight - m_scrollX; } else if( g_accelModule && g_accelModule->UseNumpad() ) { drawRectLeft = col->m_textmLeft - m_scrollX; } drawRect = wxRect(drawRectLeft, drawRectTop, drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); g_tools->DrawText(dc, row->m_textm, drawRect, *font1, *font2, colour->hiColour); // draw left/right text if( !row->m_textl.IsEmpty() || !row->m_textr.IsEmpty() ) { dc.SetFont(g_mainFrame->m_currSmallFont); drawRectTop += m_fontVDiff; // right text wxCoord extentW, extentH; dc.GetTextExtent(row->m_textr, &extentW, &extentH); dc.DrawText(row->m_textr, col->m_textrRight - extentW - m_scrollX - 1, drawRectTop); // left text if( rowEnqueued ) { dc.SetTextForeground(colour->hiColour); dc.SetFont(g_mainFrame->m_currSmallBoldFont); } dc.DrawText(row->m_textl, col->m_textlLeft - m_scrollX + 1, drawRectTop); } } } void SjAlbumBrowser::PaintCol(wxDC& dc, SjCol* col, long rcPaintLeft, long rcPaintTop, long rcPaintRight, long rcPaintBottom) { // this function assumes, that the pen is set to transparent on call! SjRow* row; bool rowSelected, lastRowSelected = FALSE; int r; long drawRectLeft, drawRectTop, drawRectRight, drawRectBottom; bool coverDrawn = FALSE; bool odd = TRUE, toggleOdd = TRUE; for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; rowSelected = row->IsSelected(); drawRectTop = row->m_top - m_scrollY; drawRectBottom = row->m_bottom - m_scrollY; if( drawRectTop > rcPaintBottom ) { break; // nothing more to draw } // set "odd" if( row->m_roughType == SJ_RRTYPE_COVER ) { odd = TRUE; toggleOdd = TRUE; } else if( row->m_roughType == SJ_RRTYPE_NORMAL ) { if( toggleOdd ) { odd = !odd; } else { odd = TRUE; toggleOdd = TRUE; } } else { odd = FALSE; toggleOdd = FALSE; } // row visible? if( drawRectBottom > rcPaintTop ) { drawRectLeft = col->m_textlLeft - m_scrollX; drawRectRight = col->m_textrRight - m_scrollX; if( drawRectRight < rcPaintLeft || drawRectLeft > rcPaintRight ) { break; // nothing more to draw } if( row->m_roughType == SJ_RRTYPE_COVER ) { coverDrawn = TRUE; } // draw row PaintRow(dc, col, row, drawRectLeft, drawRectTop, drawRectRight, drawRectBottom, odd, rowSelected, lastRowSelected); } lastRowSelected = rowSelected; } // // if the cover is not yet drawn, require the cover anyway // as it may be needed for other sections (before PaintCol() was called, all covers were invalidated) // if( !coverDrawn && (m_flags&SJ_BROWSER_VIEW_COVER) ) { for( r = 0; r < col->m_rowCount; r++ ) { row = col->m_rows[r]; if( row->m_roughType == SJ_RRTYPE_COVER ) { drawRectTop = row->m_top - m_scrollY; drawRectBottom = row->m_bottom - m_scrollY; drawRectLeft = col->m_textlLeft - m_scrollX; drawRectRight = col->m_textrRight - m_scrollX; if( drawRectLeft < m_window->m_clientW // comparison against the window size is okay && drawRectTop < m_window->m_clientH // (comparison against the redrawing area would leave images unrequired) && drawRectRight > 0 && drawRectBottom > 0 ) { SjImgThreadObj* cachedImg = m_window->RequireImage(row->m_textm); if( cachedImg ) { g_mainFrame->m_imgThread->ReleaseImage(m_window, cachedImg); } } break; } } } } void SjAlbumBrowser::DoPaint(wxDC& dc) { int colRectLeft, colRectTop, colRectRight, colRectBottom, drawRectLeft, drawRectTop, drawRectRight, drawRectBottom; int c; bool anythingDrawn = FALSE; // get region outer box int regionLeft, regionTop, regionRight, regionBottom; wxRegion region = m_window->GetUpdateRegion(); region.GetBox(regionLeft, regionTop, regionRight, regionBottom); regionRight += regionLeft; regionBottom += regionTop; // reset required and waiting images g_mainFrame->m_imgThread->RequireStart(m_window); // draw whitespace atop dc.SetPen(*wxTRANSPARENT_PEN); drawRectLeft = 0; drawRectRight = m_window->m_clientW; drawRectTop = 0; drawRectBottom = g_mainFrame->m_currColumnYSpace - m_scrollY; if( drawRectBottom > 0 ) { dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(drawRectLeft, drawRectTop, drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); } // calculate position of the first column colRectLeft = g_mainFrame->m_currColumnXSpace - m_scrollX; colRectTop = g_mainFrame->m_currColumnYSpace - m_scrollY; colRectRight = colRectLeft; colRectBottom = m_window->m_clientH; for( c = 0; c < m_allocatedColCount; c++ ) { // complete column position column colRectRight = colRectLeft + g_mainFrame->m_currColumnWidth; if( colRectLeft > 0 ) { drawRectLeft = colRectLeft - g_mainFrame->m_currColumnXSpace; drawRectTop = colRectTop; drawRectRight = colRectLeft; drawRectBottom = colRectBottom; // draw whitespace aleft of column, the space left of the column belong to the column! dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); if( m_applCol[c] && !m_applCol[c]->m_textUp.IsEmpty() ) { // draw icon wxRect toggleCoversRect; toggleCoversRect.x = drawRectLeft; //x; toggleCoversRect.y = drawRectTop; //SPACE_TOP; toggleCoversRect.width = g_mainFrame->m_currColumnXSpace; //SPACE_LEFT; toggleCoversRect.height = m_fontStdHeight; //m_fontHeight; dc.DrawRectangle(toggleCoversRect); wxRect iconRect = toggleCoversRect; iconRect.y+=2; iconRect.height-=4; iconRect.width = iconRect.height; iconRect.x += (toggleCoversRect.width-iconRect.width) / 2; dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_TITLE1].fgPen); SjTools::DrawIcon(dc, iconRect, (m_flags&SJ_BROWSER_VIEW_COVER)? SJ_DRAWICON_TRIANGLE_DOWN : SJ_DRAWICON_TRIANGLE_RIGHT); dc.SetPen(*wxTRANSPARENT_PEN); // draw uptext int upY = drawRectTop + toggleCoversRect.height; m_window->DrawUpText(dc, m_applCol[c]->m_textUp, drawRectLeft, upY, drawRectRight-drawRectLeft, drawRectBottom-upY); } else { dc.DrawRectangle(drawRectLeft, drawRectTop, drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); } } // draw column if( m_applCol[c] ) { PaintCol(dc, m_applCol[c], regionLeft, regionTop, regionRight, regionBottom); drawRectTop = m_applCol[c]->m_rows[m_applCol[c]->m_rowCount-1]->m_bottom - m_scrollY; anythingDrawn = TRUE; } else { drawRectTop = colRectTop; } // draw whitespace abottom of column if( drawRectTop < m_window->m_clientH ) { drawRectLeft = colRectLeft; drawRectRight = colRectRight; drawRectBottom = m_window->m_clientH; dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(drawRectLeft, drawRectTop, drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); } // calculate next position colRectLeft = colRectRight; if( colRectLeft >= m_window->m_clientW ) { // done! break; } colRectLeft += g_mainFrame->m_currColumnXSpace; } // draw whitespace aright of last column; this will draw all if there are no columns at all if( colRectRight < m_window->m_clientW ) { drawRectLeft = colRectRight; drawRectTop = colRectTop; drawRectRight = m_window->m_clientW; drawRectBottom = m_window->m_clientH; dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(drawRectLeft, drawRectTop, drawRectRight-drawRectLeft, drawRectBottom-drawRectTop); } // free all images that are no longer required but still waiting g_mainFrame->m_imgThread->RequireEnd(m_window); // draw a stub text if there was nothing drawn before if( !anythingDrawn && g_mainFrame->m_libraryModule ) { } } void SjAlbumBrowser::CalcRowPositions(wxDC& dc, SjCol* applCol, int x, int y) { SjRow* applRow; int i; int maxWidth, leftWidth, rightWidth, midWidth, currWidth, currHeight; wxFont *font1, *font2; // // calculate the width of the left and the right columns // dc.SetFont(g_mainFrame->m_currSmallFont); maxWidth = g_mainFrame->m_currColumnWidth / 4; leftWidth = 0; rightWidth = 0; for( i = 0; i < applCol->m_rowCount; i++ ) { applRow = applCol->m_rows[i]; applRow->m_bottom = m_fontVDiff; // temporary height if( !applRow->m_textl.IsEmpty() ) { dc.GetTextExtent(applRow->m_textl, &currWidth, &currHeight); if( currWidth > maxWidth ) { currWidth = maxWidth; } if( currWidth > leftWidth ) { leftWidth = currWidth; } if( currHeight > applRow->m_bottom ) { applRow->m_bottom = currHeight + m_fontVDiff; } } if( !applRow->m_textr.IsEmpty() ) { dc.GetTextExtent(applRow->m_textr, &currWidth, &currHeight); if( currWidth > maxWidth ) { currWidth = maxWidth; } if( currWidth > rightWidth ) { rightWidth = currWidth; } if( currHeight > applRow->m_bottom ) { applRow->m_bottom = currHeight + m_fontVDiff; } } } if( leftWidth ) { leftWidth += m_fontSpace; } if( leftWidth > maxWidth ) { leftWidth = maxWidth; } if( rightWidth ) { rightWidth += m_fontSpace; } if( rightWidth > maxWidth ) { rightWidth = maxWidth; } midWidth = g_mainFrame->m_currColumnWidth - (leftWidth+rightWidth); // // set the x positions in the column object // applCol->m_textlLeft = x; applCol->m_textlRight = applCol->m_textlLeft + leftWidth; applCol->m_textmLeft = applCol->m_textlRight; applCol->m_textmRight = applCol->m_textmLeft + midWidth; applCol->m_textrLeft = applCol->m_textmRight; applCol->m_textrRight = applCol->m_textrLeft + rightWidth; // // calculate the height of each row // for( i = 0; i < applCol->m_rowCount; i++ ) { applRow = applCol->m_rows[i]; if( applRow->m_roughType == SJ_RRTYPE_COVER ) { applRow->m_top = y; if(m_flags&SJ_BROWSER_VIEW_COVER) y += g_mainFrame->m_currCoverHeight; applRow->m_bottom = y; } else { m_window->GetFonts(applRow->m_roughType, &font1, &font2, FALSE); int availWidth = midWidth; if( applRow->m_roughType>=SJ_RRTYPE_TITLE1 && applRow->m_roughType<=SJ_RRTYPE_TITLE3 ) { availWidth = g_mainFrame->m_currColumnWidth; if( g_accelModule && g_accelModule->UseNumpad() ) { availWidth -= leftWidth; } } applRow->m_top = y; currHeight = g_tools->CalcTextHeight(dc, applRow->m_textm, *font1, *font2, availWidth); if( applRow->m_bottom > currHeight ) { currHeight = applRow->m_bottom; // set to height needed by the left / right columns } y += currHeight; applRow->m_bottom = y; } } } void SjAlbumBrowser::CalcPositions() { // function calculates column position based on bs->applColIndex wxClientDC dc(m_window); int i, azSet = 0; int colRectLeft, colRectTop, colRectRight; // // calculate the height difference between the normal and the small fonts // m_window->GetFontPxSizes(dc, m_fontVDiff, m_fontSpace, m_fontStdHeight); // free all previously allocated objects for( i = 0; i < m_allocatedColCount; i++ ) { if( m_applCol[i] ) { if( m_applCol[i] == m_lastClickedCol ) { m_lastClickedCol = NULL; m_lastClickedRow = NULL; } delete m_applCol[i]; m_applCol[i] = 0; } } m_allocatedColCount = 0; m_visibleColCount = 0; // calculate position of the first row m_maxBottom = g_mainFrame->m_currColumnYSpace; colRectLeft = g_mainFrame->m_currColumnXSpace; colRectTop = g_mainFrame->m_currColumnYSpace; for( i = 0; i < MAX_COL_COUNT; i++ ) { // complete column position column colRectRight = colRectLeft + g_mainFrame->m_currColumnWidth; // allocate column object for this column if( m_applColIndex+i < m_applColCount ) { m_applCol[i] = g_mainFrame->m_columnMixer.GetMaskedCol(m_applColIndex+i); } else { m_applCol[i] = NULL; } m_allocatedColCount++; if( colRectRight <= m_window->m_clientW ) { m_visibleColCount++; } // calculate all row positions if( m_applCol[i] ) { if( i==0 ) { g_mainFrame->SetSkinAzValues(m_applCol[0]->m_az); azSet = 1; } CalcRowPositions(dc, m_applCol[i], colRectLeft, colRectTop); if( m_applCol[i]->m_rows[m_applCol[i]->m_rowCount-1]->m_bottom > m_maxBottom ) { m_maxBottom = m_applCol[i]->m_rows[m_applCol[i]->m_rowCount-1]->m_bottom; } } // calculate next position colRectLeft = colRectRight; if( colRectLeft >= m_window->m_clientW + m_scrollX ) { // done! break; } colRectLeft += g_mainFrame->m_currColumnXSpace; } if( !azSet ) { g_mainFrame->SetSkinAzValues('a'); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser_album.h��������������������������������������������������������0000664�0000000�0000000�00000015103�12660066715�0021051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser_album.h * Authors: Björn Petersen * Purpose: Silverjuke album browser * ******************************************************************************/ #ifndef __SJ_BROWSER_ALBUM_H__ #define __SJ_BROWSER_ALBUM_H__ class SjAlbumBrowser : public SjBrowserBase { public: // this is a pure-virtual base class defining a browser view // currently implemented classes are SjAlbumBrowser and SjListBrowser SjAlbumBrowser (SjBrowserWindow*); // Exit() is be called sooner than the destructor is called for save-freeing pointers. void Exit (); // called to show the browser, after this function is called // the derived class should be ready to process paint events! void Realize (bool reloadColumnMixer, bool keepColIndex); // mouse handling void OnMouseLeftDown (wxMouseEvent& event); void OnMouseLeftUp (wxMouseEvent& event); void OnMouseCaptureLost (wxMouseCaptureLostEvent& event); bool OnMouseLeftDClick (wxMouseEvent& event); void OnMouseMiddleUp (wxMouseEvent& event); void OnMouseMotion (wxMouseEvent& event); void OnMouseWheel (wxMouseEvent& event, bool scrollVert); void OnDropImage (SjDataObject* data, int mouseX, int mouseY); void OnContextMenu (int clickX, int clickY); void OnContextMenuSelect (int id); wxRect GetToolTipRect (int mouseX, int mouseY); wxString GetToolTipText (int mouseX, int mouseY, long &flags); void AddItemsToColMenu (SjMenu*); void UpdateItemsInColMenu(SjMenu*); // selection handling & scrolling bool OnSkinTargetEvent (int targetId, SjSkinValue& value, long accelFlags); // return true if the key/event was used bool DoChangeSelection (long dir, bool shiftSelection); void RefreshSelection () { InvalidateNonCovers(); } bool GotoUrl (const wxString& url); void GotoPos (const wxString& guid, long viewOffset); wxString GetFirstVisiblePos (); wxString GetFirstSelectedOrVisiblePos(long& retViewOffset); // do paint the window, paint-related events void DoPaint (wxDC&); void OnSize (wxSizeEvent& event); void OnImageThere (SjImageThereEvent& event); private: // setting the scrollbars void SetHScrollInfo (); void SetVScrollInfo (); bool OnHScroll (int nScrollCode, int nPos, bool redraw); // returns TRUE if scrolling appears bool OnVScroll (int nScrollCode, int nPos, bool redraw); // returns TRUE if scrolling appears long m_maxBottom; // the max. y-index for the calculated columns long m_scrollX; // always positive and always smaller than bs->appl->view.currCoverW - bs->appl->view.currCoverXSpace long m_scrollY; // positive or negative // selecting #define FOUND_NOTHING 0 #define FOUND_ROW 1 #define FOUND_COVER_ARROW 2 long FindRow (long xPos, long yPos, SjCol** retCol, SjRow** retRow, wxRect* retRect=NULL); bool FindSelectedRowInView (SjCol**, SjRow**, long* colIndex=NULL, long* rowIndex=NULL, bool findFromTop=TRUE); bool FindBoundingRowInView (SjCol**, SjRow**, long* colIndex=NULL, long* rowIndex=NULL, bool findFromTop=TRUE); // painting wxBitmap GetDragNDropBitmap (int mouseX, int mouseY, wxPoint& retHotspot, wxRect& retSize); void InvalidateNonCovers (); void InvalidateCovers (); void PaintCol (wxDC&, SjCol*, long rcPaintLeft, long rcPaintTop, long rcPaintRight, long rcPaintBottom); void PaintRow (wxDC&, SjCol*, SjRow*, long drawRectLeft, long drawRectTop, long drawRectRight, long drawRectBottom, bool odd, bool rowSelected, bool lastRowSelected); void CalcRowPositions (wxDC& dc, SjCol*, int x, int y); void CalcPositions (); int m_fontVDiff; // this is the difference in height between the // small and the normal font int m_fontSpace; // this is the space between the left/mid/right columns int m_fontStdHeight; // mouse void OnMouseSelect (wxMouseEvent& event); SjCol* m_lastClickedCol; SjRow* m_lastClickedRow; long m_dragStartX, m_dragStartY; long m_dragscrollCurrX, m_dragscrollCurrY; bool m_mouseSelectionOnDown; // misc long m_applColCount; // the real number of colums available by SjColumnMixer::GetMaskedCol() long m_applColIndex; // the SjColumnMixer index of the first column visible #define MAX_COL_COUNT 64 // MAX_COL_COUNT is the max. number of columns visible the SAME time SjCol* m_applCol[MAX_COL_COUNT]; long m_visibleColCount; // the number of COMPLETELY visible columns long m_allocatedColCount; // the number of COMPLETELY OR PARTLY visible columns, // this is the number of valid objects in applCol[] bool GotoColumn(long offset, bool selectOneInRow=false); // return true if the position was changed // for the tooltips SjCol* m_lastTooltipCol; SjRow* m_lastTooltipRow; }; #endif // __SJ_BROWSER_ALBUM_H__ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser_cover.cpp������������������������������������������������������0000664�0000000�0000000�00000111032�12660066715�0021420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser_cover.cpp * Authors: Björn Petersen * Purpose: Silverjuke cover browser * ******************************************************************************/ #include <sjbase/base.h> #include <sjtools/imgthread.h> #include <sjbase/browser.h> #include <sjbase/browser_cover.h> #include <sjbase/columnmixer.h> #include <sjmodules/kiosk/virtkeybd.h> #include <sjmodules/vis/vis_module.h> #define SEL_BORDER_W 4 // 3 pixels border, 1 pixel space // the selection border is just draw around the covers, no special calculations for this #define SPACE_LEFT (g_mainFrame->m_currColumnXSpace) #define SPACE_TOP (g_mainFrame->m_currColumnYSpace) #define SCROLL_RECT wxRect(SPACE_LEFT-SEL_BORDER_W, 0, (m_window->m_clientW-SPACE_LEFT)+SEL_BORDER_W, m_window->m_clientH) #undef USE_COVER_DND SjCoverBrowser::SjCoverBrowser(SjBrowserWindow* w) : SjBrowserBase(w) { m_coversXCount = 1; m_coversYCount = 1; m_allocatedCoverCount = 0; m_allocatedCover = NULL; m_applCoverCount = 0; m_applRowIndex = 0; m_applRowCount = 0; m_scrollY = 0; m_dragStartX = 0; m_dragStartY = 0; m_dragscrollCurrY = 0; m_linesBelowCover = 0; m_lastTooltipCover = NULL; m_lastClickedCover = NULL; } void SjCoverBrowser::FreeAllocatedCol() { if( m_allocatedCover ) { for( int i = 0; i < m_allocatedCoverCount; i++ ) { if( m_allocatedCover[i] ) { delete m_allocatedCover[i]; } } free(m_allocatedCover); } m_allocatedCover = NULL; m_allocatedCoverCount = 0; m_lastClickedCover = NULL; } void SjCoverBrowser::Exit() { FreeAllocatedCol(); } void SjCoverBrowser::Realize(bool reloadColumnMixer, bool keepColIndex) { // save old index long oldCoverXCount = m_coversXCount; long oldCoverIndex = m_applRowIndex*m_coversXCount; // recalculate the needed stuff if( reloadColumnMixer ) { m_scrollY = 0; m_applCoverCount = g_mainFrame->m_columnMixer.GetMaskedColCount(); } SjSkinValue value; value.value = 0; value.vmax = 0; value.thumbSize = 0; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_H_SCROLL, value); CalcRowStuff(); // try to set a new, fine row index if( oldCoverXCount != m_coversXCount ) { m_applRowIndex = oldCoverIndex / m_coversXCount; } if( m_applRowIndex >= (m_applRowCount-m_coversYCount) ) m_applRowIndex = (m_applRowCount-m_coversYCount); if( m_applRowIndex<0 || !keepColIndex ) m_applRowIndex = 0; // recalculate the rest CalcPositions(); SetVScrollInfo(); m_lastTooltipCover = NULL; } /******************************************************************************* * Mouse Handling ******************************************************************************/ void SjCoverBrowser::SelectAllRows(SjCol* cover) const { // s http://www.silverjuke.net/forum/post.php?p=5379#5379 bool multiEnqueueAvailable = g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE); if( multiEnqueueAvailable ) { cover->SelectAllRows(true); } else { SjRow* r = cover->FindSelectableRow(); if( r ) { r->Select(true); } } } void SjCoverBrowser::OnMouseSelect(wxMouseEvent& event) { /* (de-)select the item under the mouse (if any) */ SjCol* cover; long found = FindCover(event.GetX(), event.GetY(), &cover); if( found == FOUND_COVER ) { g_mainFrame->m_columnMixer.SelectAll(false); SelectAllRows(cover); RefreshSelection(); } else if( found == FOUND_COVER_ARROW ) { g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDT_WORKSPACE_SHOW_COVERS)); } else if( g_mainFrame->m_columnMixer.IsAnythingSelected() ) { g_mainFrame->m_columnMixer.SelectAll(false); RefreshSelection(); } } void SjCoverBrowser::OnMouseLeftDown(wxMouseEvent& event) { /* prepare dragscroll and object dragging */ m_window->m_mouseAction = SJ_ACTION_NONE; m_dragStartX = event.GetX(); /* client coordinates */ m_dragStartY = event.GetY(); /* client coordinates */ /* perform selection */ m_mouseSelectionOnDown = FALSE; #ifdef USE_COVER_DND SjCol* cover; if( g_accelModule->m_selDragNDrop == 1 && (cover=FindCover(m_dragStartX, m_dragStartY))!=NULL /*&& !cover->IsAnyRowSelected() -- we preserve given selections but allow only one album selected by us*/ ) { OnMouseSelect(event); m_mouseSelectionOnDown = TRUE; } #endif } void SjCoverBrowser::OnMouseLeftUp(wxMouseEvent& event) { // dragscroll: restore cursor if changed by dragscroll if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { m_window->m_mouseAction = SJ_ACTION_NONE; return; // done } // nothing in view if( g_mainFrame->m_columnMixer.GetMaskedColCount() == 0 ) { g_mainFrame->EndOneSearch(); return; // done } // perform selection if( !m_mouseSelectionOnDown ) { OnMouseSelect(event); } } void SjCoverBrowser::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { // dragscroll: restore cursor if changed by dragscroll if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { m_window->m_mouseAction = SJ_ACTION_NONE; return; // done } } void SjCoverBrowser::ToggleView() { if( m_window->IsViewAvailable(SJ_BROWSER_ALBUM_VIEW) ) { m_window->SetView_(SJ_BROWSER_ALBUM_VIEW, true, true); } else { m_window->SetView_(SJ_BROWSER_LIST_VIEW, true, true); } } bool SjCoverBrowser::OnMouseLeftDClick(wxMouseEvent& event) { SjCol* cover; long found = FindCover(event.GetX(), event.GetY(), &cover); if( found == FOUND_COVER ) { ToggleView(); return true; // click used } else if( found == FOUND_COVER_ARROW ) { return true; // click used (avoid toggle the view by fast clicks on the cover toggler) } return false; // click not used } void SjCoverBrowser::OnMouseMiddleUp(wxMouseEvent& event) { bool skip = TRUE; SjCol* cover; long found = FindCover(event.GetX(), event.GetY(), &cover); if( found == FOUND_COVER && cover->m_rowCount > 0 ) { SjRow* row = cover->m_rows[0]; int usesMiddleClick = row->UsesMiddleClick(); if( usesMiddleClick ) { g_mainFrame->m_columnMixer.SelectAll(false); SelectAllRows(cover); RefreshSelection(); m_window->Update(); skip = FALSE; row->OnMiddleClick(event.ShiftDown() || event.ControlDown()); } } if( skip ) { event.Skip(); } } void SjCoverBrowser::OnMouseMotion(wxMouseEvent& event) { if( !m_window->HasCapture() ) return; long hDifference, vDifference; long oldRowIndex, oldScrollY; long xPos = event.GetX(); /* client coordinates */ long yPos = event.GetY(); /* client coordinates */ // start dragscroll or object dragging? if( m_window->m_mouseAction == SJ_ACTION_NONE ) { hDifference = xPos - m_dragStartX; vDifference = yPos - m_dragStartY; if( hDifference > DRAGSCROLL_DELTA || hDifference < -DRAGSCROLL_DELTA || vDifference > DRAGSCROLL_DELTA || vDifference < -DRAGSCROLL_DELTA ) { #ifdef USE_COVER_DND SjCol* cover; if( g_accelModule->m_selDragNDrop && (cover=FindCover(m_dragStartX, m_dragStartY))!=NULL && cover->IsAnyRowSelected() ) { // do object dragging m_window->m_dragUrls.Clear(); g_mainFrame->m_columnMixer.GetSelectedUrls(m_window->m_dragUrls); if( g_accelModule->m_flags&SJ_ACCEL_USEDNDIMAGES ) { g_mainFrame->m_dragImage = m_window->GetCoverDragNDropBitmap(cover, g_mainFrame->m_dragRect); if( g_mainFrame->m_dragImage ) { g_mainFrame->m_dragHotspot.x = xPos - cover->m_textlLeft; g_mainFrame->m_dragHotspot.y = yPos - cover->m_top + m_scrollY; } } if( g_mainFrame->DragNDrop(SJ_DND_ENTER, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) ) { m_window->m_mouseAction = SJ_ACTION_DRAGNDROP; } } else #endif if( g_accelModule->m_flags&SJ_ACCEL_CONTENT_DRAG && m_applRowCount ) { // start dragscroll m_window->m_mouseAction = SJ_ACTION_DRAGSCROLL; m_dragscrollCurrY = yPos; } } } // in drag'n'drop? #ifdef USE_COVER_DND if( m_window->m_mouseAction == SJ_ACTION_DRAGNDROP ) { if( !g_mainFrame->DragNDrop(SJ_DND_MOVE, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) ) { m_window->m_mouseAction = SJ_ACTION_NONE; } } #endif // in dragscroll? if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { oldScrollY = m_scrollY; oldRowIndex = m_applRowIndex; // horizontal scrolling vDifference = yPos - m_dragscrollCurrY; m_dragscrollCurrY = yPos; if( vDifference ) { if( vDifference > m_coverNTitleHeight ) { vDifference = m_coverNTitleHeight; } else if( vDifference < 0 - m_coverNTitleHeight ) { vDifference = 0 - m_coverNTitleHeight; } m_scrollY -= vDifference; if( m_scrollY < 0 ) { // decrease application column position if possible if( m_applRowIndex > 0 ) { m_scrollY += m_coverNTitleHeight + SPACE_TOP; m_applRowIndex--; CalcPositions(); SetVScrollInfo(); } else { m_scrollY = 0; } } else if( m_scrollY >= m_coverNTitleHeight + SPACE_TOP ) { // increase application column position if possible if( m_applRowIndex < m_applRowCount-m_coversYCount ) { m_scrollY -= m_coverNTitleHeight + SPACE_TOP; m_applRowIndex++; CalcPositions(); SetVScrollInfo(); } else { m_scrollY = m_coverNTitleHeight + SPACE_TOP; } } else if( (m_allocatedCoverCount/m_coversXCount)*(m_coverNTitleHeight+SPACE_TOP)-m_scrollY < m_window->m_clientH ) { // a new column will fit on the right if( m_applRowIndex+m_coversYCount < m_applRowCount ) { CalcPositions(); } } } // update window if( vDifference ) { if( g_mainFrame->m_imgThread->HasWaitingImages() ) { // if there are waiting images, invalidate the whole rectangle as // some areas are no yet okay m_window->Refresh(); } else { vDifference = (oldRowIndex*(m_coverNTitleHeight+SPACE_TOP) + oldScrollY) - (m_applRowIndex*(m_coverNTitleHeight+SPACE_TOP) + m_scrollY); wxRect scrollRect = SCROLL_RECT; m_window->ScrollWindow(0, vDifference, &scrollRect); m_window->Update(); } } } } void SjCoverBrowser::OnMouseWheel(wxMouseEvent& event, bool scrollVert) { if( scrollVert ) { // add multiple small rotations (smaller than the delta to take action) to bigger ones static SjWheelHelper s_coverBrowserWheelHelper; long rotateCovers, dir; s_coverBrowserWheelHelper.PushRotationNPopAction(event, rotateCovers, dir); if( rotateCovers != 0 ) { OnVScroll(IDT_WORKSPACE_V_SCROLL, m_applRowIndex + rotateCovers*dir*-1, TRUE/*redraw*/); } } } void SjCoverBrowser::OnDropImage(SjDataObject* data, int mouseX, int mouseY) { SjCol* cover; long found = FindCover(mouseX, mouseY, &cover); if( found == FOUND_COVER && cover->m_rowCount > 0 ) { if( cover->m_rows[0]->OnDropData(data) ) { Realize(false, true /*keep col index*/); m_window->Refresh(); m_window->Update(); } } } void SjCoverBrowser::OnContextMenu(int clickX, int clickY) { SjMenu mainMenu(0); SjCol* cover; long found = FindCover(clickX, clickY, &cover); if( found == FOUND_COVER && cover->m_rowCount > 0 && cover->m_rows[0]->m_roughType == SJ_RRTYPE_COVER ) { // select the item under the mouse if( cover->FindFirstSelectedRow() == NULL ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); SelectAllRows(cover); RefreshSelection(); } m_lastClickedCover = cover; cover->m_rows[0]->CreateContextMenu(mainMenu); } else { m_lastClickedCover = NULL; } // add main items to menu g_mainFrame->CreateContextMenu_(mainMenu); // show menu if( mainMenu.GetMenuItemCount() ) { m_window->PopupMenu(&mainMenu); } } #define IDC_L_FIRST (IDM_LASTPRIVATE-17) // range start #define IDC_L_SHOWLEADARTISTNAME (IDM_LASTPRIVATE-12) #define IDC_L_SHOWALBUMNAME (IDM_LASTPRIVATE-8) #define IDC_L_SHOWYEAR (IDM_LASTPRIVATE-5) #define IDC_L_LAST (IDM_LASTPRIVATE-1) // range end void SjCoverBrowser::OnContextMenuSelect(int id) { if( id >= IDC_L_FIRST && id <= IDC_L_LAST ) { long flags = g_mainFrame->m_libraryModule->GetFlags(); if( id == IDC_L_SHOWLEADARTISTNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWLEADARTISTNAME); } if( id == IDC_L_SHOWALBUMNAME ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWALBUMNAME); } if( id == IDC_L_SHOWYEAR ) { SjTools::ToggleFlag(flags, SJ_LIB_SHOWYEAR); } g_mainFrame->m_libraryModule->SetFlags(flags); g_mainFrame->m_browser->RefreshAll(); UpdateItemsInColMenu(g_mainFrame->m_viewMenu); } else if( m_lastClickedCover ) { m_lastClickedCover->m_rows[0]->OnContextMenu(id); } } wxRect SjCoverBrowser::GetToolTipRect(int mouseX, int mouseY) { wxRect retRect; SjCol* cover; long found = FindCover(mouseX, mouseY, &cover, &retRect); if( found == FOUND_COVER || found == FOUND_COVER_ARROW ) { ; // rect is set up by FindRow } else { retRect.x = -1000; retRect.y = -1000; retRect.width = 1; retRect.height = 1; } return retRect; } wxString SjCoverBrowser::GetToolTipText(int mouseX, int mouseY, long &flags) { wxString retString; SjCol* cover; long found = FindCover(mouseX, mouseY, &cover); if( found == FOUND_COVER ) { if( cover != m_lastTooltipCover ) { for( int r = 0; r < cover->m_rowCount; r++ ) { SjRow* row = cover->m_rows[r]; if( row && (row->m_roughType == SJ_RRTYPE_TITLE1 || row->m_roughType == SJ_RRTYPE_TITLE2) ) { if( !retString.IsEmpty() ) retString += wxT("\n"); retString += row->m_textm; } } m_lastTooltipCover = cover; } } else { if( found == FOUND_COVER_ARROW ) { retString = _("Show cover titles"); } m_lastTooltipCover = NULL; } retString.Replace(wxT("\t"), wxT("")); // TAB is used for hiliting return retString; } void SjCoverBrowser::AddItemsToColMenu(SjMenu* m) { m->AppendSeparator(); m->AppendCheckItem(IDC_L_SHOWLEADARTISTNAME, _("Artist")); m->AppendCheckItem(IDC_L_SHOWALBUMNAME, _("Album")); m->AppendCheckItem(IDC_L_SHOWYEAR, _("Year")); UpdateItemsInColMenu(m); } void SjCoverBrowser::UpdateItemsInColMenu(SjMenu* m) { long flags = g_mainFrame->m_libraryModule->GetFlags(); m->Check(IDC_L_SHOWLEADARTISTNAME, (flags&SJ_LIB_SHOWLEADARTISTNAME)!=0); m->Check(IDC_L_SHOWALBUMNAME, (flags&SJ_LIB_SHOWALBUMNAME)!=0); m->Check(IDC_L_SHOWYEAR, (flags&SJ_LIB_SHOWYEAR)!=0); } long SjCoverBrowser::FindCover(long xPos, long yPos, SjCol** retCover, wxRect* retRect) { int c; SjCol* col; yPos += m_scrollY; *retCover = NULL; wxRect dummy; if(retRect==NULL) retRect = &dummy; for( c = 0; c < m_allocatedCoverCount; c++ ) { col = m_allocatedCover[c]; if( col ) { if( xPos >= col->m_textlLeft && xPos < col->m_textlRight && yPos >= col->m_top && yPos < col->m_bottom ) { *retCover = col; retRect->x = col->m_textlLeft; retRect->y = col->m_top - m_scrollY; retRect->width = g_mainFrame->m_currCoverWidth; retRect->height = m_coverNTitleHeight; return FOUND_COVER; } } } yPos -= m_scrollY; if( xPos >= 0 && xPos < SPACE_LEFT && yPos >= SPACE_TOP && yPos < SPACE_TOP+m_fontHeight && g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) ) { retRect->x = 0; retRect->y = SPACE_TOP; retRect->width = SPACE_LEFT; retRect->height = m_fontHeight; return FOUND_COVER_ARROW; } return FOUND_NOTHING; } /******************************************************************************* * selection handling & scrolling ******************************************************************************/ bool SjCoverBrowser::OnSkinTargetEvent(int targetId, SjSkinValue& value, long accelFlags) { bool shiftSelection = g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE)? ((accelFlags&wxACCEL_SHIFT)!=0) : false; m_preservedVisible.Clear(); //bool shiftSelection = g_mainFrame->IsAllAvailable()? ((accelFlags&wxACCEL_SHIFT)!=0) : false; if( targetId >= IDT_WORKSPACE_GOTO_A && targetId <= IDT_WORKSPACE_GOTO_0_9 ) { g_visModule->StopVisIfOverWorkspace(); g_mainFrame->EndSimpleSearch(); if( !GotoCover(g_mainFrame->m_columnMixer.GetMaskedColIndexByAz(targetId)) ) CalcPositions(); // needed to reset a-z m_window->SetFocus(); return true; } else switch( targetId ) { case IDT_WORKSPACE_GOTO_RANDOM: g_visModule->StopVisIfOverWorkspace(); g_mainFrame->EndSimpleSearch(); GotoCover(SjTools::Rand(g_mainFrame->m_columnMixer.GetMaskedColCount()), true); m_window->SetFocus(); return true; case IDT_WORKSPACE_KEY_LEFT: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_LEFT, shiftSelection); return true; case IDT_WORKSPACE_KEY_RIGHT: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_RIGHT, shiftSelection); return true; case IDT_WORKSPACE_KEY_UP: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_UP, shiftSelection); return true; case IDT_WORKSPACE_KEY_DOWN: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_DOWN, shiftSelection); return true; case IDT_WORKSPACE_V_SCROLL: case IDT_WORKSPACE_LINE_UP: case IDT_WORKSPACE_LINE_DOWN: case IDT_WORKSPACE_PAGE_UP: case IDT_WORKSPACE_PAGE_DOWN: case IDT_WORKSPACE_HOME: // the search should stay "as is" case IDT_WORKSPACE_END: OnVScroll(targetId, value.value, TRUE /*redraw*/); return true; case IDT_WORKSPACE_PAGE_LEFT: // this is only accessible for explicit page left/right buttons as used in the "Old-style Jukebox" OnVScroll(IDT_WORKSPACE_PAGE_UP, 0, TRUE /*redraw*/); return true; case IDT_WORKSPACE_PAGE_RIGHT: // this is only accessible for explicit page left/right buttons as used in the "Old-style Jukebox" OnVScroll(IDT_WORKSPACE_PAGE_DOWN, 0, TRUE /*redraw*/); return true; case IDT_WORKSPACE_ENTER: if( FindFirstSelectedCover() ) ToggleView(); return true; } return false; } bool SjCoverBrowser::OnVScroll(int nScrollCode, int nPos, bool redraw) { wxASSERT( nScrollCode == IDT_WORKSPACE_V_SCROLL || nScrollCode == IDT_WORKSPACE_LINE_UP || nScrollCode == IDT_WORKSPACE_LINE_DOWN || nScrollCode == IDT_WORKSPACE_PAGE_UP || nScrollCode == IDT_WORKSPACE_PAGE_DOWN || nScrollCode == IDT_WORKSPACE_HOME || nScrollCode == IDT_WORKSPACE_END ); long newIndex = m_applRowIndex, oldIndex, abs; bool canUseScroll; if( nScrollCode == IDT_WORKSPACE_HOME ) { newIndex = 0; } else if( nScrollCode == IDT_WORKSPACE_END ) { newIndex = m_applRowCount; // sth. substracted below } else if( nScrollCode == IDT_WORKSPACE_LINE_UP ) { newIndex--; } else if( nScrollCode == IDT_WORKSPACE_LINE_DOWN ) { newIndex++; } else if( nScrollCode == IDT_WORKSPACE_PAGE_UP ) { newIndex -= m_coversYCount; } else if( nScrollCode == IDT_WORKSPACE_PAGE_DOWN ) { newIndex += m_coversYCount; } else if( nScrollCode == IDT_WORKSPACE_V_SCROLL ) { newIndex = nPos; } if( newIndex > m_applRowCount-m_coversYCount ) { newIndex = m_applRowCount-m_coversYCount; // may get below zero, this is checked below } if( newIndex < 0 ) { newIndex = 0; } if( (newIndex != m_applRowIndex) || (newIndex == 0 && m_scrollY != 0) ) { oldIndex = m_applRowIndex; canUseScroll = TRUE; if( newIndex == 0 ) { m_scrollY = 0; canUseScroll = FALSE; } m_applRowIndex = newIndex; CalcPositions(); SetVScrollInfo(); abs = oldIndex - newIndex; if( abs < 0 ) { abs*=-1; } if( abs > m_coversYCount ) { canUseScroll = FALSE; } if( canUseScroll ) { if( g_mainFrame->m_imgThread->HasWaitingImages() ) { canUseScroll = FALSE; } } if( redraw ) { if( canUseScroll ) { wxRect scrollRect = SCROLL_RECT; m_window->ScrollWindow(0, (oldIndex - newIndex)*(m_coverNTitleHeight + SPACE_TOP), &scrollRect); m_window->Update(); } else { m_window->Refresh(); } return true; } } return false; } void SjCoverBrowser::SetVScrollInfo() { // this function set the horzontal scrollbar information according to // the max. visible columns in bs->visibleColCount and to the // number of total columns in bs->applColCount SjSkinValue value; value.value = m_applRowIndex; value.vmax = m_applRowCount; value.thumbSize = m_coversYCount; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_V_SCROLL, value); } bool SjCoverBrowser::GotoCover(long offset, bool selectOneInRow) { m_scrollY = 0; bool sthChanged = OnVScroll(IDT_WORKSPACE_V_SCROLL, offset/m_coversXCount, FALSE/*redraw*/); if( selectOneInRow ) // only used by "goto random" { int randMax = m_coversXCount; if( randMax > m_allocatedCoverCount ) randMax = m_allocatedCoverCount; SjCol* currCover = m_allocatedCover[SjTools::Rand(randMax)]; if( currCover ) { g_mainFrame->m_columnMixer.SelectAll(false); SelectAllRows(currCover); } } SetVScrollInfo(); m_window->Refresh(); m_window->Update(); return sthChanged; } bool SjCoverBrowser::DoChangeSelection(long dir, bool shiftSelection) { bool ret = false; int currCoverIndex, currCoverX, currCoverY; // get the currently selected cover SjCol* currCover = FindFirstSelectedCover(&currCoverIndex); if( currCover == NULL ) { // no selected cover in view -> use the first one if( m_allocatedCoverCount <= 0 ) goto Cleanup; currCoverIndex = 0; currCover = m_allocatedCover[0]; } // calulate the x and the y position from the index if( m_coversXCount <= 0 ) goto Cleanup; currCoverY = currCoverIndex / m_coversXCount; currCoverX = currCoverIndex % m_coversXCount; // correct the X and Y values to the new position if( dir == SJ_SEL_UP ) { if( currCoverY == 0 || (currCoverY == 1 && m_scrollY>30) ) { OnVScroll(IDT_WORKSPACE_LINE_UP, 0, false); } else { currCoverY--; } } else if( dir == SJ_SEL_DOWN ) { if( currCoverY == (m_coversYCount-1) ) { OnVScroll(IDT_WORKSPACE_LINE_DOWN, 0, false); } else { currCoverY++; } } else if( dir == SJ_SEL_LEFT ) { if( currCoverX == 0 ) goto Cleanup; currCoverX--; } else if( dir == SJ_SEL_RIGHT ) { if( currCoverX == (m_coversXCount-1) ) goto Cleanup; currCoverX++; } else { goto Cleanup; } // calculate the new index from the X/Y values currCoverIndex = (currCoverY * m_coversXCount) + currCoverX; if( currCoverIndex < 0 || currCoverIndex >= m_allocatedCoverCount || m_allocatedCover[currCoverIndex] == NULL ) goto Cleanup; // do select the new cover currCover = m_allocatedCover[currCoverIndex]; g_mainFrame->m_columnMixer.SelectAll(false); SelectAllRows(currCover); // success ret = true; // cleanup - always do a redraw as we do some scrolling and "errors" may occur afterwards Cleanup: m_window->Refresh(); m_window->Update(); return ret; } bool SjCoverBrowser::GotoUrl(const wxString& url) { bool ret = FALSE; long colIndex; SjCol* col = g_mainFrame->m_columnMixer.GetMaskedCol(url, colIndex); if( col ) { delete col; // check index col = NULL; if( colIndex >= 0 ) { // goto column m_scrollY = 0; OnVScroll(IDT_WORKSPACE_V_SCROLL, colIndex/m_coversXCount, FALSE/*redraw*/); SetVScrollInfo(); // select the correct row g_mainFrame->m_columnMixer.SelectAll(FALSE); for( colIndex = 0; colIndex < m_allocatedCoverCount; colIndex++ ) { col = m_allocatedCover[colIndex]; if( col ) { for( int rowIndex = 0; rowIndex < col->m_rowCount; rowIndex++ ) { SjRow* row = col->m_rows[rowIndex]; if( row->m_url == url ) { if( row->IsSelectable()==2 ) { row->Select(TRUE); } ret = TRUE; // URL found! } } } } m_window->Refresh(); m_window->Update(); } } return ret; } SjCol* SjCoverBrowser::FindFirstSelectedCover(int* retIndex) { for( int i = 0; i < m_allocatedCoverCount; i++ ) { if( m_allocatedCover[i] ) { if( m_allocatedCover[i]->FindFirstSelectedRow() ) { if( retIndex ) *retIndex = i; return m_allocatedCover[i]; } } } return NULL; } wxString SjCoverBrowser::GetFirstVisiblePos() { if( !m_preservedVisible.IsEmpty() ) return m_preservedVisible; if( m_allocatedCoverCount && m_allocatedCover[0] ) { SjRow* row = m_allocatedCover[0]->FindSelectableRow(); if( row ) return row->m_url; } return wxEmptyString; } wxString SjCoverBrowser::GetFirstSelectedOrVisiblePos(long& retViewOffset) { retViewOffset = 0; SjCol* cover = FindFirstSelectedCover(); if( cover == NULL ) return GetFirstVisiblePos(); SjRow* row = cover->FindFirstSelectedRow(); if( row ) return row->m_url; return wxEmptyString; } void SjCoverBrowser::GotoPos(const wxString& guid, long viewOffset) { m_preservedVisible = guid; long colIndex; SjCol* col = g_mainFrame->m_columnMixer.GetMaskedCol(guid, colIndex); if( col ) { delete col; // check index col = NULL; if( colIndex >= 0 ) { // goto column m_scrollY = 0; OnVScroll(IDT_WORKSPACE_V_SCROLL, colIndex/m_coversXCount, FALSE/*redraw*/); SetVScrollInfo(); } } } /******************************************************************************* * Painting the window ******************************************************************************/ void SjCoverBrowser::CalcRowStuff() { long minXSpace = g_mainFrame->m_currColumnXSpace; if( g_mainFrame->m_currColumnYSpace < g_mainFrame->m_currColumnXSpace ) minXSpace = g_mainFrame->m_currColumnYSpace; // calculate the number of columns that can be displayed currently m_coversXCount = (m_window->m_clientW - SPACE_LEFT) / (g_mainFrame->m_currCoverWidth + minXSpace); if( m_coversXCount <= 0 ) m_coversXCount = 1; m_coverXSpace = (m_window->m_clientW - SPACE_LEFT - (m_coversXCount*g_mainFrame->m_currCoverWidth)) / m_coversXCount; // calculate the number of rows that can be displayed currently m_coversYCount = (m_window->m_clientH - SPACE_TOP) / (m_coverNTitleHeight + SPACE_TOP); if( m_coversYCount <= 0 ) m_coversYCount = 1; // calculate the current and the max. row index m_applRowCount = m_applCoverCount / m_coversXCount; if( (m_applCoverCount%m_coversXCount) != 0 ) m_applRowCount++; } #define ADD_ROWS 2 void SjCoverBrowser::CalcPositions() { // free all previously allocated objects FreeAllocatedCol(); wxClientDC dc(m_window); int dummy2; m_window->GetFontPxSizes(dc, m_fontVDiff, dummy2, m_fontHeight); m_coverNTitleHeight = g_mainFrame->m_currCoverHeight; m_linesBelowCover = 0; if( m_flags&SJ_BROWSER_VIEW_COVER ) { m_coverNTitleHeight += m_fontHeight; m_linesBelowCover++; if( g_mainFrame->m_libraryModule && g_mainFrame->m_libraryModule->DefTitleCount()>1 ) { m_coverNTitleHeight += m_fontHeight; m_linesBelowCover++; } } CalcRowStuff(); if( m_applRowIndex >= (m_applRowCount-m_coversYCount) && m_applRowCount >= m_coversYCount ) m_applRowIndex = (m_applRowCount-m_coversYCount); // m_applRowCount and m_coversYCount may have changed, cut large index // allocated the space to hold all columns long maxIndex = m_coversXCount * (m_coversYCount+ADD_ROWS/*add. row atop/abottom*/); long bytesNeeded = maxIndex * sizeof(SjCol*); m_allocatedCover = (SjCol**)malloc(bytesNeeded); memset(m_allocatedCover, 0, bytesNeeded); // get the columns and calculate the positions long currIndex = m_applRowIndex*m_coversXCount; long currRow = 0; long currCol = 0; int setAzTo = 'a'; SjCol* col; while( 1 ) { if( currIndex >= m_applCoverCount || m_allocatedCoverCount >= maxIndex ) { break; // no more columns } int top = g_mainFrame->m_currColumnYSpace + currRow*(m_coverNTitleHeight+g_mainFrame->m_currColumnYSpace); // if the y-position is out-of-view, we're done if( top >= m_window->m_clientH + m_scrollY ) { break; } // allocate the columns col = g_mainFrame->m_columnMixer.GetMaskedCol(currIndex); m_allocatedCover[m_allocatedCoverCount++] = col; // calculate the column position if( col ) { if( currRow==0 ) { setAzTo = col->m_az; // use the last letter of the first row; this is to avoid // selecting the "wrong" letter if the user clicks onto one // of the a-z buttons (remember, we do not use the exact cover offset!) } // calculate the top/bottom positions col->m_top = top; col->m_bottom = top + m_coverNTitleHeight; // calculate the left/right positions col->m_textlLeft = SPACE_LEFT + currCol*(g_mainFrame->m_currCoverWidth+m_coverXSpace); col->m_textlRight = col->m_textlLeft + g_mainFrame->m_currCoverWidth; } // prepare for next currIndex++; currCol++; if( currCol >= m_coversXCount ) { currCol = 0; currRow++; } } g_mainFrame->SetSkinAzValues(setAzTo); } void SjCoverBrowser::OnSize(wxSizeEvent& event) { CalcPositions(); SetVScrollInfo(); } void SjCoverBrowser::OnImageThere(SjImageThereEvent& event) { SjImgThreadObj* obj = event.GetObj(); int c, r; SjCol* applCol; SjRow* applRow; wxASSERT(obj); for( c = 0; c < m_allocatedCoverCount; c++ ) { applCol = m_allocatedCover[c]; if( applCol ) { for( r = 0; r < applCol->m_rowCount; r++ ) { applRow = applCol->m_rows[r]; if( applRow->m_roughType == SJ_RRTYPE_COVER ) { if( obj->m_url == applRow->m_textm ) { wxClientDC dc(m_window); m_window->PaintCover(dc, obj, applCol->m_textlLeft, applCol->m_top - m_scrollY); } break; // break out of inner loop; // continue searching rows that need this // image in the outer loop } } } } g_mainFrame->m_imgThread->ReleaseImage(m_window, obj); } void SjCoverBrowser::DoPaint(wxDC& dc) { long x, y, w, h; #define SPACE_BRUSH g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush // reset required and waiting images g_mainFrame->m_imgThread->RequireStart(m_window); // draw stuff very left (does not scroll) dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(SPACE_BRUSH); dc.DrawRectangle(0, 0, SPACE_LEFT, m_window->m_clientH); dc.SetClippingRegion(wxRect(0, 0, SPACE_LEFT-SEL_BORDER_W, m_window->m_clientH)); w = m_fontHeight - 4; h = m_fontHeight - 4; x = (SPACE_LEFT-w) / 2; y = SPACE_TOP + 2; dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_TITLE1].fgPen); SjTools::DrawIcon(dc, wxRect(x, y, w, h), (m_flags&SJ_BROWSER_VIEW_COVER)? SJ_DRAWICON_TRIANGLE_DOWN : SJ_DRAWICON_TRIANGLE_RIGHT); if( g_mainFrame->m_libraryModule ) m_window->DrawUpText(dc, g_mainFrame->m_libraryModule->GetUpText(), 0, SPACE_TOP+m_fontHeight, SPACE_LEFT, m_window->m_clientH-(SPACE_TOP+m_fontHeight)); dc.DestroyClippingRegion(); // draw space atop of all covers long currY = -m_scrollY; dc.SetBrush(SPACE_BRUSH); dc.SetPen(*wxTRANSPARENT_PEN); dc.DrawRectangle(SPACE_LEFT, currY, m_window->m_clientW, g_mainFrame->m_currColumnYSpace); // go through all cover rows int coverIndex = 0; currY += g_mainFrame->m_currColumnYSpace; for( int yIndex = 0; yIndex < m_coversYCount+ADD_ROWS/*try two rows more*/; yIndex++ ) { // go through all cover columns long currX = SPACE_LEFT; for( int xIndex = 0; xIndex < m_coversXCount; xIndex++ ) { bool selectCover = false, coverDrawn = false, borderBottom = true; if( coverIndex < m_allocatedCoverCount ) { SjCol* cover = m_allocatedCover[coverIndex++]; if( cover && cover->m_rowCount>0 && cover->m_rows[0]->m_roughType==SJ_RRTYPE_COVER ) { SjImgThreadObj* cachedImg = m_window->RequireImage(cover->m_rows[0]->m_textm); // cachedImg may be NULL, but this is okay for PaintCover() and for ReleaseImage() m_window->PaintCover(dc, cachedImg, currX, currY); g_mainFrame->m_imgThread->ReleaseImage(m_window, cachedImg); coverDrawn = true; selectCover = cover->FindFirstSelectedRow()!=NULL; // draw text below cover if( m_flags&SJ_BROWSER_VIEW_COVER ) { // get text wxString texts[2]; int trackCount = 0; for( int r = 0; r < cover->m_rowCount; r++ ) { SjRow* row = cover->m_rows[r]; if( row ) { if( row->m_roughType == SJ_RRTYPE_TITLE1 || row->m_roughType == SJ_RRTYPE_TITLE2 ) { if( texts[0].IsEmpty() ) texts[0] = row->m_textm; else texts[1] = row->m_textm; } else if( row->m_roughType == SJ_RRTYPE_NORMAL ) { trackCount ++; } } } if( texts[0].IsEmpty() ) { texts[0].Printf(_("%s tracks"), SjTools::FormatNumber(trackCount).c_str()); } // draw text for( int i=0; i<m_linesBelowCover; i++ ) { wxRect drawRect(currX, currY+g_mainFrame->m_currCoverHeight+m_fontHeight*i, g_mainFrame->m_currCoverWidth, m_fontHeight); SjSkinColour* bgcolour = &g_mainFrame->m_workspaceColours[selectCover? SJ_COLOUR_SELECTIONODD : SJ_COLOUR_NORMAL]; SjSkinColour* fgcolour = &g_mainFrame->m_workspaceColours[selectCover? SJ_COLOUR_SELECTIONODD : (i==0?SJ_COLOUR_TITLE1:SJ_COLOUR_TITLE2)]; wxFont* stdFont = i==0? &g_mainFrame->m_currBoldFont : &g_mainFrame->m_currStdFont; wxFont* smallFont = i==0? &g_mainFrame->m_currSmallBoldFont : &g_mainFrame->m_currSmallFont; dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(bgcolour->bgBrush); dc.DrawRectangle(drawRect); dc.SetTextBackground(fgcolour->bgColour); dc.SetTextForeground(fgcolour->fgColour); g_tools->DrawSingleLineText(dc, texts[i], drawRect, *stdFont, *smallFont, NULL, fgcolour->hiColour); if( selectCover ) borderBottom = false; } } } } if( !coverDrawn ) { // draw space instead of cover (normally this happens if this are the last covers) dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(currX-SEL_BORDER_W, currY-SEL_BORDER_W, g_mainFrame->m_currCoverWidth+SEL_BORDER_W*2, m_coverNTitleHeight+SEL_BORDER_W*2); } else { // draw the (selection) border SjSkinColour* colour = &g_mainFrame->m_workspaceColours[selectCover? SJ_COLOUR_SELECTIONODD : SJ_COLOUR_NORMAL]; dc.SetPen(colour->bgPen); dc.SetBrush(*wxTRANSPARENT_BRUSH); for( int i = 1; i <= SEL_BORDER_W; i++ ) { dc.DrawRectangle(currX-i, currY-i, g_mainFrame->m_currCoverWidth+i*2, m_coverNTitleHeight+i*(borderBottom?2:1)); if( !borderBottom ) { dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgPen); y = currY+m_coverNTitleHeight+i-1; dc.DrawLine(currX-SEL_BORDER_W, y, currX+g_mainFrame->m_currCoverWidth+SEL_BORDER_W, y); dc.SetPen(colour->bgPen); } } } // draw space aright of the cover x = currX+g_mainFrame->m_currCoverWidth+SEL_BORDER_W; y = currY-SEL_BORDER_W; h = m_coverNTitleHeight+SEL_BORDER_W*2; w = m_coverXSpace-SEL_BORDER_W*2; if( xIndex == m_coversXCount-1 ) w = m_window->m_clientW-(currX+g_mainFrame->m_currCoverWidth+SEL_BORDER_W); if( w > 0 ) { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(SPACE_BRUSH); dc.DrawRectangle(x, y, w, h); } // next cover in row currX += g_mainFrame->m_currCoverWidth+m_coverXSpace; } // draw space below this cover row x = SPACE_LEFT-SEL_BORDER_W; y = currY+m_coverNTitleHeight+SEL_BORDER_W; w = m_window->m_clientW-x; h = g_mainFrame->m_currColumnYSpace-SEL_BORDER_W*2; if( yIndex == (m_coversYCount-1)+ADD_ROWS /*we've added 2 in the for() loop, so no -1 here*/ ) h = m_window->m_clientH-(currY+m_coverNTitleHeight+SEL_BORDER_W); if( h > 0 ) { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(SPACE_BRUSH); dc.DrawRectangle(x, y, w, h); } // next row currY += m_coverNTitleHeight+g_mainFrame->m_currColumnYSpace; } // free all images that are no longer required but still waiting g_mainFrame->m_imgThread->RequireEnd(m_window); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser_cover.h��������������������������������������������������������0000664�0000000�0000000�00000012147�12660066715�0021074�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser_cover.h * Authors: Björn Petersen * Purpose: Silverjuke cover browser * ******************************************************************************/ #ifndef __SJ_BROWSER_COVER_H__ #define __SJ_BROWSER_COVER_H__ class SjCoverBrowser : public SjBrowserBase { public: // this is a pure-virtual base class defining a browser view SjCoverBrowser (SjBrowserWindow*); // Exit() is be called sooner than the destructor is called for save-freeing pointers. void Exit (); // called to show the browser, after this function is called // the derived class should be ready to process paint events! void Realize (bool reloadColumnMixer, bool keepColIndex); // mouse handling void OnMouseLeftDown (wxMouseEvent& event); void OnMouseLeftUp (wxMouseEvent& event); void OnMouseCaptureLost (wxMouseCaptureLostEvent& event); bool OnMouseLeftDClick (wxMouseEvent& event); void OnMouseMiddleUp (wxMouseEvent& event); void OnMouseMotion (wxMouseEvent& event); void OnMouseWheel (wxMouseEvent& event, bool scrollVert); void OnDropImage (SjDataObject* data, int mouseX, int mouseY); void OnContextMenu (int clickX, int clickY); void OnContextMenuSelect (int id); wxRect GetToolTipRect (int mouseX, int mouseY); wxString GetToolTipText (int mouseX, int mouseY, long &flags); void AddItemsToColMenu (SjMenu*); void UpdateItemsInColMenu(SjMenu*); // selection handling & scrolling bool OnSkinTargetEvent (int targetId, SjSkinValue& value, long accelFlags); // return true if the key/the event was used bool DoChangeSelection (long dir, bool shiftSelection); void RefreshSelection () { m_window->Refresh(); } bool GotoUrl (const wxString& url); void GotoPos (const wxString& guid, long viewOffset); wxString GetFirstVisiblePos (); wxString GetFirstSelectedOrVisiblePos(long& retViewOffset); // do paint the window, paint-related events void DoPaint (wxDC&); void OnSize (wxSizeEvent& event); void OnImageThere (SjImageThereEvent& event); private: // positions void CalcPositions (); long m_coverXSpace; long m_coversXCount, m_coversYCount; SjCol* FindFirstSelectedCover(int* index=NULL); // loaded data void FreeAllocatedCol (); long m_allocatedCoverCount; SjCol** m_allocatedCover; // scrolling bool OnVScroll (int nScrollCode, int nPos, bool redraw); // returns true if sth. was changed void SetVScrollInfo (); bool GotoCover (long offset, bool selectOneInRow=false); // misc void SelectAllRows (SjCol*) const; long m_applCoverCount; // the real number of colums (covers for us) available by SjColumnMixer::GetMaskedCol() void CalcRowStuff(); long m_applRowIndex, m_applRowCount; int m_fontHeight, m_fontVDiff; long m_scrollY; // always positive and always smaller than g_mainFrame->m_currCoverWidth - g_mainFrame->m_currColumnXSpace #define FOUND_NOTHING 0 #define FOUND_COVER 1 #define FOUND_COVER_ARROW 2 long FindCover (long xPos, long yPos, SjCol** retCover, wxRect* retRect=NULL); void ToggleView (); long m_coverNTitleHeight; // may be equal to g_mainFrame->m_currCoverHeight in the easiest case long m_linesBelowCover; // mouse SjCol* m_lastClickedCover; SjCol* m_lastTooltipCover; long m_dragStartX, m_dragStartY; long m_dragscrollCurrY; bool m_mouseSelectionOnDown; void OnMouseSelect(wxMouseEvent& event); wxString m_preservedVisible; }; #endif // __SJ_BROWSER_COVER_H__ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser_list.cpp�������������������������������������������������������0000664�0000000�0000000�00000165364�12660066715�0021276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser_list.cpp * Authors: Björn Petersen * Purpose: Silverjuke list browser * ******************************************************************************/ #include <sjbase/base.h> #include <sjtools/imgthread.h> #include <sjbase/browser.h> #include <sjbase/browser_list.h> #include <sjbase/columnmixer.h> #include <sjmodules/kiosk/kiosk.h> #include <sjmodules/kiosk/virtkeybd.h> #include <sjmodules/vis/vis_module.h> /******************************************************************************* * SjListBrowser ******************************************************************************/ #define SPACE_TOP (g_mainFrame->m_currColumnYSpace) #define SPACE_LEFT (g_mainFrame->m_currColumnXSpace) #define SPACE_MID (g_mainFrame->m_currColumnYSpace) #define MIN_COLUMN_WIDTH 32 #define MAX_COLUMN_WIDTH 2048 static const long s_possibleCols[] = { SJ_TI_TRACKNAME ,SJ_TI_PLAYTIMEMS ,SJ_TI_LEADARTISTNAME ,SJ_TI_ORGARTISTNAME ,SJ_TI_COMPOSERNAME ,SJ_TI_ALBUMNAME ,SJ_TI_TRACKNR ,SJ_TI_TRACKCOUNT ,SJ_TI_DISKNR ,SJ_TI_DISKCOUNT ,SJ_TI_GENRENAME ,SJ_TI_YEAR ,SJ_TI_GROUPNAME ,SJ_TI_BEATSPERMINUTE ,SJ_TI_RATING ,SJ_TI_COMMENT ,SJ_TI_X_TIMESPLAYED ,SJ_TI_X_LASTPLAYED ,SJ_TI_X_TIMEADDED ,SJ_TI_X_TIMEMODIFIED ,SJ_TI_X_DATABYTES ,SJ_TI_X_BITRATE ,SJ_TI_X_SAMPLERATE ,SJ_TI_X_CHANNELS ,SJ_TI_X_AUTOVOL ,SJ_TI_URL ,SJ_TI_Y_FILETYPE ,SJ_TI_Y_QUEUEPOS ,0 }; static bool isAzPossibleForCol(long ti) { if( ti == SJ_TI_TRACKNAME || ti == SJ_TI_LEADARTISTNAME || ti == SJ_TI_ORGARTISTNAME || ti == SJ_TI_COMPOSERNAME || ti == SJ_TI_ALBUMNAME || ti == SJ_TI_GENRENAME || ti == SJ_TI_GROUPNAME || ti == SJ_TI_COMMENT || ti == SJ_TI_URL || ti == SJ_TI_Y_FILETYPE ) { return true; } return false; } static bool isPossibleCol(long ti) { for( int i = 0; s_possibleCols[i]; i++ ) { if( s_possibleCols[i] == ti ) return true; } return false; } #define IDC_RESET_COL (IDM_LASTPRIVATE-101) #define IDC_FIRST_COL_ID (IDM_LASTPRIVATE-100) #define IDC_LAST_COL_ID (IDM_LASTPRIVATE-1) SjListBrowser::SjListBrowser(SjBrowserWindow* w) : SjBrowserBase(w) { m_listView = NULL; m_scrollPos = 0; m_sortField = SJ_TI_ALBUMNAME; m_sortDesc = false; m_tracksHScroll = 0; m_columnDragIndex = -1; m_lastContextMenuTrackIndex = -1; m_visibleTrackCount = 1; m_tracksNeededToFitCoverHeight = -1; m_lastClickedCover = NULL; LoadConfig(); } void SjListBrowser::FreeAllocatedCover() { int i, iCount = m_allocatedCover.GetCount(); for( i = 0; i < iCount; i++ ) { SjCol* col = (SjCol*)m_allocatedCover[i]; wxASSERT( col ); delete col; } m_allocatedCover.Empty(); m_lastClickedCover = NULL; } void SjListBrowser::LoadConfig() { wxASSERT( m_columns.GetCount() == 0 ); wxASSERT( m_columnWidths.GetCount() == 0 ); wxString data_ = g_tools->m_config->Read(wxT("main/columns"), wxT("")); wxArrayString data = SjTools::Explode(data_, ',', 4); // read sort field long l = 0; int i; if( !data[0].ToLong(&l, 10) ) { l = 0; } if( !isPossibleCol(l) ) goto LoadConfig_Failed; m_sortField = l; if( !data[1].ToLong(&l, 10) ) { l = 0; } m_sortDesc = l!=0; // read columns for( i = 4; i < (int)data.GetCount(); i += 2 ) { if( !data[i].ToLong(&l, 10) ) { l = 0; } if( !isPossibleCol(l) ) goto LoadConfig_Failed; m_columns.Add(l); if( !data[i+1].ToLong(&l, 10) ) { l = 0; } if( l < MIN_COLUMN_WIDTH || l > MAX_COLUMN_WIDTH) l = MIN_COLUMN_WIDTH; m_columnWidths.Add(l); } if( m_columns.GetCount() <= 0 ) goto LoadConfig_Failed; // success return; // error LoadConfig_Failed: InitCols(); } void SjListBrowser::SaveConfig() { wxString data = wxString::Format(wxT("%i,%i,0,0"), (int)m_sortField, m_sortDesc? 1 : 0); for( int i = 0; i < (int)m_columns.GetCount(); i++ ) { data += wxString::Format(wxT(",%i,%i"), (int)m_columns[i], (int)m_columnWidths[i]); } g_tools->m_config->Write(wxT("main/columns"), data); } void SjListBrowser::SetOrder(long sortField, bool desc) { wxBusyCursor busy; if( !isPossibleCol(sortField) ) return; m_sortField = sortField; // this function is also called from extern! m_sortDesc = desc; wxString pos; long posOffset = 0; #define KEEP_POSITION 1 // see http://www.silverjuke.net/forum/viewtopic.php?t=1350 #if KEEP_POSITION pos = GetFirstSelectedAndVisiblePos(posOffset); #endif if( m_listView ) // if m_listView is NULL, the view is not yet realized { m_listView->ChangeOrder(m_sortField, m_sortDesc); CalculatePositions(); if( pos.IsEmpty() ) GotoOffset__(0, 0, false/*select*/, true/*update*/, false/*hscroll*/); else GotoUrl__(pos, posOffset, false/*select*/, true/*update*/, false/*hscroll*/); m_selAnchor = -1; } } void SjListBrowser::SetColumns(const wxArrayLong& newCols) { if( newCols.IsEmpty() ) return; BackupWidths(); m_columns.Clear(); m_columnWidths.Clear(); int i, iCount = newCols.GetCount(); for( i = 0; i < iCount; i++ ) { if( isPossibleCol(newCols[i]) && m_columns.Index(newCols[i]) == wxNOT_FOUND ) { m_columns.Add(newCols[i]); m_columnWidths.Add(GetBackupWidth(newCols[i])); } } if( m_columns.IsEmpty() ) InitCols(); if( m_listView ) // if m_listView is NULL, the view is not yet realized { CalcRefreshNUpdateHeaderNTracks(); } } void SjListBrowser::BackupWidths() { int i, iCount = m_columns.GetCount(); for( i = 0; i < iCount; i++ ) { if( m_columnWidths[i] > 0 ) m_columnBackupWidths.Insert(m_columns[i], m_columnWidths[i]); } } long SjListBrowser::GetBackupWidth(long ti) { long w = m_columnBackupWidths.Lookup(ti); if( w <= 10 ) w = 80; return w; } void SjListBrowser::InitCols() { m_columns.Clear(); m_columnWidths.Clear(); m_columns.Add(SJ_TI_TRACKNR); m_columnWidths.Add(32); m_columns.Add(SJ_TI_TRACKNAME); m_columnWidths.Add(160); m_columns.Add(SJ_TI_PLAYTIMEMS); m_columnWidths.Add(45); m_columns.Add(SJ_TI_LEADARTISTNAME); m_columnWidths.Add(150); m_columns.Add(SJ_TI_ALBUMNAME); m_columnWidths.Add(150); m_columns.Add(SJ_TI_GENRENAME); m_columnWidths.Add(80); m_columns.Add(SJ_TI_YEAR); m_columnWidths.Add(40); m_columns.Add(SJ_TI_X_TIMESPLAYED); m_columnWidths.Add(40); m_columns.Add(SJ_TI_X_LASTPLAYED); m_columnWidths.Add(120); } void SjListBrowser::Exit() { if( m_listView ) delete m_listView; SaveConfig(); ClearTooltips(); FreeAllocatedCover(); } void SjListBrowser::Realize(bool reloadColumnMixer, bool keepColIndex) { // first, calculate the number of rows needed to fit the height of a cover CalculateFontHeight(); long tracksNeededToFitCoverHeight = 0; if( m_flags&SJ_BROWSER_VIEW_COVER ) tracksNeededToFitCoverHeight = (m_coverW / m_fontHeight)+1; if( m_tracksNeededToFitCoverHeight != tracksNeededToFitCoverHeight ) { m_tracksNeededToFitCoverHeight = tracksNeededToFitCoverHeight; reloadColumnMixer = true; } // reload column mixer? if( reloadColumnMixer ) { // for the moment, we have only one list view; for future versions, // this may change (current CD-ROM, Radio Stations etc.) wxBusyCursor busy; //-- I think, this is normally not needed :-) we're fast enough eg. for 30.000 tracks on my machine (always less than 200 ms to create a view) if( m_listView ) delete m_listView; m_listView = g_mainFrame->m_columnMixer.CreateListView(0, m_sortField, m_sortDesc, m_tracksNeededToFitCoverHeight); } if( m_scrollPos >= (m_listView->GetTrackCount()-m_visibleTrackCount) ) m_scrollPos = (m_listView->GetTrackCount()-m_visibleTrackCount); if( m_scrollPos < 0 || !keepColIndex ) m_scrollPos = 0; m_selAnchor = -1; wxASSERT( m_listView ); CalculatePositions(false /*no font height calculation*/); } void SjListBrowser::CalculateFontHeight() { wxClientDC dc(m_window); int dummy2; m_window->GetFontPxSizes(dc, m_fontVDiff, dummy2, m_fontHeight); // map base cover percentage from GetBaseCoverHeight() to the number of lines static const int s_covers[11] = { 3, 3, 4, 4, 5, 5, 6, 6, 7, 7/*def*/, 8 }; int coversIndex = g_mainFrame->GetBaseCoverHeight() / 10; if( coversIndex < 0 ) coversIndex = 0; if( coversIndex > 10 ) coversIndex = 10; m_coverW = m_fontHeight * s_covers[coversIndex]; } void SjListBrowser::CalculatePositions(bool calculateFontHeight) { // calculate the current font height if( calculateFontHeight ) CalculateFontHeight(); // calculate the toggle covers rect int x = 0; m_toggleCoversRect.x = x; m_toggleCoversRect.y = SPACE_TOP; m_toggleCoversRect.width = SPACE_LEFT; m_toggleCoversRect.height = m_fontHeight; // calculate the uptext rect m_uptextRect.x = x; m_uptextRect.y = SPACE_TOP+m_fontHeight; m_uptextRect.width = SPACE_LEFT; m_uptextRect.height = m_window->m_clientH - (SPACE_TOP+m_fontHeight); x += m_uptextRect.width; // calculate the covers rect m_coversRect.x = x; m_coversRect.y = 0; m_coversRect.width = m_coverW; m_coversRect.height = m_window->m_clientH; if( !(m_flags&SJ_BROWSER_VIEW_COVER) ) { m_coversRect.x = -10000; } else { x += m_coversRect.width; } // calculate the playmark rect m_playmarkRect.x = x; m_playmarkRect.y = SPACE_TOP; m_playmarkRect.width = SPACE_MID; m_playmarkRect.height = m_window->m_clientH - SPACE_TOP; x += m_playmarkRect.width; // calculate the header rect m_headerRect.x = x; m_headerRect.y = SPACE_TOP; m_headerRect.width = m_window->m_clientW - m_headerRect.x; m_headerRect.height = m_fontHeight; if( m_headerRect.width < 0 ) { m_headerRect.width = 0; // may get negative on window sizes close to zero; as the horizontal thumb rely on this value, we correct it here } // calculate the tracks rect m_tracksRect.x = m_headerRect.x; m_tracksRect.y = m_headerRect.y + m_headerRect.height; m_tracksRect.width = m_headerRect.width; m_tracksRect.height = m_window->m_clientH - m_tracksRect.y; m_tracksVirtualW = 0; int col, colCount = m_columns.GetCount(); for( col = 0; col < colCount; col ++ ) { m_tracksVirtualW += m_columnWidths[col]; } // get the number of tracks currently visible m_visibleTrackCount = m_tracksRect.height / m_fontHeight; if( m_visibleTrackCount < 1 ) m_visibleTrackCount = 1; // for safety if( m_scrollPos > (m_listView->GetTrackCount()-m_visibleTrackCount) ) { m_scrollPos = (m_listView->GetTrackCount()-m_visibleTrackCount); } if( m_scrollPos < 0 ) { m_scrollPos = 0; } SetVScrollInfo(); // set the horizontal scrollbar if( m_tracksVirtualW <= m_tracksRect.width ) { m_tracksHScroll = 0; } else if( m_tracksHScroll > (m_tracksVirtualW-m_tracksRect.width) ) { m_tracksHScroll = m_tracksVirtualW-m_tracksRect.width; } SetHScrollInfo(); } /******************************************************************************* * Mouse Handling ******************************************************************************/ bool SjListBrowser::MouseInHeader(int x, int y, long& colIndex, bool& inSizer, wxArrayLong* columns, wxArrayLong* widths) { if( columns == NULL ) columns = &m_columns; if( widths == NULL ) widths = &m_columnWidths; #define COLUMNDRAG_WIDTH 10L #define COLUMNDRAG_OVERHANG 2L // the number of pixels in the next column colIndex = 0; inSizer = false; if( x >= m_headerRect.x && x < m_headerRect.x+m_headerRect.width && y >= m_headerRect.y && y < m_headerRect.y+m_headerRect.height ) { int currLeft = m_headerRect.x - m_tracksHScroll, currRight; int col, colCount = columns->GetCount(); for( col = 0; col < colCount; col ++ ) { currRight = currLeft + widths->Item(col) + COLUMNDRAG_OVERHANG; if( x >= currLeft && x < currRight ) { if( x > currRight - COLUMNDRAG_WIDTH ) inSizer = true; colIndex = col; return true; } currLeft = currRight - COLUMNDRAG_OVERHANG; } } return false; } bool SjListBrowser::MouseInTrack(int x, int y, long& offset) { if( m_listView && x >= m_tracksRect.x && x < m_tracksRect.x+m_tracksRect.width && y >= m_tracksRect.y && y < m_tracksRect.y+m_tracksRect.height ) { long relOffset = (y-m_tracksRect.y) / m_fontHeight; offset = relOffset + m_scrollPos; if( offset >= 0 && offset < m_listView->GetTrackCount() ) { int currLeft = m_headerRect.x - m_tracksHScroll, currRight; int col, colCount = m_columns.GetCount(); for( col = 0; col < colCount; col ++ ) { currRight = currLeft + m_columnWidths.Item(col); if( x >= currLeft && x < currRight ) { return (m_listView->GetTrackSpecial(offset)&SJ_LISTVIEW_SPECIAL_GAP)==0; } currLeft = currRight; } } } return false; } bool SjListBrowser::MouseInCover(int x, int y, SjCol** cover) { if( m_listView && x >= m_coversRect.x && x < m_coversRect.x+m_coversRect.width ) { int i, iCount = m_allocatedCover.GetCount(); for( i = 0; i < iCount; i++ ) { SjCol* col = (SjCol*)m_allocatedCover[i]; wxASSERT( col ); if( y >= col->m_rows[0]->m_top && y < col->m_rows[0]->m_top+m_coverW ) { if( cover ) *cover = col; return true; } } } return false; } long SjListBrowser::GetFirstSelectedAndVisible() { long add = (m_tracksRect.height%m_fontHeight)==0? 0 : 1; long listViewTrackCount = m_listView->GetTrackCount(); for( long i = 0; i < m_visibleTrackCount+add; i++ ) { long offset = m_scrollPos+i; if( m_listView && offset >= 0 && offset < listViewTrackCount ) { if( m_listView->IsTrackSelected(offset) ) return offset; } } return -1; // none } long SjListBrowser::GetLastSelectedAndVisible(bool alsoUseGaps) { long overhang = (m_tracksRect.height%m_fontHeight)==0? 0 : 1; long listViewTrackCount = m_listView->GetTrackCount(); for( long i = (m_visibleTrackCount-1)+overhang; i >= 0; i-- ) { long offset = m_scrollPos+i; if( m_listView && offset >= 0 && offset < listViewTrackCount ) { if( m_listView->IsTrackSelected(offset) && (alsoUseGaps || !(m_listView->GetTrackSpecial(offset)&SJ_LISTVIEW_SPECIAL_GAP)) ) { return offset; } } } return -1; // none } void SjListBrowser::SelectRange(long i1, long i2) { long start, end; if( i1 < i2 ) { start = i1; end = i2; } else { start = i2; end = i1; } g_mainFrame->m_columnMixer.SelectAll(false); for( long i = start; i <= end; i++ ) { m_listView->SelectTrack(i, true); } } void SjListBrowser::OnMouseSelect(wxMouseEvent& event) { bool multiEnqueueAvailable = g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE); /* (de-)select the item under the mouse (if any) */ long index; SjCol* cover; if( MouseInTrack(event.GetX(), event.GetY(), index) ) { if( multiEnqueueAvailable && event.ShiftDown() ) { if( m_selAnchor == -1 ) { m_selAnchor = GetFirstSelectedAndVisible(); if( m_selAnchor == -1 ) m_selAnchor = index; } SelectRange(m_selAnchor, index); RefreshSelection(); } else if( multiEnqueueAvailable && event.ControlDown() ) { m_listView->SelectTrack(index, !m_listView->IsTrackSelected(index)); RefreshSelection(); m_selAnchor = index; } else { g_mainFrame->m_columnMixer.SelectAll(false); m_listView->SelectTrack(index, true); RefreshSelection(); m_selAnchor = index; } } else if( MouseInCover(event.GetX(), event.GetY(), &cover) ) { if( g_mainFrame->m_libraryModule->PlayOnDblClick() ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); long index = cover->m_textlLeft; // a little hack - we use this custom var for the index of the view long iCount = m_listView->GetTrackCount(); // select everything up to the next gap while( index < iCount && !(m_listView->GetTrackSpecial(index)&SJ_LISTVIEW_SPECIAL_GAP) ) { m_listView->SelectTrack(index, true); index++; } RefreshSelection(); } } else if( !event.ShiftDown() && !event.ControlDown() && g_mainFrame->m_columnMixer.IsAnythingSelected() ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); RefreshSelection(); } g_mainFrame->m_libraryModule->UpdateMenuBar(); } void SjListBrowser::OnMouseLeftDown(wxMouseEvent& event) { /* prepare dragscroll and object dragging */ m_window->m_mouseAction = SJ_ACTION_NONE; m_dragStartX = event.GetX(); /* client coordinates */ m_dragStartY = event.GetY(); /* client coordinates */ /* change column width? */ long index; if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) /*toggle columns?*/ ) { bool inSizer; if( MouseInHeader(event.GetX(), event.GetY(), index, inSizer) && inSizer ) { m_window->m_mouseAction = SJ_ACTION_COLUMNWIDTH; m_columnDragIndex = index; m_columnDragOrgWidth = m_columnWidths[index]; CalcRefreshNUpdateHeader(); return; } } /* select a track? */ m_mouseSelectionOnDown = FALSE; if( g_accelModule->m_selDragNDrop == 1 && MouseInTrack(m_dragStartX, m_dragStartY, index) && !m_listView->IsTrackSelected(index) ) { OnMouseSelect(event); m_mouseSelectionOnDown = TRUE; } } void SjListBrowser::OnMouseLeftUp(wxMouseEvent& event) { if( ResetSpecialMouseAction() ) return; // done // nothing in view if( g_mainFrame->m_columnMixer.GetMaskedColCount() == 0 ) { g_mainFrame->EndOneSearch(); return; // done } // toggle sort? long index; bool inSizer; if( MouseInHeader(event.GetX(), event.GetY(), index, inSizer) && !inSizer ) { wxBusyCursor busy; if( m_columns[index] == m_sortField ) { m_sortDesc = !m_sortDesc; } else { m_sortField = m_columns[index]; m_sortDesc = false; if( m_sortField == SJ_TI_PLAYTIMEMS || m_sortField == SJ_TI_YEAR || m_sortField == SJ_TI_X_TIMESPLAYED || m_sortField == SJ_TI_X_LASTPLAYED || m_sortField == SJ_TI_X_TIMEADDED || m_sortField == SJ_TI_X_TIMEMODIFIED || m_sortField == SJ_TI_RATING ) { m_sortDesc = true; } } SetOrder(m_sortField, m_sortDesc); return; } else if( m_toggleCoversRect.Contains(event.GetX(), event.GetY()) ) { g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDT_WORKSPACE_SHOW_COVERS)); return; } // perform selection if( !m_mouseSelectionOnDown ) { OnMouseSelect(event); return; } } void SjListBrowser::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { ResetSpecialMouseAction(); } bool SjListBrowser::ResetSpecialMouseAction() { // dragscroll/columnmove/columnwidth: restore cursor if changed by dragscroll if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL || m_window->m_mouseAction == SJ_ACTION_COLUMNMOVE || m_window->m_mouseAction == SJ_ACTION_COLUMNWIDTH ) { if( m_window->m_mouseAction == SJ_ACTION_COLUMNMOVE || m_window->m_mouseAction == SJ_ACTION_COLUMNWIDTH ) { m_columnDragIndex = -1; CalcRefreshNUpdateHeader(); } m_window->m_mouseAction = SJ_ACTION_NONE; return true; // resetted } return false; // nothing done } bool SjListBrowser::OnMouseLeftDClick(wxMouseEvent& event) { int clickX = event.GetX(); int clickY = event.GetY(); long colIndex; bool inSizer; SjCol* cover; if( MouseInTrack(clickX, clickY, colIndex) ) { m_listView->OnDoubleClick(colIndex, event.ShiftDown() || event.ControlDown()); return true; // click used } else if( MouseInHeader(clickX, clickY, colIndex, inSizer) ) { return true; // click used - by the "normal" clicks (two mouseclicks in the header simply toggle the sorting up and down again) } else if( MouseInCover(clickX, clickY, &cover) ) { cover->m_rows[0]->OnDoubleClick(event.ShiftDown() || event.ControlDown()); /* g_mainFrame->m_columnMixer.SelectAll(false); cover->SelectAllRows(true); if( m_window->IsViewAvailable(SJ_BROWSER_ALBUM_VIEW) ) { m_window->SetView_(SJ_BROWSER_ALBUM_VIEW, true, true); } else if( m_window->IsViewAvailable(SJ_BROWSER_COVER_VIEW) ) { m_window->SetView_(SJ_BROWSER_COVER_VIEW, true, true); } */ return true; } return false; // click not used } void SjListBrowser::OnMouseMiddleUp(wxMouseEvent& event) { bool skip = TRUE; int clickX = event.GetX(); int clickY = event.GetY(); long index; if( MouseInTrack(clickX, clickY, index) ) { // select the item under the mouse if( !m_listView->IsTrackSelected(index) ) { g_mainFrame->m_columnMixer.SelectAll(false); m_listView->SelectTrack(index, true); RefreshSelection(); m_selAnchor = index; } m_listView->OnMiddleClick(index, event.ShiftDown() || event.ControlDown()); skip = false; } if( skip ) { event.Skip(); } g_mainFrame->m_libraryModule->UpdateMenuBar(); } void SjListBrowser::OnMouseMotion(wxMouseEvent& event) { long index; bool inSizer; long xPos = event.GetX(); /* client coordinates */ long yPos = event.GetY(); /* client coordinates */ /* start dragging? */ long hDifference = xPos - m_dragStartX; long vDifference = yPos - m_dragStartY; if( m_window->m_mouseAction == SJ_ACTION_NONE && m_window->HasCapture() ) { if( hDifference > DRAGSCROLL_DELTA || hDifference < -DRAGSCROLL_DELTA || vDifference > DRAGSCROLL_DELTA || vDifference < -DRAGSCROLL_DELTA ) { if( MouseInHeader(m_dragStartX, m_dragStartY, index, inSizer) && !inSizer ) { // move columns if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) /*toggle columns?*/ ) { m_window->m_mouseAction = SJ_ACTION_COLUMNMOVE; m_columnDragIndex = index; CalcRefreshNUpdateHeader(); } } else if( MouseInTrack(m_dragStartX, m_dragStartY, index) && m_listView->IsTrackSelected(index) ) { // do object dragging m_window->m_dragUrls.Clear(); g_mainFrame->m_columnMixer.GetSelectedUrls(m_window->m_dragUrls); if( g_accelModule->m_flags&SJ_ACCEL_USE_DND_IMAGES ) { g_mainFrame->m_dragImage = new wxDragImage(GetDragNDropBitmap(m_dragStartX, m_dragStartY, g_mainFrame->m_dragHotspot, g_mainFrame->m_dragRect)); } if( g_mainFrame->DragNDrop(SJ_DND_ENTER, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) ) { m_window->m_mouseAction = SJ_ACTION_DRAGNDROP; } } else if( g_accelModule->m_flags&SJ_ACCEL_CONTENT_DRAG && m_listView->GetTrackCount() > 0 ) { // start dragscroll m_dragScrollOrgHScroll = m_tracksHScroll; m_dragScrollOrgScrollPos = m_scrollPos; m_window->m_mouseAction = SJ_ACTION_DRAGSCROLL; } } } /* in drag'n'drop? */ if( m_window->m_mouseAction == SJ_ACTION_DRAGNDROP ) { if( !g_mainFrame->DragNDrop(SJ_DND_MOVE, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) ) { m_window->m_mouseAction = SJ_ACTION_NONE; } } /* in dragscroll? */ if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL ) { OnHScroll(IDT_WORKSPACE_H_SCROLL, m_dragScrollOrgHScroll-hDifference, true); OnVScroll(IDT_WORKSPACE_V_SCROLL, m_dragScrollOrgScrollPos-((vDifference+m_fontHeight/2)/m_fontHeight), true); return; } /* change column width */ if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) /*toggle columns?*/ ) { if( !m_window->HasCapture() ) { if( MouseInHeader(xPos, yPos, index, inSizer) && inSizer ) { if( !m_window->m_cursorChanged ) { m_window->SetCursor(g_tools->m_staticResizeWECursor); m_window->m_cursorChanged = true; } } else { m_window->ResetCursor(); } } else if( m_window->m_mouseAction == SJ_ACTION_COLUMNWIDTH ) { long diff = xPos - m_dragStartX; m_columnWidths[m_columnDragIndex] = m_columnDragOrgWidth + diff; if( m_columnWidths[m_columnDragIndex] < MIN_COLUMN_WIDTH ) m_columnWidths[m_columnDragIndex] = MIN_COLUMN_WIDTH; CalcRefreshNUpdateHeaderNTracks(); return; } } /* in dragscroll? */ if( m_window->m_mouseAction == SJ_ACTION_COLUMNMOVE ) { if( MouseInHeader(xPos, yPos, index, inSizer) && !inSizer && index != m_columnDragIndex ) { // change the column order ... wxArrayLong newColumns = m_columns; wxArrayLong newWidths = m_columnWidths; long oldField = newColumns[m_columnDragIndex]; long oldWidth = newWidths[m_columnDragIndex]; newColumns.RemoveAt(m_columnDragIndex); newWidths.RemoveAt(m_columnDragIndex); newColumns.Insert(oldField, index); newWidths.Insert(oldWidth, index); // check if the mouse is REALLY over the new position long testIndex; if( MouseInHeader(xPos, yPos, testIndex, inSizer, &newColumns, &newWidths) && !inSizer && testIndex == index ) { m_columns = newColumns; m_columnWidths = newWidths; m_columnDragIndex = index; CalcRefreshNUpdateHeaderNTracks(); } } return; } } void SjListBrowser::OnMouseWheel(wxMouseEvent& event, bool scrollVert) { long rotation = event.GetWheelRotation(); if( rotation != 0 ) { if( scrollVert ) { // add multiple small rotations (smaller than the delta to take action) to bigger ones static SjWheelHelper s_coverViewWheelHelper; long rotateLines, dir; s_coverViewWheelHelper.PushRotationNPopAction(event, rotateLines, dir); if( rotateLines != 0 ) { // We take action 4 times faster as normal to make things more comparable with // the scrolling in the album view (line-by-line scrolling is too slow and page scrolling is too fast) float multiplier = m_fontHeight > 0? (event.GetWheelDelta()/m_fontHeight) : 1; if( multiplier < 1 ) multiplier = 1; if( multiplier > 8 ) multiplier = 8; rotateLines = (long)((float)rotateLines * multiplier); OnVScroll(IDT_WORKSPACE_V_SCROLL, m_scrollPos + rotateLines*dir*-1, TRUE/*redraw*/); } } else { OnHScroll(IDT_WORKSPACE_H_SCROLL, m_tracksHScroll + rotation, TRUE/*redraw*/); } } } void SjListBrowser::OnDropImage(SjDataObject* data, int mouseX, int mouseY) { SjCol* cover; if( MouseInCover(mouseX, mouseY, &cover) ) { if( cover->m_rows[0]->OnDropData(data) ) { Realize(false, true); // true = keep col index m_window->Refresh(); m_window->Update(); } } } void SjListBrowser::AddItemsToColMenu(SjMenu* m) { m->AppendSeparator(); for( int i = 0; s_possibleCols[i]; i++ ) { m->AppendCheckItem(IDC_FIRST_COL_ID+i, SjTrackInfo::GetFieldDescr(s_possibleCols[i])); } m->AppendSeparator(); m->Append(IDC_RESET_COL, _("Reset to default values")); UpdateItemsInColMenu(m); } void SjListBrowser::UpdateItemsInColMenu(SjMenu* m) { for( int i = 0; s_possibleCols[i]; i++ ) { m->Check(IDC_FIRST_COL_ID+i, m_columns.Index(s_possibleCols[i]) != wxNOT_FOUND); } } void SjListBrowser::OnContextMenu(int clickX, int clickY) { SjMenu mainMenu(0); bool inSizer; long index; m_columnDragIndex = -1; m_lastClickedCover = NULL; SjCol* cover; if( MouseInTrack(clickX, clickY, index) ) { // select the item under the mouse if( !m_listView->IsTrackSelected(index) ) { g_mainFrame->m_columnMixer.SelectAll(false); m_listView->SelectTrack(index, true); RefreshSelection(); m_selAnchor = index; } // build the context menu m_listView->CreateContextMenu(index, mainMenu); m_lastContextMenuTrackIndex = index; } else if( MouseInHeader(clickX, clickY, index, inSizer) ) { // build the header context menu if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) /*toggle columns?*/ ) { AddItemsToColMenu(&mainMenu); } m_lastContextMenuColIndex = index; m_columnDragIndex = index; m_window->Refresh(false, &m_headerRect); } else if( MouseInCover(clickX, clickY, &cover) ) { cover->m_rows[0]->CreateContextMenu(mainMenu); m_lastClickedCover = cover; } // add main items to menu g_mainFrame->CreateContextMenu_(mainMenu); // show menu if( mainMenu.GetMenuItemCount() ) { m_window->PopupMenu(&mainMenu); } // deselect header (if selected before) if( m_columnDragIndex != -1 ) { m_columnDragIndex = -1; m_window->Refresh(false, &m_headerRect); } g_mainFrame->m_libraryModule->UpdateMenuBar(); } void SjListBrowser::OnContextMenuSelect(int id) { if( m_lastClickedCover ) { m_lastClickedCover->m_rows[0]->OnContextMenu(id); m_lastClickedCover = NULL; } else if( id == IDC_RESET_COL ) { if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) /*toggle columns?*/ ) { InitCols(); CalcRefreshNUpdateHeaderNTracks(); } if( g_mainFrame->m_viewMenu ) { UpdateItemsInColMenu(g_mainFrame->m_viewMenu); } } else if( id>=IDC_FIRST_COL_ID && id<=IDC_LAST_COL_ID ) { // toggle columns if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) /*toggle columns?*/ ) { long ti = s_possibleCols[id-IDC_FIRST_COL_ID]; if( m_lastContextMenuColIndex < 0 || m_lastContextMenuColIndex >= (long)m_columns.GetCount() ) m_lastContextMenuColIndex = 0; long index = m_columns.Index(ti); if( index == wxNOT_FOUND ) { // switch column ON m_columns.Insert(ti, m_lastContextMenuColIndex); m_columnWidths.Insert(GetBackupWidth(ti), m_lastContextMenuColIndex); } else if( m_columns.GetCount() > 1 ) { // switch column OFF BackupWidths(); m_columns.RemoveAt(index); m_columnWidths.RemoveAt(index); } CalcRefreshNUpdateHeaderNTracks(); } if( g_mainFrame->m_viewMenu ) { UpdateItemsInColMenu(g_mainFrame->m_viewMenu); } } else { // forward to library module if( m_lastContextMenuTrackIndex < 0 || m_lastContextMenuTrackIndex >= m_listView->GetTrackCount() ) m_lastContextMenuTrackIndex = GetFirstSelectedAndVisible(); if( m_lastContextMenuTrackIndex != -1 ) m_listView->OnContextMenu(m_lastContextMenuTrackIndex, id); } } class SjListTooltip { public: SjListTooltip(const wxRect& r, const wxString& s) { m_rect = r; m_string = s; } wxRect m_rect; wxString m_string; }; void SjListBrowser::ClearTooltips() { long i, iCount = m_tooltips.GetCount(); SjListTooltip* t; for( i = 0; i < iCount; i++ ) { t = (SjListTooltip*)m_tooltips.Item(i); delete t; } m_tooltips.Empty(); } void SjListBrowser::AddToTooltips(const wxRect& r, const wxString& s) { m_tooltips.Add(new SjListTooltip(r, s)); } SjListTooltip* SjListBrowser::FindTooltip(int mouseX, int mouseY) { long i, iCount = m_tooltips.GetCount(); SjListTooltip* t; for( i = 0; i < iCount; i++ ) { t = (SjListTooltip*)m_tooltips.Item(i); if( t->m_rect.Contains(mouseX, mouseY) ) return t; } return NULL; } wxRect SjListBrowser::GetToolTipRect(int mouseX, int mouseY) { wxRect retRect; retRect.x = -1000; retRect.y = -1000; retRect.width = 1; retRect.height = 1; if( m_headerRect.Contains(mouseX, mouseY) || m_tracksRect.Contains(mouseX, mouseY) || m_toggleCoversRect.Contains(mouseX, mouseY) ) { SjListTooltip* t = FindTooltip(mouseX, mouseY); if( t ) { retRect = t->m_rect; } } return retRect; } wxString SjListBrowser::GetToolTipText(int mouseX, int mouseY, long &flags) { wxString retString; if( m_headerRect.Contains(mouseX, mouseY) || m_tracksRect.Contains(mouseX, mouseY) || m_toggleCoversRect.Contains(mouseX, mouseY) ) { SjListTooltip* t = FindTooltip(mouseX, mouseY); if( t ) { retString = t->m_string; } } retString.Replace(wxT("\t"), wxT("")); // TAB is used for hiliting; return retString; } /******************************************************************************* * selection handling & scrolling ******************************************************************************/ bool SjListBrowser::OnSkinTargetEvent(int targetId, SjSkinValue& value, long accelFlags) { bool shiftSelection = g_mainFrame->IsOpAvailable(SJ_OP_MULTI_ENQUEUE)? ((accelFlags&wxACCEL_SHIFT)!=0) : false; if( targetId >= IDT_WORKSPACE_GOTO_A && targetId <= IDT_WORKSPACE_GOTO_0_9 ) { g_visModule->StopVisIfOverWorkspace(); g_mainFrame->EndSimpleSearch(); bool azSet = false; if( isAzPossibleForCol(m_sortField) ) { long offset = m_listView->Az2TrackOffset('a'+(targetId-IDT_WORKSPACE_GOTO_A)); if( offset != -1 ) { // g_mainFrame->m_columnMixer.SelectAll(false); -- is this usefull? browser_album.cpp does this not. If we look at A-Z same as scrolling we should leave the selection. GotoOffset__(offset, 0, false/*select*/, true/*update*/, true/*hscroll*/); azSet = true; } } if( !azSet ) g_mainFrame->SetSkinAzValues(0); m_window->SetFocus(); return true; } else switch( targetId ) { case IDT_WORKSPACE_GOTO_RANDOM: g_visModule->StopVisIfOverWorkspace(); g_mainFrame->EndSimpleSearch(); GotoOffset__(SjTools::Rand(m_listView->GetTrackCount()), SjTools::Rand(m_visibleTrackCount) | (SJ_BROWSER_LIST_VIEW<<24), true, true, true); m_window->SetFocus(); return true;; case IDT_WORKSPACE_V_SCROLL: case IDT_WORKSPACE_LINE_UP: case IDT_WORKSPACE_LINE_DOWN: case IDT_WORKSPACE_PAGE_UP: case IDT_WORKSPACE_PAGE_DOWN: case IDT_WORKSPACE_HOME: case IDT_WORKSPACE_END: OnVScroll(targetId, value.value, TRUE /*redraw*/); return true;; case IDT_WORKSPACE_H_SCROLL: case IDT_WORKSPACE_LINE_LEFT: case IDT_WORKSPACE_LINE_RIGHT: case IDT_WORKSPACE_PAGE_LEFT: case IDT_WORKSPACE_PAGE_RIGHT: case IDT_WORKSPACE_MINOR_HOME: case IDT_WORKSPACE_KEY_LEFT: case IDT_WORKSPACE_KEY_RIGHT: OnHScroll(targetId, value.value, TRUE /*redraw*/); return true;; case IDT_WORKSPACE_KEY_UP: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_UP, shiftSelection); return true;; case IDT_WORKSPACE_KEY_DOWN: if( !g_mainFrame->IsWorkspaceMovedAway() ) DoChangeSelection(SJ_SEL_DOWN, shiftSelection); return true;; } return false; } void SjListBrowser::OnHScroll(int nScrollCode, int nPos, bool redraw) { // returns TRUE if scrolling appears long newIndex = m_tracksHScroll; if( nScrollCode == IDT_WORKSPACE_MINOR_HOME ) { newIndex = 0; } else if( nScrollCode == IDT_WORKSPACE_MINOR_END ) { newIndex = m_tracksVirtualW; // sth. substracted below } else if( nScrollCode == IDT_WORKSPACE_LINE_LEFT || nScrollCode == IDT_WORKSPACE_KEY_LEFT ) { newIndex -= g_mainFrame->m_currFontSize*2; } else if( nScrollCode == IDT_WORKSPACE_LINE_RIGHT || nScrollCode == IDT_WORKSPACE_KEY_RIGHT ) { newIndex += g_mainFrame->m_currFontSize*2; } else if( nScrollCode == IDT_WORKSPACE_PAGE_LEFT ) { newIndex -= m_tracksRect.width; } else if( nScrollCode == IDT_WORKSPACE_PAGE_RIGHT ) { newIndex += m_tracksRect.width; } else if( nScrollCode == IDT_WORKSPACE_H_SCROLL ) { newIndex = nPos; } if( newIndex < 0 ) { newIndex = 0; } if( newIndex > m_tracksVirtualW - m_tracksRect.width ) { newIndex = m_tracksVirtualW - m_tracksRect.width; if( newIndex < 0 ) { newIndex = 0; } } if( newIndex != m_tracksHScroll ) { m_tracksHScroll = newIndex; SetHScrollInfo(); if( redraw ) { m_window->Refresh(FALSE, &m_headerRect); m_window->Refresh(FALSE, &m_tracksRect); m_window->Update(); } } } void SjListBrowser::SetHScrollInfo() { SjSkinValue value; value.value = m_tracksHScroll; value.vmax = m_tracksVirtualW; value.thumbSize = m_tracksRect.width; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_H_SCROLL, value); } void SjListBrowser::OnVScroll(int nScrollCode, int nPos, bool redraw) { // returns TRUE if scrolling appears long newIndex = m_scrollPos; if( nScrollCode == IDT_WORKSPACE_HOME ) { newIndex = 0; } else if( nScrollCode == IDT_WORKSPACE_END ) { newIndex = m_listView->GetTrackCount(); // sth. substracted below } else if( nScrollCode == IDT_WORKSPACE_LINE_UP ) { newIndex --; } else if( nScrollCode == IDT_WORKSPACE_LINE_DOWN ) { newIndex ++; } else if( nScrollCode == IDT_WORKSPACE_PAGE_UP ) { newIndex -= m_visibleTrackCount; } else if( nScrollCode == IDT_WORKSPACE_PAGE_DOWN ) { newIndex += m_visibleTrackCount; } else if( nScrollCode == IDT_WORKSPACE_V_SCROLL ) { newIndex = nPos; } if( newIndex < 0 ) { newIndex = 0; } if( newIndex > m_listView->GetTrackCount() - m_visibleTrackCount ) { newIndex = m_listView->GetTrackCount() - m_visibleTrackCount; if( newIndex < 0 ) { newIndex = 0; } } if( newIndex != m_scrollPos ) { m_scrollPos = newIndex; SetVScrollInfo(); if( redraw ) { m_window->Refresh(FALSE, &m_tracksRect); if( m_flags&SJ_BROWSER_VIEW_COVER ) { m_window->Refresh(FALSE, &m_coversRect); m_window->Refresh(FALSE, &m_playmarkRect); } m_window->Update(); } } } void SjListBrowser::SetVScrollInfo() { SjSkinValue value; value.value = m_scrollPos; value.vmax = m_listView->GetTrackCount(); value.thumbSize = m_visibleTrackCount; g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_V_SCROLL, value); } void SjListBrowser::ScrollOneLineInView(long index) { // scroll max. one line up/down to put the index in view if( index < m_scrollPos ) { OnVScroll(IDT_WORKSPACE_LINE_UP, 0, true /*redraw*/); } else if( index >= (m_scrollPos+m_visibleTrackCount) ) { OnVScroll(IDT_WORKSPACE_LINE_DOWN, 0, true /*redraw*/); } } bool SjListBrowser::DoChangeSelection(long dir, bool selectShifted) { bool up = (dir == SJ_SEL_UP || dir == SJ_SEL_LEFT || dir == SJ_SEL_PREV); if( selectShifted && m_selAnchor != -1 ) { long firstSel = m_selAnchor, lastSel = m_selAnchor, newPos; while( firstSel > 0 ) { if( !m_listView->IsTrackSelected(firstSel-1) ) break; firstSel--; } while( lastSel < (m_listView->GetTrackCount()-2) ) { if( !m_listView->IsTrackSelected(lastSel+1) ) break; lastSel++; } if( up ) { if( lastSel == m_selAnchor ) { newPos = firstSel-1; if( newPos < 0 ) return false; m_listView->SelectTrack(newPos, true); } else { newPos = lastSel; if( newPos < 0 ) return false; m_listView->SelectTrack(newPos, false); } } else { if( firstSel == m_selAnchor ) { newPos = lastSel+1; if( newPos >= m_listView->GetTrackCount() ) return false; m_listView->SelectTrack(newPos, true); } else { newPos = firstSel; if( newPos < 0 ) return false; m_listView->SelectTrack(newPos, false); } } ScrollOneLineInView(newPos); RefreshSelection(); g_mainFrame->m_libraryModule->UpdateMenuBar(); return true; } long newPos; if( up ) { newPos = GetFirstSelectedAndVisible(); if( newPos != -1 ) { // change selection newPos --; if( newPos < 0 ) return false; } else { // start a new selection, before http://www.silverjuke.net/forum/topic-2892.html we used "m_scrollPos - 1" here newPos = m_scrollPos; if( newPos < 0 ) return false; } } else { newPos = GetLastSelectedAndVisible(); if( newPos != -1 ) { // change selection if( newPos >= (m_scrollPos+m_visibleTrackCount) ) newPos --; newPos ++; if( newPos >= m_listView->GetTrackCount() ) return false; } else { // start a new selection, we're selection the first track here (as we do in the album view), see http://www.silverjuke.net/forum/topic-2892.html newPos = m_scrollPos; if( newPos < 0 ) return false; } } ScrollOneLineInView(newPos); m_selAnchor = newPos; g_mainFrame->m_columnMixer.SelectAll(false); m_listView->SelectTrack(newPos, true); RefreshSelection(); g_mainFrame->m_libraryModule->UpdateMenuBar(); return true; } bool SjListBrowser::GotoOffset__(long offset, long viewOffset, bool select, bool update, bool hscroll) { if( (viewOffset>>24) != SJ_BROWSER_LIST_VIEW ) viewOffset = 0; else viewOffset &= 0x00FFFFFFL; if( offset < 0 || offset >= m_listView->GetTrackCount() ) return false; // goto column OnVScroll(IDT_WORKSPACE_V_SCROLL, offset-viewOffset, FALSE/*redraw*/); if( hscroll ) { OnHScroll(IDT_WORKSPACE_H_SCROLL, 0, FALSE/*redraw*/); } // select the correct row if( select ) { g_mainFrame->m_columnMixer.SelectAll(FALSE); m_listView->SelectTrack(offset, true); } // update the view if( update ) { m_window->Refresh(); m_window->Update(); } // success return true; } bool SjListBrowser::GotoUrl__(const wxString& url, long viewOffset, bool select, bool update, bool hscroll) { if( m_listView ) { long offset = m_listView->Url2TrackOffset(url); if( offset != -1 ) { GotoOffset__(offset, viewOffset, select, update, hscroll); return true; } } return false; } wxString SjListBrowser::GetFirstVisiblePos() { if( m_listView ) { SjTrackInfo ti; long albumId, special; m_listView->GetTrack(m_scrollPos, ti, albumId, special); return ti.m_url; } return wxEmptyString; } wxString SjListBrowser::GetFirstSelectedOrVisiblePos(long& retViewOffset) { retViewOffset = 0; if( m_listView ) { long offset = GetFirstSelectedAndVisible(); if( offset == -1 ) return GetFirstVisiblePos(); SjTrackInfo ti; long albumId, special; m_listView->GetTrack(offset, ti, albumId, special); retViewOffset = (offset-m_scrollPos) | (SJ_BROWSER_LIST_VIEW<<24); return ti.m_url; } wxASSERT( 0 ); return wxEmptyString; } wxString SjListBrowser::GetFirstSelectedAndVisiblePos(long& retViewOffset) { retViewOffset = 0; if( m_listView ) { long offset = GetFirstSelectedAndVisible(); if( offset != -1 ) { SjTrackInfo ti; long albumId, special; m_listView->GetTrack(offset, ti, albumId, special); retViewOffset = (offset-m_scrollPos) | (SJ_BROWSER_LIST_VIEW<<24); return ti.m_url; } } return wxEmptyString; } /******************************************************************************* * Painting the window ******************************************************************************/ #define SPACE_BRUSH g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush //#define SPACE_BRUSH (*wxGREEN_BRUSH) void SjListBrowser::OnSize(wxSizeEvent& event) { CalculatePositions(); } void SjListBrowser::OnImageThere(SjImageThereEvent& event) { SjImgThreadObj* obj = event.GetObj(); int i, iCount = m_allocatedCover.GetCount(); for( i = 0; i < iCount; i++ ) { SjCol* col = (SjCol*)m_allocatedCover[i]; wxASSERT( col ); wxASSERT( col->m_rowCount > 0 ); if( col->m_rows[0]->m_textm == obj->m_url && (m_flags&SJ_BROWSER_VIEW_COVER) ) { wxClientDC dc(m_window); m_window->PaintCover(dc, obj, m_coversRect.x, col->m_rows[0]->m_top, m_coverW); } } g_mainFrame->m_imgThread->ReleaseImage(m_window, obj); } void SjListBrowser::DoPaintHeader(wxDC& dc, long x, long y, long w, long h, bool addTooltips) { dc.SetPen(*wxTRANSPARENT_PEN); // draw the columns wxString str; wxRect drawRect; long currX = x; int col, colCount = m_columns.GetCount(); for( col = 0; col < colCount; col ++ ) { // get information if( m_columns[col] == SJ_TI_TRACKNR ) { str = _("Nr."); } else if( m_columns[col] == SJ_TI_X_BITRATE ) { // TRANSLATORS: Abbreviation of "Bits per second" str = _("bit/s"); } else if( m_columns[col] == SJ_TI_X_SAMPLERATE ) { str = _("Samplerate") + wxString(wxT("/")) + // TRANSLATORS: Abbreviation of "Hertz" _("Hz"); } else { str = SjTrackInfo::GetFieldDescr(m_columns[col]); } bool selected = (col == m_columnDragIndex); // recreate complete draw rect as it gets modified by DrawText(); drawRect.x = currX; drawRect.y = y; drawRect.height = h; drawRect.width = m_columnWidths[col]; // draw background dc.SetBrush(g_mainFrame->m_workspaceColours[selected? SJ_COLOUR_SELECTION : SJ_COLOUR_NORMAL].bgBrush); SjSkinColour* colour = &g_mainFrame->m_workspaceColours[selected? SJ_COLOUR_SELECTION : SJ_COLOUR_TITLE1]; dc.SetTextBackground(colour->bgColour); dc.SetTextForeground(colour->fgColour); if( selected ) { drawRect.height --; } dc.DrawRectangle(drawRect); if( selected ) { dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgPen); //dc.SetPen(*wxGREEN_PEN); dc.DrawLine(drawRect.x, drawRect.y+drawRect.height, drawRect.x+drawRect.width, drawRect.y+drawRect.height); dc.SetPen(*wxTRANSPARENT_PEN); drawRect.height ++; } // draw text if( m_columns[col] == m_sortField ) { wxRect iconRect = drawRect; iconRect.y+=2; iconRect.height-=4; iconRect.width = iconRect.height; dc.SetPen(g_mainFrame->m_workspaceColours[selected? SJ_COLOUR_SELECTION : SJ_COLOUR_TITLE1].fgPen); SjTools::DrawIcon(dc, iconRect, m_sortDesc? SJ_DRAWICON_TRIANGLE_DOWN : SJ_DRAWICON_TRIANGLE_UP); dc.SetPen(*wxTRANSPARENT_PEN); drawRect.x += iconRect.width+2; drawRect.width -= iconRect.width+2; } drawRect.width -= 2; if( g_tools->DrawSingleLineText(dc, str, drawRect, g_mainFrame->m_currBoldFont, g_mainFrame->m_currSmallBoldFont, NULL, colour->hiColour) ) { if( addTooltips ) AddToTooltips(drawRect, str); } // next currX += m_columnWidths[col]; } // draw space aright if( currX < x+w ) { dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(currX, y, (x+w)-currX, h); } } void SjListBrowser::DoPaintTrack(wxDC& dc, long x, long y, long w, long h, long offset, bool& lastTrackSelected, bool addTooltips, bool setAz, int* lastAz, wxArrayLong* retLinePos, wxArrayLong* retAlbumIds) { SjTrackInfo ti; // get the track information long tiAlbumId, tiSpecial; m_listView->GetTrack(offset, ti, tiAlbumId, tiSpecial); bool tiGap = (tiSpecial&SJ_LISTVIEW_SPECIAL_GAP)!=0; bool tiSelected = m_listView->IsTrackSelected(offset); if( retAlbumIds ) retAlbumIds->Add(tiSpecial&SJ_LISTVIEW_SPECIAL_FIRST_TRACK? tiAlbumId : 0); // set A-Z bool hiliteFirstChar = false; wxString str; int thisAz = 0; if( isAzPossibleForCol(m_sortField) ) // can sort by A-Z? { str = SjNormaliseString(ti.GetFormattedValue(m_sortField), 0); thisAz = str.Len()? str[0] : 'z'+1; if( thisAz < 'a' || thisAz > 'z' ) { thisAz = 'z'+1; } } if( lastAz != NULL && thisAz && thisAz != *lastAz ) { if( thisAz != 'z'+1 ) { hiliteFirstChar = true; } *lastAz = thisAz; } if( setAz && !g_mainFrame->HasSimpleSearch()) { g_mainFrame->SetSkinAzValues(thisAz); } // set objects to use SjSkinColour* colour; if( tiSpecial&SJ_LISTVIEW_SPECIAL_DARK ) { colour = &g_mainFrame->m_workspaceColours[tiSelected? SJ_COLOUR_SELECTIONODD : SJ_COLOUR_NORMALODD]; } else { colour = &g_mainFrame->m_workspaceColours[(tiSelected&&!tiGap)? SJ_COLOUR_SELECTION : SJ_COLOUR_NORMAL]; } dc.SetBrush(colour->bgBrush); dc.SetPen(*wxTRANSPARENT_PEN); dc.SetTextBackground(colour->bgColour); dc.SetTextForeground(colour->fgColour); wxRect drawRect; int col, colCount = m_columns.GetCount(); long currX = x, field; wxFont* largeFont; wxFont* boldFont; bool showNumpadNumbers = (g_kioskModule && g_accelModule && g_accelModule->UseNumpad()); for( col = 0; col < colCount; col ++ ) { // get information field = m_columns[col]; str = ti.GetFormattedValue(field); if( showNumpadNumbers && field == SJ_TI_TRACKNR ) { // TODO: hier sollte mal die "richtige" nummer im Numpad-Modus angezeigt werden ... //str = wxT("x"); } largeFont = &g_mainFrame->m_currSmallFont; boldFont = &g_mainFrame->m_currSmallBoldFont; if( field == SJ_TI_TRACKNAME || field == SJ_TI_LEADARTISTNAME || field == SJ_TI_ORGARTISTNAME || field == SJ_TI_COMPOSERNAME || field == SJ_TI_ALBUMNAME ) { largeFont = &g_mainFrame->m_currStdFont; boldFont = &g_mainFrame->m_currBoldFont; } // recreate complete draw rect as it gets modified by DrawText(); drawRect.x = currX; drawRect.y = y; drawRect.height = h; drawRect.width = m_columnWidths[col]; // draw background bool drawLine = false; if( lastTrackSelected && tiSelected && !tiGap ) { dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgPen); dc.DrawLine(drawRect.x, drawRect.y, drawRect.x+drawRect.width, drawRect.y); dc.SetPen(*wxTRANSPARENT_PEN); drawLine = true; } dc.DrawRectangle(drawRect.x, drawRect.y+(drawLine?1:0), drawRect.width, drawRect.height-(drawLine?1:0)); // draw text if( !tiGap ) { drawRect.width -= 2; if( g_tools->DrawSingleLineText(dc, str, drawRect, *largeFont, g_mainFrame->m_currSmallFont, (hiliteFirstChar && m_sortField==field)? boldFont : NULL, colour->hiColour) ) { if( addTooltips ) AddToTooltips(drawRect, str); } } // next currX += m_columnWidths[col]; } // draw space aright if( currX < x+w ) { dc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].bgBrush); dc.DrawRectangle(currX, y, (x+w)-currX, h); } // draw a line? if( (tiSpecial&SJ_LISTVIEW_SPECIAL_LAST_GAP) && retLinePos ) { long lineY = y + m_fontHeight/2; dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].fgPen); dc.DrawLine(m_tracksRect.x, lineY, m_tracksRect.x+m_tracksRect.width, lineY); if( retLinePos ) retLinePos->Add(lineY); } // remember some stuff lastTrackSelected = tiGap? false : tiSelected; } void SjListBrowser::DoPaintHeaderNTracks(wxDC& dc, long x, long y_, long w, long h, bool addTooltips, wxArrayLong* retLinePos, wxArrayLong* retAlbumIds) { // draw header long currY = y_; DoPaintHeader(dc, x, currY, w, m_fontHeight, addTooltips); currY += m_fontHeight; // init lastAz int lastAz = 0; if( m_scrollPos > 0 && isAzPossibleForCol(m_sortField) ) { SjTrackInfo ti; long tiAlbumId, tiSpecial; m_listView->GetTrack(m_scrollPos-1, ti, tiAlbumId, tiSpecial); wxString str = SjNormaliseString(ti.GetFormattedValue(m_sortField), 0); lastAz = str.Len()? str[0] : 'z'+1; if( lastAz < 'a' || lastAz > 'z' ) { lastAz = 'z'+1; } } // draw all tracks long index = m_scrollPos; bool lastTrackSelected = false; long listViewTrackCount = m_listView->GetTrackCount(); while( currY < m_window->m_clientH && index < listViewTrackCount ) { DoPaintTrack(dc, x, currY, w, m_fontHeight, index, lastTrackSelected /*used internally*/, addTooltips, (index==m_scrollPos)/*set Az?*/, &lastAz /*used internally*/, retLinePos, retAlbumIds); // next index++; currY += m_fontHeight; } // draw space abottom if( currY < y_+h ) { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(SPACE_BRUSH); dc.DrawRectangle(x, currY, w, (y_+h)-currY); } } void SjListBrowser::DoPaint(wxDC& dc) { ClearTooltips(); // empty whole background (for testing only /*dc.SetBrush(*wxGREY_BRUSH); dc.SetPen(*wxTRANSPARENT_PEN); dc.DrawRectangle(0, 0, m_window->m_clientW, m_window->m_clientH); */ // draw space atop dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(SPACE_BRUSH); if( m_flags&SJ_BROWSER_VIEW_COVER ) { dc.DrawRectangle(0, 0, m_uptextRect.width, SPACE_TOP); dc.DrawRectangle(m_playmarkRect.x, 0, m_window->m_clientW, SPACE_TOP); } else { dc.DrawRectangle(0, 0, m_window->m_clientW, SPACE_TOP); } // draw toggle cover rect { dc.DrawRectangle(m_toggleCoversRect); dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_TITLE1].fgPen); wxRect iconRect = m_toggleCoversRect; iconRect.y+=2; iconRect.height-=4; iconRect.width = iconRect.height; iconRect.x += (m_toggleCoversRect.width-iconRect.width) / 2; SjTools::DrawIcon(dc, iconRect, (m_flags&SJ_BROWSER_VIEW_COVER)? SJ_DRAWICON_TRIANGLE_DOWN : SJ_DRAWICON_TRIANGLE_RIGHT); if( g_mainFrame->IsOpAvailable(SJ_OP_TOGGLE_ELEMENTS) ) AddToTooltips(m_toggleCoversRect, _("Show covers")); } // draw space left of covers if( m_listView ) m_window->DrawUpText(dc, m_listView->GetUpText(), m_uptextRect.x, m_uptextRect.y, m_uptextRect.width, m_uptextRect.height); else dc.DrawRectangle(m_uptextRect); // draw the workspace wxRect workspaceRect = m_headerRect; workspaceRect.height += m_tracksRect.height; dc.SetClippingRegion(workspaceRect); int w = workspaceRect.width; if( m_tracksVirtualW > workspaceRect.width ) w = m_tracksVirtualW; wxArrayLong linePos; wxArrayLong albumIds; DoPaintHeaderNTracks(dc, workspaceRect.x-m_tracksHScroll, workspaceRect.y, w, workspaceRect.height, true /*add tooltips*/, &linePos, &albumIds); dc.DestroyClippingRegion(); // draw space right of covers { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(SPACE_BRUSH); dc.DrawRectangle(m_playmarkRect); dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].fgPen); for( size_t i = 0; i < linePos.GetCount(); i++ ) dc.DrawLine(m_playmarkRect.x, linePos[i], m_playmarkRect.x+m_playmarkRect.width, linePos[i]); } // draw the covers if( m_flags&SJ_BROWSER_VIEW_COVER ) { wxRect updateRect = m_window->GetUpdateRegion().GetBox(); if( updateRect.Intersects(m_coversRect) ) { FreeAllocatedCover(); // rewind the index to the previous cover (do this always as it may be partly visible) long index = m_scrollPos; long indexMinus = (m_tracksNeededToFitCoverHeight+1); if( index - indexMinus < 0 ) indexMinus = index; index -= indexMinus; wxASSERT( index >= 0 ); // init y long currY = m_tracksRect.y - indexMinus*m_fontHeight; long lastCoverBottom = 0; // draw all covers g_mainFrame->m_imgThread->RequireStart(m_window); long listViewTrackCount = m_listView->GetTrackCount(); while( currY < m_window->m_clientH && index < listViewTrackCount ) { // find out album Id long tiAlbumId = 0; if( index >= m_scrollPos && (index-m_scrollPos) < (long)albumIds.GetCount() ) { tiAlbumId = albumIds[index-m_scrollPos]; } else if( m_listView->GetTrackSpecial(index)&SJ_LISTVIEW_SPECIAL_FIRST_TRACK ) { SjTrackInfo tiDummy; long tiSpecial; m_listView->GetTrack(index, tiDummy, tiAlbumId, tiSpecial); } if( tiAlbumId ) { // draw space above cover if( currY > 0 ) { dc.SetBrush(SPACE_BRUSH); dc.SetPen(*wxTRANSPARENT_PEN); dc.DrawRectangle(m_coversRect.x, lastCoverBottom, m_coversRect.width, currY-lastCoverBottom); } // get the cover pointer SjCol* cover = m_listView->GetCol(tiAlbumId); if( cover ) { if( cover->m_rowCount <= 0 ) { delete cover; cover = NULL; } else { m_allocatedCover.Add(cover); cover->m_textlLeft = index; // a little hack - we use this custom var for the index of the view cover->m_rows[0]->m_top = currY; } } // draw cover SjImgThreadObj* obj = cover==NULL? NULL : m_window->RequireImage(cover->m_rows[0]->m_textm, m_coverW); // cachedImg may be NULL, but this is okay for PaintCover() and for ReleaseImage() m_window->PaintCover(dc, obj, m_coversRect.x, currY, m_coverW); g_mainFrame->m_imgThread->ReleaseImage(m_window, obj); // draw a line if( index ) { dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].fgPen); long y = (currY-m_fontHeight)+(m_fontHeight/2); dc.DrawLine(m_coversRect.x, y, m_coversRect.x+m_coversRect.width, y); } // prepare for the next cover lastCoverBottom = currY + m_coverW; } // next index++; currY += m_fontHeight; } g_mainFrame->m_imgThread->RequireEnd(m_window); // draw space below last cover if( lastCoverBottom < m_window->m_clientH ) { dc.SetBrush(SPACE_BRUSH); dc.SetPen(*wxTRANSPARENT_PEN); dc.DrawRectangle(m_coversRect.x, lastCoverBottom, m_coversRect.width, m_window->m_clientH); dc.SetPen(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMAL].fgPen); for( size_t i = 0; i < linePos.GetCount(); i++ ) { if( linePos[i] >= lastCoverBottom ) dc.DrawLine(m_coversRect.x, linePos[i], m_coversRect.x+m_coversRect.width, linePos[i]); } } } } } wxBitmap SjListBrowser::GetDragNDropBitmap(int mouseX, int mouseY, wxPoint& retHotspot, wxRect& retSize) { // calculate the width and the height of the bitmap long firstSelected = GetFirstSelectedAndVisible(); long lastSelected = GetLastSelectedAndVisible(false); if( firstSelected == -1 || lastSelected == -1 ) return wxNullBitmap; long dndWidth = m_tracksVirtualW; long dndHeight = m_fontHeight * ((lastSelected-firstSelected)+1); retHotspot.x = mouseX - m_tracksRect.x + m_tracksHScroll; retHotspot.y = mouseY - m_tracksRect.y - ((firstSelected-m_scrollPos)*m_fontHeight); // create an offscreen DC with the given Size wxBitmap imgBitmap(dndWidth, dndHeight); wxMemoryDC imgDc; imgDc.SelectObject(imgBitmap); wxBitmap maskBitmap(dndWidth, dndHeight, 1); wxMemoryDC maskDc; maskDc.SelectObject(maskBitmap); // draw the selected rows to the offscreen dc imgDc.SetPen(*wxTRANSPARENT_PEN); imgDc.SetBrush(g_mainFrame->m_workspaceColours[SJ_COLOUR_NORMALODD].bgBrush); imgDc.DrawRectangle(0, 0, dndWidth, dndHeight); maskDc.SetPen(*wxTRANSPARENT_PEN); maskDc.SetBrush(*wxBLACK_BRUSH); maskDc.DrawRectangle(0, 0, dndWidth, dndHeight); maskDc.SetBrush(*wxWHITE_BRUSH); long y = 0; bool lastTrackSelected = false; for( long index = firstSelected; index <= lastSelected; index++ ) { if( m_listView->IsTrackSelected(index) ) { DoPaintTrack(imgDc, 0, y, dndWidth, m_fontHeight, index, lastTrackSelected, false /*addTooltips*/, false /*setAz*/, NULL); maskDc.DrawRectangle(0, y, dndWidth, m_fontHeight); } y += m_fontHeight; } // done creating the images imgDc.SelectObject(wxNullBitmap); maskDc.SelectObject(wxNullBitmap); // scale the bitmaps down if they are too large #define MAX_W (m_window->m_clientW) #define MAX_H (m_window->m_clientH) #define MAX_PIXELS (250*250) if( (dndWidth*dndHeight) > MAX_PIXELS || dndWidth > MAX_W || dndHeight > MAX_H ) { // calculate the new width and height long oldWidth = dndWidth, oldHeight = dndHeight; if( dndWidth > MAX_W ) { dndHeight = (dndHeight*MAX_W) / dndWidth; dndWidth = MAX_W; } if( dndHeight>MAX_H ) { dndWidth = (dndWidth*MAX_H) / dndHeight; dndHeight = MAX_H; } if( (dndWidth*dndHeight) > MAX_PIXELS ) { float div = (float)(dndWidth*dndHeight) / (float)MAX_PIXELS; dndHeight = (long) ((float)dndHeight/div); dndWidth = (long) ((float)dndWidth/div); wxASSERT( (dndWidth*dndHeight) <= MAX_PIXELS ); } // scale down image wxImage img = imgBitmap.ConvertToImage(); //img.Rescale(dndWidth, dndHeight); SjImgOp::DoResize(img, dndWidth, dndHeight, SJ_IMGOP_SMOOTH); imgBitmap = wxBitmap(img); // scale down mask img = maskBitmap.ConvertToImage(); img.Rescale(dndWidth, dndHeight); maskBitmap = wxBitmap(img, 1); // correct hotspot retHotspot.x = (retHotspot.x*dndWidth) / oldWidth; retHotspot.y = (retHotspot.y*dndHeight) / oldHeight; } // done imgBitmap.SetMask(new wxMask(maskBitmap)); retSize.x = 0; retSize.y = 0; retSize.width = dndWidth; retSize.height= dndHeight; return imgBitmap; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/browser_list.h���������������������������������������������������������0000664�0000000�0000000�00000017334�12660066715�0020734�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: browser_list.h * Authors: Björn Petersen * Purpose: Silverjuke list browser * ******************************************************************************/ #ifndef __SJ_BROWSER_LIST_H__ #define __SJ_BROWSER_LIST_H__ class SjListTooltip; class SjImageThereEvent; class SjListBrowser : public SjBrowserBase { public: // this is a pure-virtual base class defining a browser view SjListBrowser (SjBrowserWindow*); // Exit() is be called sooner than the destructor is called for save-freeing pointers. void Exit (); // called to show the browser, after this function is called // the derived class should be ready to process paint events! void Realize (bool reloadColumnMixer, bool keepColIndex); // functions for externs void SetOrder (long sortField, bool desc); void GetOrder (long& sortField, bool& desc) const {sortField=m_sortField; desc=m_sortDesc;} void SetColumns (const wxArrayLong&); wxArrayLong GetColumns () const {return m_columns;} // mouse handling void OnMouseLeftDown (wxMouseEvent& event); void OnMouseLeftUp (wxMouseEvent& event); void OnMouseCaptureLost (wxMouseCaptureLostEvent& event); bool OnMouseLeftDClick (wxMouseEvent& event); void OnMouseMiddleUp (wxMouseEvent& event); void OnMouseMotion (wxMouseEvent& event); void OnMouseWheel (wxMouseEvent& event, bool scrollVert); void OnDropImage (SjDataObject* data, int mouseX, int mouseY); void OnContextMenu (int clickX, int clickY); void OnContextMenuSelect (int id); wxRect GetToolTipRect (int mouseX, int mouseY); wxString GetToolTipText (int mouseX, int mouseY, long &flags); bool ResetSpecialMouseAction(); void AddItemsToColMenu (SjMenu*); void UpdateItemsInColMenu(SjMenu*); // selection handling & scrolling bool OnSkinTargetEvent (int targetId, SjSkinValue& value, long accelFlags); // return true if the key/the event was used bool DoChangeSelection (long dir, bool shiftSelection); void RefreshSelection () { m_window->Refresh(false, &m_tracksRect); } bool GotoUrl (const wxString& url) { return GotoUrl__(url, 0, true/*select*/, true/*update*/); } void GotoPos (const wxString& pos, long viewOffset) { GotoUrl__(pos, viewOffset, false/*select*/, true/*update*/); } wxString GetFirstVisiblePos (); wxString GetFirstSelectedOrVisiblePos(long& retViewOffset); wxString GetFirstSelectedAndVisiblePos(long& retViewOffset); // do paint the window, paint-related events void DoPaint (wxDC&); void OnSize (wxSizeEvent& event); void OnImageThere (SjImageThereEvent& event); private: bool GotoUrl__ (const wxString& pos, long viewOffset, bool select, bool update, bool hscroll=true); bool GotoOffset__ (long offset, long viewOffset, bool select, bool update, bool hscroll=true); wxArrayLong m_columns; // values from SJ_TI_* wxArrayLong m_columnWidths; SjLLHash m_columnBackupWidths; void BackupWidths(); long GetBackupWidth(long ti); SjListView* m_listView; long m_visibleTrackCount; long m_scrollPos; wxRect m_uptextRect; wxRect m_toggleCoversRect; wxRect m_coversRect; wxRect m_playmarkRect; // left of the header/tracks wxRect m_headerRect; wxRect m_tracksRect; long m_tracksVirtualW; long m_tracksHScroll; long m_selAnchor; int m_fontHeight, m_fontVDiff; int m_coverW; long m_sortField; // value from SJ_TI_* bool m_sortDesc; void DoPaintHeaderNTracks(wxDC& dc, long x, long y, long w, long h, bool addTooltips, wxArrayLong* retLinePos=NULL, wxArrayLong* retAlbumIds=NULL); void DoPaintHeader(wxDC& dc, long x, long y, long w, long h, bool addTooltips); void DoPaintTrack(wxDC& dc, long x, long y, long w, long h, long offset, bool& lastTrackSelected, bool addTooltips, bool setAz, int* lastAz, wxArrayLong* retLinePos=NULL, wxArrayLong* retAlbumIds=NULL); void CalculateFontHeight(); void CalculatePositions(bool calculateFontHeight=true); void OnHScroll(int nScrollCode, int nPos, bool redraw); void SetHScrollInfo(); void OnVScroll(int nScrollCode, int nPos, bool redraw); void SetVScrollInfo(); bool MouseInHeader(int x, int y, long& colIndex, bool& inSizer, wxArrayLong* columns=NULL, wxArrayLong* widths=NULL); bool MouseInTrack(int x, int y, long& offset); bool MouseInCover(int x, int y, SjCol** cover); void OnMouseSelect(wxMouseEvent& event); long m_dragStartX, m_dragStartY, m_columnDragIndex, m_columnDragOrgWidth; bool m_mouseSelectionOnDown; long GetFirstSelectedAndVisible(); // -1 if none long GetLastSelectedAndVisible(bool alsoUseGaps=true); // -1 if none void SelectRange(long i1, long i2); void ScrollOneLineInView(long index); // scroll max. one line up/down to put the index in view long m_lastContextMenuTrackIndex, m_lastContextMenuColIndex; void InitCols(); void LoadConfig(); void SaveConfig(); wxBitmap GetDragNDropBitmap(int mouseX, int mouseY, wxPoint& retHotspot, wxRect& retSize); long m_dragScrollOrgHScroll, m_dragScrollOrgScrollPos; void CalcRefreshNUpdateHeader() { CalculatePositions(); m_window->Refresh(false, &m_headerRect); m_window->Update(); } void CalcRefreshNUpdateTracks(bool refreshCovers) { CalculatePositions(); m_window->Refresh(false, &m_tracksRect); if( refreshCovers ) m_window->Refresh(false, &m_coversRect); m_window->Update(); } void CalcRefreshNUpdateHeaderNTracks() { CalculatePositions(); m_window->Refresh(false, &m_headerRect); m_window->Refresh(false, &m_tracksRect); m_window->Update(); } // tooltip helper wxArrayPtrVoid m_tooltips; void AddToTooltips(const wxRect&, const wxString&); void ClearTooltips(); SjListTooltip* FindTooltip(int mouseX, int mouseY); // misc. long m_tracksNeededToFitCoverHeight; // loaded data void FreeAllocatedCover (); wxArrayPtrVoid m_allocatedCover; SjCol* m_lastClickedCover; }; #endif // __SJ_BROWSER_LIST_H__ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/columnmixer.cpp��������������������������������������������������������0000664�0000000�0000000�00000047675�12660066715�0021126�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: columnmixer.cpp * Authors: Björn Petersen * Purpose: The column mixer * ******************************************************************************/ #include <sjbase/base.h> /******************************************************************************* * Constructor / Destructor ******************************************************************************/ SjColumnMixer::SjColumnMixer() { m_moduleCount = 0; m_libraryModule = NULL; m_selAnchorColIndex = -1; m_maskedColCount = 0; m_unmaskedColCount = 0; } SjColumnMixer::~SjColumnMixer() { } void SjColumnMixer::LoadModules(SjModuleSystem* moduleSystem) { wxASSERT(m_moduleCount==0); wxASSERT(m_libraryModule==NULL); SjModuleList* moduleList = moduleSystem->GetModules(SJ_MODULETYPE_COL); SjModuleList::Node* moduleNode = moduleList->GetFirst(); while( moduleNode ) { SjColModule* module = (SjColModule*)moduleNode->GetData(); wxASSERT(module); if( module->Load() ) { if( module->m_file == wxT("memory:library.lib") ) { m_libraryModule = module; } m_modules[m_moduleCount] = module; m_moduleMaskedColCount[m_moduleCount] = -1; m_moduleUnmaskedColCount[m_moduleCount] = -1; m_moduleCount++; if( m_moduleCount>=SJ_COLUNMMIXER_MAX_MODULES ) { wxLogError(wxT("Too many column modules.")); break; // out of while } } moduleNode = moduleNode->GetNext(); } SetColCount__(); } void SjColumnMixer::UnloadModules() { int m; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); m_modules[m]->Unload(); } m_moduleCount = 0; m_libraryModule = NULL; SetColCount__(); } void SjColumnMixer::ReloadColumns() { SetColCount__(); } /******************************************************************************* * Search Handling ******************************************************************************/ long SjColumnMixer::DelInsSelection(bool delPressed) { long numDeletedTracks = 0; int m; // remember the first selection position on delete // (the new item at the same position will be restored after deletion) long oldColIndex = 0, oldRowIndex = 0; wxString oldUrl; if( delPressed ) { GetSelectionAnchor(oldColIndex, oldRowIndex); SjCol* col = GetMaskedCol(oldColIndex); if( col ) { oldUrl = col->m_url; delete col; } } // delete the selection for( m = 0; m < m_moduleCount; m++ ) { numDeletedTracks += m_modules[m]->DelInsSelection(delPressed); } if( numDeletedTracks ) { // recalculate internals SetColCount__(); // set a new selection if( delPressed ) { int i; if( GetMaskedColIndexByColUrl(oldUrl) == -1 ) { // complete column deleted if( oldColIndex >= GetMaskedColCount() ) oldColIndex = GetMaskedColCount()-1; for( i = 0; i<=4; i++ ) { if( SetSelection(oldColIndex, i) ) // find selectable row from top of column break; } } else { // row deleted for( i=0; i<=2; i++ ) { if( SetSelection(oldColIndex, oldRowIndex-i) ) // find selectable row from old pos. upwards break; } } } } return numDeletedTracks; } SjSearchStat SjColumnMixer::SetSearch(const SjSearch& search, bool deepSearch) { // we're assuming, the search has really changed -- the caller // (currently only SjMainFrame::PerformSearch() should check this SjSearchStat retStat; int m; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); retStat += m_modules[m]->SetSearch(search, deepSearch); } SetColCount__(); return retStat; } void SjColumnMixer::SetColCount__() { m_maskedColCount = 0; m_unmaskedColCount = 0; m_selAnchorColIndex = -1; int m; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); m_moduleMaskedColCount[m] = m_modules[m]->GetMaskedColCount(); m_maskedColCount += m_moduleMaskedColCount[m]; m_moduleUnmaskedColCount[m] = m_modules[m]->GetUnmaskedColCount(); m_unmaskedColCount += m_moduleUnmaskedColCount[m]; } } long SjColumnMixer::GetMaskedColIndexByAz(int targetId) { int m; long index = 0; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); if( m_modules[m] == m_libraryModule ) { return index + m_modules[m]->GetMaskedColIndexByAz(targetId); } index += m_moduleMaskedColCount[m]; } return 0; } wxString SjColumnMixer::GetAzDescr(int targetIdOrChar) { int azChar = targetIdOrChar; if( azChar >= IDT_WORKSPACE_GOTO_A && azChar <= IDT_WORKSPACE_GOTO_0_9 ) { azChar = 'a' + (targetIdOrChar-IDT_WORKSPACE_GOTO_A); } if( azChar == ('z'+1) /*character behind 'z' is normally '{'*/ ) { return wxT("0-9"); } else { return wxString::Format(wxT("%c"), (wxChar)azChar).Upper(); } } long SjColumnMixer::GetMaskedColIndexByColUrl(const wxString& colUrl) { int m; long index = 0, modIndex; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); modIndex = m_modules[m]->GetMaskedColIndexByColUrl(colUrl); if( modIndex >= 0 ) { return index + modIndex; } index += m_moduleMaskedColCount[m]; } return -1; // not found } bool SjColumnMixer::GetMaskedColIndexByRow(SjRow* row, long& colIndex, long& rowIndex) { SjCol* col = GetMaskedCol(row->m_url, colIndex); if( col ) { for( rowIndex = 0; rowIndex < col->m_rowCount; rowIndex++ ) { if( col->m_rows[rowIndex]->m_url == row->m_url ) { delete col; return TRUE; // success } } delete col; } return FALSE; // error } SjCol* SjColumnMixer::GetMaskedCol(long index) { SjCol* ret; int m; if( index >= 0 && index < m_maskedColCount ) { for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); if( index < m_moduleMaskedColCount[m] ) { ret = m_modules[m]->GetMaskedCol(index); if( ret ) { wxASSERT(ret->m_module == m_modules[m]); return ret; } else { return NULL; } } index -= m_moduleMaskedColCount[m]; } } return NULL; } SjCol* SjColumnMixer::GetUnmaskedCol(long index) { SjCol* ret; int m; if( index >= 0 && index < m_unmaskedColCount ) { for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); if( index < m_moduleUnmaskedColCount[m] ) { ret = m_modules[m]->GetUnmaskedCol(index); if( ret ) { wxASSERT(ret->m_module == m_modules[m]); return ret; } else { return NULL; } } index -= m_moduleUnmaskedColCount[m]; } } return NULL; } SjCol* SjColumnMixer::GetMaskedCol(const wxString& trackUrl, long& retIndex) { SjCol* col; int m; long otherIndex = 0; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); col = m_modules[m]->GetMaskedCol(trackUrl, retIndex); if( col ) { if( retIndex != -1 ) retIndex += otherIndex; return col; } otherIndex += m_moduleMaskedColCount[m]; } return NULL; } /******************************************************************************* * Selection Handling ******************************************************************************/ bool SjColumnMixer::IsAnythingSelected() { int m; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); if( m_modules[m]->GetSelectedUrlCount() ) { return TRUE; } } return FALSE; } long SjColumnMixer::GetSelectedUrlCount() { int m; long ret = 0; for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); ret += m_modules[m]->GetSelectedUrlCount(); } return ret; } void SjColumnMixer::SelectAll(bool select, bool keepAnchor) { int m; if( !keepAnchor ) { m_selAnchorColIndex = -1; } for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); m_modules[m]->SelectAllRows(select); } } void SjColumnMixer::GetSelectedUrls(wxArrayString& urls, SjSelectedUrlsScope scope) { int m; switch( scope ) { case SJ_SEL_URLS_WORKSPACE: // use the selected workspace URLs for( m = 0; m < m_moduleCount; m++ ) m_modules[m]->GetSelectedUrls(urls); break; case SJ_SEL_URLS_DISPLAY: // use the selected display URLS urls = g_mainFrame->m_player.m_queue.GetUrlsByIds(g_mainFrame->m_display.m_selectedIds); break; case SJ_SEL_URLS_SMART: // return the (a) selected display URLs, (b) selected workspace URLs or (c) _all_ display URLs if( g_mainFrame->m_display.m_selectedIds.GetCount() ) { urls = g_mainFrame->m_player.m_queue.GetUrlsByIds(g_mainFrame->m_display.m_selectedIds); if( urls.GetCount() ) return; } for( m = 0; m < m_moduleCount; m++ ) m_modules[m]->GetSelectedUrls(urls); if( urls.GetCount() == 0 ) urls = g_mainFrame->m_player.m_queue.GetUrls(); break; } } bool SjColumnMixer::GetSelectionRange(long& firstSelColIndex, long& firstSelRowIndex, long* lastSelColIndex, long* lastSelRowIndex) { SjCol* currCol; long s, c; wxArrayString selUrls; long selUrlsCount; bool busyCursorSet = FALSE; unsigned long startBusyTime = SjTools::GetMsTicks() + 80; // Get all selected URLs. GetSelectedUrls(selUrls); selUrlsCount = selUrls.GetCount(); // Find out the first/last selected column and row index. // The calculation of the last selection is optional and may be skipped for speed reasons. firstSelColIndex = -1; if( lastSelColIndex ) { *lastSelColIndex = -1; } for( s = 0; s < selUrlsCount; s++ ) { currCol = GetMaskedCol(selUrls[s], c); if( currCol ) { if( c < firstSelColIndex || firstSelColIndex == -1 ) { firstSelColIndex = c; for( firstSelRowIndex = 0; firstSelRowIndex < currCol->m_rowCount; firstSelRowIndex++ ) { if( currCol->m_rows[firstSelRowIndex]->IsSelected() ) { break; } } if( firstSelRowIndex >= currCol->m_rowCount ) { firstSelColIndex = -1; // error -> start over } } if( lastSelColIndex && (c > *lastSelColIndex || *lastSelColIndex == -1) ) { *lastSelColIndex = c; for( *lastSelRowIndex = currCol->m_rowCount-1; *lastSelRowIndex >= 0; (*lastSelRowIndex)-- ) { if( currCol->m_rows[*lastSelRowIndex]->IsSelected() ) { break; } } if( *lastSelRowIndex < 0 ) { *lastSelColIndex = -1; // error -> start over } } delete currCol; } // Check busy cursor for longer operations. if( !busyCursorSet && SjTools::GetMsTicks() > startBusyTime ) { ::wxBeginBusyCursor(); busyCursorSet = TRUE; } } // Done. if( busyCursorSet ) { ::wxEndBusyCursor(); } return (firstSelColIndex!=-1); // if a first selection is found, there is always a last selection } long SjColumnMixer::SetSelectionRange(long firstSelColIndex, long firstSelRowIndex, long lastSelColIndex, long lastSelRowIndex, bool keepAnchor ) { long c, r; SjCol* currCol; bool busyCursorSet = FALSE; unsigned long startBusyTime = SjTools::GetMsTicks() + 80; long selectionCount = 0; // deselect all rows SelectAll(FALSE, keepAnchor); // select given rows for( c = firstSelColIndex; c <= lastSelColIndex; c++ ) { currCol = GetMaskedCol(c); if( currCol ) { for( r = 0; r < currCol->m_rowCount; r++ ) { if( (firstSelColIndex!=lastSelColIndex && ((c==firstSelColIndex && r>=firstSelRowIndex) || (c> firstSelColIndex && c<lastSelColIndex) || (c==lastSelColIndex && r<=lastSelRowIndex))) || (r>=firstSelRowIndex && r<=lastSelRowIndex) ) { if( currCol->m_rows[r]->IsSelectable()==2 ) { currCol->m_rows[r]->Select(TRUE); selectionCount++; } } } delete currCol; } // check busy cursor for longer operations if( !busyCursorSet && SjTools::GetMsTicks() > startBusyTime ) { ::wxBeginBusyCursor(); busyCursorSet = TRUE; } } // Done. if( busyCursorSet ) { ::wxEndBusyCursor(); } return selectionCount; } bool SjColumnMixer::GetSelectionAnchor(long& colIndex__, long& rowIndex__) { SjCol* currCol; // verify stored anchor if( m_selAnchorColIndex != -1 ) { currCol = GetMaskedCol(m_selAnchorColIndex); if( currCol == NULL ) { m_selAnchorColIndex = -1; // recalculate anchor - this is no error! } else { if( m_selAnchorRowIndex<0 || m_selAnchorRowIndex>=currCol->m_rowCount || !currCol->m_rows[m_selAnchorRowIndex]->IsSelected() ) { m_selAnchorColIndex = -1; // recalculate anchor - this is no error! } delete currCol; } } // recalculate anchor if needed if( m_selAnchorColIndex == -1 || GetSelectedUrlCount() == 1 ) { GetSelectionRange(m_selAnchorColIndex, m_selAnchorRowIndex); } // done colIndex__ = m_selAnchorColIndex; rowIndex__ = m_selAnchorRowIndex; return m_selAnchorColIndex!=-1; } void SjColumnMixer::SelectShifted(SjRow* rowClicked) { // Function selects all rows from the "currently selected" row // up to the given row. All other rows are deselected. // The "currently selected" row is the first selected row or a stored anchor. wxASSERT( rowClicked ); wxASSERT( rowClicked->IsSelectable()==2 ); long rowClickedColIndex, rowClickedRowIndex; // If there is no selected row/no anchor, we cannot shift to the given row; // simply select the given row in this case. if( !GetSelectionAnchor(rowClickedColIndex/*dummy*/, rowClickedRowIndex/*dummy*/) ) { rowClicked->Select(TRUE); return; // Done. } // find out "shift to" column and row index if( GetMaskedColIndexByRow(rowClicked, rowClickedColIndex, rowClickedRowIndex) ) { // okay, now we have the first and the last selected row index // and the index of the row to shift to -- see what to do if( rowClickedColIndex > m_selAnchorColIndex || (rowClickedColIndex == m_selAnchorColIndex && rowClickedRowIndex > m_selAnchorRowIndex) ) { // select from the first selected row up to the shifted row SetSelectionRange(m_selAnchorColIndex, m_selAnchorRowIndex, rowClickedColIndex, rowClickedRowIndex, TRUE); } else { // select from the shifted row up to the first selected row; SetSelectionRange(rowClickedColIndex, rowClickedRowIndex, m_selAnchorColIndex, m_selAnchorRowIndex, TRUE); } } } bool SjColumnMixer::SelectShifted(int keyPressed/*-1=up, +1=down*/, long& retScopeColIndex, long& retScopeRowIndex) { long firstSelColIndex, firstSelRowIndex, lastSelColIndex, lastSelRowIndex; bool prevNextOk; // get selection anchor and the first/last selected row if( !GetSelectionAnchor(firstSelColIndex/*dummy*/, firstSelRowIndex/*dummy*/) || !GetSelectionRange(firstSelColIndex, firstSelRowIndex, &lastSelColIndex, &lastSelRowIndex) ) { return FALSE; // no anchor, the caller should preform a "simple" selection } // calculate the new selection... if( firstSelColIndex == lastSelColIndex && firstSelRowIndex == lastSelRowIndex ) { if( keyPressed == -1 ) { // ...initial selection from anchor to top prevNextOk = PrevNextRow(firstSelColIndex, firstSelRowIndex, -1); retScopeColIndex = firstSelColIndex; retScopeRowIndex = firstSelRowIndex; } else { // ...initial selection from anchor to bottom prevNextOk = PrevNextRow(lastSelColIndex, lastSelRowIndex, +1); retScopeColIndex = lastSelColIndex; retScopeRowIndex = lastSelRowIndex; } } else if( firstSelColIndex < m_selAnchorColIndex || (firstSelColIndex == m_selAnchorColIndex && firstSelRowIndex < m_selAnchorRowIndex) ) { // ...selected stuff above the anchor... prevNextOk = PrevNextRow(firstSelColIndex, firstSelRowIndex, keyPressed); retScopeColIndex = firstSelColIndex; retScopeRowIndex = firstSelRowIndex; } else { // ...select stuff below the anchor... prevNextOk = PrevNextRow(lastSelColIndex, lastSelRowIndex, keyPressed); retScopeColIndex = lastSelColIndex; retScopeRowIndex = lastSelRowIndex; } if( prevNextOk ) { // set the new selection SetSelectionRange(firstSelColIndex, firstSelRowIndex, lastSelColIndex, lastSelRowIndex, TRUE); // make sure, the anchor is always selected SjCol* col = GetMaskedCol(m_selAnchorColIndex); if( col ) { if( m_selAnchorRowIndex >= 0 && m_selAnchorRowIndex < col->m_rowCount ) { col->m_rows[m_selAnchorRowIndex]->Select(TRUE); } delete col; } } return TRUE; } bool SjColumnMixer::PrevNextRow(long& colIndex, long& rowIndex, int dir) { long orgColIndex = colIndex, orgRowIndex = rowIndex; wxASSERT( dir==+1 || dir==-1 ); SjCol* col; while( 1 ) { col = GetMaskedCol(colIndex); if( col == NULL ) break; if( rowIndex == -2 /* (X) see below */ ) rowIndex = col->m_rowCount; if( dir == +1 ) { rowIndex++; for( ; rowIndex < col->m_rowCount; rowIndex++ ) { if( col->m_rows[rowIndex]->IsSelectable() == 2 ) { delete col; return TRUE; // success } } colIndex++; rowIndex = -1; } else { rowIndex--; for( ; rowIndex >= 0; rowIndex-- ) { if( col->m_rows[rowIndex]->IsSelectable() == 2 ) { delete col; return TRUE; // success } } colIndex--; rowIndex = -2; // corrected above (X) } delete col; } // no subsequent row found, return given row colIndex = orgColIndex; rowIndex = orgRowIndex; return FALSE; } /******************************************************************************* * Get Column/Row Information ******************************************************************************/ bool SjColumnMixer::GetQuickInfo(const wxString& url, wxString& trackName, wxString& leadArtistName, wxString& albumName, long& playtimeMs) { int m; bool ok = FALSE; m_tempInfo.m_trackName.Empty(); m_tempInfo.m_leadArtistName.Empty(); m_tempInfo.m_playtimeMs = 0; // first, try the "A-Z" module (normally the largest module) if( m_libraryModule ) { ok = m_libraryModule->GetTrackInfo(url, m_tempInfo, SJ_TI_QUICKINFO, FALSE/*no log*/); } // then, try the other modules if( !ok ) { for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); if( m_modules[m] != m_libraryModule ) { ok = m_modules[m]->GetTrackInfo(url, m_tempInfo, SJ_TI_QUICKINFO, FALSE/*no log*/); if( ok ) { break; } } } } // done so far if( ok ) { trackName = m_tempInfo.m_trackName; leadArtistName = m_tempInfo.m_leadArtistName; albumName = m_tempInfo.m_albumName; playtimeMs = m_tempInfo.m_playtimeMs; return TRUE; } else { trackName = url; leadArtistName.Empty(); playtimeMs = 0; return FALSE; } } wxString SjColumnMixer::GetTrackCoverUrl(const wxString& trackUrl) { int m; bool ok = FALSE; // amy track given? if( trackUrl.IsEmpty() ) return wxEmptyString; // first, try the "A-Z" module (normally the largest module) if( m_libraryModule ) { m_tempInfo.m_arts.Empty(); ok = m_libraryModule->GetTrackInfo(trackUrl, m_tempInfo, SJ_TI_TRACKCOVERURL, FALSE/*no log*/); } // then, try the other modules if( !ok ) { for( m = 0; m < m_moduleCount; m++ ) { wxASSERT(m_modules[m]); if( m_modules[m] != m_libraryModule ) { m_tempInfo.m_arts.Empty(); ok = m_modules[m]->GetTrackInfo(trackUrl, m_tempInfo, SJ_TI_TRACKCOVERURL, FALSE/*no log*/); if( ok ) { break; } } } } // anything found? if( !ok ) return wxEmptyString; // simply return the first cover return m_tempInfo.m_arts.BeforeFirst(wxT('\n')); } �������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/columnmixer.h����������������������������������������������������������0000664�0000000�0000000�00000011075�12660066715�0020554�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: columnmixer.h * Authors: Björn Petersen * Purpose: The column mixer * ******************************************************************************/ #ifndef __SJ_COLUMN_MIXER_H__ #define __SJ_COLUMN_MIXER_H__ class SjModuleSystem; class SjCol; enum SjSelectedUrlsScope { SJ_SEL_URLS_WORKSPACE, SJ_SEL_URLS_DISPLAY, SJ_SEL_URLS_SMART }; class SjColumnMixer { public: SjColumnMixer (); ~SjColumnMixer (); void LoadModules (SjModuleSystem*); void UnloadModules (); void ReloadColumns (); // search handling SjSearchStat SetSearch (const SjSearch&, bool deepSearch); static wxString GetAzDescr (int targetIdOrChar); // column- and cover-view handling, a retrieved SjCol object that is no longer needed should be deleted long GetUnmaskedColCount () { return m_unmaskedColCount; } SjCol* GetUnmaskedCol (long index); long GetMaskedColCount () {return m_maskedColCount;} long GetMaskedColIndexByAz(int targetId); long GetMaskedColIndexByColUrl(const wxString& colUrl); bool GetMaskedColIndexByRow(SjRow*, long& colIndex, long& rowIndex); SjCol* GetMaskedCol (long index); SjCol* GetMaskedCol (const wxString& trackUrl, long& retIndex); // list-view handling, a list view that is no longer needed should be deleted long GetListViewCount () const { return m_moduleCount; } SjListView* CreateListView (int i, long order, bool desc, long minAlbumRows) { return m_modules[i]->CreateListView(order, desc, minAlbumRows); } // selection handling bool IsAnythingSelected (); long GetSelectedUrlCount (); void GetSelectedUrls (wxArrayString&, SjSelectedUrlsScope scope=SJ_SEL_URLS_WORKSPACE); void SelectAll (bool select, bool keepAnchor=FALSE); void SelectShifted (SjRow* rowClicked); bool SelectShifted (int keyPressed/*-1=up, +1=down*/, long& retScopeColIndex, long& retScopeRowIndex); bool PrevNextRow (long& colIndex, long& rowIndex, int dir); long DelInsSelection (bool del); // return TRUE if the browser's view should be reloaded // retrieve information bool GetQuickInfo (const wxString& url, wxString& trackName, wxString& leadArtistName, wxString& albumName, long& playtimeMs); wxString GetTrackCoverUrl (const wxString& url); private: #define SJ_COLUNMMIXER_MAX_MODULES 16 long m_moduleCount; SjColModule* m_modules[SJ_COLUNMMIXER_MAX_MODULES]; SjColModule* m_libraryModule; // may be NULL long SetSelection (long colIndex, long rowIndex) { return SetSelectionRange(colIndex, rowIndex, colIndex, rowIndex, FALSE); } bool GetSelectionRange (long& firstSelColIndex, long& firstSelRowIndex, long* lastSelColIndex=NULL, long* lastSelRowIndex=NULL); long SetSelectionRange (long firstSelColIndex, long firstSelRowIndex, long lastSelColIndex, long lastSelRowIndex, bool keepAnchor); long m_unmaskedColCount; long m_moduleUnmaskedColCount[SJ_COLUNMMIXER_MAX_MODULES]; long m_maskedColCount; long m_moduleMaskedColCount[SJ_COLUNMMIXER_MAX_MODULES]; long m_selAnchorColIndex, m_selAnchorRowIndex; bool GetSelectionAnchor (long& colIndex, long& rowIndex); void SetColCount__ (); SjTrackInfo m_tempInfo; }; #endif // __SJ_COLUMN_MIXER_H__ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/compileoptions.h�������������������������������������������������������0000664�0000000�0000000�00000012332�12660066715�0021253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: compileoptions.h * Authors: Björn Petersen * Purpose: Program configuration * ******************************************************************************/ #ifndef __SJ_CONFIG_H__ #define __SJ_CONFIG_H__ #define SJ_VERSION_MAJOR 16 // when changing the version number here, also change it in configure.ac and maybe in the OS-depending installer #define SJ_VERSION_MINOR 2 #define SJ_VERSION_REVISION 3 #ifndef SJ_PROGRAM_NAME #define SJ_PROGRAM_NAME wxT("Silverjuke") #endif #ifndef SJ_USE_C_INTERFACE // allow C plugins? Makes only sense if scripting is enabled, too. #define SJ_USE_C_INTERFACE 1 #endif #ifndef SJ_USE_SCRIPTS // Can the user use scripts? #define SJ_USE_SCRIPTS 1 #endif #ifndef SJ_USE_TOOLTIPS // Use tooltips? #define SJ_USE_TOOLTIPS 0 #endif #ifndef SJ_USE_PROJECTM // Use the internal projectM/Prjm Milkdrop-esque visualisation? (requires OpenGL) #define SJ_USE_PROJECTM 1 #endif #ifndef SJ_CAN_USE_MM_KEYBD #define SJ_CAN_USE_MM_KEYBD 0 // Can the multimedia keyboards keys be used? #endif #ifndef SJ_CAN_USE_GLOBAL_HOTKEYS // Can global hotkeys be used? #define SJ_CAN_USE_GLOBAL_HOTKEYS 0 #endif #ifndef SJ_CAN_DISABLE_SCRSAVER // Can the screensaver be disabled? #define SJ_CAN_DISABLE_SCRSAVER 0 #endif #ifndef SJ_CAN_DISABLE_POWERMAN // Can the power management be disabled? #define SJ_CAN_DISABLE_POWERMAN 0 #endif #ifndef SJ_DEF_SQLITE_SYNC #define SJ_DEF_SQLITE_SYNC 0L // 0=off (fast), 1=normal (save but slower), 2=full (very save and slow) #endif #ifndef SJ_DEF_SQLITE_CACHE_BYTES #define SJ_DEF_SQLITE_CACHE_BYTES 0x100000L #endif #ifndef SJ_DEF_IMGTHREAD_CACHE_BYTES #define SJ_DEF_IMGTHREAD_CACHE_BYTES 0x200000L #endif #ifndef SJ_DEF_SEARCH_WHILE_TYPING #define SJ_DEF_SEARCH_WHILE_TYPING 1L #endif #ifndef SJ_RATING_CHARS_DLG #if wxUSE_UNICODE #define SJ_RATING_CHARS_DLG wxT("\u2605") // "BLACK STAR" #define SJ_RATING_CHARS_ELSEWHERE wxT("\u2605") // "BLACK STAR" #else #define SJ_RATING_CHARS_DLG wxT("*") #define SJ_RATING_CHARS_ELSEWHERE wxT("*") #endif #endif #ifndef SJ_DEF_FONT_FACE #define SJ_DEF_FONT_FACE wxT("Arial") #endif #ifndef SJ_DEF_FONT_SIZE #define SJ_DEF_FONT_SIZE 10L #endif #ifndef SJ_ALT_FONT_FACE #define SJ_ALT_FONT_FACE wxT("Times New Roman") // used for creating dummy covers #endif #ifndef SJ_DEF_COLUMN_WIDTH #define SJ_DEF_COLUMN_WIDTH 180L // pixels #define SJ_MIN_COLUMN_WIDTH 80L #define SJ_MAX_COLUMN_WIDTH 1600L #endif #ifndef SJ_DEF_COVER_HEIGHT #define SJ_DEF_COVER_HEIGHT 90L // percent - 90% looks a little bit smarter as if using the full column width #endif #ifndef SJ_MIN_FONT_SIZE #define SJ_MIN_FONT_SIZE 6L // Pt #define SJ_MAX_FONT_SIZE 64L #endif #ifndef SJ_DEF_VOLUME #define SJ_DEF_VOLUME 240L // 0..255 #endif #ifndef SJ_DEF_OUTPUT_BUF_MS #define SJ_DEF_OUTPUT_BUF_MS 92 // buffer size should be a power of 2 in bytes (this is corrected automatically) #endif #ifndef SJ_SEARCH_DELAY_MS #define SJ_SEARCH_DELAY_MS 180L // the initial number of milliseconds between text input and search start, #endif // the number is adapted on-the-fly by the 'real' search time #ifndef SJ_HISTORY_DELAY_MS #define SJ_HISTORY_DELAY_MS 3000L // the number of milliseconds before new text input is added to the history #endif #ifndef SJ_SEEK_RESOLUTION #define SJ_SEEK_RESOLUTION 500L // ms, the display is updated at most every 1000 ms #endif #ifndef SJ_FILENAME_MAX_LEN // some information about a file name (NOT: a path!) #define SJ_FILENAME_MAX_LEN 240 #define SJ_FILENAME_FORBIDDEN wxT("\\") wxT("\"") wxT("/:*?<>|") #define SJ_FILENAME_FORBIDDEN_REPLACE wxT("_") wxT("'") wxT("__+____") #endif #ifndef SJ_WINDOW_DISABLER #define SJ_WINDOW_DISABLER(a) wxWindowDisabler disabler((a)); #endif #if !defined(SJ_USE_XINE) && !defined(SJ_USE_GSTREAMER) #define SJ_USE_GSTREAMER 1 #endif #ifndef SJ_USE_XINE #define SJ_USE_XINE 0 #endif #ifndef SJ_USE_GSTREAMER #define SJ_USE_GSTREAMER 0 #endif #ifndef SJ_USE_VIDEO // Use the video decoder and the video display? (should be checked after the player) #if SJ_USE_GSTREAMER #define SJ_USE_VIDEO 1 #else #define SJ_USE_VIDEO 0 #endif #endif #endif // __SJ_CONFIG_H__ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/display.cpp������������������������������������������������������������0000664�0000000�0000000�00000103315�12660066715�0020211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: mainframe.cpp * Authors: Björn Petersen * Purpose: Silverjuke main frame * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/display.h> #include <sjbase/mainframe.h> #include <sjbase/browser.h> #include <sjmodules/kiosk/kiosk.h> #include <sjmodules/tageditor/tageditor.h> #include <sjmodules/arteditor.h> // wanted wxLogDebug() outputs #undef DEBUG_DISPLAY SjDisplay::SjDisplay() { m_scrollPos = -1; // use queue pos m_msgCancelAtTimestamp = 0; m_selectedIdsTimestamp = 0; m_selectedAnchorId = 0; m_tagEditorJustOpened = false; m_backupedCurrLine = -1; } void SjDisplay::ClearDisplaySelection() { m_selectedIds.Clear(); m_selectedAnchorId = 0; g_mainFrame->UpdateDisplay(); } /******************************************************************************* * Handling the Display - The edit dialog ******************************************************************************/ SjDisplayEditDlg::SjDisplayEditDlg() : SjTagEditorDlg(g_mainFrame, (g_mainFrame->m_contextMenuClickedUrls.GetCount()>1)) { g_mainFrame->m_display.m_tagEditorJustOpened = TRUE; g_mainFrame->m_libraryModule->SavePendingData(); m_id = g_mainFrame->m_contextMenuClickedId; if( g_mainFrame->m_contextMenuClickedUrls.GetCount() > 1 ) { m_urls = g_mainFrame->m_contextMenuClickedUrls; } else { m_urls.Add(g_mainFrame->m_player.m_queue.GetUrlById(m_id)); MarkId(0); } } void SjDisplayEditDlg::MarkId(long changeScrollPosDir) { g_mainFrame->m_display.m_selectedIds.Clear(); g_mainFrame->m_display.m_selectedIds.Insert(m_id, 1); long markedPos = g_mainFrame->m_player.m_queue.GetPosById(m_id); long queuePos = g_mainFrame->m_display.m_scrollPos==-1? g_mainFrame->m_player.m_queue.GetCurrPos() : g_mainFrame->m_display.m_scrollPos; if( changeScrollPosDir && (markedPos < queuePos || markedPos >= queuePos+g_mainFrame->GetLinesCount()) ) { if( changeScrollPosDir < 0 ) { g_mainFrame->m_display.m_scrollPos = markedPos; } else { g_mainFrame->m_display.m_scrollPos = (markedPos-g_mainFrame->GetLinesCount())+1; } } g_mainFrame->GotDisplayInputFromUser(); g_mainFrame->UpdateDisplay(); g_mainFrame->m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); g_mainFrame->m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; } bool SjDisplayEditDlg::GetUrls(wxArrayString& retUrls, int what) { if( what != 0 ) { m_urls.Clear(); long newId = 0; long currPos = g_mainFrame->m_player.m_queue.GetPosById(m_id); long queueCount = g_mainFrame->m_player.m_queue.GetCount(); if( currPos >= 0 && currPos < queueCount ) { if( what == 1 && currPos < queueCount-1 ) { // get next track newId = g_mainFrame->m_player.m_queue.GetIdByPos(currPos+1); } else if( what == -1 && currPos > 0 ) { // get prev. track newId = g_mainFrame->m_player.m_queue.GetIdByPos(currPos-1); } } if( newId ) { m_id = newId; m_urls.Clear(); m_urls.Add(g_mainFrame->m_player.m_queue.GetUrlById(m_id)); MarkId(what); } } // return the urls in scope retUrls = m_urls; return TRUE; } void SjDisplayEditDlg::OnUrlChanged(const wxString& oldUrl, const wxString& newUrl) { if( !newUrl.IsEmpty() ) { int index = m_urls.Index(oldUrl); if( index != wxNOT_FOUND ) { m_urls[index] = newUrl; } } } /******************************************************************************* * Receiving display events ******************************************************************************/ void SjMainFrame::OnSkinDisplayEvent(int targetId, SjSkinValue& value, long accelFlags) { if( targetId >= IDT_DISPLAY_LINE_FIRST && targetId <= IDT_DISPLAY_LINE_LAST ) { long displayLine = targetId-IDT_DISPLAY_LINE_FIRST; GotDisplayInputFromUser(); if( !m_display.m_msg1.IsEmpty() ) { ClearDisplayMsg(); return; } long queuePos = m_display.m_firstLineQueuePos + displayLine; if( queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { if( value.value == SJ_SUBITEM_ICONRIGHT && IsOpAvailable(SJ_OP_UNQUEUE) ) { UnqueueByPos(queuePos); } else if( value.value == SJ_SUBITEM_ICONLEFT ) { if( m_player.m_queue.GetCurrPos() == queuePos ) { if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { PlayOrPause(); } } else if( m_player.m_queue.WasPlayed(queuePos) ) { if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { m_player.m_queue.ResetPlayCount(queuePos); UpdateDisplay(); } } } else if( value.value == SJ_SUBITEM_TEXT_DCLICK && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { #ifdef DEBUG_DISPLAY SjPlaylistEntry& urlInfo = m_player.m_queue.GetInfo(queuePos); wxLogDebug("Line pos. %i: %s - %s", (int)queuePos, urlInfo.GetLeadArtistName().c_str(), urlInfo.GetTrackName().c_str()); #endif if( m_player.m_queue.GetCurrPos() == queuePos && IsPlaying() ) { ; // PlayOrPause(); // better do nothing } else { m_player.GotoAbsPos(queuePos, accelFlags!=0); if( !IsPlaying() ) { Play(); UpdateDisplay(); } } } else if( (value.value == SJ_SUBITEM_TEXT_MOUSEDOWN || value.value == SJ_SUBITEM_TEXT/*_MOUSEUP*/ ) && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { MarkDisplayTrack(targetId, value.value == SJ_SUBITEM_TEXT_MOUSEDOWN, value.vmin); } else if( value.value == SJ_SUBITEM_TEXT_MIDDLECLICK ) { if( g_accelModule->m_middleMouseAction ) { long queueId = m_player.m_queue.GetIdByPos(queuePos); if( queueId == 0 ) { return; } if( !m_display.m_selectedIds.Lookup(queueId) ) { // mark the item under the mouse if it is not marked m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(queueId, 1); m_display.m_selectedAnchorId = queueId; UpdateDisplay(); } m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; m_contextMenuClickedUrls = m_player.m_queue.GetUrlsByIds(m_display.m_selectedIds); m_contextMenuClickedId = queueId; switch( g_accelModule->m_middleMouseAction ) { case SJ_ACCEL_MID_OPENS_TAG_EDITOR: if( IsAllAvailable() ) { g_tagEditorModule->OpenTagEditor(new SjDisplayEditDlg()); } break; } } } } else { // click on empty line; remove all marks m_display.m_selectedIds.Clear(); m_display.m_selectedAnchorId = 0; UpdateDisplay(); } } else switch( targetId ) { // curr / next tracks case IDT_CURR_TRACK: if( value.value == SJ_SUBITEM_TEXT_DCLICK && !IsStopped() && IsPaused() && IsOpAvailable(SJ_OP_PLAYPAUSE) ) { Play(); UpdateDisplay(); } break; case IDT_NEXT_TRACK: if( value.value == SJ_SUBITEM_TEXT_DCLICK && !IsStopped() && !GetShuffle() && HasNextIgnoreAP() && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { GotoNextRegardAP(accelFlags!=0); if( !IsPlaying() ) Play(); UpdateDisplay(); } break; // main volume case IDT_MAIN_VOL_UP: case IDT_MAIN_VOL_DOWN: if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { SetRelMainVol(targetId==IDT_MAIN_VOL_UP? 8 : -8); SetSkinTargetValue(IDT_MAIN_VOL_MUTE, m_player.GetMainVolMute()? 1 : 0); // maybe later -- SetDisplayMsg(_("Volume")+wxString::Format(": %i%%", (m_player.GetMainVolume()*100)/255), SDM_STATE_CHANGE_MS); } break; case IDT_MAIN_VOL_SLIDER: if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { SetAbsMainVol(value.value); SetSkinTargetValue(IDT_MAIN_VOL_MUTE, m_player.GetMainVolMute()? 1 : 0); // maybe later -- SetDisplayMsg(_("Volume")+wxString::Format(": %i%%", (m_player.GetMainVolume()*100)/255), SDM_STATE_CHANGE_MS); } break; case IDT_MAIN_VOL_MUTE: if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { m_player.ToggleMainVolMute(); UpdateDisplay(); } break; // seek case IDT_SEEK: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { SjPlayer* recentPlayer = &g_mainFrame->m_player; recentPlayer->SeekAbs(value.value*SJ_SEEK_RESOLUTION); UpdateDisplay(); } break; case IDT_SEEK_BWD: case IDT_SEEK_FWD: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { SjPlayer* recentPlayer = &g_mainFrame->m_player; recentPlayer->SeekRel(targetId==IDT_SEEK_BWD? -5000 : 5000); UpdateDisplay(); } break; // misc. case IDO_DISPLAY_COVER_EXPLR: { SjPlayer* recentPlayer = &g_mainFrame->m_player; g_tools->ExploreUrl(m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1))); } break; case IDT_DISPLAY_COVER: case IDO_DISPLAY_COVER: // IDO_DISPLAY_COVER is only used for the menu item if( value.value == SJ_SUBITEM_TEXT_DCLICK || (value.value == SJ_SUBITEM_TEXT_MIDDLECLICK && g_accelModule->m_middleMouseAction==SJ_ACCEL_MID_OPENS_TAG_EDITOR) || targetId != IDT_DISPLAY_COVER ) { // open the cover editor for the display cover SjPlayer* recentPlayer = &g_mainFrame->m_player; wxString trackUrl = recentPlayer->m_queue.GetUrlByPos(-1); wxSqlt sql; sql.Query(wxT("SELECT albumid FROM tracks WHERE url='") + sql.QParam(trackUrl) + wxT("';")); unsigned long albumId = sql.Next()? sql.GetLong(0) : 0; wxString selArtUrl = m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1)); wxArrayLong artIds; wxArrayString artUrls; g_mainFrame->m_libraryModule->GetPossibleAlbumArts(albumId, artIds, &artUrls, true/*addAutoCover*/); g_artEditorModule->OnArtMenu(g_mainFrame, artUrls, selArtUrl, albumId, IDM_OPENARTEDITOR, NULL, true /*IsPlaylistCover*/ ); /* // simulate a double click on the cover row or explore the cover url long index, r; SjCol* col = m_columnMixer.GetMaskedCol(recentPlayer->m_queue.GetUrlByPos(recentPlayer->m_queue.GetCurrPos()), index); SjAlbumCoverRow* row; if( col ) { for( r = 0; r < col->m_rowCount; r++ ) { if( col->m_rows[r]->m_roughType == SJ_RRTYPE_COVER ) { row = (SjAlbumCoverRow*)col->m_rows[r]; row->IsPlaylistCover(true); // if set to true, "follow playlist" is always active row->OnMiddleClick(false); break; } } delete col; } */ } break; case IDT_DISPLAY_UP: GotDisplayInputFromUser(); if( m_display.m_scrollPos == -1 ) { m_display.m_scrollPos = GetQueuePos(); } if( m_display.m_scrollPos >= 1 ) { m_display.m_scrollPos--; UpdateDisplay(); } break; case IDT_DISPLAY_DOWN: GotDisplayInputFromUser(); if( m_display.m_scrollPos == -1 ) { m_display.m_scrollPos = GetQueuePos(); } m_display.m_scrollPos++; // corrected in UpdateDisplay() UpdateDisplay(); break; case IDT_DISPLAY_V_SCROLL: GotDisplayInputFromUser(); m_display.m_scrollPos = value.value; UpdateDisplay(); break; } } /******************************************************************************* * Setting the display ******************************************************************************/ void SjMainFrame::UpdateCurrTime() { long showMs = -1; bool prependMinus = false; if( m_player.IsStopped() ) { // we show not title if the player is stopped /* long pos = m_player.m_queue.GetCurrPos(); if( pos >= 0 ) { SjPlaylistEntry& urlInfo = m_player.m_queue.GetInfo(pos); showMs = urlInfo.GetPlaytimeMs(); if( showMs <= 0 ) showMs = -1; } */ } else { long totalMs, elapsedMs, remainingMs; m_player.GetTime(totalMs, elapsedMs, remainingMs); if( m_showRemainingTime && remainingMs >= 0 ) { showMs = remainingMs; prependMinus = true; } else { showMs = elapsedMs; } } SjSkinValue value; if( showMs >= 0 ) { value.string.Append(SjTools::FormatTime(showMs/1000, SJ_FT_ALLOW_ZERO|SJ_FT_MIN_5_CHARS|(prependMinus?SJ_FT_PREPEND_MINUS:0))); } else { value.string = wxT("--:--"); } SetSkinTargetValue(IDT_CURR_TIME, value); } wxString SjMainFrame::CombineArtistNTitle(const wxString& artist, const wxString& title, const wxString& sep) { wxString ret(artist); if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_ARTIST ) { if( !ret.IsEmpty() ) ret.Append(sep); ret.Append(title); } else { ret = title; } return ret; } void SjMainFrame::UpdateDisplay() { SjSkinValue value; long totalMs, elapsedMs; // get the number of visible lines long visLineCount = GetLinesCount(), visLine; wxASSERT(visLineCount>=0); // get the player SjPlayer* recentPlayer = &g_mainFrame->m_player; // get the number of tracks in the queue long queueTrackCount = recentPlayer->m_queue.GetCount(), queuePlayingPos = recentPlayer->m_queue.GetCurrPos(), queuePos; wxASSERT(queueTrackCount>=0); // current stuff SjPlaylistEntry& urlInfo1 = recentPlayer->m_queue.GetInfo(-1); wxString currTrackName = urlInfo1.GetTrackName(); wxString currArtistName = urlInfo1.GetLeadArtistName(); unsigned long currTimestamp = SjTools::GetMsTicks(); // update cover { if( queuePlayingPos != -1 ) { value.string = m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1)); value.value = SJ_VFLAG_STRING_IS_IMAGE_URL; SetSkinTargetValue(IDT_DISPLAY_COVER, value); } else { SetSkinTargetValue(IDT_DISPLAY_COVER, value); } } // update seeker { totalMs = recentPlayer->GetTotalTime(); value.string.Empty(); if( !recentPlayer->IsStopped() && totalMs > 0 ) { elapsedMs = recentPlayer->GetElapsedTime(); value.vmax = totalMs/SJ_SEEK_RESOLUTION; if( value.vmax==0 ) value.vmax = 1; value.value = elapsedMs/SJ_SEEK_RESOLUTION; SetSkinTargetValue(IDT_SEEK, value); } else { value.value = 0; SetSkinTargetValue(IDT_SEEK, value); } } // update main window title and the "currTrack" target if( !IsStopped() ) { wxString title, titleArtistName(currArtistName), titleTrackName(currTrackName); if( recentPlayer != &m_player ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(-1); titleTrackName = urlInfo4.GetTrackName(); titleArtistName = urlInfo4.GetLeadArtistName(); } // set windows title title = CombineArtistNTitle(titleArtistName, titleTrackName, wxT(" - ")); title.Append(wxT(" - ")); title.Append(SJ_PROGRAM_NAME); SetTitle(title); } else { // set windows title SetTitle(SJ_PROGRAM_NAME); } // update display lines... bool displayMsgInCurrNextTrack = false; if( (m_display.m_msgCancelAtTimestamp && !m_display.m_msg1.IsEmpty()) ) { // ...display message wxString msg1(m_display.m_msg1), msg2(m_display.m_msg2); if( HasSkinTarget(IDT_DISPLAY_LINE_FIRST) ) { m_display.m_backupedCurrLine = -1; value.value = SJ_VFLAG_CENTER; value.value |= queueTrackCount? SJ_VFLAG_IGNORECENTEROFFSET : 0; for( visLine = 0; visLine < visLineCount; visLine++ ) { if( visLine==visLineCount/2 ) { value.string = msg1; } else if( visLine==(visLineCount/2)+1 ) { value.string = msg2; } else { value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } else if( HasSkinTarget(IDT_CURR_TRACK) ) { displayMsgInCurrNextTrack = true; value.value = 0; if( HasSkinTarget(IDT_NEXT_TRACK) ) { value.string = msg1; SetSkinTargetValue(IDT_CURR_TRACK, value); value.string = msg2; SetSkinTargetValue(IDT_NEXT_TRACK, value); } else { value.string = msg1; if( !msg2.IsEmpty() ) value.string += wxT(" ") + msg2; SetSkinTargetValue(IDT_CURR_TRACK, value); } } } else if( queueTrackCount == 0 ) { // ...nothing in queue, display logo m_display.m_firstLineQueuePos = -1; value.thumbSize = 1; value.vmin = 0; value.vmax = 1; value.value = 0; SetSkinTargetValue(IDT_DISPLAY_V_SCROLL, value); value.value = SJ_VFLAG_CENTER; for( visLine = 0; visLine < visLineCount; visLine++ ) { if( visLine==visLineCount/2 ) { value.string = wxString::Format(wxT("%s %i.%i"), SJ_PROGRAM_NAME, SJ_VERSION_MAJOR, SJ_VERSION_MINOR); } else { value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } else { // ...sth. in queue, display queue... m_display.m_backupedCurrLine = -1; m_display.m_backupedCurrBold = FALSE; queuePos = m_display.m_scrollPos==-1? queuePlayingPos : m_display.m_scrollPos; if( queuePos < 0 ) queuePos = 0; if( queueTrackCount > visLineCount && queuePos > queueTrackCount-visLineCount ) queuePos = queueTrackCount-visLineCount; if( queueTrackCount <= visLineCount ) queuePos = 0; if( m_display.m_scrollPos != -1 ) m_display.m_scrollPos = queuePos; // correct the value value.thumbSize = visLineCount; value.vmin = 0; value.vmax = queueTrackCount; value.value = queuePos; SetSkinTargetValue(IDT_DISPLAY_V_SCROLL, value); value.thumbSize = 0; m_display.m_firstLineQueuePos = queuePos; for( visLine = 0; visLine < visLineCount; visLine++, queuePos++ ) { value.vmax = 0; value.vmin = 0; if( queuePos >= 0 && queuePos < queueTrackCount ) { // ...name SjPlaylistEntry& urlInfo2 = recentPlayer->m_queue.GetInfo(queuePos); value.string = CombineArtistNTitle(urlInfo2.GetLeadArtistName(), urlInfo2.GetTrackName()); if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_AUTOPLAY ) { if( recentPlayer->m_queue.GetFlags(queuePos)&SJ_PLAYLISTENTRY_AUTOPLAY ) { value.string.Prepend(_("AutoPlay")+wxString(wxT(": "))); } } if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TRACKNR ) { value.string.Prepend(wxString::Format(wxT("%i. "), (int)queuePos+1)); } // ...time / right icon value.value = 0; if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { value.value |= (SJ_VFLAG_MOVABLE); } if( IsOpAvailable(SJ_OP_UNQUEUE) ) { value.value |= (SJ_VFLAG_ICONR_DELETE); } if( queuePos == queuePlayingPos && !recentPlayer->IsStopped() ) { value.value |= SJ_VFLAG_VMIN_IS_TIME; if( IsOpAvailable(SJ_OP_TOGGLE_TIME_MODE) ) value.value |= SJ_VFLAG_TIME_CLICKABLE; long totalTime = recentPlayer->GetTotalTime(); if( m_showRemainingTime && totalTime > 0 ) { value.value |= SJ_VFLAG_VMIN_MINUS; value.vmin = recentPlayer->GetRemainingTime(); if( value.vmin <= 0 ) { value.vmin = urlInfo2.GetPlaytimeMs(); } } else { value.vmin = recentPlayer->GetElapsedTime(); } if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TOTAL_TIME ) { value.vmax = totalTime; value.value |= value.vmax>0? SJ_VFLAG_VMAX_IS_TIME : 0; } } else { value.vmin = urlInfo2.GetPlaytimeMs(); value.value |= value.vmin>0? SJ_VFLAG_VMIN_IS_TIME : 0; } // marked (or just added?) if( m_display.m_selectedIds.Lookup(urlInfo2.GetId()) ) { value.value |= SJ_VFLAG_BOLD; if( queuePos == queuePlayingPos ) { m_display.m_backupedCurrBold = TRUE; } } // ...left icon if( queuePos == queuePlayingPos ) { if( recentPlayer->IsStopped() ) { value.value |= SJ_VFLAG_ICONL_STOP; } else if( recentPlayer->IsPaused() ) { value.value |= SJ_VFLAG_ICONL_PAUSE; } else { value.value |= SJ_VFLAG_ICONL_PLAY; } m_display.m_backupedCurrTitle = value.string; m_display.m_backupedCurrLine = visLine; } else { long entryFlags = recentPlayer->m_queue.GetFlags(queuePos); if( entryFlags & SJ_PLAYLISTENTRY_MOVED_DOWN ) { if( !recentPlayer->m_queue.IsBoring(queuePos, currTimestamp) ) { entryFlags &= ~SJ_PLAYLISTENTRY_MOVED_DOWN; recentPlayer->m_queue.SetFlags(queuePos, entryFlags); } } if( entryFlags&SJ_PLAYLISTENTRY_ERRONEOUS ) { value.value |= SJ_VFLAG_ICONL_ERRONEOUS; } else if( recentPlayer->m_queue.WasPlayed(queuePos) ) { value.value |= SJ_VFLAG_ICONL_PLAYED; } else if( entryFlags&SJ_PLAYLISTENTRY_MOVED_DOWN ) { value.value |= SJ_VFLAG_ICONL_MOVED_DOWN; } else { value.value |= SJ_VFLAG_ICONL_EMPTY; } } } else { // ...empty line value.value = SJ_VFLAG_ICONL_EMPTY; value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } // set "currTrack", "nextTrack" and "currTime" targets if( !displayMsgInCurrNextTrack ) { if( HasSkinTarget(IDT_CURR_TRACK) ) { value.value = 0; value.string = SJ_PROGRAM_NAME; if( !IsStopped() && queuePlayingPos < queueTrackCount ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(queuePlayingPos); value.string = CombineArtistNTitle(urlInfo4.GetLeadArtistName(), urlInfo4.GetTrackName()); } SetSkinTargetValue(IDT_CURR_TRACK, value); } if( HasSkinTarget(IDT_NEXT_TRACK) ) { value.value = 0; value.string.Empty(); if( !IsStopped() ) { if( GetShuffle() ) { if( HasNextRegardAP() ) { value.string = _("Shuffle"); } } else { if( queuePlayingPos+1 < queueTrackCount ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(queuePlayingPos+1); value.string = CombineArtistNTitle(urlInfo4.GetLeadArtistName(), urlInfo4.GetTrackName()); } } } SetSkinTargetValue(IDT_NEXT_TRACK, value); } } if( HasSkinTarget(IDT_CURR_TIME) ) { UpdateCurrTime(); } // playing states value.vmin = 0; value.vmax = 255; value.thumbSize = 0; value.value = m_player.GetMainVol(); SetSkinTargetValue(IDT_MAIN_VOL_SLIDER, value); value.vmax = 0; value.value = m_player.GetMainVolMute()? 1 : 0; SetSkinTargetValue(IDT_MAIN_VOL_MUTE, value); value.value = m_player.IsPlaying()? 1 : 0; SetSkinTargetValue(IDT_PLAY, value); value.value = m_player.IsPaused()? 1 : 0; SetSkinTargetValue(IDT_PAUSE, value); value.value = m_player.IsStopped()? 1 : 0; SetSkinTargetValue(IDT_STOP, value); value.value = HasPrev()? 0 : 2; SetSkinTargetValue(IDT_PREV, value); value.value = HasNextRegardAP()? 0 : 2; SetSkinTargetValue(IDT_NEXT, value); SetSkinTargetValue(IDT_FADE_TO_NEXT, value); value.value = m_player.StopAfterThisTrack()? 1 : (/*m_player.IsStopped()? 2 :*/ 0); SetSkinTargetValue(IDT_STOP_AFTER_THIS_TRACK, value); value.value = m_player.StopAfterEachTrack()? 1 : (/*m_player.IsStopped()? 2 :*/ 0); SetSkinTargetValue(IDT_STOP_AFTER_EACH_TRACK, value); value.value = m_player.m_queue.GetShuffle()? 1 : 0; SetSkinTargetValue(IDT_SHUFFLE, value); value.value = m_player.m_queue.GetRepeat(); /*0=off, 1=single, 2=all*/ SetSkinTargetValue(IDT_REPEAT, value); value.value = queueTrackCount? 0/*enabled*/ : 2/*disabled*/; SetSkinTargetValue(IDT_APPEND_FILES, value); SetSkinTargetValue(IDT_SAVE_PLAYLIST, value); SetSkinTargetValue(IDT_UNQUEUE_ALL, value); SetSkinTargetValue(IDT_MORE_FROM_CURR_ALBUM, value); SetSkinTargetValue(IDT_MORE_FROM_CURR_ARTIST, value); } void SjMainFrame::OnElapsedTimeTimer(wxTimerEvent& event) { // flush pending messages? // in wxWidgets 2.4.2 this is needed for windows eg. if a menu // or a modal system dialog is opened the events are not sent otherwise. // this may change in future wxWidgets versions, and, however, for other // OS this may not be necessary. #ifdef __WXMSW__ m_mainApp->ProcessPendingEvents(); #endif // display stuff unsigned long thisTimestamp = SjTools::GetMsTicks(); SjPlayer* recentPlayer = &g_mainFrame->m_player; if( HasSkinTarget(IDT_CURR_TIME) ) { UpdateCurrTime(); } // snap back to current position? if( IsMouseInDisplayMove() ) { m_display.m_selectedIdsTimestamp = thisTimestamp; m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; } else if( m_display.m_scrollPos != -1 || m_display.m_selectedIdsTimestamp != 0 || m_display.m_msgCancelAtTimestamp != 0 ) { bool updateDisplay = FALSE; if( m_display.m_selectedIdsTimestamp != 0 && thisTimestamp > (m_display.m_selectedIdsTimestamp+m_display.m_selectedIdsLockMs) ) { m_display.m_selectedIds.Clear(); m_display.m_selectedIdsTimestamp = 0; if( thisTimestamp > (m_lastUserDisplayInputTimestamp+SJ_DISPLAY_ENQUEUE_LOCK_MS) ) { m_display.m_scrollPos = -1; } updateDisplay = TRUE; } if( thisTimestamp > (m_lastUserInputTimestamp+SJ_DISPLAY_SCROLL_LOCK_MS) ) { m_display.m_scrollPos = -1; updateDisplay = TRUE; } if( m_display.m_msgCancelAtTimestamp != 0 && thisTimestamp > m_display.m_msgCancelAtTimestamp ) { if( g_kioskModule ) { g_kioskModule->m_numpadInput.DisplayTimeout(); } m_display.m_msgCancelAtTimestamp = 0; m_display.m_msg1.Empty(); m_display.m_msg2.Empty(); updateDisplay = TRUE; } if( updateDisplay ) { UpdateDisplay(); goto Done; } } if( recentPlayer && !recentPlayer->IsStopped() ) { SjSkinValue value; long totalMs = recentPlayer->GetTotalTime(); long elapsedMs = recentPlayer->GetElapsedTime(); bool isPaused = recentPlayer->IsPaused(); bool stopAfterTrack = ( recentPlayer->StopAfterThisTrack()||recentPlayer->StopAfterEachTrack() ); bool blink = ( (&m_player==recentPlayer&&stopAfterTrack ) || isPaused ); if( totalMs > 0 ) { value.vmin = 0; value.vmax = totalMs/SJ_SEEK_RESOLUTION; value.thumbSize = 0; value.value = elapsedMs/SJ_SEEK_RESOLUTION; } SetSkinTargetValueIfPossible(IDT_SEEK, value); if( m_display.m_backupedCurrLine != -1 ) { value.value = SJ_VFLAG_VMIN_IS_TIME | SJ_VFLAG_ICONL_PLAY; if( IsOpAvailable(SJ_OP_TOGGLE_TIME_MODE) ) value.value |= SJ_VFLAG_TIME_CLICKABLE; if( m_showRemainingTime && totalMs > 0 ) { value.vmin = recentPlayer->GetRemainingTime(); value.value |= SJ_VFLAG_VMIN_MINUS; } else { value.vmin = elapsedMs; } if( m_display.m_backupedCurrBold ) { value.value |= SJ_VFLAG_BOLD; } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { value.value |= (SJ_VFLAG_MOVABLE); } if( IsOpAvailable(SJ_OP_UNQUEUE) ) { value.value |= (SJ_VFLAG_ICONR_DELETE); } value.string = m_display.m_backupedCurrTitle; if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TOTAL_TIME ) { value.vmax = totalMs; value.value |= totalMs>0? SJ_VFLAG_VMAX_IS_TIME : 0; } if( blink ) { if( isPaused ) { value.value &= ~SJ_VFLAG_ICONL_PLAY; value.value |= m_blinkBlink? SJ_VFLAG_ICONL_PAUSE : SJ_VFLAG_ICONL_EMPTY; } else if( !m_blinkBlink ) { value.value &= ~SJ_VFLAG_ICONL_PLAY; value.value |= SJ_VFLAG_ICONL_STOP; } } SetSkinTargetValueIfPossible(IDT_DISPLAY_LINE_FIRST+m_display.m_backupedCurrLine, value); m_blinkBlink = !m_blinkBlink; } } Done: // invoke auto control stuff m_autoCtrl.OnOneSecondTimer(); } /******************************************************************************* * Movin' selected tracks ******************************************************************************/ void SjMainFrame::OnSkinTargetMotion(int clickTargetId, int requestedMotionAmount) { GotDisplayInputFromUser(); if( m_display.m_selectedIds.GetCount() ) { m_display.m_backupedCurrLine = -1; // stop timer display updating until UpdateDisplay() is called long visLineCount = GetLinesCount(); long queueTrackCount = m_player.m_queue.GetCount(); long queuePlayingPos = m_player.m_queue.GetCurrPos(); long scrollPos = m_display.m_scrollPos==-1? queuePlayingPos : m_display.m_scrollPos; if( scrollPos < 0 ) scrollPos = 0; if( queueTrackCount > visLineCount && scrollPos > queueTrackCount-visLineCount ) { scrollPos = queueTrackCount-visLineCount; #ifdef DEBUG_DISPLAY wxLogDebug(" vv corrected vv"); #endif } if( queueTrackCount <= visLineCount ) scrollPos = 0; int realMotionAmount = m_player.m_queue.MoveByIds(m_display.m_selectedIds, requestedMotionAmount); int resumeTargetId = clickTargetId; if( realMotionAmount ) { #ifdef DEBUG_DISPLAY wxLogDebug("oldScrollPos=%i (oldDisplayScrollPos=%i, queuePlayingPos=%i)", (int)scrollPos, (int)m_display.m_scrollPos, (int)queuePlayingPos); #endif resumeTargetId += realMotionAmount; if( resumeTargetId < IDT_DISPLAY_LINE_FIRST ) { m_display.m_scrollPos = scrollPos + realMotionAmount; if( m_display.m_scrollPos < 0 ) m_display.m_scrollPos = 0; resumeTargetId = IDT_DISPLAY_LINE_FIRST; #ifdef DEBUG_DISPLAY wxLogDebug(" ^ newDisplayScrollPos=%i, resumeTargetLine=%i", (int)m_display.m_scrollPos, (int)resumeTargetId-IDT_DISPLAY_LINE_FIRST); #endif } else if( resumeTargetId >= IDT_DISPLAY_LINE_FIRST+visLineCount ) { m_display.m_scrollPos = scrollPos + realMotionAmount; resumeTargetId = (IDT_DISPLAY_LINE_FIRST+visLineCount)-1; #ifdef DEBUG_DISPLAY wxLogDebug(" v newDisplayScrollPos=%i, resumeTargetLine=%i", (int)m_display.m_scrollPos, (int)resumeTargetId-IDT_DISPLAY_LINE_FIRST); #endif } else { m_display.m_scrollPos = scrollPos; #ifdef DEBUG_DISPLAY wxLogDebug(" * newDisplayScrollPos=%i, resumeTargetLine=%i", (int)m_display.m_scrollPos, (int)resumeTargetId-IDT_DISPLAY_LINE_FIRST); #endif } } ResumeSkinTargetMotion(clickTargetId, resumeTargetId); UpdateDisplay(); #ifdef DEBUG_DISPLAY wxLogDebug(" resultingDisplayScrollPos=%i", (int)m_display.m_scrollPos); #endif m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; } } void SjMainFrame::MarkDisplayTrack(int targetId, bool mouseDown, long accelFlags) { // get needed data long queuePos = m_display.m_firstLineQueuePos + (targetId-IDT_DISPLAY_LINE_FIRST); if( queuePos < 0 || queuePos >= m_player.m_queue.GetCount() ) { return; } long queueId = m_player.m_queue.GetIdByPos(queuePos); if( queueId == 0 ) { return; } bool queuePosMarked = m_display.m_selectedIds.Lookup(queueId)!=0; // bool updateDisplay = FALSE; // do the selection now? if( mouseDown ) { if( queuePosMarked ) { m_display.m_selectionDoneOnMouseDown = 0; return; } else if( accelFlags & (wxACCEL_SHIFT|wxACCEL_CTRL) ) { m_display.m_selectionDoneOnMouseDown = -1; if( (accelFlags&wxACCEL_CTRL) && m_display.m_selectedIds.GetCount()==0 ) { m_display.m_selectedAnchorId = queueId; } } else { m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(queueId, 1); m_display.m_selectedAnchorId = queueId; UpdateDisplay(); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; m_display.m_selectionDoneOnMouseDown = queueId; return; // if a queue id is set, it is removed on "mouse up" } // . } // . else if( m_display.m_selectionDoneOnMouseDown ) // . { if( m_display.m_selectionDoneOnMouseDown != -1 ) { // . // . here m_display.m_selectedIds.Remove(m_display.m_selectionDoneOnMouseDown); UpdateDisplay(); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; } return; } // mark the track if( accelFlags & wxACCEL_CTRL ) { // (de-)select using CTRL if( m_display.m_selectedIds.Lookup(queueId) ) { m_display.m_selectedIds.Remove(queueId); } else { m_display.m_selectedIds.Insert(queueId, 1); } } else if( accelFlags & wxACCEL_SHIFT ) { // select a range using SHIFT // (the first SHIFT/CONTROL always defines the anchor and selects one time; // this is by design as a single item is only selected temporary until the mouse // is released) long anchorPos = m_player.m_queue.GetPosById(m_display.m_selectedAnchorId), p1, p2, p; if( anchorPos < 0 ) anchorPos = queuePos; if( anchorPos < queuePos ) { p1=anchorPos; p2=queuePos; } else { p1=queuePos; p2=anchorPos; } m_display.m_selectedIds.Clear(); for( p = p1; p <= p2; p++ ) { m_display.m_selectedIds.Insert(m_player.m_queue.GetIdByPos(p), 1); } } else { // normal selection // (the normal selection is temporary and is removed as the mouse is released) m_display.m_selectedIds.Clear(); m_display.m_selectedAnchorId = queueId; } UpdateDisplay(); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; } /******************************************************************************* * Simple display messages ******************************************************************************/ void SjMainFrame::SetDisplayMsg(const wxString& text, long holdMs) { m_display.m_msg1 = text.BeforeFirst('\n'); m_display.m_msg2 = text.AfterFirst('\n'); m_display.m_msgCancelAtTimestamp = SjTools::GetMsTicks()+holdMs; UpdateDisplay(); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/display.h��������������������������������������������������������������0000664�0000000�0000000�00000004767�12660066715�0017671�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: displaysj.h * Authors: Björn Petersen * Purpose: Silverjuke main frame * ******************************************************************************/ #ifndef __SJ_DISPLAYSJ_H__ #define __SJ_DISPLAYSJ_H__ #include <sjmodules/tageditor/tageditor.h> class SjDisplay { public: SjDisplay (); #define SJ_DISPLAY_SCROLL_LOCK_MS 20000 /*20 seconds*/ #define SJ_DISPLAY_SELECTION_LOCK_MS 20000 /*20 seconds*/ #define SJ_DISPLAY_ENQUEUE_LOCK_MS 4000 /* 4 seconds*/ long m_scrollPos; long m_firstLineQueuePos; bool m_tagEditorJustOpened; wxString m_msg1; wxString m_msg2; unsigned long m_msgCancelAtTimestamp; wxString m_backupedCurrTitle; long m_backupedCurrLine; bool m_backupedCurrBold; SjLLHash m_selectedIds; long m_selectedAnchorId; unsigned long m_selectedIdsTimestamp; unsigned long m_selectedIdsLockMs; long m_selectionDoneOnMouseDown; void ClearDisplaySelection(); }; class SjDisplayEditDlg : public SjTagEditorDlg { public: SjDisplayEditDlg (); bool GetUrls (wxArrayString&, int what); void OnUrlChanged (const wxString& oldUrl, const wxString& newUrl); private: wxArrayString m_urls; long m_id; // for single edit only void MarkId (long changeScrollPosDir); }; #endif // __SJ_DISPLAYSJ_H__ ���������silverjuke-16.2.3/src/sjbase/ids.h������������������������������������������������������������������0000664�0000000�0000000�00000042401�12660066715�0016766�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: ids.h * Authors: Björn Petersen * Purpose: Silverjuke main application id definitions * ******************************************************************************* * * We do not use enums for the IDs as they may be send through windows, wx * etc. which will need too much conversion; moreover a conversion from * int to enum is undefined (however, normally this may work...) * ******************************************************************************/ #ifndef __SJ_IDS_H__ #define __SJ_IDS_H__ /* Take care, the identifiers should NOT be in the range of wxID_LOWEST (4999) * to wxID_HIGHEST (5999). Moreover, all IDs should only use 16 Bit as * the IDs may be used together with some flags in the high-order word. */ /* First, we define the [T]arget [ID]s, IDT_*, as they're used in an zero-based * array in SjSkin. So don't put unneeded gaps in the target IDs. */ #define IDT_NONE 0 #define IDT_UNUSABLE_01 1 // range start (avoid other system ID conflicts) #define IDT_UNISABLE_20 20 // range end #define IDT_FIRST 21 // first target ID relavant to menu selection #define IDT_WORKSPACE_GOTO_A 21 // range start (A, B, C, ... Z, 0-9) #define IDT_WORKSPACE_GOTO_Z 46 #define IDT_WORKSPACE_GOTO_0_9 47 // range end #define IDT_LAYOUT_FIRST 48 // range start #define IDT_LAYOUT_LAST 96 // range end, max. 49 layouts #define IDT_DISPLAY_LINE_FIRST 97 // range start #define IDT_DISPLAY_LINE_LAST 146 // range end, max. 50 lines #define IDT_PRELISTEN_VOL_DOWN 147 #define IDT_PRELISTEN_VOL_UP 148 #define IDT_DISPLAY_UP 149 #define IDT_DISPLAY_DOWN 150 #define IDT_DISPLAY_V_SCROLL 151 #define IDT_GOTO_CURR 152 #define IDT_WORKSPACE_HOME 153 #define IDT_TOGGLE_TIME_MODE 154 #define IDT_WORKSPACE_END 155 #define IDT_TOGGLE_KIOSK 156 #define IDT_DISPLAY_COVER 157 #define IDT_PLAY 158 #define IDT_PAUSE 159 #define IDT_STOP 160 #define IDT_PREV 161 #define IDT_NEXT 162 #define IDT_SEEK 163 #define IDT_SEARCH 164 #define IDT_SEARCH_BUTTON 165 #define IDT_SEARCH_INFO 166 #define IDT_CURR_CREDIT 167 #define IDT_CURR_TRACK 168 #define IDT_CURR_TIME 169 #define IDT_MAIN_VOL_SLIDER 170 #define IDT_MAIN_VOL_UP 171 #define IDT_MAIN_VOL_DOWN 172 #define IDT_MAIN_VOL_MUTE 173 #define IDT_WORKSPACE 175 #define IDT_WORKSPACE_LINE_LEFT 176 // this a the button beside a scrollbar, see also IDT_WORKSPACE_KEY_* #define IDT_WORKSPACE_LINE_RIGHT 177 // - " - #define IDT_WORKSPACE_LINE_UP 178 // - " - #define IDT_WORKSPACE_LINE_DOWN 179 // - " - #define IDT_WORKSPACE_H_SCROLL 180 #define IDT_WORKSPACE_V_SCROLL 181 #define IDT_ZOOM_IN 182 #define IDT_ZOOM_OUT 183 #define IDT_ZOOM_NORMAL 184 #define IDT_QUIT 187 #define IDT_ENQUEUE_LAST 192 #define IDT_ENQUEUE_NEXT 193 #define IDT_ENQUEUE_NOW 194 #define IDT_UNQUEUE 195 #define IDT_UNQUEUE_ALL 196 #define IDT_MAINMENU 197 #define IDT_VIS_TOGGLE 198 #define IDT_UPDATE_INDEX 199 #define IDT_DEEP_UPDATE_INDEX 200 #define IDT_SETTINGS 201 #define IDT_WORKSPACE_GOTO_RANDOM 202 #define IDT_STOP_AFTER_THIS_TRACK 203 #define IDT_SHUFFLE 204 #define IDT_REPEAT 205 #define IDT_ALWAYS_ON_TOP 207 #define IDT_VIS_RECT 208 #define IDT_OPEN_FILES 211 #define IDT_APPEND_FILES 212 #define IDT_SAVE_PLAYLIST 213 #define IDT_ADV_SEARCH 214 #define IDT_WORKSPACE_SHOW_COVERS 215 #define IDT_UNUSED_216 216 #define IDT_NUMPAD_FIRST 217 // Range start #define IDT_NUMPAD_0 217 #define IDT_NUMPAD_1 218 #define IDT_NUMPAD_2 219 #define IDT_NUMPAD_3 220 #define IDT_NUMPAD_4 221 #define IDT_NUMPAD_5 222 #define IDT_NUMPAD_6 223 #define IDT_NUMPAD_7 224 #define IDT_NUMPAD_8 225 #define IDT_NUMPAD_9 226 #define IDT_NUMPAD_CANCEL 227 #define IDT_NUMPAD_PAGE_LEFT 228 #define IDT_NUMPAD_PAGE_RIGHT 229 #define IDT_NUMPAD_PAGE_UP 230 #define IDT_NUMPAD_PAGE_DOWN 231 #define IDT_NUMPAD_MENU 232 #define IDT_NUMPAD_RESERVED_01 233 #define IDT_NUMPAD_RESERVED_08 240 #define IDT_NUMPAD_LAST 240 // Range end #define IDT_PLAY_NOW_ON_DBL_CLICK 241 #define IDT_PRELISTEN 242 #define IDT_ADD_CREDIT_FIRST 243 // Range start #define IDT_ADD_CREDIT_01 243 #define IDT_ADD_CREDIT_16 258 #define IDT_ADD_CREDIT_RESERVED_01 259 #define IDT_ADD_CREDIT_RESERVED_08 266 #define IDT_ADD_CREDIT_LAST 266 // Range end #define IDT_NEXT_TRACK 267 #define IDT_FADE_TO_NEXT 268 #define IDT_MORE_FROM_CURR_ALBUM 269 #define IDT_MORE_FROM_CURR_ARTIST 270 #define IDT_WORKSPACE_PAGE_LEFT 271 #define IDT_WORKSPACE_PAGE_RIGHT 272 #define IDT_WORKSPACE_PAGE_UP 273 #define IDT_WORKSPACE_PAGE_DOWN 274 #define IDT_WORKSPACE_INSERT 275 #define IDT_WORKSPACE_DELETE 276 #define IDT_WORKSPACE_KEY_LEFT 277 // this a pressed cursor key, see also IDT_WORKSPACE_LINE_* #define IDT_WORKSPACE_KEY_RIGHT 278 // - " - #define IDT_WORKSPACE_KEY_UP 279 // - " - #define IDT_WORKSPACE_KEY_DOWN 280 // - " - #define IDT_WORKSPACE_MINOR_HOME 281 // this resets eg. the vertical position in the album view; for the list view, this does nothing #define IDT_WORKSPACE_MINOR_END 282 // - " - #define IDT_WORKSPACE_ALBUM_VIEW 283 #define IDT_WORKSPACE_COVER_VIEW 284 #define IDT_WORKSPACE_LIST_VIEW 285 #define IDT_WORKSPACE_TOGGLE_VIEW 286 #define IDT_WORKSPACE_ENTER 287 #define IDT_WORKSPACE_GOTO_PREV_AZ 288 #define IDT_WORKSPACE_GOTO_NEXT_AZ 289 #define IDT_SEEK_FWD 290 #define IDT_SEEK_BWD 291 #define IDT_STOP_AFTER_EACH_TRACK 294 #define IDT_TOGGLE_REMOVE_PLAYED 295 #define IDT_LAST 295 /* last relavant target ID */ /* Here comes the [M]odules [ID]s, IDM_*, which are normally forwarded * to the current module. Most times these IDs are used in * context menus. Modules can define their own, private IDs in * the range IDM_FIRSTPRIVATE..IDM_LASTPRIVATE */ #define IDM_FIRST 1000 /* range start */ #define IDM_EDITSELECTION 1001 #define IDM_ROTATELEFT 1003 #define IDM_ROTATERIGHT 1004 #define IDM_DONTROTATE 1005 #define IDM_FULLSCREEN 1006 #define IDM_FLIPHORZ 1008 #define IDM_FLIPVERT 1009 #define IDM_BRIGHTPLUS 1010 #define IDM_BRIGHTMINUS 1011 #define IDM_CONTRASTPLUS 1012 #define IDM_CONTRASTMINUS 1013 #define IDM_CONTRASTBRIGHTNULL 1014 #define IDM_GRAYSCALE 1015 #define IDM_NEGATIVE 1016 #define IDM_OPENCOVER 1017 #define IDM_SAVECOVER 1019 #define IDM_CROP 1054 #define IDM_EXPLORE 1055 #define IDM_WWWCOVER00 1056 /* range start, place for 50 IDs */ #define IDM_WWWCOVER49 1105 /* range end */ #define IDM_SELECTIMG00 1106 /* range start, place for 300 IDs */ #define IDM_SELECTIMG299 1405 /* range end */ #define IDM_SELECTIMGAUTO 1406 #define IDM_NOALTCOVERS 1407 #define IDM_PREVIMG 1408 #define IDM_NEXTIMG 1409 #define IDM_OPENARTEDITOR 1410 #define IDM_OPENARTEDFORCROP 1411 #define IDM_CLOSEARTEDITOR 1412 #define IDM_SELECTARTISTINF00 1413 /* range start */ #define IDM_SELECTARTISTINF49 1462 /* range end */ #define IDM_RATINGSELECTION00 1463 #define IDM_RATINGSELECTION01 1464 #define IDM_RATINGSELECTION02 1465 #define IDM_RATINGSELECTION03 1466 #define IDM_RATINGSELECTION04 1467 #define IDM_RATINGSELECTION05 1468 #define IDM_RATINGSELECTION06 1469 #define IDM_FIRSTPRIVATE 1500 /* range start, place for 1500 IDs */ #define IDM_LASTPRIVATE 2999 /* range end */ #define IDM_LAST 2999 /* range end */ /* [O]ther (Menu) [ID]s, IDO_*, as they're not used as a target or * by a modules. */ #define IDO_VIS_FIRST__ 4800 /* range start */ #define IDO_VIS_STARTFIRST 4800 /* range start */ #define IDO_VIS_STARTLAST 4848 /* range end */ #define IDO_VIS_STOP 4849 #define IDO_VIS_OPTIONFIRST 4850 /* range start */ #define IDO_VIS_OPTIONLAST 4899 /* range end */ #define IDO_VIS_HALFSIZE 4901 #define IDO_VIS_AUTOSWITCHOVER 4902 #define IDO_VIS_NEXTPRESET 4903 #define IDO_VIS_PREVPRESET 4904 #define IDO_VIS_LAST__ 4920 /* range end */ #define IDO_wxID_LOWEST 4999 /* range start, used by wx */ #define IDO_wxID_HIGHEST 5999 /* range end, used by wx */ #define IDO_SEARCHGENRE000 6000 /* range start */ #define IDO_SEARCHGENRE999 6999 /* range end */ #define IDO_SEARCHMUSICSEL000 7000 /* range start */ #define IDO_SEARCHMUSICSEL999 7999 /* range end */ #define IDO_SAMEZOOMINALLVIEWS 8000 #define IDO_START_PB_ON_ENQUEUE 8001 #define IDO_CORNERCLICK 8002 #define IDO_SETTINGS_ADDFILES 8004 #define IDO_ESC 8005 #define IDO_DEBUGSKIN_RELOAD 8006 #define IDO_DISPLAY_TRACKNR 8007 #define IDO_DISPLAY_ARTIST 8008 #define IDO_DISPLAY_TOTAL_TIME 8009 #define IDO_DISPLAY_AUTOPLAY 8010 #define IDO_DISPLAY_PREFERALBCV 8011 #define IDO_TOGGLE_TIME_MODE2 8012 #define IDO_SETTINGS_QUEUE 8013 #define IDO_SETTINGS_AUTOVOL 8014 #define IDO_SETTINGS_SKINS 8015 #define IDO_SETTINGS_FONTNCOVER 8016 #define IDO_SMOOTH 8109 #define IDO_SEARCHINPUT 8110 #define IDO_TAB 8111 #define IDO_SEARCHHISTORY00 8112 /* range start */ #define IDO_SEARCHHISTORY99 8211 /* range end */ #define IDO_SELECTALL 8215 #define IDO_LINKCLICKED 8224 #define IDO_INIPROGRAMLISTFIRST 8228 /* range start, 100 IDs required */ #define IDO_INIPROGRAMLISTLAST 8328 /* range end */ #define IDO_MARKERSOPTIONS 8329 #define IDO_REALLYENDSEARCH 8330 #define IDO_DISPLAY_COVER 8331 #define IDO_PASTE 8332 #define IDO_PASTE_USING_COORD 8333 #define IDO_DISPLAY_COVER_EXPLR 8336 #define IDO_EDITQUEUE 8337 #define IDO_RATINGQUEUE00 8338 #define IDO_RATINGQUEUE01 8339 #define IDO_RATINGQUEUE02 8340 #define IDO_RATINGQUEUE03 8341 #define IDO_RATINGQUEUE04 8342 #define IDO_RATINGQUEUE05 8343 #define IDO_RATINGQUEUE06 8344 #define IDO_ARTISTINFQUEUE00 8347 /* range start */ #define IDO_ARTISTINFQUEUE49 8396 /* range end */ #define IDO_UNQUEUE_MARKED 8397 #define IDO_UNQUEUE_ALL_BUT_MARKED 8398 #define IDO_GOTO_CURR_MARK 8399 #define IDO_DND_ONDATA 8400 #define IDO_VIRTKEYBDFRAME 8401 #define IDO_GOTOCURRAUTO 8402 #define IDO_OPENSETTINGSASYNC 8403 #define IDO_SCRIPTCONFIG_MENU00 8404 /* range start */ #define IDO_SCRIPTCONFIG_MENU99 8503 /* range end */ #define IDO_ONLINE_HELP 8606 #define IDO_EXPLOREQUEUE 8607 #define IDO_BROWSER_RELOAD_VIEW 8609 #define IDO_ABOUT_OPEN_WWW 8610 #define IDO_ABOUT 8611 #define IDO_SCRIPT_MENU00 8613 /* range start */ #define IDO_SCRIPT_MENU99 8712 /* range end */ #define IDO_CONSOLE 8713 /* take care, we're close to end! At 8800 the IDPLAYER_ IDs start! */ /* [PLAYER] [ID]s, IDPLAYER_*, posted from SjPlayer -> SjMainFrame -> SjPlayer.OnPostBack() */ #define IDPLAYER_FIRST 8800 /* range start */ #define IDPLAYER_LAST 8899 /* range end */ /* [TIMER] [ID]s, IDTIMER_* */ #define IDTIMER_SEARCHINPUT 8900 #define IDTIMER_ELAPSEDTIME 8903 #define IDTIMER_TOOLTIPTIMER 8905 #define IDTIMER_EFFECTINFO 8906 #define IDTIMER_VIRTKEYBD 8907 #define IDTIMER_TRIGGERBALLOON 8908 #define IDTIMER_CLOSEBALLOON 8909 #define IDTIMER_SETSIZEHACK 8910 #define ID_HTTP_SERVER 8980 #define ID_HTTP_SOCKET 8981 /* [C]ontrol [ID]s, IDC_*, used in dialogs, may be mixed with the * other IDs */ #define IDC_MAINFRAME 9000 #define IDC_PREVDLGPAGE 9022 #define IDC_NEXTDLGPAGE 9023 #define IDC_HTMLWINDOW 9055 #define IDC_BUTTONBARMENU 9056 #define IDC_MODULE00 9081 /* range start */ #define IDC_MODULE99 9180 /* range end */ #define IDC_MODLIST 9191 /* global! */ #define IDC_SKINUPDATELIST 9192 /* global! */ #if 0 #define IDC_MODUPDATELIST 9193 /* global! */ #endif #define IDC_NOTEBOOK 9197 /* global! */ #define IDC_IDXLIST 9198 #define IDC_IDXADDSOURCES 9199 #define IDC_IDXDELSOURCE 9200 #define IDC_IDXCONFIGSOURCE 9202 #define IDC_IDXCONFIGSOURCEMENU 9203 #define IDC_IDXEXPLORE 9204 #define IDC_IDXUPDATEMENU 9206 #define IDC_NEWSEARCH 9207 #define IDC_SAVESEARCH 9208 #define IDC_SAVESEARCHAS 9209 #define IDC_RENAMESEARCH 9210 #define IDC_DELETESEARCH 9211 #define IDC_ENDADVSEARCH 9212 #define IDC_REVERTTOSAVEDSEARCH 9213 #define IDC_EFFECTSLOTOPT00 9214 /* range start */ #define IDC_EFFECTSLOTOPT09 9224 /* range end */ #define IDC_PLUGIN_FIRST 9225 /* range start */ #define IDC_PLUGIN_REPLACE 9226 #define IDC_PLUGIN_RENAME 9227 #define IDC_PLUGIN_SPLIT 9228 #define IDC_PLUGIN_FREEDB 9229 #define IDC_PLUGIN_LAST 9250 /* range end */ #define IDC_HOOK_FIRST 9260 /* range start */ #define IDC_HOOK_LAST 9299 /* range end*/ /* [MOD]ule [M]e[S]sa[G]e [ID]s, IDMODMSG_* * send via a SjModuleSystem::BroadcastMsg() from silverjuke --> all modules */ #define IDMODMSG_FIRST 11000 /* range start */ #define IDMODMSG_WINDOW_ICONIZED 11000 #define IDMODMSG_WINDOW_UNICONIZED 11001 #define IDMODMSG_WINDOW_CLOSE 11004 /* sent if the program is about to terminate; objects are valid, player is already stopped, window is already hidden */ #define IDMODMSG_WINDOW_SIZED_MOVED 11006 #define IDMODMSG_WINDOW_BEFORE_CLOSE_HIDE_N_STOP 11008 /* send a moment before IDMODMSG_WINDOW_CLOSE is send; objects are valid, player is still playing, window is still visible */ #define IDMODMSG_APP_ACTIVATED 11010 #define IDMODMSG_APP_DEACTIVATED 11011 #define IDMODMSG_SETTINGS_CLOSE 11020 /* sent if the settings dialog is about to be closed, needed only for very special tasks */ #define IDMODMSG_ADV_SEARCH_CONFIG_CHANGED 11021 /* sent if adv. searches are created/deleted/modified */ #define IDMODMSG_TRACK_ON_AIR_CHANGED 11030 /* also send if only the player state changes */ #define IDMODMSG_VIDEO_DETECTED 11031 #define IDMODMSG_VIS_STATE_CHANGED 11033 #define IDMODMSG_KIOSK_STARTING 11034 #define IDMODMSG_KIOSK_STARTED 11035 #define IDMODMSG_KIOSK_ENDING 11036 #define IDMODMSG_KIOSK_ENDED 11037 #define IDMODMSG_PLAYER_STOPPED_BY_EOQ 11038 /* ONLY send if the player was stopped by end of queue! */ #define IDMODMSG_SEARCH_CHANGED 11040 /* also send if the search is cleared */ #define IDMODMSG_MODULE_DISABLED 11050 /* send if a DSP or output module is disabled, may be the module wants to close modeless dialogs after this message */ #define IDMODMSG__VIS_MOD_PRIVATE_1__ 11051 #define IDMODMSG__VIS_MOD_PRIVATE_2__ 11052 #define IDMODMSG__VIS_MOD_PRIVATE_4__ 11054 #define IDMODMSG_PROGRAM_LOADED 11060 /* send to indicate, the program is loaded and the main window is shown*/ #define IDMODMSG_LAST 11999 /* range end */ #endif /* __SJ_IDS_H__ */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/mainapp.cpp������������������������������������������������������������0000664�0000000�0000000�00000043400�12660066715�0020167�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: mainapp.cpp * Authors: Björn Petersen * Purpose: Silverjuke main application class * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/skinml.h> #include <sjtools/http.h> #include <sjtools/gcalloc.h> #include <sjtools/console.h> #include <sjmodules/kiosk/kiosk.h> #include <sjmodules/vis/vis_module.h> #include <tagger/tg_a_tagger_frontend.h> #include <see_dom/sj_see.h> #include <wx/ipc.h> #include <wx/display.h> #include <wx/snglinst.h> #include <wx/cmdline.h> #include <wx/tokenzr.h> #include <wx/socket.h> /******************************************************************************* * SjClient/SjServer ******************************************************************************/ class SjConnection : public wxConnection { public: SjConnection(bool isServer) : wxConnection() { m_isServer = isServer; } bool OnExecute(const wxString& topic, const void*, size_t, wxIPCFormat format); bool OnDisconnect() { if( m_isServer ) { delete this; } return TRUE; } private: bool m_isServer; void Raise (); }; void SjConnection::Raise() { wxASSERT( g_mainFrame ); if( g_mainFrame ) { g_mainFrame->Show(); g_mainFrame->Iconize(FALSE); g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDMODMSG_WINDOW_UNICONIZED)); g_mainFrame->Raise(); } } bool SjConnection::OnExecute(const wxString& topic, const void* data_, size_t size_, wxIPCFormat format_) { // can we handle the request? if( SjMainApp::IsInShutdown() || g_mainFrame ==NULL || (SjMainFrame*)wxWindow::FindWindowById(IDC_MAINFRAME) == NULL ) { return FALSE; } // get the data wxArrayString data; if( data_ ) { wxStringTokenizer tkz(GetTextFromData(data_, size_, format_), "\n\r", wxTOKEN_RET_EMPTY_ALL); while( tkz.HasMoreTokens() ) { wxString token = tkz.GetNextToken(); token.Trim(TRUE); token.Trim(FALSE); if( !token.IsEmpty() ) { data.Add(token); } } } // execute the given command if( topic==wxT("open") && data.GetCount() ) { Raise(); g_mainFrame->OpenFiles(data, SJ_OPENFILES_PLAY); } else if( topic==wxT("enqueue") && data.GetCount() ) { g_mainFrame->OpenFiles(data, SJ_OPENFILES_ENQUEUE); } else if( topic==wxT("play") ) { g_mainFrame->Play(); } else if( topic==wxT("pause") ) { g_mainFrame->Pause(); } else if( topic==wxT("toggle") ) { g_mainFrame->PlayOrPause(); } else if( topic==wxT("togglevis") ) { if( g_visModule ) { if( g_visModule->IsVisStarted() ) g_visModule->StopVis(); else g_visModule->StartVis(); } } else if( topic==wxT("volup") || topic==wxT("voldown") ) { g_mainFrame->SetRelMainVol(topic==wxT("volup")? +8 : -8); g_mainFrame->SetSkinTargetValue(IDT_MAIN_VOL_MUTE, g_mainFrame->m_player.GetMainVolMute()? 1 : 0); } else if( topic==wxT("prev") ) { g_mainFrame->GotoPrev(); } else if( topic==wxT("next") ) { g_mainFrame->GotoNextRegardAP(false /*no fade to next*/); } else if( topic==wxT("fadetonext") ) { g_mainFrame->GotoNextRegardAP(true /*fade to next*/); } else if( topic==wxT("kiosk") ) { Raise(); if( g_kioskModule ) g_kioskModule->StartRequest(TRUE); } else if( topic==wxT("addcredit") || topic==wxT("setcredit") ) { if( data.GetCount() ) { wxString data0(data[0]); // be graceful and also allow the number in quotes - data0.Replace(wxT("\""), wxT("")); // this is esp. needed for some clients who will put the data0.Replace(wxT("'"), wxT("")); // data into a binary form otherwise. long addCredit = 0; if( !data0.ToLong(&addCredit, 10) ) { addCredit = 0; } if( g_kioskModule ) { g_kioskModule->m_creditBase.AddCredit(addCredit, SJ_ADDCREDIT_FROM_DDE | (topic==wxT("setcredit")? SJ_ADDCREDIT_SET_TO_NULL_BEFORE_ADD : 0) ); } } } else if( topic=="displaymsg" ) // this is mainly for testing IPC { if( data.GetCount() ) { g_mainFrame->SetDisplayMsg(data[0], 10000); } } else if( topic==wxT("execute") ) { #if SJ_USE_SCRIPTS g_mainFrame->CmdLineAndDdeSeeExecute(GetTextFromData(data_, size_, format_)); #else wxLogError(wxT("Scripts are not supported in this build.")); #endif } else /* eg. "raise" */ { Raise(); } return TRUE; } class SjServer : public wxServer { public: wxConnectionBase* OnAcceptConnection(const wxString& topic) { return new SjConnection(TRUE); } }; class SjClient : public wxClient { public: wxConnectionBase* OnMakeConnection() { return new SjConnection(FALSE); } }; /******************************************************************************* * SjMainApp ******************************************************************************/ IMPLEMENT_APP(SjMainApp) BEGIN_EVENT_TABLE(SjMainApp, wxApp) EVT_ACTIVATE_APP (SjMainApp::OnActivate ) EVT_QUERY_END_SESSION (SjMainApp::OnQueryEndSession ) EVT_END_SESSION (SjMainApp::OnEndSession ) END_EVENT_TABLE() #define SJ_ISRUNNING_NAME (wxT(".") SJ_PROGRAM_NAME wxT("-") + wxGetUserId() + g_tools->m_instance) static wxSingleInstanceChecker* s_isRunningChecker = NULL; static SjServer* s_server = NULL; static SjLogGui* s_logGui = NULL; wxCmdLineParser* SjMainApp::s_cmdLine = NULL; bool SjMainApp::s_isInShutdown = FALSE; bool SjMainApp::OnInit() { // call OnFatalException() //::wxHandleFatalExceptions(true); // init HTTP stuff - absolutely neccessary before any thread can use HTTP - eg. SjHttp or SjImgThread or maybe the player // see also http://www.litwindow.com/Knowhow/wxSocket/wxsocket.html wxSocketBase::Initialize(); // set our logging routines s_logGui = new SjLogGui(); // log silverjuke and platform version and release information wxLogInfo(wxT("Silverjuke %i.%i.%i-%ibit-%s%s%s started on %s-%ibit, %s, sqlite %s"), SJ_VERSION_MAJOR, SJ_VERSION_MINOR, SJ_VERSION_REVISION, (int)(sizeof(void*)*8), #ifdef wxUSE_UNICODE wxT("u"), #else wxT("a"), #endif #ifdef __WXDEBUG__ wxT("d"), #else wxT(""), #endif #if SJ_USE_SCRIPTS wxT("s"), #else wxT(""), #endif ::wxGetOsDescription().c_str(), ::wxIsPlatform64Bit()? 64 : 32, wxVERSION_STRING, wxSqltDb::GetLibVersion().c_str()); // set the application name SetAppName(SJ_PROGRAM_NAME); // create and parse command line static const wxCmdLineEntryDesc s_cmdLineDesc[] = { // options and swithches, the order _is_ important as we can forward only _one_ command to other instances! // so please move things as "instance" down after "play", "pause" etc, see http://www.silverjuke.net/forum/post.php?p=10433#10433 // player commands { wxCMD_LINE_SWITCH, NULL, wxT_2("play"), wxT_2("Play") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("pause"), wxT_2("Pause") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("toggle"), wxT_2("Toggle play/pause") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("togglevis"), wxT_2("Toggle vis.") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("volup"), wxT_2("Increase volume") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("voldown"), wxT_2("Decrease volume") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("prev"), wxT_2("Go to previous track") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("next"), wxT_2("Go to next track") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("kiosk"), wxT_2("Start kiosk mode") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("update"), wxT_2("Update index on startup") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("raise"), wxT_2("Show and raise the Silverjuke window") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("open"), wxT_2("Open the given file(s) (default)") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("enqueue"), wxT_2("Enqueue the given file(s)") }, { wxCMD_LINE_OPTION, NULL, wxT_2("setcredit"), wxT_2("Set the number of credits in the credit system"), wxCMD_LINE_VAL_NUMBER }, { wxCMD_LINE_OPTION, NULL, wxT_2("addcredit"), wxT_2("Add the number of credits to the credit system"), wxCMD_LINE_VAL_NUMBER }, { wxCMD_LINE_OPTION, NULL, wxT_2("displaymsg"), wxT_2("Show the given message on the display"), wxCMD_LINE_VAL_STRING }, // this is mainly for testing IPC { wxCMD_LINE_OPTION, NULL, wxT_2("execute"), wxT_2("Execute the given scripting commands") }, // environment settings { wxCMD_LINE_SWITCH, NULL, wxT_2("skiperrors"), wxT_2("Do not show startup errors") }, { wxCMD_LINE_SWITCH, NULL, wxT_2("minimize"), wxT_2("Start minimized") }, { wxCMD_LINE_OPTION, NULL, wxT_2("kioskrect"), wxT_2("Where to show the kiosk: DISPLAY|X,Y,W,H[,clipmouse]") }, { wxCMD_LINE_OPTION, NULL, wxT_2("visrect"), wxT_2("Where to show the video screen: DISPLAY|X,Y,W,H") }, { wxCMD_LINE_OPTION, NULL, wxT_2("blackrect"), wxT_2("Add black areas: DISPLAY|X,Y,W,H[;DISPLAY,X,Y,W,H;...]") }, { wxCMD_LINE_OPTION, NULL, wxT_2("instance"), wxT_2("Set the configuration file and the instance to use") }, { wxCMD_LINE_OPTION, NULL, wxT_2("ini"), wxT_2("Set the configuration file to use") }, { wxCMD_LINE_OPTION, NULL, wxT_2("jukebox"), wxT_2("Set the jukebox file to use") }, { wxCMD_LINE_OPTION, NULL, wxT_2("temp"), wxT_2("Set the temporary directory to use") }, // addional parameters { wxCMD_LINE_PARAM, NULL, NULL, wxT_2("File(s)"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL|wxCMD_LINE_PARAM_MULTIPLE }, { wxCMD_LINE_NONE } }; s_cmdLine = new wxCmdLineParser(s_cmdLineDesc, argc, argv); if( s_cmdLine == NULL ) { FatalError(); } if( s_cmdLine->Parse() != 0 /*-1: help option shown, >0 syntax error*/ ) { return FALSE; } // create tools to use, the tools are deleted if SjMainFrame is deleted g_tools = new SjTools; // create the server name wxString serviceName; #ifndef __WXMSW__ // under Unix (or Mac) the IPC communication goes over a temporary file serviceName = g_tools->m_cache.GetTempDir(); wxASSERT( serviceName.Last() == wxT('/') ); #endif serviceName << wxT("silverjuke"); if( !g_tools->m_instance.IsEmpty() ) { serviceName << wxT("-") << g_tools->m_instance; } #ifndef __WXMSW__ serviceName << wxT("-ipc"); #endif // Is there another instance of silverjuke? if so, forward the commmand line // to this instance. We use the wxSingleInstanceChecker class in addition // for speed reasons - wxClient::MakeConnection() is rather slow. { wxLogNull null; // don't show any suspicious errors wxASSERT( g_tools ); // needed in SJ_ISRUNNING_NAME s_isRunningChecker = new wxSingleInstanceChecker(SJ_ISRUNNING_NAME); if( s_isRunningChecker && s_isRunningChecker->IsAnotherRunning() ) { bool executedSuccessfully = FALSE; SjClient* client = new SjClient; if( client ) { // get all data (files) wxString data; int i; for( i = 0; i < (int)s_cmdLine->GetParamCount(); i++ ) { data += i? wxT("\n") : wxT(""); data += s_cmdLine->GetParam(i); } // get topic ("raise", "open" or one of the command line switches) wxString topic(data.IsEmpty()? wxT("raise") : wxT("open")), valString; long valLong = 0; for( i = 0; i < (int)(sizeof(s_cmdLineDesc)/sizeof(wxCmdLineEntryDesc)); i++ ) { if( s_cmdLineDesc[i].kind == wxCMD_LINE_SWITCH && s_cmdLine->Found(s_cmdLineDesc[i].longName) ) { topic = s_cmdLineDesc[i].longName; break; } else if( s_cmdLineDesc[i].kind == wxCMD_LINE_OPTION ) { if( s_cmdLineDesc[i].type == wxCMD_LINE_VAL_NUMBER && s_cmdLine->Found(s_cmdLineDesc[i].longName, &valLong) ) { topic = s_cmdLineDesc[i].longName; data = wxString::Format(wxT("%i"), (int)valLong); break; } else if( s_cmdLine->Found(s_cmdLineDesc[i].longName, &valString) ) { topic = s_cmdLineDesc[i].longName; data = valString; break; } } } // execute topic wxConnectionBase* connection = client->MakeConnection(wxT("localhost"), serviceName, topic); if( connection ) { executedSuccessfully = connection->Execute(data); connection->Disconnect(); delete connection; } delete client; client = NULL; } // If execution has failed, wait a second to allow the previous instance // to terminated completly. After that, we check the instance again // (for this, we have to recreate wxSingleInstanceChecker() as IsAnotherRunning() // always returns a static value). if( !executedSuccessfully ) { ::wxSleep(1); if( s_isRunningChecker ) { delete s_isRunningChecker; s_isRunningChecker = NULL; } s_isRunningChecker = new wxSingleInstanceChecker(SJ_ISRUNNING_NAME); } // On execution success or if the other process is still present, we're terminating now. // There's nothing more we can do here. We check IsAnotherRunning() again as the prev. // instance may be terminted completly from our last check (see above). if( executedSuccessfully || s_isRunningChecker == NULL || s_isRunningChecker->IsAnotherRunning() ) { if( s_isRunningChecker ) { delete s_isRunningChecker; s_isRunningChecker = NULL; } delete g_tools; g_tools = NULL; return FALSE; } } } // create the server s_server = new SjServer; if( s_server ) { if( !s_server->Create(serviceName) ) { delete s_server; s_server = NULL; } } // create main frame window long skinFlags = g_tools->m_config->Read(wxT("main/skinFlags"), SJ_SKIN_DEFAULT_FLAGS); new SjMainFrame(this, IDC_MAINFRAME, skinFlags, wxPoint(50, 50), wxSize(700, 500)); return TRUE; } void SjMainApp::SetIsInShutdown() { s_isInShutdown = TRUE; } int SjMainApp::OnExit() { /* exit parser */ SjSkinMlParserData::FreeStaticData(); /* exit tagging libraries */ SjExitID3Etc(); /* client and server */ if( s_server ) { delete s_server; s_server = NULL; } /* delete single instance checkers: */ if( s_isRunningChecker ) { delete s_isRunningChecker; s_isRunningChecker = NULL; } /* delete command line */ if( s_cmdLine ) { delete s_cmdLine; s_cmdLine = NULL; } /* remove our error logger */ delete s_logGui; /* delete pending temp. files */ SjTempNCache::LastCallOnExit(); /* shutdown garbage collector */ #if SJ_USE_SCRIPTS ::SjGcShutdown(); // this may free references to the objects deleted in the next lines #endif delete SjModuleSystem::s_delayedDbDelete; SjModuleSystem::s_delayedDbDelete = NULL; /* shutdown HTTP-services */ wxSocketBase::Shutdown(); /* done. */ return 0; } void SjMainApp::OnActivate(wxActivateEvent& event) { SjMainFrame* mainFrame = (SjMainFrame*)wxWindow::FindWindowById(IDC_MAINFRAME); if( mainFrame ) { mainFrame->m_moduleSystem.BroadcastMsg(event.GetActive()? IDMODMSG_APP_ACTIVATED : IDMODMSG_APP_DEACTIVATED); } } void SjMainApp::OnQueryEndSession(wxCloseEvent& event) { if( !IsInShutdown() ) { SjMainFrame* mainFrame = (SjMainFrame*)GetTopWindow(); if( mainFrame ) { if( !event.CanVeto() || mainFrame->QueryEndSession(TRUE/*onShutdown*/) ) { mainFrame->DoEndSession(); } else { event.Veto(); } } } } void SjMainApp::OnEndSession(wxCloseEvent& event) { if( !IsInShutdown() ) { SjMainFrame* mainFrame = (SjMainFrame*)GetTopWindow(); if( mainFrame ) { mainFrame->DoEndSession(); } } } void SjMainApp::DoShutdownEtc(SjShutdownEtc action, long restoreOrgVol) { // already in shutdown? if( IsInShutdown() ) { return; } // user defined script? if( action>=SJ_SHUTDOWN_USER_DEF_SCRIPT && action<=SJ_SHUTDOWN_USER_DEF_SCRIPT_LAST ) { #if SJ_USE_SCRIPTS SjSee::OnGlobalEmbedding(SJ_PERSISTENT_EXIT_OPTION_deprecated, action-SJ_SHUTDOWN_USER_DEF_SCRIPT); #endif return; } // stop playback g_mainFrame->Stop(); if( restoreOrgVol != -1 ) { g_mainFrame->SetAbsMainVol(restoreOrgVol); } if( action == SJ_SHUTDOWN_STOP_PLAYBACK ) { return; } // just clear the playlist? if( action == SJ_SHUTDOWN_CLEAR_PLAYLIST ) { g_mainFrame->UnqueueAll(); return; } // exit, shutdown etc. g_tools->NotCrashed(TRUE); // On shutdown, the program may not really run to end ... if( action == SJ_SHUTDOWN_EXIT_SILVERJUKE ) { g_mainFrame->DoEndSession(); } else if( action == SJ_SHUTDOWN_POWEROFF_COMPUTER ) { ::wxShutdown(wxSHUTDOWN_POWEROFF); } else if( action == SJ_SHUTDOWN_REBOOT_COMPUTER ) { ::wxShutdown(wxSHUTDOWN_REBOOT); } } void SjMainApp::OnFatalException() { FatalError(); } void SjMainApp::FatalError() { // show all errors wxLog* l = wxLog::GetActiveTarget(); if( l ) { l->Flush(); } // show message that we will quite now ::wxLogFatalError(wxString::Format(/*n/t, maybe locale error?*/wxT("We'll terminating %s now.\nSorry, there's nothing we can do."), SJ_PROGRAM_NAME)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/mainapp.h��������������������������������������������������������������0000664�0000000�0000000�00000004576�12660066715�0017647�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: mainapp.h * Authors: Björn Petersen * Purpose: Silverjuke main application class * ******************************************************************************/ #ifndef __SJ_MAINAPP_H__ #define __SJ_MAINAPP_H__ enum SjShutdownEtc { SJ_SHUTDOWN_STOP_PLAYBACK = 0, SJ_SHUTDOWN_CLEAR_PLAYLIST = 10, SJ_SHUTDOWN_EXIT_KIOSK_MODE = 20, SJ_SHUTDOWN_EXIT_SILVERJUKE = 30, SJ_SHUTDOWN_POWEROFF_COMPUTER = 40, SJ_SHUTDOWN_REBOOT_COMPUTER = 50, SJ_SHUTDOWN_USER_DEF_SCRIPT = 60, SJ_SHUTDOWN_USER_DEF_SCRIPT_LAST= 159, // must all be less than 255, also note, the values are saved to disk! SJ_SHUTDOWN_ASK_FOR_ACTION = 1000, }; class SjMainApp : public wxApp { public: bool OnInit (); int OnExit (); void OnFatalException (); static void FatalError (); void SetIsInShutdown (); static bool IsInShutdown () { return s_isInShutdown; } static void DoShutdownEtc (SjShutdownEtc, long restoreOrgVol=-1); static wxCmdLineParser* s_cmdLine; private: static bool s_isInShutdown; void OnActivate (wxActivateEvent&); void OnQueryEndSession (wxCloseEvent&); void OnEndSession (wxCloseEvent&); DECLARE_EVENT_TABLE (); }; DECLARE_APP(SjMainApp); #endif /* __SJ_MAINAPP_H__ */ ����������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/mainframe.cpp����������������������������������������������������������0000664�0000000�0000000�00000262045�12660066715�0020511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: mainframe.cpp * Authors: Björn Petersen * Purpose: Silverjuke main frame * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/browser.h> #include <sjtools/imgthread.h> #include <sjtools/testdrive.h> #include <sjtools/console.h> #include <sjtools/msgbox.h> #include <sjmodules/settings.h> #include <sjmodules/arteditor.h> #include <sjmodules/help/help.h> #include <sjmodules/openfiles.h> #include <sjmodules/basicsettings.h> #include <sjmodules/kiosk/kiosk.h> #include <sjmodules/advsearch.h> #include <sjmodules/tageditor/tageditor.h> #include <sjmodules/kiosk/virtkeybd.h> #include <sjmodules/cinterface.h> #include <sjmodules/playbacksettings.h> #include <sjmodules/internalinterface.h> #include <sjmodules/vis/vis_module.h> #include <see_dom/sj_see.h> #ifdef __WXMSW__ #include <windows.h> #include <wx/msw/winundef.h> // undef symbols conflicting with wxWidgets #endif #include <wx/cmdline.h> #include <wx/clipbrd.h> #include <wx/stdpaths.h> #include <wx/sysopt.h> #include <sjdata/icons/xpm_sj_32.xpm> #include <sjdata/icons/xpm_sj_16.xpm> /******************************************************************************* * Public Functions ******************************************************************************/ SjMainFrame* g_mainFrame = NULL; void SjMainFrame::OpenSettings(const wxString& selFile, int selIndex, int selPage) { SjSettingsModule::OpenSettings(selFile, selIndex, selPage); } void SjMainFrame::Enqueue(const wxArrayString& urls, long enqueuePos, bool urlsVerified, bool autoPlay, bool uiChecks) { bool gotoPos = false; bool fadeToPos = false; bool forcePlayback = false; bool queueEmptyBefore = m_player.m_queue.GetCount()? false : true; long markForPlayingNext = 0; // anything to enqueue? if( urls.GetCount() <= 0 ) { return; // nothing given } if( uiChecks ) { // enought credits? if( !autoPlay && g_kioskModule && !g_kioskModule->CanEnqueue(urls, urlsVerified) ) { return; // no, an error is already printed in CanEnqueue() } // interrupt AutoPlay? if( !autoPlay && m_autoCtrl.HasInterruptibleAutoPlay() && m_player.IsAutoPlayOnAir() ) { enqueuePos = -3; /*play now*/ fadeToPos = true; } // get correct queue position if( enqueuePos == -2 /*play next*/ ) { enqueuePos = m_player.m_queue.GetCurrPos()+1; markForPlayingNext = SJ_PLAYLISTENTRY_PLAYNEXT; } else if( enqueuePos == -3 /*play now*/ ) { enqueuePos = m_player.m_queue.GetCurrPos()+1; gotoPos = true; forcePlayback = true; } else if( enqueuePos == -1 /*enqueue*/ ) { ; } // check if enqueing should also start playback if( m_player.m_queue.GetCount() == 0 ) { if( (g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE) || !IsOpAvailable(SJ_OP_PLAYPAUSE) ) { forcePlayback = true; } } if( !m_player.IsPlaying() && (IsKioskStarted() || !m_haltedManually ) ) // stopped and (in-kiosk or end-of-playlist) { if( g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE ) { gotoPos = true; // this will also mark the previous one as play which is unwanted if SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE is unset } if( (g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE) || !IsOpAvailable(SJ_OP_PLAYPAUSE) ) { forcePlayback = true; } } if( autoPlay ) { forcePlayback = true; m_player.m_queue.EqualizeRepeatRound(); } } // do what to do m_display.m_selectedIds.Clear(); m_player.m_queue.Enqueue(urls, enqueuePos, urlsVerified, &m_display.m_selectedIds, markForPlayingNext|(autoPlay? SJ_PLAYLISTENTRY_AUTOPLAY : 0)); if( gotoPos && (!queueEmptyBefore || !m_player.m_queue.GetShuffle()) /*if shuffle is enabled, let the queue select the track*/ ) { m_player.GotoAbsPos(enqueuePos==-1? m_player.m_queue.GetCount()-urls.GetCount() : enqueuePos, fadeToPos); } if( forcePlayback && !m_player.IsPlaying() ) { m_player.Play(); // don't call SjMainFrame::Play() - this save one UpdateDisplay() m_haltedManually = false; } if( !autoPlay ) { GotInputFromUser(); } m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_ENQUEUE_LOCK_MS; if( enqueuePos == -1 ) { m_display.m_scrollPos = m_player.m_queue.GetCount()-urls.GetCount(); } else { m_display.m_scrollPos = -1; } UpdateDisplay(); // visualize the changes m_browser->RefreshSelection(); UpdateMenuBarQueue(); } void SjMainFrame::UnqueueByPos(long queuePos) { if( queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { long playlistEntryFlags = m_player.m_queue.GetFlags(queuePos); if( (playlistEntryFlags&SJ_PLAYLISTENTRY_AUTOPLAY) && !IsPaused() && !HasNextIgnoreAP() ) { m_autoCtrl.SetAutoPlayUnqueueId(m_player.m_queue.GetIdByPos(queuePos)); } m_player.m_queue.UnqueueByPos(queuePos, &m_player); UpdateDisplay(); m_browser->RefreshSelection(); UpdateMenuBarQueue(); } } bool SjMainFrame::GotoNextRegardAP(bool fadeToNext, bool ignoreTimeouts) { if( !HasNextIgnoreAP() && HasNextRegardAP() ) { // enqueue a new auto play URL if( !m_autoCtrl.DoAutoPlayIfEnabled(ignoreTimeouts) ) { return false; } } bool success = m_player.GotoNextIgnoreAP(fadeToNext); m_display.m_scrollPos=-1; if( !IsPlaying() ) { UpdateDisplay(); } UpdateMenuBarQueue(); return success; } void SjMainFrame::ReplayIfPlaying() { // this function may be used to reflect new audio/player settings wxBusyCursor busy; // update player if( IsPlaying() ) { long pos = GetElapsedTime(); m_player.Stop(false); m_player.Play(pos); } else { Stop(); } UpdateMenuBarQueue(); } void SjMainFrame::SetAbsMainVol(long v) { SjSkinValue value; m_player.SetMainVol(v); value.vmin = 0; value.vmax = 255; value.thumbSize = 0; value.value = m_player.GetMainVol(); SetSkinTargetValue(IDT_MAIN_VOL_SLIDER, value); value.vmax = 0; value.value = m_player.GetMainVolMute()? 1 : 0; SetSkinTargetValue(IDT_MAIN_VOL_MUTE, value); } bool SjMainFrame::UpdateIndex(wxWindow* parent, bool deepUpdate) { bool ret = TRUE; static bool inUpdate = FALSE; m_updateIndexAfterConstruction = false; if( !inUpdate ) { inUpdate = TRUE; SJ_WINDOW_DISABLER(parent); // if we do not end the search and the music selection, // the search will be inconsistent after the update -- // it may be possible to reset if afterwards, but this is more complicated. EndAllSearch(); { SjBusyInfo /*construct exactly here*/ busy(parent, deepUpdate? _("Recreating music library") : _("Updating music library"), IsAllAvailable() /*canCancel? (we may come here due the --update option in kiosk mode; in this case, the update may not be aborted)*/, _("If you cancel the update process, your music library may not be up to date.\n\nCancel the update process?")); SjModuleList* list = m_moduleSystem.GetModules(SJ_MODULETYPE_COL); wxASSERT(list); SjModuleList::Node* moduleNode = list->GetFirst(); while( moduleNode ) { SjColModule* module = (SjColModule*)moduleNode->GetData(); wxASSERT(module); if( !module->UpdateAllCol(&busy, deepUpdate) ) { ret = FALSE; break; // user abort } moduleNode = moduleNode->GetNext(); } } if( ret ) { m_columnMixer.ReloadColumns(); m_browser->ReloadColumnMixer(); } UpdateMainMenu(); inUpdate = FALSE; } return ret; } bool SjMainFrame::QueryEndSession(bool onShutdown) { if( !m_mainApp->IsInShutdown() ) { g_tools->NotCrashed(TRUE/*stopLogging*/); // On shutdown, the program may not really run to end ... if( IsKioskStarted() ) { if( onShutdown ) { return !g_kioskModule->IsShutdownDisabled(); } else { return FALSE; } } if( !onShutdown && IsPlaying() ) { if( g_accelModule->YesNo( wxString::Format(_("%s is currently playing. Do you want to stop the playing track and exit %s?"), SJ_PROGRAM_NAME, SJ_PROGRAM_NAME ), wxString::Format(_os(_("Exit %s")), SJ_PROGRAM_NAME), this, SJ_ACCEL_ASK_ON_CLOSE_IF_PLAYING) != wxYES ) { return FALSE; } } } return TRUE; } void SjMainFrame::DoEndSession() { if( !m_mainApp->IsInShutdown() ) { m_mainApp->SetIsInShutdown(); g_tools->NotCrashed(TRUE/*stopLogging*/); // On shutdown, the program may not really run to end ... Destroy(); } } /******************************************************************************* * Drag'n'Drop / Open Files ******************************************************************************/ class SjDropTarget : public wxDropTarget { public: SjDropTarget(wxWindow* linkedWindow) { m_linkedWindow = linkedWindow; m_dataObject = new SjDataObject(wxDragMove); m_dataObject->AddFileData(); m_dataObject->AddBitmapData(); SetDataObject(m_dataObject); } wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def) { if( g_mainFrame && g_mainFrame->DragNDrop(SJ_DND_MOVE, g_mainFrame, wxPoint(x, y), NULL, NULL) ) { return def; } else { return wxDragNone; } } bool OnDrop(wxCoord x, wxCoord y) { return (OnDragOver(x, y, wxDragCopy)==wxDragCopy); } wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) { if( OnDragOver(x, y, wxDragCopy)!=wxDragCopy ) { return wxDragNone; } m_dataObject = new SjDataObject(def); m_dataObject->AddFileData(); m_dataObject->AddBitmapData(); m_dataObject->m_dragResult = def; SetDataObject(m_dataObject); GetData(); m_dataX = x; m_dataY = y; // convert the coordinates to client coordinated of the main window, if needed if( m_linkedWindow != g_mainFrame ) { wxPoint linkedPos = m_linkedWindow->GetPosition(); m_dataX += linkedPos.x; m_dataY += linkedPos.y; } wxCommandEvent* fwd = new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDO_DND_ONDATA); fwd->SetClientData((void*)this); g_mainFrame->GetEventHandler()->QueueEvent(fwd); return def; } SjDataObject* m_dataObject; wxCoord m_dataX, m_dataY; wxWindow* m_linkedWindow; }; void SjMainFrame::OnIDO_DND_ONDATA(wxCommandEvent& evt) { SjDropTarget* dropTarget = (SjDropTarget*)evt.GetClientData(); if( dropTarget ) { DragNDrop(SJ_DND_DROP, this, wxPoint(dropTarget->m_dataX, dropTarget->m_dataY), dropTarget->m_dataObject, NULL); } } bool SjMainFrame::DragNDrop(SjDragNDropAction action, wxWindow* dndOwner, const wxPoint& dndOwnerPos, SjDataObject* data, wxArrayString* files) // "files" is only needed to change from the internal to the system-wide drag'n'drop { static wxWindow* s_currWindow = NULL; static SjCommonModule* s_currModule = NULL; // // save the given data and get the screen position of the dnd action // wxPoint screenPos = dndOwner->ClientToScreen(dndOwnerPos); // // init drag'n'drop - this message is NOT forwarded to any module at this moment // (done when we receive eg. MOVE) // if( action == SJ_DND_ENTER ) { s_currWindow = NULL; s_currModule = NULL; m_internalDragNDrop = TRUE; // release the mouse capture (handled by the dnd classes) if( dndOwner->HasCapture() ) { dndOwner->ReleaseMouse(); } // try to enter dnd using an image if( m_dragImage ) { if( (g_accelModule->m_flags&SJ_ACCEL_USE_DND_IMAGES) && m_dragImage->BeginDrag(m_dragHotspot, dndOwner, TRUE) ) { m_dragRect.x = screenPos.x - m_dragHotspot.x; m_dragRect.y = screenPos.y - m_dragHotspot.y; m_dragImage->Move(dndOwnerPos); m_dragImage->Show(); return TRUE; // start dnd by caller, the caller should call this function with the } // actions SJ_DND_MOVE and SJ_DND_DROP delete m_dragImage; m_dragImage = NULL; } // use default system-dnd without an image if( files ) { wxFileDataObject myData; for( size_t i = 0; i < files->GetCount(); i++ ) { myData.AddFile(files->Item(i)); } { wxDropSource dropSource(dndOwner); // it may be important that wxDropSource is freed BEFORE dropSource.SetData(myData); // wxFileDataObject is freed (true as it is inside a nested block) dropSource.DoDragDrop(TRUE); } } m_internalDragNDrop = FALSE; return FALSE; // the caller should not call this function for the dnd progress anymore } // // find the top-level window under the mouse // wxPoint currPos; { wxWindow* newWindow = SjDialog::FindTopLevel(::wxFindWindowAtPoint(screenPos)); if( newWindow ) { currPos = newWindow->ScreenToClient(screenPos); } if( newWindow != s_currWindow ) { if( s_currModule ) { s_currModule->DragNDrop(SJ_DND_LEAVE, s_currWindow, currPos, NULL); s_currModule = NULL; } if( s_currWindow ) { if( s_currWindow==g_mainFrame || s_currWindow->GetParent()==g_mainFrame ) s_currWindow->SetCursor(SjVirtKeybdModule::GetStandardCursor()); else s_currWindow->SetCursor(*wxSTANDARD_CURSOR); // wxNullCursor does not work!, see http://www.silverjuke.net/forum/topic-1478.html } s_currWindow = newWindow; // may be NULL if( s_currWindow ) { // find out the module that will handle the dnd stuff SjModuleList* list = m_moduleSystem.GetModules(SJ_MODULETYPE_COMMON); SjModuleList::Node* moduleNode = list->GetFirst(); while( moduleNode ) { SjCommonModule* module = (SjCommonModule*)moduleNode->GetData(); wxASSERT( module && module->m_type == SJ_MODULETYPE_COMMON ); if( module->DragNDrop(SJ_DND_ENTER, s_currWindow, currPos, NULL) ) { s_currModule = module; break; } moduleNode = moduleNode->GetNext(); } } } } // // move the drag'n'drop image or, if no image is present, test if the dnd target // accepts the // if( action == SJ_DND_MOVE ) { if( m_dragImage ) { static int inHereRet = 0; if( inHereRet ) { return inHereRet > 0? TRUE : FALSE; } wxRect r = GetRect(); r.Inflate(4); wxPoint mouse = ::wxGetMousePosition(); if( (mouse.x < r.x || mouse.x > r.x+r.width || mouse.y < r.y || mouse.y > r.y+r.height) && s_currWindow == NULL ) { inHereRet = -1; // Item moved outside silverjuke: end imaged drag'n'drop and // switch to normal drag'n'drop to allow other applications to receive data. // // As there were some problems some times, I added lots of "crash precautions" // to see what happens. I then added the "inHere" state - hopefully this // solved the problem. however, I think we leave the crash precautions here // some time. g_tools->CrashPrecaution(wxT("mainframe"), wxT("DragNDrop(DeleteImage)")); m_dragImage->Hide(); m_dragImage->EndDrag(); delete m_dragImage; m_dragImage = NULL; // start normal drag'n'drop if( files ) { g_tools->CrashPrecaution(wxT("mainframe"), wxT("DragNDrop(CreateDataObject)")); wxFileDataObject myData; for( size_t i = 0; i < files->GetCount(); i++ ) { myData.AddFile(files->Item(i)); } { g_tools->CrashPrecaution(wxT("mainframe"), wxT("DragNDrop(CreateDropSrc)")); wxDropSource dropSource(dndOwner); // it may be important that wxDropSource is freed BEFORE g_tools->CrashPrecaution(wxT("mainframe"), wxT("DragNDrop(SetData)")); dropSource.SetData(myData); // wxFileDataObject is freed (true as it is inside a nested block) g_tools->CrashPrecaution(wxT("mainframe"), wxT("DragNDrop(DoDragDrop)")); dropSource.DoDragDrop(TRUE); } } g_tools->CrashPrecaution(wxT("mainframe"), wxT("DragNDrop(EndInternal)")); m_internalDragNDrop = FALSE; inHereRet = 0; return FALSE; // stop dnd } else { // just move the image inside Silverjuke inHereRet = 1; m_dragRect.x = screenPos.x - m_dragHotspot.x; m_dragRect.y = screenPos.y - m_dragHotspot.y; m_dragImage->Move(dndOwnerPos); if( s_currModule && s_currModule->DragNDrop(SJ_DND_MOVE, s_currWindow, currPos, NULL) ) { if( s_currWindow==g_mainFrame || s_currWindow->GetParent()==g_mainFrame ) s_currWindow->SetCursor(SjVirtKeybdModule::GetStandardCursor()); else s_currWindow->SetCursor(*wxSTANDARD_CURSOR); // wxNullCursor does not work!, see http://www.silverjuke.net/forum/topic-1478.html } else if( s_currWindow ) { s_currWindow->SetCursor(g_tools->m_staticNoEntryCursor); } inHereRet = 0; return TRUE; // continue dnd } } else if( s_currModule ) { // when we're here, the function is called from SjDropTarget::OnDragOver() - // return if the position is acceptable or not wxASSERT( s_currWindow ); return s_currModule->DragNDrop(SJ_DND_MOVE, s_currWindow, currPos, NULL); } } // // drop the item over the given dnd target // if( action == SJ_DND_DROP ) { // finish drag'n'drop if( m_dragImage ) { m_dragImage->Hide(); m_dragImage->EndDrag(); delete m_dragImage; m_dragImage = NULL; if( s_currWindow ) { if( s_currWindow==g_mainFrame || s_currWindow->GetParent()==g_mainFrame ) s_currWindow->SetCursor(SjVirtKeybdModule::GetStandardCursor()); else s_currWindow->SetCursor(*wxSTANDARD_CURSOR); // wxNullCursor does not work!, see http://www.silverjuke.net/forum/topic-1478.html } } if( s_currModule ) { wxASSERT( s_currWindow ); if( data ) { s_currModule->DragNDrop(SJ_DND_DROP, s_currWindow, currPos, data); } else if( files ) { SjDataObject data(wxDragMove); data.AddFiles(*files); s_currModule->DragNDrop(SJ_DND_DROP, s_currWindow, currPos, &data); } } m_internalDragNDrop = FALSE; } return FALSE; // stop drag'n'drop } bool SjMainFrame::OpenFiles(const wxArrayString& files, int command, int x, int y) { SjDataObject data(wxDragMove); data.AddFiles(files); return OpenData(&data, command, x, y); } bool SjMainFrame::OpenData(SjDataObject* data, int command, int mouseX, int mouseY) { wxBusyCursor busy; SjPlaylist newPlaylist; // if the main frame is not enable, we probably cannot accept any files as // we may be in an undefined modal state. if( !IsEnabled() ) return FALSE; // any files given? if( data == NULL ) return FALSE; wxArrayString filenames; if( data->m_fileData ) { filenames = data->m_fileData->GetFilenames(); #ifdef __WXMAC__ // there seems to be a bug in the drag'n'drop handler of wx - the filenames contain lineend characters!? for( int i = filenames.GetCount()-1; i >= 0; i-- ) { filenames[i].Replace(wxT("\n"), wxT("")); filenames[i].Replace(wxT("\r"), wxT("")); } #endif } long filenamesCount = filenames.GetCount(); // get the extension, if there is only one file wxString ext; if( filenamesCount == 1 ) { ext = SjTools::GetExt(filenames[0]); } // see what we can do with the data... long i, iCount; if( filenamesCount == 1 && ext == wxT("sjs") ) { // open a skin if( !::wxFileExists(filenames[0]) ) { // TRANSLATORS: %s will be replaced by a filename wxLogError(_("Cannot open \"%s\"."), filenames[0].c_str()); return false; } wxFileName srcfile(filenames[0]); wxFileName destfile(g_tools->GetSearchPath(0), srcfile.GetFullName()); if( !::wxFileExists(destfile.GetFullPath()) ) { ::wxCopyFile(srcfile.GetFullPath(), destfile.GetFullPath()); } Raise(); OpenSettings(wxT("memory:viewsettings.lib"), 0, 0); return true; } else if( filenamesCount == 1 && ext == wxT("js") ) { // open and execute a script ... #if SJ_USE_SCRIPTS if( !::wxFileExists(filenames[0]) ) { wxLogError(_("Cannot open \"%s\"."), filenames[0].c_str()); return false; } // ... copy to user dir Raise(); { wxFileName srcfile(filenames[0]); wxFileName destfile(g_tools->GetSearchPath(0), srcfile.GetFullName()); wxArrayString options; options.Add(wxString::Format(_("Also install the script to \"%s\" for permanent use"), destfile.GetPath(wxPATH_GET_VOLUME|wxPATH_GET_SEPARATOR).c_str())); int selOption = 0; if( SjMessageBox(wxString::Format(_("Execute the script \"%s\"?")+"\n\n"+ _("CAUTION: Scripts may slow down Silverjuke or damage your data. Please use only scripts you trust."), srcfile.GetFullPath().c_str()), SJ_PROGRAM_NAME, wxYES_NO|wxNO_DEFAULT|wxICON_QUESTION, this, &options, &selOption) != wxYES ) { return false; } if( selOption ) { ::wxCopyFile(srcfile.GetFullPath(), destfile.GetFullPath(), true /*overwrite*/); filenames[0] = destfile.GetFullPath(); } } // ... execute the script wxLogInfo(wxT("Loading %s"), filenames[0].c_str()); wxFileSystem fs; wxFSFile* fsFile = fs.OpenFile(filenames[0]); if( fsFile == NULL ) return false; SjSee* see = new SjSee; see->SetExecutionScope(filenames[0]); see->Execute(SjTools::GetFileContent(fsFile->GetStream(), &wxConvUTF8)); delete fsFile; if( see->m_persistentAnchor->m_next == NULL ) delete see; // script is a "one shot" and can be deleted else m_moduleSystem.m_sees.Add(see); #else wxLogError(wxT("Scripts are not supported in this build.")); #endif return true; } else if( (filenamesCount == 1 && m_moduleSystem.FindImageHandlerByExt(ext)) || (data->m_bitmapData && data->m_bitmapData->GetBitmap().IsOk()) ) { // open an image - this should be handled by the browser if( m_browser ) { Raise(); ClientToScreen(&mouseX, &mouseY); m_browser->ScreenToClient(&mouseX, &mouseY); m_browser->DropImage(data, mouseX, mouseY); } return TRUE; } else if( filenamesCount == 1 && m_moduleSystem.FindPlaylistHandlerByExt(ext) ) { // modify playlist: open a single playlist if( !newPlaylist.AddFromFile(filenames[0]) ) { return FALSE; } } else if( filenamesCount >= 1 ) { // modify playlist: add music files // or: if there are folders given, forward them to the library module wxArrayString folders; for( i = 0; i < filenamesCount; i++ ) { if( ::wxDirExists(filenames[i]) ) { folders.Add(filenames[i]); } else { newPlaylist.Add(filenames[i], FALSE/*not verified*/, 0/*flags*/); } } if( folders.GetCount() && m_libraryModule ) { Raise(); if( m_libraryModule->AddFolders(folders) ) { UpdateIndex(g_mainFrame, FALSE); return TRUE; } return FALSE; } } else { // cannot handle the data return FALSE; } // add playlist to playing queue if( newPlaylist.GetCount() ) { SjHaltAutoPlay haltAutoPlay; wxArrayString newUrls; iCount = newPlaylist.GetCount(); for( i = 0; i < iCount; i++ ) { newUrls.Add(newPlaylist[i].GetUnverifiedUrl()); } m_player.m_queue.MergeMetaData(newPlaylist); if( command!=SJ_OPENFILES_ENQUEUE ) { m_player.m_queue.UnqueueAll(&m_player, FALSE); } Enqueue(newUrls, (command==SJ_OPENFILES_PLAY&&i==0)? -3/*play now*/ : -1/*play last*/, FALSE/*not verified*/); m_browser->RefreshSelection(); return TRUE; } else { for( i = filenamesCount-1; i >=0 ; i-- ) { wxLogError(_("Cannot open \"%s\"."), filenames[i].c_str()); } return FALSE; } } /******************************************************************************* * Constructor / Destructor ******************************************************************************/ SjMainFrame::SjMainFrame(SjMainApp* mainApp, int id, long skinFlags, const wxPoint& pos, const wxSize& size) : SjSkinWindow(NULL, id, skinFlags, SJ_PROGRAM_NAME, pos, size, wxDEFAULT_FRAME_STYLE) { /* ======================================================= * init as less and as fast as possible until the window * can be shown - this makes the program look faster; * remember that some objects are initialized before * construction! * ======================================================= */ /* (/) Init some pointers */ g_mainFrame = this; #if SJ_USE_SCRIPTS m_cmdLineAndDdeSee = NULL; #endif m_updateIndexAfterConstruction = false; m_menuBar = NULL; m_fileMenu = NULL; m_editMenu = NULL; m_editExtrasMenu = NULL; m_viewMenu = NULL; m_viewColMenu = NULL; m_playbackMenu = NULL; m_visMenu = NULL; m_kioskMenu = NULL; m_helpMenu = NULL; m_haltedManually = FALSE; m_mainApp = mainApp; m_browser = NULL; m_imgThread = NULL; m_libraryModule = NULL; m_availOp = SJ_OP_DEF_NONKIOSK; m_internalDragNDrop = FALSE; m_lastUserDisplayInputTimestamp = 0; m_lastUserBrowserInputTimestamp = 0; m_inConstruction = TRUE; m_currZoom = -1; // set invalid, corrected when the browser view is loaded GotInputFromUser(); /* (1) Init Tools, configuration may be used from here */ // already done in SjMainApp as needed for the parent constructor /* (/) Init I18n stuff, this needs the filesystem handlers * (SjModule constructor) and SjTools */ { // define search paths for .mo lookup #if defined(__WXMSW__) wxLocale::AddCatalogLookupPathPrefix(wxStandardPaths::Get().GetResourcesDir() + wxT("\\locale")); // eg. "C:\program Files\Silverjuke\locale" #elif !defined(__WXOSX__) wxLocale::AddCatalogLookupPathPrefix(wxT("/usr/local/share/locale")); // for proper installations, wx should already search here, however, for development installations, this explicit path may help #endif // get language to use as canonical name wxString langCanonicalName; const wxLanguageInfo* langInfo = wxLocale::GetLanguageInfo(wxLocale::GetSystemLanguage()); langCanonicalName = langInfo? langInfo->CanonicalName : wxString(wxT("en_GB")); langCanonicalName = g_tools->m_config->Read(wxT("main/language"), langCanonicalName); // convert the canonical name to a language information structure, NULL on errors langInfo = wxLocale::FindLanguageInfo(langCanonicalName); // init the locale { wxLogNull null; // avoid warnings like "cannot set locale to ..." if the language is not available as a system language if( !m_locale.Init(langInfo? langInfo->Language : wxLANGUAGE_DEFAULT, 0) ) { m_locale.Init(langCanonicalName, langCanonicalName); // not sure why, however, this form loads catalogs even if the locale is not supported by the system } } // add translation catalog m_locale.AddCatalog(wxT("silverjuke")); } /* (/) Crash handling (after i18n for localized messages) */ if( !SjMainApp::s_cmdLine->Found(wxT("skiperrors")) ) { g_tools->ShowPossibleCrash(); } /* (2) Init Image Thread */ m_imgThread = new SjImgThread(); if( !m_imgThread ) { SjMainApp::FatalError(); } /* (3) create browser and search input window; the browser needs the image thread */ m_browser = new SjBrowserWindow(this); SetWorkspaceWindow(m_browser); m_inPerformingSearch = FALSE; m_simpleSearchInputFromUser = FALSE; #ifdef __WXMAC__ // wxMAC_TEXTCONTROL_USE_MLTE supports using of background colours etc. but also has // some disadvantages - so we use this flag only if needed - and here it is needed. // see mac/carbon/textctrl.h for details. wxSystemOptions::SetOption(wxMAC_TEXTCONTROL_USE_MLTE, 1); #endif m_simpleSearchInputWindow = new SjVirtKeybdTextCtrl(this, IDO_SEARCHINPUT, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_LEFT | wxTE_PROCESS_ENTER | wxNO_BORDER); #ifdef __WXMAC__ // switch back to the normal MAC controls wxSystemOptions::SetOption(wxMAC_TEXTCONTROL_USE_MLTE, 0); #endif SetInputWindow(m_simpleSearchInputWindow); m_simpleSearchInputFromUser = TRUE; m_simpleSearchInputTimer.SetOwner(this, IDTIMER_SEARCHINPUT); m_elapsedTimeTimer.SetOwner(this, IDTIMER_ELAPSEDTIME); // init search info text { SjSkinValue v; v.value = SJ_VFLAG_CENTER; v.string = _("Search"); SetSkinTargetValue(IDT_SEARCH_INFO, v); } /* (/) Load Skin, Set Icons */ SetDefaultWindowSize(); { wxString defaultSkin(wxT("memory:defaultskin.xml")); wxString skin = g_tools->m_config->Read(wxT("main/skinFile"), defaultSkin); wxLogInfo(wxT("Loading %s"), skin.c_str()); if( !LoadSkin(skin, SJ_OP_DEF_NONKIOSK, g_tools->m_config->Read(wxT("main/skinSettings"), wxT(""))) ) { wxLogError(wxT("Cannot load %s, falling back to default skin"), skin.c_str()); LoadSkin(defaultSkin, SJ_OP_DEF_NONKIOSK); g_tools->m_config->Write(wxT("main/skinFile"), defaultSkin); } } m_iconBundle.AddIcon(wxIcon(xpm_sj_32)); m_iconBundle.AddIcon(wxIcon(xpm_sj_16)); SetIcons(m_iconBundle); // check whether to start minimized, some OS specials bool startMinimized = (SjMainApp::s_cmdLine->Found(wxT("minimize")) || g_tools->m_config->Read(wxT("main/minimize"), 0L)!=0); #ifdef __WXMSW__ if( mainApp->m_nCmdShow == SW_HIDE || mainApp->m_nCmdShow == SW_MINIMIZE || mainApp->m_nCmdShow == SW_SHOWMINIMIZED || mainApp->m_nCmdShow == SW_SHOWMINNOACTIVE ) { startMinimized = true; } #endif // check whether to start in kiosk mode bool startKiosk = (SjMainApp::s_cmdLine->Found(wxT("kiosk")) || g_tools->m_config->Read(wxT("main/kiosk"), 0L)!=0); if( startKiosk ) { startMinimized = false; } /* (/) Load settings if not yet done as needed before window showing */ m_baseColumnWidth = CorrectColumnWidth(g_tools->m_config->Read(wxT("main/fontCoverSize")/*historical*/, SJ_DEF_COLUMN_WIDTH)); m_baseCoverHeight = CorrectCoverHeight(g_tools->m_config->Read(wxT("main/fontCoverHeight"), SJ_DEF_COVER_HEIGHT)); m_baseFontSize = CorrectFontSize(g_tools->m_config->Read(wxT("main/fontSize"), SJ_DEF_FONT_SIZE)); m_baseFontFace = g_tools->m_config->Read(wxT("main/fontFace"), SJ_DEF_FONT_FACE); m_allSearchMs = g_tools->m_config->Read(wxT("main/searchTime"), SJ_SEARCH_DELAY_MS); m_allSearchCount = 1; // fake one search to avoid division by zero m_autoCtrl.LoadAutoCtrlSettings(); /* (4) Init Modules and Player */ m_moduleSystem.Init(); m_moduleSystem.AddInterface(new SjInternalInterface()); m_moduleSystem.AddInterface(new SjCInterface()); // the interface is also used for adding scripts, so add it independingly of SJ_USE_C_INTERFACE m_moduleSystem.LoadModules(); m_libraryModule = (SjLibraryModule*)m_moduleSystem.FindModuleByFile(wxT("memory:library.lib")); wxASSERT(m_libraryModule); m_columnMixer.LoadModules(&m_moduleSystem); // this will also load the library module m_player.Init(); m_showRemainingTime = g_tools->m_config->Read(wxT("main/showRemainingTime"), 1L)!=0; /* (/) load other GUI modules, this sets MANY global pointers to the modules */ { int i, iCount; for( i = 0; i < 2; i++ ) { SjModuleList* list = m_moduleSystem.GetModules(SJ_MODULETYPE_ALL); SjModuleList::Node* moduleNode = list->GetFirst(); while( moduleNode ) { SjModule* module = moduleNode->GetData(); wxASSERT(module); if( module->m_type == SJ_MODULETYPE_COMMON || module->m_type == SJ_MODULETYPE_SCANNER ) { if( (i==0 && module->m_interface == g_internalInterface) || (i==1 && module->m_interface != g_internalInterface) ) { module->Load(); } } moduleNode = moduleNode->GetNext(); } } // Load scripts - if things are not ready at this point, make it safe to use them anyway. // Remember, the skin, which may also use scripts, is also already loaded. wxFileSystem fs; m_moduleSystem.m_scripts.Sort(); iCount = m_moduleSystem.m_scripts.GetCount(); for( i = 0; i < iCount; i++ ) { #if SJ_USE_SCRIPTS wxLogInfo(wxT("Loading %s"), m_moduleSystem.m_scripts[i].c_str()); wxFSFile* fsFile = fs.OpenFile(m_moduleSystem.m_scripts[i]); if( fsFile ) { SjSee* see = new SjSee; see->SetExecutionScope(m_moduleSystem.m_scripts[i]); see->Execute(SjTools::GetFileContent(fsFile->GetStream(), &wxConvUTF8)); delete fsFile; if( see->m_persistentAnchor->m_next == NULL ) delete see; // script is a "one shot" and can be deleted else m_moduleSystem.m_sees.Add(see); } #else wxLogInfo(wxT("%s not loaded - scripts are not supported in this build"), m_moduleSystem.m_scripts[i].c_str()); #endif } } if( SjMainApp::s_cmdLine->Found(wxT("execute")) ) { #if SJ_USE_SCRIPTS wxString cmds; SjMainApp::s_cmdLine->Found(wxT("execute"), &cmds); CmdLineAndDdeSeeExecute(cmds); #else wxLogError(wxT("Scripts are not supported in this build.")); #endif } /* (/) set the browser to the current state */ { m_browser->SetView_(g_tools->m_config->Read(wxT("main/selAlbumView"), (long)SJ_BROWSER_ALBUM_VIEW), false/*nothing to keep*/, false /*no redraw, done in GotoPos*/); long lastAdvSearchId = g_tools->m_config->Read(wxT("main/searchId"), 0L); bool reloadColumnMixer = TRUE; if( lastAdvSearchId ) { wxASSERT( g_advSearchModule ); SjAdvSearch lastSearch = g_advSearchModule->GetSearchById(lastAdvSearchId); if( lastSearch.GetId() ) { SetSearch(SJ_SETSEARCH_SETADV, wxT(""), &lastSearch); if( m_searchStat.m_totalResultCount == 0 ) { // if there are no results, clear the search; this may happen eg. // if the adv. search contains conditons regarding the playlist SetSearch(SJ_SETSEARCH_CLEARADV|SJ_SETSEARCH_NOAUTOHISTORYADD); } reloadColumnMixer = FALSE; // done in set search } } if( reloadColumnMixer ) { m_browser->ReloadColumnMixer(); } m_browser->GotoPos(g_tools->m_config->Read(wxT("main/selAlbumUrl"), wxT(""))); } /* (/) set accelerators * (some accelerators as "space" are done in the browser window * as they're also used in the input window) */ SetAcceleratorTable(g_accelModule->GetAccelTable(SJA_MAIN)); SetSkinTargetValue(IDT_PLAY_NOW_ON_DBL_CLICK, (g_accelModule->m_flags&SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK)? 1 : 0); SetSkinTargetValue(IDT_TOGGLE_REMOVE_PLAYED, (m_player.m_queue.GetQueueFlags()&SJ_QUEUEF_REMOVE_PLAYED)? 1 : 0); /* (/) Init main menu */ CreateMainMenu(); SetMenuBar(m_menuBar); UpdateMainMenu(); /* open files from the command line or resume */ if( SjMainApp::s_cmdLine->GetParamCount() ) { wxArrayString filenames; int i, iCount = SjMainApp::s_cmdLine->GetParamCount(); for( i = 0; i < iCount; i++ ) { filenames.Add(SjMainApp::s_cmdLine->GetParam(i)); } int commandId = SJ_OPENFILES_DEFCMD; if( SjMainApp::s_cmdLine->Found(wxT("enqueue")) ) commandId = SJ_OPENFILES_ENQUEUE; OpenFiles(filenames, commandId); } else if( m_player.m_queue.GetQueueFlags()&SJ_QUEUEF_RESUME ) { m_player.LoadFromResumeFile(); } /* (/) Show the window, init Drag'n'Drop */ if( startMinimized ) { Iconize(true); } UpdateDisplay(); Show(); Update(); SetDropTarget(new SjDropTarget(this)); // Init Drag'n'Drop (don't wonder: this will start 2 threads under MSW) and set the focus to the browser #ifdef __WXMAC__ m_browser->SetDropTarget(new SjDropTarget(m_browser)); #endif m_browser->SetFocus(); /* (/) Some Functionality Tests */ if( g_debug ) { SjTestdrive1(); } /* start kiosk mode? */ if( startKiosk ) { g_kioskModule->StartRequest(TRUE/*force no query settings*/); } /* update the index? */ if( SjMainApp::s_cmdLine->Found(wxT("update")) || g_tools->m_config->Read(wxT("main/update"), 0L)!=0 ) { UpdateIndexAfterConstruction(); } if( m_updateIndexAfterConstruction ) { g_mainFrame->GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDT_UPDATE_INDEX)); } /* start the timer - this should be VERY last as the timer * is used eg. to start a playback */ m_blinkBlink = TRUE; m_elapsedTimeTimer.Start(1000); /* done */ m_inConstruction = FALSE; GetEventHandler()->QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, IDMODMSG_PROGRAM_LOADED)); // do not call BroadcastMsg() directly to allow windows to get realized } SjMainFrame::~SjMainFrame(void) { /* ======================================================= * First hide the top level windows (looks faster) as the real * termination progress may take some seconds eg. when the temp. * directory is cleaned. Moreover, the fist we do is to * fade down the music, if playing ;-) * ======================================================= */ m_moduleSystem.BroadcastMsg(IDMODMSG_WINDOW_BEFORE_CLOSE_HIDE_N_STOP); m_player.Pause(); // this will start fading the music out, the implementation may use a smart fading by regarding IsInShutdown() g_visModule->StopVis(); #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ExitForever(); #endif wxWindowList::Node *node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { wxWindow *winTop = node->GetData(); if ( winTop->IsShown() ) { winTop->Hide(); } } m_imgThread->Shutdown(); if( IsKioskStarted() ) { g_kioskModule->DoExit(FALSE/*restoreWindow*/); } m_moduleSystem.BroadcastMsg(IDMODMSG_WINDOW_CLOSE); /* ======================================================= * now, as the window is hidden, start destruction * ======================================================= */ /* (/) Save some settings */ if( !IsIconized() && !IsMaximized() // don't check for IsFakedMaximized(); the faked maximized positions can be used && !IsFullScreen() ) { g_tools->m_config->Write(wxT("main/skinSettings"), GetSavableSkinSettings()); } g_tools->m_config->Write(wxT("main/showRemainingTime"), m_showRemainingTime? 1L : 0L); g_tools->m_config->Write(wxT("main/searchTime"), m_allSearchMs/m_allSearchCount); g_tools->m_config->Write(wxT("main/searchId"), m_search.m_adv.GetId()); g_tools->m_config->Write(wxT("main/selAlbumView"), m_browser->GetView()); g_tools->m_config->Write(wxT("main/selAlbumUrl"), m_browser->GetFirstVisiblePos()); /* (3) Exit Browser, should be done _before_ existing the modules * although the initialisation order is different */ m_browser->Exit(); /* (4) Exit Player and Modules; m_player.Exit() may wait until the music is faded out */ m_player.Exit(); // still needs the module system m_player.SaveSettings(); m_columnMixer.UnloadModules(); m_moduleSystem.Exit(); /* (2) Exit Image Thread */ if( m_imgThread ) { delete m_imgThread; m_imgThread = 0; } /* (1) Exit Tools */ if( g_tools ) { delete g_tools; g_tools = NULL; } g_mainFrame = NULL; } /******************************************************************************* * Events ******************************************************************************/ BEGIN_EVENT_TABLE(SjMainFrame, SjSkinWindow) EVT_MENU_RANGE (IDT_FIRST, IDT_LAST, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_TOGGLE_TIME_MODE2, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_COVER, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_COVER_EXPLR, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_TOTAL_TIME, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_TRACKNR, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_ARTIST, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_AUTOPLAY, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DISPLAY_PREFERALBCV, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_START_PB_ON_ENQUEUE, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_GOTO_CURR_MARK, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_GOTOCURRAUTO, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SETTINGS_ADDFILES, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SETTINGS_SKINS, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SETTINGS_FONTNCOVER, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SETTINGS_QUEUE, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SETTINGS_AUTOVOL, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_REALLYENDSEARCH, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_CORNERCLICK, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_ABOUT_OPEN_WWW, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_ABOUT, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_ONLINE_HELP, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDO_VIS_FIRST__, IDO_VIS_LAST__, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDO_SCRIPT_MENU00, IDO_SCRIPT_MENU99, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDO_SCRIPTCONFIG_MENU00, IDO_SCRIPTCONFIG_MENU99, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_CONSOLE, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDM_FIRST, IDM_LAST, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_BROWSER_RELOAD_VIEW, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_DEBUGSKIN_RELOAD, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SELECTALL, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_UNQUEUE_MARKED, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_UNQUEUE_ALL_BUT_MARKED, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_EDITQUEUE, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDO_ARTISTINFQUEUE00,IDO_ARTISTINFQUEUE49, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDO_RATINGQUEUE00, IDO_RATINGQUEUE05, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_EXPLOREQUEUE, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SMOOTH, SjMainFrame::OnFwdToSkin ) EVT_MENU (IDO_SAMEZOOMINALLVIEWS, SjMainFrame::OnFwdToSkin ) EVT_MENU_RANGE (IDMODMSG_FIRST, IDMODMSG_LAST, SjMainFrame::OnFwdToModules ) EVT_MENU_RANGE (IDPLAYER_FIRST, IDPLAYER_LAST, SjMainFrame::OnFwdToPlayer ) EVT_MENU (IDO_DND_ONDATA, SjMainFrame::OnIDO_DND_ONDATA ) EVT_MENU (IDO_PASTE, SjMainFrame::OnPaste ) EVT_MENU (IDO_PASTE_USING_COORD, SjMainFrame::OnPaste ) EVT_MENU (IDO_ESC, SjMainFrame::OnEsc ) EVT_MENU (IDO_TAB, SjMainFrame::OnTab ) EVT_TEXT (IDO_SEARCHINPUT, SjMainFrame::OnSimpleSearchInput ) EVT_TEXT_ENTER (IDO_SEARCHINPUT, SjMainFrame::OnSimpleSearchInput ) EVT_MENU_RANGE (IDO_SEARCHHISTORY00, IDO_SEARCHHISTORY99, SjMainFrame::OnSearchHistory ) EVT_MENU_RANGE (IDO_SEARCHGENRE000, IDO_SEARCHGENRE999, SjMainFrame::OnSearchGenre ) EVT_MENU_RANGE (IDO_SEARCHMUSICSEL000, IDO_SEARCHMUSICSEL999, SjMainFrame::OnSearchMusicSel ) EVT_TIMER (IDTIMER_SEARCHINPUT, SjMainFrame::OnSimpleSearchInputTimer) EVT_TIMER (IDTIMER_ELAPSEDTIME, SjMainFrame::OnElapsedTimeTimer ) EVT_CLOSE ( SjMainFrame::OnCloseWindow ) EVT_ICONIZE ( SjMainFrame::OnIconizeWindow ) //EVT_IDLE ( SjMainFrame::OnIdle ) #ifndef __WXMSW__ EVT_MOUSEWHEEL ( SjMainFrame::OnMouseWheel ) #endif #ifdef SJHOOK_MAIN_EVENT_TABLE SJHOOK_MAIN_EVENT_TABLE #endif END_EVENT_TABLE() #if SJ_USE_SCRIPTS void SjMainFrame::CmdLineAndDdeSeeExecute(const wxString& cmds__) { wxString cmds(cmds__); if( m_mainApp == NULL || m_mainApp->IsInShutdown() || g_mainFrame == NULL ) { return; // cancel if in shutdown } if( m_cmdLineAndDdeSee == NULL ) { m_cmdLineAndDdeSee = new SjSee; m_cmdLineAndDdeSee->SetExecutionScope(wxT("DDE")); m_moduleSystem.m_sees.Add(m_cmdLineAndDdeSee); } // cmds can be either some native commands or a file to load. // convert file to native commands: if( ::wxFileExists(cmds) ) { wxFileSystem fs; wxFSFile* fsFile = fs.OpenFile(cmds); cmds.Empty(); if( fsFile != NULL ) { cmds = SjTools::GetFileContent(fsFile->GetStream(), &wxConvUTF8); delete fsFile; } } m_cmdLineAndDdeSee->Execute(cmds); } #endif void SjMainFrame::OnSkinTargetEvent(int targetId, SjSkinValue& value, long accelFlags) { /* hier sollten wirklich alle Fäden zusammenlaufen damit die Tastaturbedienung auch ohne Accel-Table funktioniert, vgl. http://www.silverjuke.net/forum/topic-3197.html */ GotInputFromUser(); if( targetId >= IDT_DISPLAY_LINE_FIRST && targetId <= IDT_DISPLAY_LINE_LAST ) { OnSkinDisplayEvent(targetId, value, accelFlags); } else if( (targetId >= IDT_WORKSPACE_GOTO_A && targetId <= IDT_WORKSPACE_GOTO_0_9) // Silverjuke is a "grown" program, so we have no continuous IDs for the workspace ... || (targetId >= IDT_WORKSPACE_LINE_LEFT && targetId <= IDT_WORKSPACE_LINE_DOWN) || (targetId >= IDT_WORKSPACE_PAGE_LEFT && targetId <= IDT_WORKSPACE_ENTER) || targetId == IDT_WORKSPACE_GOTO_PREV_AZ || targetId == IDT_WORKSPACE_GOTO_NEXT_AZ || targetId == IDT_WORKSPACE_HOME || targetId == IDT_WORKSPACE_END || targetId == IDT_WORKSPACE_H_SCROLL || targetId == IDT_WORKSPACE_V_SCROLL || targetId == IDT_WORKSPACE_GOTO_RANDOM || targetId == IDT_WORKSPACE_SHOW_COVERS || targetId == IDT_ZOOM_IN || targetId == IDT_ZOOM_OUT || targetId == IDT_ZOOM_NORMAL ) { // this stuff will be forwarded to the browser // (we may come from there, but this is not necessarily the case, eg. when using "real" accelerators or buttons for this) m_browser->OnSkinTargetEvent(targetId, value, accelFlags); } else if( targetId >= IDT_LAYOUT_FIRST && targetId <= IDT_LAYOUT_LAST ) { SjSkinLayout* layout = GetLayout(targetId-IDT_LAYOUT_FIRST); if( layout ) { LoadLayout(layout); } } else if( targetId >= IDT_NUMPAD_FIRST && targetId <= IDT_NUMPAD_LAST ) { if( g_kioskModule ) { g_kioskModule->m_numpadInput.KeyPressed(targetId); } } else if( targetId >= IDT_ADD_CREDIT_FIRST && targetId <= IDT_ADD_CREDIT_LAST ) { g_kioskModule->m_creditBase.AddCredit((targetId-IDT_ADD_CREDIT_01)+1, SJ_ADDCREDIT_FROM_DDE); } else if( targetId >= IDO_SCRIPT_MENU00 && targetId <= IDO_SCRIPT_MENU99 ) { #if SJ_USE_SCRIPTS SjSee::OnGlobalEmbedding(SJ_PERSISTENT_MENU_ENTRY, targetId-IDO_SCRIPT_MENU00); #endif } else if( targetId >= IDO_SCRIPTCONFIG_MENU00 && targetId <= IDO_SCRIPTCONFIG_MENU99 ) { #if SJ_USE_SCRIPTS SjSee::OnGlobalEmbedding(SJ_PERSISTENT_CONFIG_BUTTON, targetId-IDO_SCRIPTCONFIG_MENU00); #endif } else if( targetId >= IDM_FIRST && targetId <= IDM_LAST ) { m_browser->OnModuleUserId(targetId); } else if( targetId >= IDO_ARTISTINFQUEUE00 && targetId <= IDO_ARTISTINFQUEUE49 ) { if( IsAllAvailable() ) { m_libraryModule->ShowArtistInfo(IDO_ARTISTINFQUEUE00, targetId); } } else if( targetId == IDT_VIS_TOGGLE || (targetId>=IDO_VIS_FIRST__ && targetId<=IDO_VIS_LAST__) ) { if( g_visModule ) { g_visModule->OnVisMenu(targetId); } } else { switch( targetId ) { case IDT_SEARCH_BUTTON: if( IsOpAvailable(SJ_OP_SEARCH) ) { bool focusInSearchWindow = (wxWindow::FindFocus()==m_simpleSearchInputWindow)? TRUE : FALSE; if( value.value == 1 ) { EndOneSearch(); if( focusInSearchWindow ) { m_simpleSearchInputWindow->SetFocus(); } else { m_browser->SetFocus(); } } else { wxCommandEvent fwdEvent(wxEVT_COMMAND_TEXT_ENTER, IDO_SEARCHINPUT); OnSimpleSearchInput(fwdEvent); m_simpleSearchInputWindow->SetFocus(); g_virtKeybd->OpenKeybd(m_simpleSearchInputWindow); } } break; case IDO_REALLYENDSEARCH: if( IsOpAvailable(SJ_OP_SEARCH) ) { EndAllSearch(); } break; case IDO_UNQUEUE_MARKED: // should go here, not to OnDisplayCommand(), see http://www.silverjuke.net/forum/topic-3197.html case IDO_UNQUEUE_ALL_BUT_MARKED: if( IsOpAvailable(SJ_OP_UNQUEUE) ) { m_player.m_queue.UnqueueByIds(m_display.m_selectedIds, targetId==IDO_UNQUEUE_MARKED? 1 : 0, &m_player); UpdateDisplay(); m_browser->RefreshSelection(); } break; case IDO_EDITQUEUE: // should go here, not to OnDisplayCommand(), see http://www.silverjuke.net/forum/topic-3197.html if( IsAllAvailable() ) { g_tagEditorModule->OpenTagEditor(new SjDisplayEditDlg()); } break; case IDO_RATINGQUEUE00: // should go here, not to OnDisplayCommand(), see http://www.silverjuke.net/forum/topic-3197.html case IDO_RATINGQUEUE01: case IDO_RATINGQUEUE02: case IDO_RATINGQUEUE03: case IDO_RATINGQUEUE04: case IDO_RATINGQUEUE05: if( IsAllAvailable() && m_contextMenuClickedUrls.GetCount() > 0 ) { m_libraryModule->SetRating(m_contextMenuClickedUrls, targetId-IDO_RATINGQUEUE00); } break; case IDO_EXPLOREQUEUE: // should go here, not to OnDisplayCommand(), see http://www.silverjuke.net/forum/topic-3197.html if( IsAllAvailable() && m_contextMenuClickedUrls.GetCount() ) { g_tools->ExploreUrl(m_contextMenuClickedUrls[0]); } break; case IDO_SMOOTH: if( IsAllAvailable() ) { SjTools::ToggleFlag(m_skinFlags, SJ_SKIN_IMG_SMOOTH); g_tools->m_config->Write(wxT("main/skinFlags"), m_skinFlags); m_browser->RefreshAll(); } break; case IDO_SELECTALL: if( IsAllAvailable() ) { m_columnMixer.SelectAll(TRUE); m_browser->RefreshSelection(); } break; case IDO_BROWSER_RELOAD_VIEW: m_browser->RefreshAll(); UpdateDisplay(); break; case IDO_DEBUGSKIN_RELOAD: if( IsAllAvailable() ) { wxBusyCursor busy; ReloadSkin(SJ_OP_DEF_NONKIOSK, true/*reloadScripts*/); m_browser->Refresh(); m_simpleSearchInputWindow->Refresh(); } break; case IDT_UPDATE_INDEX: case IDT_DEEP_UPDATE_INDEX: if( IsAllAvailable() || m_updateIndexAfterConstruction ) { UpdateIndex(this, targetId==IDT_DEEP_UPDATE_INDEX); } break; case IDT_SETTINGS: if( IsAllAvailable() ) { OpenSettings(); // use the last page used, defaults to "memory:mymusic.lib" } break; case IDO_SETTINGS_ADDFILES: if( IsAllAvailable() ) { OpenSettings("memory:mymusic.lib", 0, 0); } break; case IDO_SETTINGS_SKINS: case IDO_SETTINGS_FONTNCOVER: if( IsAllAvailable() ) { OpenSettings("memory:viewsettings.lib", 0, targetId==IDO_SETTINGS_SKINS? 0 : 1); } break; case IDO_SETTINGS_QUEUE: case IDO_SETTINGS_AUTOVOL: if( IsAllAvailable() ) { OpenSettings("memory:playbacksettings.lib", 0, targetId==IDO_SETTINGS_QUEUE? 0 : 2); } break; case IDO_CONSOLE: SjLogGui::OpenManually(); break; case IDT_TOGGLE_KIOSK: g_kioskModule->ToggleRequest(SJ_KIOSKF_EXIT_KEY); break; case IDO_CORNERCLICK: g_kioskModule->ExitRequest(SJ_KIOSKF_EXIT_CORNER); break; case IDT_QUIT: if( QueryEndSession() ) { DoEndSession(); } break; case IDT_ALWAYS_ON_TOP: if( IsAllAvailable() ) { ShowAlwaysOnTop(!IsAlwaysOnTop()); } break; case IDT_MAIN_VOL_UP: case IDT_MAIN_VOL_DOWN: case IDT_MAIN_VOL_SLIDER: case IDT_MAIN_VOL_MUTE: case IDT_SEEK: case IDT_SEEK_BWD: case IDT_SEEK_FWD: case IDT_DISPLAY_COVER: case IDO_DISPLAY_COVER: // IDO_DISPLAY_COVER is only used for the menu item case IDO_DISPLAY_COVER_EXPLR: case IDT_DISPLAY_UP: case IDT_DISPLAY_DOWN: case IDT_DISPLAY_V_SCROLL: case IDT_PRELISTEN_VOL_UP: case IDT_PRELISTEN_VOL_DOWN: case IDT_CURR_TRACK: case IDT_NEXT_TRACK: OnSkinDisplayEvent(targetId, value, accelFlags); break; case IDT_SHUFFLE: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { ToggleShuffle(); SetDisplayMsg(_("Shuffle")+wxString(wxT(": "))+(GetShuffle()? _("On") : _("Off")), SDM_STATE_CHANGE_MS); } break; case IDT_REPEAT: if( IsOpAvailable(SJ_OP_REPEAT) ) { ToggleRepeat(); wxString msg(_("Repeat playlist")+wxString(wxT(": "))); switch(GetRepeat()) { case SJ_REPEAT_OFF: msg+=_("Off"); break; case SJ_REPEAT_SINGLE: msg+=_("Repeat one"); break; case SJ_REPEAT_ALL: msg+=_("Repeat all"); break; } SetDisplayMsg(msg, SDM_STATE_CHANGE_MS); } break; case IDT_CURR_TIME: if( value.value!=SJ_SUBITEM_TEXT/*_MOUSEUP*/ ) break; /*else fall through*/ case IDT_TOGGLE_TIME_MODE: case IDO_TOGGLE_TIME_MODE2: if( IsOpAvailable(SJ_OP_TOGGLE_TIME_MODE) ) { m_showRemainingTime = !m_showRemainingTime; UpdateDisplay(); UpdateMenuBarQueue(); } break; case IDO_DISPLAY_TOTAL_TIME: case IDO_DISPLAY_TRACKNR: case IDO_DISPLAY_ARTIST: case IDO_DISPLAY_AUTOPLAY: case IDO_DISPLAY_PREFERALBCV: if( IsAllAvailable() ) { if( targetId==IDO_DISPLAY_TOTAL_TIME ) { SjTools::ToggleFlag(m_skinFlags, SJ_SKIN_SHOW_DISPLAY_TOTAL_TIME); } if( targetId==IDO_DISPLAY_TRACKNR ) { SjTools::ToggleFlag(m_skinFlags, SJ_SKIN_SHOW_DISPLAY_TRACKNR); } if( targetId==IDO_DISPLAY_ARTIST ) { SjTools::ToggleFlag(m_skinFlags, SJ_SKIN_SHOW_DISPLAY_ARTIST); } if( targetId==IDO_DISPLAY_AUTOPLAY ) { SjTools::ToggleFlag(m_skinFlags, SJ_SKIN_SHOW_DISPLAY_AUTOPLAY); } if( targetId==IDO_DISPLAY_PREFERALBCV ) { SjTools::ToggleFlag(m_skinFlags, SJ_SKIN_PREFER_TRACK_COVER); } g_tools->m_config->Write(wxT("main/skinFlags"), m_skinFlags); UpdateDisplay(); UpdateMenuBarQueue(); } break; case IDO_SAMEZOOMINALLVIEWS: if( IsAllAvailable() ) { SjTools::ToggleFlag(g_accelModule->m_flags, SJ_ACCEL_SAME_ZOOM_IN_ALL_VIEWS); g_tools->m_config->Write(wxT("main/accelFlags"), g_accelModule->m_flags); UpdateViewMenu(); } break; case IDT_PLAY: case IDT_PAUSE: if( m_player.m_queue.GetCount()==0 && !m_player.IsPlaying() ) { OnSkinTargetEvent(IDT_ENQUEUE_LAST, value, 0); // recursive call if( !(g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE) && m_player.m_queue.GetCount() && !m_player.IsPlaying() ) { PlayOrPause();// playback not started on enqueue, start it here return; } if( !m_player.IsPlaying() ) { m_autoCtrl.DoAutoPlayIfEnabled(true /*ignoreTimeouts*/); if( !m_player.IsPlaying() ) { SetDisplayMsg(_("Select a track, then start playback."), 2000); } } return; } if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { PlayOrPause(); // this also sets m_haltedManually } break; case IDT_STOP: if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { Stop(); } break; case IDT_STOP_AFTER_THIS_TRACK: if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { StopAfterThisTrack(!StopAfterThisTrack()); SetDisplayMsg(_("Stop after this track")+wxString(wxT(": "))+(StopAfterThisTrack()? _("On") : _("Off")), SDM_STATE_CHANGE_MS); } break; case IDT_STOP_AFTER_EACH_TRACK: if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { StopAfterEachTrack(!StopAfterEachTrack()); SetDisplayMsg(_("Stop after each track")+wxString(wxT(": "))+(StopAfterEachTrack()? _("On") : _("Off")), SDM_STATE_CHANGE_MS); } break; case IDT_PLAY_NOW_ON_DBL_CLICK: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { SjTools::ToggleFlag(g_accelModule->m_flags, SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK); g_tools->m_config->Write(wxT("main/accelFlags"), g_accelModule->m_flags); SetSkinTargetValue(IDT_PLAY_NOW_ON_DBL_CLICK, (g_accelModule->m_flags&SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK)? 1 : 0); SetDisplayMsg(_("Double click play tracks at once")+wxString(wxT(": "))+((g_accelModule->m_flags&SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK)? _("On") : _("Off")), SDM_STATE_CHANGE_MS); } break; case IDO_START_PB_ON_ENQUEUE: if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { SjTools::ToggleFlag(g_accelModule->m_flags, SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE); g_tools->m_config->Write(wxT("main/accelFlags"), g_accelModule->m_flags); if( m_playbackMenu ) { m_playbackMenu->Check(IDO_START_PB_ON_ENQUEUE, (g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE)!=0); } SetDisplayMsg(_("Start playback on first enqueue")+wxString(wxT(": "))+((g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE)? _("On") : _("Off")), SDM_STATE_CHANGE_MS); } break; case IDT_TOGGLE_REMOVE_PLAYED: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { long queueFlags, boredomTrackMinutes, boredomArtistMinutes; g_mainFrame->m_player.m_queue.GetQueueFlags(queueFlags, boredomTrackMinutes, boredomArtistMinutes); SjTools::ToggleFlag(queueFlags, SJ_QUEUEF_REMOVE_PLAYED); g_mainFrame->m_player.m_queue.SetQueueFlags(queueFlags, boredomTrackMinutes, boredomArtistMinutes); SetSkinTargetValue(IDT_TOGGLE_REMOVE_PLAYED, (queueFlags&SJ_QUEUEF_REMOVE_PLAYED)? 1 : 0); SetDisplayMsg(_("Remove played tracks from queue")+wxString(wxT(": "))+((queueFlags&SJ_QUEUEF_REMOVE_PLAYED)? _("On") : _("Off")), SDM_STATE_CHANGE_MS); } break; case IDT_PREV: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { GotoPrev(); } break; case IDT_NEXT: case IDT_FADE_TO_NEXT: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { GotoNextRegardAP(targetId==IDT_FADE_TO_NEXT || accelFlags!=0); } break; case IDT_ENQUEUE_LAST: case IDT_ENQUEUE_NEXT: case IDT_ENQUEUE_NOW: { GotBrowserInputFromUser(); wxArrayString urls; m_columnMixer.GetSelectedUrls(urls); long enqueuePos = -1; if( targetId == IDT_ENQUEUE_NEXT && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { enqueuePos = -2; } if( targetId == IDT_ENQUEUE_NOW && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { enqueuePos = -3; } Enqueue(urls, enqueuePos, TRUE/*verified*/); m_libraryModule->UpdateMenuBar(); } break; case IDT_MORE_FROM_CURR_ALBUM: case IDT_MORE_FROM_CURR_ARTIST: { GotBrowserInputFromUser(); wxArrayString urls = m_libraryModule->GetMoreFrom(m_player.GetUrlOnAir(), targetId, &m_player.m_queue); if( urls.GetCount() ) { long enqueuePos = -1; // last, if queue editing is not available if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { enqueuePos = -2; // next, this is the normal usage } Enqueue(urls, enqueuePos, TRUE/*verified*/); m_libraryModule->UpdateMenuBar(); } else { wxString msg(targetId==IDT_MORE_FROM_CURR_ALBUM? _("More from current album") : _("More from current artist")); msg += wxT(": "); msg += _("No more tracks."); SetDisplayMsg(msg, 3000); } } break; case IDT_PRELISTEN: if( IsOpAvailable(SJ_OP_PRELISTEN) ) { GotBrowserInputFromUser(); wxArrayString urls; m_columnMixer.GetSelectedUrls(urls); m_player.TogglePrelisten(urls); UpdateDisplay(); m_libraryModule->UpdateMenuBar(); } break; case IDT_UNQUEUE: if( IsOpAvailable(SJ_OP_UNQUEUE) ) { wxArrayString urls; m_columnMixer.GetSelectedUrls(urls); m_player.m_queue.UnqueueByUrls(urls, &m_player); UpdateDisplay(); m_browser->RefreshSelection(); m_libraryModule->UpdateMenuBar(); } break; case IDT_UNQUEUE_ALL: if( IsOpAvailable(SJ_OP_UNQUEUE) ) { bool doClear = TRUE; if( m_player.m_queue.GetCount() > 1 ) { if( g_accelModule->YesNo(wxString::Format( // TRANSLATORS: %i will be replaced by the number of tracks wxPLURAL("Remove %i track from the queue and stop playback?", "Remove %i tracks from the queue and stop playback?", m_player.m_queue.GetCount()), (int)m_player.m_queue.GetCount()), _("Clear playlist"), this, SJ_ACCEL_ASK_ON_CLEAR_PLAYLIST) != wxYES ) { doClear = FALSE; } } if( doClear ) { m_player.m_queue.UnqueueAll(&m_player, TRUE); UpdateDisplay(); m_browser->RefreshSelection(); m_moduleSystem.BroadcastMsg(IDMODMSG_TRACK_ON_AIR_CHANGED); } } break; case IDT_SAVE_PLAYLIST: if( m_player.m_queue.GetCount() && IsAllAvailable() ) { m_player.m_queue.SaveAsDlg(this); } break; case IDT_APPEND_FILES: // before 1.23beta1, we checked for appending whether the playlist is empty and did nothing in this case -- I think this is not useful esp. when using a shortcut case IDT_OPEN_FILES: if( IsAllAvailable() && g_openFilesModule ) { g_openFilesModule->OpenDialog(targetId==IDT_APPEND_FILES); } break; case IDO_ABOUT_OPEN_WWW: if( IsAllAvailable() ) { g_tools->ExploreHomepage(SJ_HOMEPAGE_INDEX); } break; case IDO_ABOUT: g_helpModule->OpenTopic(this, SJ_HELP_TOPIC_ABOUT); break; case IDO_ONLINE_HELP: if( IsAllAvailable() ) { #if defined(PKGDOCDIR) g_tools->ExploreUrl(wxT(PKGDOCDIR)); #elif defined(__WXMAC__) g_tools->ExploreUrl(SjTools::GetGlobalAppDataDir()+"docs"); #else g_tools->ExploreUrl(g_tools->GetSilverjukeProgramDir()+wxString(wxT("docs/"))); #endif } break; case IDT_GOTO_CURR: case IDO_GOTO_CURR_MARK: m_autoCtrl.m_stateGotoCurrClickedTimestamp = SjTools::GetMsTicks(); GotDisplayInputFromUser(); // fall through case IDO_GOTOCURRAUTO: { wxString url; if( targetId == IDO_GOTO_CURR_MARK && m_contextMenuClickedUrls.GetCount()==1 ) { url = m_contextMenuClickedUrls[0]; } else { url = m_player.m_queue.GetUrlByPos(-1); } if( !url.IsEmpty() ) { if( targetId!=IDO_GOTOCURRAUTO ) { g_visModule->StopVisIfOverWorkspace(); } if( !m_browser->GotoUrl(url) ) { EndSimpleSearch(); m_browser->GotoUrl(url); } } } break; case IDT_ADV_SEARCH: if( g_advSearchModule && IsAllAvailable() ) { g_advSearchModule->OpenDialog(); } break; case IDMODMSG_WINDOW_SIZED_MOVED: m_moduleSystem.BroadcastMsg((int)targetId); break; } } #ifdef SJHOOK_ON_MAIN_EVENT SJHOOK_ON_MAIN_EVENT #endif } void SjMainFrame::OnPaste(wxCommandEvent& event) { if( IsAllAvailable() ) { if( wxTheClipboard->Open() ) { SjDataObject data(wxDragCopy); { wxBusyCursor busy; if( wxTheClipboard->IsSupported(wxDF_FILENAME) ) { data.AddFileData(); wxTheClipboard->GetData(*(data.m_fileData)); } else if( wxTheClipboard->IsSupported(wxDF_BITMAP) ) { data.AddBitmapData(); wxTheClipboard->GetData(*(data.m_bitmapData)); } else if( wxTheClipboard->IsSupported(wxDF_TEXT) ) { wxTextDataObject text; wxTheClipboard->GetData(text); if( ::wxFileExists(text.GetText()) ) { data.AddFileData(); data.m_fileData->AddFile(text.GetText()); } } } // use the data _before_ closing the clipboard (may get lost otherwise) wxPoint pt; if( event.GetId() == IDO_PASTE_USING_COORD ) { pt = m_pasteCoord; } else { pt = ScreenToClient(::wxGetMousePosition()); } OpenData(&data, SJ_OPENFILES_ENQUEUE, pt.x, pt.y); wxTheClipboard->Close(); } } } void SjMainFrame::OnFwdToSkin(wxCommandEvent& event) { SjSkinValue dummy; OnSkinTargetEvent(event.GetId(), dummy, 0); } void SjMainFrame::OnFwdToModules(wxCommandEvent& event) { if( m_mainApp->IsInShutdown() ) { return; // cancel pending events } int modMsg = (int)event.GetId(); SjPlayer* testPlayer = (SjPlayer*)event.GetClientData(); if( testPlayer != &m_player && testPlayer != NULL ) { return; // this message comes eg. from another player } if( modMsg == IDMODMSG_TRACK_ON_AIR_CHANGED ) { // new track or a manual stop/pause long queuef = m_player.m_queue.GetQueueFlags(); if( queuef&SJ_QUEUEF_REMOVE_PLAYED ) { m_player.m_queue.UnqueuePlayed(); } UpdateDisplay(); } else if( modMsg == IDMODMSG_PLAYER_STOPPED_BY_EOQ ) { // this message is ONLY send if the player is stopped // as the end of the queue is reached (eg. if repeat is on, this is never send) // when we receive this message, we've received IDMODMSG_TRACK_ON_AIR_CHANGED before. if( m_player.IsStopped() && m_player.m_queue.MoveToTopOnEoq() ) { m_player.GotoAbsPos(0); UpdateDisplay(); } } else if( modMsg == IDMODMSG_VIS_STATE_CHANGED ) { // vis. state changed SetSkinTargetValue(IDT_VIS_TOGGLE, g_visModule->IsVisStarted()? 1 : 0); if( !g_visModule->IsVisStarted() ) { m_autoCtrl.m_stateStopVisTimestamp = SjTools::GetMsTicks(); } } m_moduleSystem.BroadcastMsg(modMsg); } void SjMainFrame::OnFwdToPlayer(wxCommandEvent& event) { /* This function just forward command events between IDPLAYER_FIRST and IDPLAYER_LAST * to the player given in the client data. This forwarding is needed to trigger * the player's main thread from the decoding thread. The meaning of the IDs is private * to SjPlayer and not of any interest here. * * Using m_player is safe as we may have several players for several windows but only one player per window. */ wxASSERT( wxThread::IsMain() ); if( SjBusyInfo::InYield() ) { // we cannot process this event now as we're called from within wxYield() // and forwarding the event may result in opening a new http stream which // may also require wxYield(). So delay the event until the BusyInfo is gone. m_autoCtrl.m_pendingEvents.Add(event.Clone()); } else { m_player.ReceiveSignal(event.GetId(), (uintptr_t)event.GetClientData()); } } void SjMainFrame::OnCloseWindow(wxCloseEvent& event) { if( m_player.m_queue.GetQueueFlags()&SJ_QUEUEF_RESUME ) { m_player.SaveToResumeFile(); // this should be done _very_ first, the OS may kill us at any time and it is a good idea to have the resume file ready then. } if( !event.CanVeto() || QueryEndSession() ) { DoEndSession(); } else { event.Veto(); } } void SjMainFrame::OnIconizeWindow(wxIconizeEvent& event) { /* Some words about iconizing the window: If we would iconize manually (we've done this in former times frnom the skin) we just call Iconize(!IsIconized()) from OnSkinTargetEvent/IDT_MINIMIZE which will result in a wxEVT_ICONIZE catched by OnIconizeWindow(). The same event is also emmited by iconizing due the system, so we're here in OnIconizeWindow() whenever the iconize state changes. In this function we're posting ourself a IDMODMSG_* message that will be forwarded to all modules (esp. the System Tray). We do not send this message directly to make sure the window is really iconized when the IDMODMSG_* is send. */ if( event.IsIconized() ) { if( g_visModule ) { g_visModule->StopVis(); } } QueueEvent(new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, event.IsIconized()? IDMODMSG_WINDOW_ICONIZED : IDMODMSG_WINDOW_UNICONIZED)); event.Skip(); } void SjMainFrame::OnEsc(wxCommandEvent& event) { if( g_visModule->IsVisStarted() && g_visModule->IsOverWorkspace() ) { g_visModule->StopVis(); } else if( HasAnySearch() ) { bool focusInSearchWindow = (wxWindow::FindFocus()==m_simpleSearchInputWindow)? TRUE : FALSE; EndOneSearch(); if( focusInSearchWindow ) { m_simpleSearchInputWindow->SetFocus(); } else { m_browser->SetFocus(); } } else if( m_columnMixer.IsAnythingSelected() ) { m_columnMixer.SelectAll(FALSE); m_browser->RefreshSelection(); } } void SjMainFrame::OnTab(wxCommandEvent& event) { if( wxWindow::FindFocus() == m_simpleSearchInputWindow ) { m_browser->SetFocus(); } else { m_simpleSearchInputWindow->SetFocus(); } } void SjMainFrame::OnMouseWheel(wxMouseEvent& e) { // just forward the mouse wheel event to the browser window where it is used. // (needed for Linux/Mac; on Windows mouse wheel events seems to go to the focused window) m_browser->OnMouseWheel(e); } /******************************************************************************* * Handling Tool Tips ******************************************************************************/ #if SJ_USE_TOOLTIPS wxString SjMainFrameToolTipProvider::GetText(long& flags) { wxString hint; wxString info; if( m_targetId >= IDT_DISPLAY_LINE_FIRST && m_targetId <= IDT_DISPLAY_LINE_LAST ) { long displayLine = (m_targetId-IDT_DISPLAY_LINE_FIRST); long queuePos = g_mainFrame->m_display.m_firstLineQueuePos + displayLine; long queuePlayingPos = g_mainFrame->m_player.m_queue.GetCurrPos(); if( queuePos >= 0 && queuePos < g_mainFrame->m_player.m_queue.GetCount() ) { if( m_subitem == SJ_SUBITEM_ICONLEFT && queuePos != queuePlayingPos ) { long entryFlags = g_mainFrame->m_player.m_queue.GetFlags(queuePos); long entryPlayCount = g_mainFrame->m_player.m_queue.GetPlayCount(queuePos); if( g_mainFrame->m_player.m_queue.WasPlayed(queuePos) ) { hint = _("Track played, click to reset"); } else if( entryFlags & SJ_PLAYLISTENTRY_MOVED_DOWN ) { hint = _("Boredom avoided: Track moved down"); } } else if( m_subitem == SJ_SUBITEM_ICONRIGHT ) { hint = _("Remove this track"); } else if( m_subitem == SJ_SUBITEM_TIME ) { hint = _("Toggle time mode"); } } } else if( m_targetId >= IDT_WORKSPACE_GOTO_A && m_targetId <= IDT_WORKSPACE_GOTO_0_9 ) { hint.Printf(_("Go to \"%s\""), SjColumnMixer::GetAzDescr(m_targetId).c_str()); } else if( m_targetId >= IDT_NUMPAD_FIRST && m_targetId <= IDT_NUMPAD_LAST ) { ; /*no tooltip*/ } else switch( m_targetId ) { case IDT_CURR_TIME: hint = _("Toggle time mode"); break; case IDT_SEARCH_BUTTON: case IDT_SEARCH_INFO: hint = g_mainFrame->HasAnySearch()? _("End search") : _("Search"); hint += wxT(" - "); hint += _("click right for options"); break; case IDT_MAIN_VOL_SLIDER: hint = _("Volume"); hint += wxString::Format(wxT(" (%i%%)"), (int)( (g_mainFrame->m_player.GetMainVol()*100)/255 )); break; case IDT_DISPLAY_COVER: if( g_mainFrame->m_player.m_queue.GetCount() ) { hint = _("Double-click to enlarge the cover"); } break; case IDT_WORKSPACE_H_SCROLL: case IDT_WORKSPACE_LINE_LEFT: case IDT_WORKSPACE_LINE_RIGHT: case IDT_WORKSPACE_LINE_UP: case IDT_WORKSPACE_LINE_DOWN: case IDT_WORKSPACE_PAGE_LEFT: case IDT_WORKSPACE_PAGE_RIGHT: case IDT_WORKSPACE_PAGE_UP: case IDT_WORKSPACE_PAGE_DOWN: /*no tooltip, no fall-through as before 1.11...*/ break; case IDT_NEXT: hint = g_mainFrame->GetNextMenuTitle(); break; case IDT_QUIT: hint = wxString::Format(_("Close this window and exit %s"), SJ_PROGRAM_NAME); break; case IDT_MAINMENU: hint = _("Open main menu"); break; case IDT_SHUFFLE: hint = _("Toggle shuffle mode"); break; case IDT_REPEAT: hint = _("Repeat all/repeat current"); break; default: hint = g_accelModule->GetCmdNameById(m_targetId, true/*short name*/); break; } return hint; } #endif /******************************************************************************* * Handling Zoom and Font ******************************************************************************/ long SjMainFrame::CorrectColumnWidth(long columnWidth) { if( columnWidth < SJ_MIN_COLUMN_WIDTH ) return SJ_MIN_COLUMN_WIDTH; if( columnWidth > SJ_MAX_COLUMN_WIDTH ) return SJ_MAX_COLUMN_WIDTH; return columnWidth; } long SjMainFrame::CorrectCoverHeight(long coverHeight) { if( coverHeight < 10 ) return 10; if( coverHeight > 100 ) return 100; return coverHeight; } long SjMainFrame::CorrectFontSize(long fontsize) { if( fontsize < SJ_MIN_FONT_SIZE ) return SJ_MIN_FONT_SIZE; if( fontsize > SJ_MAX_FONT_SIZE ) return SJ_MAX_FONT_SIZE; return fontsize; } void SjMainFrame::CalcCurrFontSizesFromZoom() { // get permille zoom value static const long zoom2permille[1+7] = { 556, 667, 778, 889, 1000, 1111, 1222, 1333 }; long permille; wxASSERT( m_currZoom >= 0 && m_currZoom <= 6 ); permille = zoom2permille[m_currZoom+1]; // calculate normal font size from permille and base font size m_currFontSize = CorrectFontSize((m_baseFontSize*permille) / 1000); // calculate small font size from permille and base font size m_currFontSizeSmall = CorrectFontSize((m_baseFontSize*zoom2permille[m_currZoom]) / 1000); if( m_currFontSizeSmall == m_currFontSize ) { m_currFontSizeSmall = CorrectFontSize(m_currFontSize - 1); } // calculate column width from permille and base column width m_currColumnWidth = CorrectColumnWidth((m_baseColumnWidth*permille) / 1000); // calculate spaces from column width m_currColumnXSpace = m_currColumnWidth / 8; m_currColumnYSpace = m_currColumnWidth / 14; // calculate cover height (=width) from column width and percentage if( m_baseCoverHeight < 99 ) { m_currCoverHeight = (m_currColumnWidth*m_baseCoverHeight) / 100; m_currCoverHeight = (m_currCoverHeight/5) * 5; if( m_currCoverHeight < 32 ) { m_currCoverHeight = 32; } if( m_currCoverHeight > m_currColumnWidth ) { m_currCoverHeight = m_currColumnWidth; } } else { m_currCoverHeight = m_currColumnWidth; } m_currCoverWidth = m_currCoverHeight; } void SjMainFrame::CreateFontObjects() { m_baseStdFont = wxFont(m_baseFontSize, wxSWISS, wxNORMAL, wxNORMAL, FALSE, m_baseFontFace); m_currStdFont = wxFont(m_currFontSize, wxSWISS, wxNORMAL, wxNORMAL, FALSE, m_baseFontFace); m_currSmallFont = wxFont(m_currFontSizeSmall, wxSWISS, wxNORMAL, wxNORMAL, FALSE, m_baseFontFace); m_currSmallBoldFont = wxFont(m_currFontSizeSmall, wxSWISS, wxNORMAL, wxBOLD, FALSE, m_baseFontFace); m_currBoldFont = wxFont(m_currFontSize, wxSWISS, wxNORMAL, wxBOLD, FALSE, m_baseFontFace); m_currBoldItalicFont= wxFont(m_currFontSize, wxSWISS, wxITALIC, wxBOLD, FALSE, m_baseFontFace); } long SjMainFrame::CorrectZoom(long zoom) { if( zoom < SJ_ZOOM_MIN ) return SJ_ZOOM_MIN; if( zoom > SJ_ZOOM_MAX ) return SJ_ZOOM_MAX; return zoom; } void SjMainFrame::SetZoom__(long newZoom, bool redraw) { newZoom = CorrectZoom(newZoom); if( newZoom != m_currZoom ) { g_visModule->StopVisIfOverWorkspace(); m_currZoom = newZoom; CalcCurrFontSizesFromZoom(); CreateFontObjects(); if( redraw ) { m_browser->RefreshAll(); } } } void SjMainFrame::SetFontNCoverBase(const wxString& fontFace, long fontSize, long columnWidth, long coverHeight) { fontSize= CorrectFontSize(fontSize); columnWidth = CorrectColumnWidth(columnWidth); coverHeight = CorrectCoverHeight(coverHeight); m_currZoom = CorrectZoom(m_currZoom); // just for safety, normally the zoom should be fine if( m_baseFontFace != fontFace || m_baseFontSize != fontSize || m_baseColumnWidth != columnWidth || m_baseCoverHeight != coverHeight ) { m_baseFontFace = fontFace; m_baseFontSize = fontSize; m_baseColumnWidth = columnWidth; m_baseCoverHeight = coverHeight; g_tools->m_config->Write(wxT("main/fontFace"), m_baseFontFace); g_tools->m_config->Write(wxT("main/fontSize"), m_baseFontSize); g_tools->m_config->Write(wxT("main/fontCoverSize")/*historical*/, m_baseColumnWidth); g_tools->m_config->Write(wxT("main/fontCoverHeight"), m_baseCoverHeight); g_tools->m_config->Flush(); CalcCurrFontSizesFromZoom(); CreateFontObjects(); m_browser->RefreshAll(); } } void SjMainFrame::SetDefaultWindowSize() { // set wanted window size wxRect displRect = SjDialog::GetDisplayWorkspaceRect(NULL); wxRect wantedRect; wantedRect = wxRect(displRect.x + displRect.width/20, displRect.y + displRect.height/20, displRect.width - displRect.width/10, displRect.height - displRect.height/4); // just set the default size; the size may be corrected // when a skin gets loaded SetSize(wantedRect); } /******************************************************************************* * Misc. ******************************************************************************/ bool SjMainFrame::IsAnyDialogOpened() { if( SjSettingsModule::IsDialogOpen() || (g_openFilesModule && g_openFilesModule->IsDialogOpened() ) || (g_helpModule && g_helpModule->IsHelpOpen() ) || (g_tagEditorModule && g_tagEditorModule->IsTagEditorOpened()) || (g_advSearchModule && g_advSearchModule->IsDialogOpen()) || (g_virtKeybd && g_virtKeybd->IsKeybdOpened()) || (g_kioskModule && g_kioskModule->IsPasswordDlgOpened()) ) { return TRUE; } else { return FALSE; } } /******************************************************************************* * Handling the search input field ******************************************************************************/ void SjMainFrame::SetSkinAzValues(int az) { // this selects/deselects the goto a-z buttons in the skin. // // if the target does not exist in the skin, the button left of the // letter is selected. wxASSERT(az==0 || (az>='a' && az<=('z'+1))); int testId, idToMark = IDT_WORKSPACE_GOTO_A; { int sollId = IDT_WORKSPACE_GOTO_A + (az - 'a'); bool markNext = false; bool hasAnyTarget = false; for( testId = IDT_WORKSPACE_GOTO_0_9; testId >= IDT_WORKSPACE_GOTO_A; testId-- ) { bool hasThisTarget = HasSkinTarget(testId); if( hasThisTarget ) { hasAnyTarget = true; } if( testId == sollId || markNext ) { if( testId == IDT_WORKSPACE_GOTO_A || hasThisTarget ) { idToMark = hasAnyTarget? testId : sollId; break; } else { markNext = true; } } } } SjSkinValue value; for( testId = IDT_WORKSPACE_GOTO_0_9; testId >= IDT_WORKSPACE_GOTO_A; testId-- ) { value.value = testId==idToMark? 1 : 0; SetSkinTargetValue(testId, value); } } wxString SjMainFrame::NormalizeSearchText(const wxString& text__) { wxString text(text__); text.Trim(TRUE); text.Trim(FALSE); while( text.Find(wxT(" ")) != -1 ) { text.Replace(wxT(" "), wxT(" ")); } return text; } void SjMainFrame::OnSimpleSearchInput(wxCommandEvent& event) { if( !g_advSearchModule || !m_simpleSearchInputFromUser ) return; wxString text = NormalizeSearchText(m_simpleSearchInputWindow->GetValue()); GotInputFromUser(); // This is a real hack - under MSW the curor disappears on // text input (it reappaers on mouse move, and it does not disappear // when typing controls as backspace... i don't know, however, // using WarpPointer() makes it appearing again :-| #ifdef __WXMSW__ wxPoint mousePos = ScreenToClient(::wxGetMousePosition()); WarpPointer(mousePos.x, mousePos.y); #endif // set skin value if "search while typing" is disabled // (a click on the magnifier will start the search) if( !(g_advSearchModule->m_flags&SJ_SEARCHFLAG_SEARCHWHILETYPING) ) { SetSkinTargetValue(IDT_SEARCH_BUTTON, (!text.IsEmpty() && text==m_search.m_simple.GetWords())? 1 : 0); } // prepare performung the search WXTYPE eventType = event.GetEventType(); if( (eventType == wxEVT_COMMAND_TEXT_UPDATED && (g_advSearchModule->m_flags&SJ_SEARCHFLAG_SEARCHWHILETYPING)) || eventType == wxEVT_COMMAND_TEXT_ENTER ) { // avoid recursion and disable further calls of this functions static bool inSearchInput = FALSE; if( !inSearchInput ) { inSearchInput = TRUE; m_simpleSearchInputTimer.Stop(); if( !text.IsEmpty() && (eventType==wxEVT_COMMAND_TEXT_UPDATED || m_inPerformingSearch) ) { // delayed search by timer: use the average search time plus 10% as delay long delay = (m_allSearchMs / m_allSearchCount); delay += delay/10; if( delay < 70) { delay = 70; } // few persons type faster if( delay > 1600) { delay = 1600; } // few persons wait longer // start the timer m_simpleSearchDelayedText = text; m_simpleSearchInputTimer.Start(delay, TRUE /*one shot*/); } else { // undelayed search SetSearch(SJ_SETSEARCH_SETSIMPLE| SJ_SETSEARCH_NOTEXTCTRLUPDATE, text); } inSearchInput = FALSE; } } } void SjMainFrame::OnSimpleSearchInputTimer(wxTimerEvent& event) { SetSearch(SJ_SETSEARCH_SETSIMPLE| SJ_SETSEARCH_NOTEXTCTRLUPDATE|SJ_SETSEARCH_NOAUTOHISTORYADD, m_simpleSearchDelayedText); } void SjMainFrame::UpdateSearchInfo(long numTracksRemoved) { if( numTracksRemoved ) { m_searchStat.m_advResultCount -= numTracksRemoved; m_searchStat.m_totalResultCount -= numTracksRemoved; m_searchStat.m_mbytes = 0; m_searchStat.m_seconds = 0; // m_moduleSystem.BroadcastMsg(IDMODMSG_SEARCH_CHANGED); -- not needed } SjSkinValue v; v.value = SJ_VFLAG_CENTER; if( !m_search.m_simple.IsSet() && (!m_search.m_adv.IsSet() || m_searchStat.m_totalResultCount>0 || m_libraryModule->GetUnmaskedTrackCount()==0) ) { if( m_search.m_adv.IsSet() && (IsOpAvailable(SJ_OP_MUSIC_SEL) || IsOpAvailable(SJ_OP_MUSIC_SEL_GENRE)) ) { v.string = wxString::Format(_("Search in \"%s\""), m_search.m_adv.GetName().c_str()); } else { v.string = _("Search"); } } else { v.string = SjAdvSearchModule::FormatResultString( m_searchStat.m_totalResultCount, m_search.m_adv.IsSet()? m_search.m_adv.GetName() : wxString()); } SetSkinTargetValue(IDT_SEARCH_INFO, v); } void SjMainFrame::SetSearch(long flags, const wxString& newSimpleSearch, const SjAdvSearch* newAdvSearch) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); // avoid recursion, this flag is also checked by OnSimpleSearchInput() if( !m_inPerformingSearch ) { m_inPerformingSearch = TRUE; static unsigned long lastSearchTime = 0; unsigned long thisSearchTime = SjTools::GetMsTicks(); bool searchModified = FALSE; bool useHourglass = FALSE; bool deepSearch = FALSE; bool gatherStatistics = FALSE; // save pending stuff m_libraryModule->SavePendingData(); // add previous search to the history if SJ_HISTORY_DELAY_MS have expired if( thisSearchTime > lastSearchTime+SJ_HISTORY_DELAY_MS || !(flags&SJ_SETSEARCH_NOAUTOHISTORYADD) ) { if( m_search.IsSet() && m_searchStat.m_totalResultCount > 0 ) { g_advSearchModule->AddToHistory(m_search); } } lastSearchTime = thisSearchTime; // modify the search object - first we modify the adv. search as // the simple search may check this. if( (flags&SJ_SETSEARCH_CLEARADV) && (IsOpAvailable(SJ_OP_MUSIC_SEL) || IsOpAvailable(SJ_OP_MUSIC_SEL_GENRE)) ) { bool doClear = TRUE; if( IsKioskStarted() ) { // reset to the default music selection long limitToId = g_kioskModule->GetLimitToId(); if( limitToId ) { m_search.m_adv = g_advSearchModule->GetSearchById(limitToId); searchModified = TRUE; useHourglass = TRUE; deepSearch = TRUE; doClear = FALSE; } } if( doClear && m_search.m_adv.IsSet() ) { m_search.m_adv.Clear(); searchModified = TRUE; } } else if( (flags&SJ_SETSEARCH_SETADV) && (IsOpAvailable(SJ_OP_MUSIC_SEL) || IsOpAvailable(SJ_OP_MUSIC_SEL_GENRE)) ) { wxASSERT( newAdvSearch ); /*if( m_search.m_adv != *newAdvSearch ) {*/ // always set a new advanced search to allow the user // eg. to reflect his changes in the database // by hitting the search button again. // this has no really bad performance impact as an // advanced search is done rather seldomly (compared with // the simple search which is normally not cached) m_search.m_adv = *newAdvSearch; searchModified = TRUE; useHourglass = TRUE; deepSearch = TRUE; /*}*/ } if( flags&SJ_SETSEARCH_CLEARSIMPLE ) { if( m_search.m_simple.IsSet() ) { m_search.m_simple.Clear(); searchModified = TRUE; } } else if( flags&SJ_SETSEARCH_SETSIMPLE ) { if( m_search.m_simple.GetWords() != newSimpleSearch ) { m_search.m_simple = newSimpleSearch; searchModified = TRUE; gatherStatistics = TRUE; if( (m_allSearchMs / m_allSearchCount) > 500 || m_allSearchCount < 3 ) { useHourglass = TRUE; } } } if( searchModified ) { // show hourglass if previous searches take a long time or // if this is one of the first two searches (which will take // longer; btw m_allSearchCount starts with 1) if( useHourglass ) { ::wxBeginBusyCursor(); useHourglass = TRUE; } // update the search input window, if needed if( !(flags&SJ_SETSEARCH_NOTEXTCTRLUPDATE) ) { m_simpleSearchInputFromUser = FALSE; m_simpleSearchInputWindow->SetValue(m_search.m_simple.GetWords()); m_simpleSearchInputWindow->SetInsertionPointEnd(); m_simpleSearchInputFromUser = TRUE; } // stop the vis. if it is running if( g_visModule->IsOverWorkspace() ) { g_visModule->StopVis(); m_simpleSearchInputWindow->SetFocus(); } // prepare updating the browser after the search wxString columnGuid; long columnGuidViewOffset = 0; if( !m_search.m_simple.IsSet() ) { columnGuid = m_browser->GetFirstSelectedOrVisiblePos(columnGuidViewOffset); } // do the search { SjSearchStat stat = m_columnMixer.SetSearch(m_search, deepSearch); m_searchStat.m_totalResultCount = stat.m_totalResultCount; if( flags&(SJ_SETSEARCH_SETADV|SJ_SETSEARCH_CLEARADV) ) { m_searchStat.m_advResultCount = stat.m_advResultCount; m_searchStat.m_mbytes = stat.m_mbytes; m_searchStat.m_seconds = stat.m_seconds; } } // set skin values (should be done before updating the browser // as the browser uses the text from the search information) SjSkinValue v; v.value = m_search.IsSet()? 1 : 0; SetSkinTargetValue(IDT_SEARCH_BUTTON, v); UpdateSearchInfo(0); // update the browser m_browser->ReloadColumnMixer(false); if( !m_search.m_simple.IsSet() && (!columnGuid.IsEmpty() || !m_searchLastColumnGuid.IsEmpty()) ) { if( !columnGuid.IsEmpty() ) { m_browser->GotoPos(columnGuid, columnGuidViewOffset); } else { m_browser->GotoPos(m_searchLastColumnGuid, m_searchLastColumnGuidViewOffset); } } GotDisplayInputFromUser(); // remember the row to use after an unsuccessful search or after ending the search if( !m_search.IsSet() || m_searchStat.m_totalResultCount ) { m_searchLastColumnGuidViewOffset = 0; m_searchLastColumnGuid = m_browser->GetFirstSelectedOrVisiblePos(m_searchLastColumnGuidViewOffset); } // gather statistics for finding out the search delay thisSearchTime = SjTools::GetMsTicks() - thisSearchTime; wxLogDebug(wxT("%i ms needed for the query"), (int)thisSearchTime); if( gatherStatistics ) { m_allSearchCount++; m_allSearchMs += m_allSearchCount>3? thisSearchTime : SJ_SEARCH_DELAY_MS; // use default values for the first two // searches as the real times are not // representive as nothing is cached yet // (m_allSearchCount starts with "1") } // inform all modules about the new search m_moduleSystem.BroadcastMsg(IDMODMSG_SEARCH_CHANGED); // clear hourglass if set before if( useHourglass ) { ::wxEndBusyCursor(); } } m_inPerformingSearch = FALSE; } } void SjMainFrame::OnSearchHistory(wxCommandEvent& event) { int index = event.GetId() - IDO_SEARCHHISTORY00; int count = g_advSearchModule->GetHistoryCount(); if( index >= 0 && index < count ) { GotInputFromUser(); const SjSearchHistory* historyItem = g_advSearchModule->GetHistory(index); SjSearch newSearch = historyItem->GetSearch(); SetSearch( (newSearch.m_simple.IsSet()? SJ_SETSEARCH_SETSIMPLE : SJ_SETSEARCH_CLEARSIMPLE) | (newSearch.m_adv.IsSet()? SJ_SETSEARCH_SETADV : SJ_SETSEARCH_CLEARADV), newSearch.m_simple.GetWords(), &newSearch.m_adv ); } } void SjMainFrame::OnSearchGenre(wxCommandEvent& event) { wxArrayString data = m_libraryModule->GetUniqueValues(SJ_TI_GENRENAME); int index = event.GetId() - IDO_SEARCHGENRE000; if( index >= 0 && index < (int)data.GetCount() && IsOpAvailable(SJ_OP_MUSIC_SEL_GENRE) ) { GotInputFromUser(); m_tempSearch.Init(data[index], SJ_SELECTSCOPE_TRACKS, SJ_SELECTOP_ALL); m_tempSearch.AddRule(SJ_FIELD_GENRENAME, SJ_FIELDOP_IS_EQUAL_TO, data[index]); SetSearch( SJ_SETSEARCH_CLEARSIMPLE | SJ_SETSEARCH_SETADV, wxT(""), &m_tempSearch ); } } void SjMainFrame::OnSearchMusicSel(wxCommandEvent& event) { int iCount = g_advSearchModule->GetSearchCount(); int index = event.GetId() - IDO_SEARCHMUSICSEL000; if( index >= 0 && index < iCount && IsOpAvailable(SJ_OP_MUSIC_SEL) ) { GotInputFromUser(); SjAdvSearch advSearch = g_advSearchModule->GetSearchByIndex(index); SetSearch( SJ_SETSEARCH_CLEARSIMPLE | SJ_SETSEARCH_SETADV, wxT(""), &advSearch ); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/mainframe.h������������������������������������������������������������0000664�0000000�0000000�00000044037�12660066715�0020155�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: mainframe.h * Authors: Björn Petersen * Purpose: Silverjuke main frame * ******************************************************************************/ #ifndef __SJ_MAINFRAME_H__ #define __SJ_MAINFRAME_H__ class SjColumnMixer; class SjBrowserWindow; class SjMainApp; class SjLibraryModule; class SjMainFrame; class SjSee; extern SjMainFrame* g_mainFrame; #if SJ_USE_TOOLTIPS class SjMainFrameToolTipProvider : public SjToolTipProvider { public: wxString GetText (long& flags); wxWindow* GetWindow () { return (wxWindow*)g_mainFrame; } wxRect GetLocalRect () { return m_rect; } private: long m_targetId; long m_subitem; wxRect m_rect; friend class SjMainFrame; }; #endif class SjMainFrame : public SjSkinWindow { public: // Constructor and Destructor SjMainFrame (SjMainApp*, int id, long skinFlags, const wxPoint& pos, const wxSize& size); ~SjMainFrame (void); bool InConstruction () { return m_inConstruction; } long GetUptimeSeconds (); // Public pointers and objects SjModuleSystem m_moduleSystem; SjLibraryModule* m_libraryModule; SjColumnMixer m_columnMixer; SjBrowserWindow* m_browser; wxIconBundle m_iconBundle; wxLocale m_locale; // Public Player Functions void Play (long ms=0) { m_player.Play(ms); m_haltedManually=FALSE; UpdateDisplay(); } void Pause () { m_player.Pause(); m_haltedManually=TRUE; UpdateDisplay(); } void Stop () { m_player.Stop(); m_haltedManually=TRUE; UpdateDisplay(); } void PlayOrPause () { m_player.PlayOrPause(); m_haltedManually=m_player.IsPaused(); UpdateDisplay(); } void ReplayIfPlaying (); void SeekAbs (long m) { m_player.SeekAbs(m); UpdateDisplay(); } void SeekRel (long m) { m_player.SeekRel(m); UpdateDisplay(); } void Enqueue (const wxString& url, long pos, bool verified, bool autoPlay=false, bool uiChecks=true) { wxArrayString a; a.Add(url); Enqueue(a, pos, verified, autoPlay, uiChecks); } /* pos=-1: enqueue last, pos=-2: play next, pos=-3: play now */ void Enqueue (const wxArrayString&, long pos, bool verified, bool autoPlay=false, bool uiChecks=true); void UnqueueAll () { m_player.m_queue.UnqueueAll(&m_player, TRUE); m_display.m_scrollPos=-1; UpdateDisplay(); /*the caller should update the browser as he may enqueue new tracks just after the unqueue!*/ } void UnqueueByPos (long p); void UpdateEnqueuedUrl (const wxString& url, bool urlVerified, long playtimeMs) { m_player.m_queue.UpdateUrl(url, urlVerified, playtimeMs); } void GotoAbsPos (long p) { m_player.GotoAbsPos(p); m_display.m_scrollPos=-1; } void GotoUrl (const wxString& url) { m_player.GotoUrl(url); m_display.m_scrollPos=-1; if(!IsPlaying()) {UpdateDisplay();} } void GotoPrev () { m_player.GotoPrev(); m_display.m_scrollPos=-1; if(!IsPlaying()) {UpdateDisplay();} } bool GotoNextRegardAP (bool fadeToNext, bool ignoreTimeouts=true); void SetAbsMainVol (long v); void SetRelMainVol (long v) { SetAbsMainVol(m_player.GetMainVol()+v); } long GetMainVol () const { return m_player.GetMainVol(); } void SetShuffle (bool v) { m_player.m_queue.SetShuffle(v); UpdateDisplay(); } void ToggleShuffle () { m_player.m_queue.ToggleShuffle(); UpdateDisplay(); } void SetRepeat (SjRepeat r) { m_player.m_queue.SetRepeat(r); UpdateDisplay(); } void ToggleRepeat () { m_player.m_queue.ToggleRepeat(); UpdateDisplay(); } void StopAfterThisTrack (bool s) { m_player.StopAfterThisTrack(s); UpdateDisplay(); } void StopAfterEachTrack (bool s) { m_player.StopAfterEachTrack(s); UpdateDisplay(); } void ShowRemainingTime (bool s) { m_showRemainingTime=s; UpdateDisplay(); } bool IsStopped () { return m_player.IsStopped(); } bool IsPlaying () { return m_player.IsPlaying(); } bool IsPaused () { return m_player.IsPaused(); } bool IsEnqueued (const wxString& url) const { return m_player.m_queue.IsEnqueued(url); } bool IsAnyDialogOpened (); bool HasPrev () { return m_player.HasPrev(); } bool HasNextIgnoreAP () { return m_player.HasNextIgnoreAP(); } bool HasNextRegardAP () { return ( HasNextIgnoreAP() || (IsPlaying() && (m_autoCtrl.m_flags&SJ_AUTOCTRL_AUTOPLAY_ENABLED)) ); } wxString GetNextMenuTitle (); long GetQueuePos () const { return m_player.m_queue.GetCurrPos(); } long GetClosestQueuePosByUrl (const wxString& url) const { return m_player.m_queue.GetClosestPosByUrl(url); } // wxNOT_FOUND for "not in queue" long GetAllQueuePosByUrl(const wxString& url, wxArrayLong& ret, bool unplayedOnly=false) const{ return m_player.m_queue.GetAllPosByUrl(url, ret, unplayedOnly); } // returns the count, 0 for "not in queue" long GetQueueCount () const { return m_player.m_queue.GetCount(); } wxString GetQueueUrl (long p) const { return m_player.m_queue.GetUrlByPos(p); } SjPlaylistEntry& GetQueueInfo (long p) { return m_player.m_queue.GetInfo(p); } long GetElapsedTime () { return m_player.GetElapsedTime(); } long GetRemainingTime () { return m_player.GetRemainingTime(); } long GetTotalTime () { return m_player.GetTotalTime(); } bool GetShuffle () const { return m_player.m_queue.GetShuffle(); } SjRepeat GetRepeat () const { return m_player.m_queue.GetRepeat(); } bool StopAfterThisTrack () const { return m_player.StopAfterThisTrack(); } bool StopAfterEachTrack () const { return m_player.StopAfterEachTrack(); } bool ShowRemainingTime () const { return m_showRemainingTime; } void OnUrlChanged (const wxString& n, const wxString& o) { m_player.m_queue.OnUrlChanged(n, o); } void OnUrlChangingDone () { UpdateDisplay(); } // open files - this function is called eg. on a double click // on an associated file or when the user drags a file onto the main frame. #define SJ_OPENFILES_DEFCMD 0 #define SJ_OPENFILES_PLAY 1 #define SJ_OPENFILES_ENQUEUE 2 void OnIDO_DND_ONDATA (wxCommandEvent&); bool OpenFiles (const wxArrayString&, int command=SJ_OPENFILES_DEFCMD, int x=0, int y=0); bool OpenData (SjDataObject*, int command=SJ_OPENFILES_DEFCMD, int x=0, int y=0); bool DragNDrop (SjDragNDropAction, wxWindow*, const wxPoint&, SjDataObject* data, wxArrayString* files); void UpdateIndexAfterConstruction () { m_updateIndexAfterConstruction = TRUE; } void SetPasteCoord (const wxPoint& pt) { m_pasteCoord=pt; } // Public Search Functions #define SJ_SETSEARCH_CLEARSIMPLE 0x01 #define SJ_SETSEARCH_SETSIMPLE 0x02 #define SJ_SETSEARCH_CLEARADV 0x04 #define SJ_SETSEARCH_SETADV 0x08 #define SJ_SETSEARCH_NOTEXTCTRLUPDATE 0x10 #define SJ_SETSEARCH_NOAUTOHISTORYADD 0x20 void SetSearch (long flags, const wxString& newSimpleSearch=wxEmptyString, const SjAdvSearch* newAdvSearch=NULL); const SjSearch* GetSearch () const { return &m_search; } const SjSearchStat* GetSearchStat () const { return &m_searchStat; } void EndOneSearch () { SetSearch(m_search.m_simple.IsSet()? SJ_SETSEARCH_CLEARSIMPLE : SJ_SETSEARCH_CLEARADV); } void EndAllSearch () { SetSearch(SJ_SETSEARCH_CLEARADV|SJ_SETSEARCH_CLEARSIMPLE); } void EndSimpleSearch () { SetSearch(SJ_SETSEARCH_CLEARSIMPLE); } long GetAvgSearchMs () const { return m_allSearchMs/m_allSearchCount; } // m_allSearchCount is at least 1 bool HasAnySearch () const { return m_search.IsSet(); } bool HasSimpleSearch () const { return m_search.m_simple.IsSet(); } void UpdateSearchInfo (long numTracksRemoved); // Zoom and Font Settings wxString GetBaseFontFace () const { return m_baseFontFace; } long GetBaseFontSize () const { return m_baseFontSize; } long GetBaseColumnWidth () const { return m_baseColumnWidth; } long GetBaseCoverHeight () const { return m_baseCoverHeight; } void SetFontNCoverBase (const wxString& fontFace, long fontSize, long columnWidth, long coverHeight); void SetDefaultWindowSize(); long m_currColumnWidth, m_currCoverWidth, m_currCoverHeight; long m_currColumnXSpace, m_currColumnYSpace; long m_currFontSize, m_currFontSizeSmall; wxFont m_baseStdFont; // m_baseStdFont should be used in dialogs etc. this is the same as m_currStdFont - without any zoom applied wxFont m_currStdFont; wxFont m_currSmallFont; wxFont m_currSmallBoldFont; wxFont m_currBoldFont; wxFont m_currBoldItalicFont; // Misc. Settings bool m_internalDragNDrop; // Misc. Functions void OpenSettings (const wxString& selFile=wxEmptyString, int selIndex=0, int selPage=0); bool UpdateIndex (wxWindow* parent, bool deepUpdate); void SetSkinAzValues (int az); void OnSkinTargetEvent (int targetId, SjSkinValue&, long accelFlags); // overwritten from SjSkinWindow bool QueryEndSession (bool onShutdown=FALSE); void DoEndSession (); void LoadLayout (SjSkinLayout* l, SjLoadLayoutFlag sizeChangeFlag=SJ_AUTO_SIZE_CHANGE) { long oldLines = GetLinesCount(); SjSkinWindow::LoadLayout(l, sizeChangeFlag); if( oldLines != GetLinesCount() ) { m_display.m_scrollPos = -1; } UpdateDisplay(); } // Menu Stuff public: void CreateMainMenu (); void UpdateMainMenu (); void CreateContextMenu_ (SjMenu&, bool embedFastSearch=FALSE); void CreatePlaybackMenu (SjMenu*); void UpdateViewMenu (); void CreateUnqueueMenu (SjMenu&); void CreateSearchMenu (SjMenu&); void AddScriptMenuEntries(SjMenu&); #if SJ_USE_TOOLTIPS SjMainFrameToolTipProvider m_toolTipProvider; SjToolTipProvider* GetToolTipProvider (long targetId, long subitem, const wxRect& rect) { m_toolTipProvider.m_targetId = targetId; m_toolTipProvider.m_subitem = subitem; m_toolTipProvider.m_rect = rect; return &m_toolTipProvider; } #endif SjMenu *m_fileMenu, *m_editMenu, *m_editExtrasMenu, *m_viewMenu, *m_viewColMenu, *m_playbackMenu, *m_visMenu, *m_kioskMenu, *m_helpMenu; wxMenuBar* m_menuBar; private: void UpdateMenuBarValue (int targetId, const SjSkinValue& v); void UpdateMenuBarQueue (); // Allowed Operations (in Kiosk Mode), see SJ_OP_* in skin.h public: long m_availOp; bool IsOpAvailable (long f) const { return (m_availOp&f)==f; } bool IsAllAvailable () const { return IsOpAvailable(SJ_OP_ALL); } // if SJ_OP_ALL is set, this should imply all other flags bool IsKioskStarted () const { return IsOpAvailable(SJ_OP_KIOSKON); } // Auto-control struff: // Call these functions only if the input REALLY comes from the user // (used for timeouts, eg. for the display reset and for following the playlist) void GotInputFromUser () { m_lastUserInputTimestamp = SjTools::GetMsTicks(); #if SJ_USE_TOOLTIPS if(g_tools) {g_tools->m_toolTipManager.CloseToolTipWindow();} #endif } unsigned long LastInputFromUser () const {return m_lastUserInputTimestamp;} void GotDisplayInputFromUser () { m_lastUserDisplayInputTimestamp = SjTools::GetMsTicks(); GotInputFromUser(); } void GotBrowserInputFromUser () { m_lastUserBrowserInputTimestamp = SjTools::GetMsTicks(); GotInputFromUser(); } SjAutoCtrl m_autoCtrl; // Display stuff // The message OnSetDisplayMsg() may contain up to two lines separated by "\n" void SetDisplayMsg (const wxString& text, long holdMs=10000); #define SDM_STATE_CHANGE_MS 2500 #define SDM_KIOSK_CANNOT_ENQUEUE_MS 3000 void ClearDisplayMsg () { SetDisplayMsg(wxEmptyString, 0); } // you should only use the Get-functions from the player; // if SjMainFrame provides its own functins; these should be preferred SjPlayer m_player; // Display stuff - Public - UpdateDisplay() should be used with care and is most times not needed! void UpdateDisplay (); SjDisplay m_display; private: // Display stuff - Private void MarkDisplayTrack (int targetId, bool mouseDown, long accelFlags); void OnSkinTargetMotion (int targetId, int motionAmount); void OnSkinDisplayEvent (int targetId, SjSkinValue&, long accelFlags); wxString CombineArtistNTitle (const wxString& artist, const wxString& title, const wxString& sep=wxT("\t")); void UpdateCurrTime (); private: // Functions overwritten from SjSkinWindow void OnSkinTargetContextMenu (int, long x, long y); // The search stuff wxString NormalizeSearchText (const wxString&); void OnSimpleSearchInput (wxCommandEvent&); // also called on SetValue, so use the flag below void OnSimpleSearchInputTimer (wxTimerEvent&); void OnSearchHistory (wxCommandEvent&); void OnSearchGenre (wxCommandEvent&); void OnSearchMusicSel (wxCommandEvent&); wxTextCtrl* m_simpleSearchInputWindow; bool m_simpleSearchInputFromUser, m_inPerformingSearch; wxTimer m_simpleSearchInputTimer; wxString m_simpleSearchDelayedText; long m_allSearchCount, m_allSearchMs; // current search settings SjSearch m_search; SjSearchStat m_searchStat; wxString m_searchLastColumnGuid; long m_searchLastColumnGuidViewOffset; SjAdvSearch m_tempSearch; // Zoom and Font Settings public: #define SJ_ZOOM_MIN 0 #define SJ_ZOOM_DEF 3 #define SJ_ZOOM_MAX 6 void SetZoom__ (long newZoom, bool redraw=true); // Should ONLY be called by SjBrowserWindow::SetZoom() (which should be used from extern) long GetZoom () const {return m_currZoom;} static long CorrectZoom (long zoom); private: long m_currZoom; // 0=smallest..3=normal..6=largest long m_baseColumnWidth; long m_baseCoverHeight; wxString m_baseFontFace; long m_baseFontSize; static long CorrectColumnWidth (long columnWidth); static long CorrectCoverHeight (long coverHeight); static long CorrectFontSize (long fontSize); void CalcCurrFontSizesFromZoom (); void CreateFontObjects (); // Misc. unsigned long m_lastUserInputTimestamp, m_lastUserDisplayInputTimestamp, m_lastUserBrowserInputTimestamp; bool m_showRemainingTime; bool m_blinkBlink; wxTimer m_elapsedTimeTimer; SjMainApp* m_mainApp; bool m_updateIndexAfterConstruction; bool m_haltedManually; bool m_inConstruction; wxArrayString m_contextMenuClickedUrls; long m_contextMenuClickedId; #if SJ_USE_SCRIPTS SjSee* m_cmdLineAndDdeSee; #endif public: #if SJ_USE_SCRIPTS void CmdLineAndDdeSeeExecute (const wxString&); #endif private: // paste handling void OnPaste (wxCommandEvent&); wxPoint m_pasteCoord; // events //void OnIdle (wxIdleEvent&); void OnOpenBuyDlg (wxCommandEvent&); void OnFwdToSkin (wxCommandEvent&); void OnFwdToPlayer (wxCommandEvent&); void OnFwdToModules (wxCommandEvent&); void OnEsc (wxCommandEvent&); void OnTab (wxCommandEvent&); void OnCloseWindow (wxCloseEvent&); void OnIconizeWindow (wxIconizeEvent&); void OnElapsedTimeTimer (wxTimerEvent&); void OnMouseWheel (wxMouseEvent&); DECLARE_EVENT_TABLE (); friend class SjMainFrameToolTipProvider; friend class SjBasicSettingsConfigPage; // for m_locale friend class SjKioskModule; friend class SjDisplayEditDlg; friend class SjAutoCtrl; friend class SjDisplay; friend class SjAutoFader; friend class SjTagEditorDlg; }; #endif /* __SJ_MAINFRAME_H__ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/mainframe_menu.cpp�����������������������������������������������������0000664�0000000�0000000�00000056621�12660066715�0021536�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: mainframe.cpp * Authors: Björn Petersen * Purpose: Silverjuke main frame - Menu part * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/browser.h> #include <sjtools/console.h> #include <sjmodules/advsearch.h> #include <sjmodules/kiosk/kiosk.h> #include <sjmodules/vis/vis_module.h> #include <see_dom/sj_see.h> /******************************************************************************* * The main menu ******************************************************************************/ void SjMainFrame::CreateMainMenu() { // set up operating-system specific stuff, should be done before the menu bar is really created #ifdef __WXMAC__ wxApp::s_macHelpMenuTitleName = _("Help"); wxApp::s_macAboutMenuItemId = IDO_ABOUT; wxApp::s_macPreferencesMenuItemId = IDT_SETTINGS; wxApp::s_macExitMenuItemId = IDT_QUIT; #endif // create menu bar m_menuBar = new wxMenuBar(); // create menus m_fileMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_editMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_viewMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_playbackMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_visMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_kioskMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_helpMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); // create "file" menu m_fileMenu->Append(IDO_SETTINGS_ADDFILES, _("Add folders and files")+wxString("...")); m_fileMenu->Append(IDT_UPDATE_INDEX); m_fileMenu->AppendSeparator(); m_fileMenu->Append(IDT_OPEN_FILES); m_fileMenu->Append(IDT_SAVE_PLAYLIST); m_fileMenu->Append(IDT_UNQUEUE_ALL); m_fileMenu->AppendSeparator(); m_fileMenu->Append(IDT_QUIT); // create "edit" menu m_libraryModule->CreateMenu(m_playbackMenu, m_editMenu, TRUE); m_editExtrasMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_editMenu->Append(0, _("Extensions"), m_editExtrasMenu); m_editMenu->AppendSeparator(); m_editMenu->Append(IDO_SELECTALL); m_editMenu->AppendSeparator(); m_editMenu->Append(IDT_SEARCH_BUTTON); m_editMenu->Append(IDT_ADV_SEARCH); m_editMenu->Append(IDO_REALLYENDSEARCH, _("End search")); m_editMenu->AppendSeparator(); m_editMenu->Append(IDT_SETTINGS); // create "view" menu m_viewMenu->AppendRadioItem(IDT_WORKSPACE_ALBUM_VIEW); m_viewMenu->AppendRadioItem(IDT_WORKSPACE_COVER_VIEW); m_viewMenu->AppendRadioItem(IDT_WORKSPACE_LIST_VIEW); m_viewMenu->Append(IDT_WORKSPACE_TOGGLE_VIEW); m_viewMenu->AppendSeparator(); SjMenu* submenu = new SjMenu(SJ_SHORTCUTS_LOCAL); submenu->AppendCheckItem(IDT_TOGGLE_TIME_MODE, _("Show remaining time")); submenu->AppendCheckItem(IDO_TOGGLE_TIME_MODE2, _("Show elapsed time")); submenu->AppendCheckItem(IDO_DISPLAY_TOTAL_TIME, _("Show total time")); submenu->AppendCheckItem(IDO_DISPLAY_TRACKNR, _("Show track number")); submenu->AppendCheckItem(IDO_DISPLAY_ARTIST, _("Show artist name")); submenu->AppendCheckItem(IDO_DISPLAY_AUTOPLAY, _("Show AutoPlay")); submenu->AppendCheckItem(IDO_DISPLAY_PREFERALBCV, _("Prefer album- to track-cover")); m_viewMenu->Append(0, _("Display"), submenu); m_viewColMenu = new SjMenu(SJ_SHORTCUTS_LOCAL); m_viewMenu->Append(0, _("Columns"), m_viewColMenu); submenu = new SjMenu(SJ_SHORTCUTS_LOCAL); submenu->Append(IDT_ZOOM_IN); submenu->Append(IDT_ZOOM_OUT); submenu->Append(IDT_ZOOM_NORMAL); submenu->AppendSeparator(); submenu->AppendCheckItem(IDO_SAMEZOOMINALLVIEWS, _("Same zoom in all views")); submenu->Append(IDO_SETTINGS_FONTNCOVER, _("Fonts and covers")+wxString("...")); m_viewMenu->Append(0, _("Zoom"), submenu); m_viewMenu->Append(IDO_SETTINGS_SKINS, _("Skins")+wxString("...")); m_viewMenu->AppendSeparator(); m_viewMenu->Append(IDT_GOTO_CURR); m_viewMenu->Append(IDT_WORKSPACE_GOTO_RANDOM); m_viewMenu->Append(IDT_WORKSPACE_GOTO_PREV_AZ); m_viewMenu->Append(IDT_WORKSPACE_GOTO_NEXT_AZ); m_viewMenu->AppendSeparator(); m_viewMenu->AppendCheckItem(IDT_ALWAYS_ON_TOP); // init "playback" menu m_playbackMenu->AppendSeparator(); CreatePlaybackMenu(m_playbackMenu); // init "video screen" menu is done in UpdateVisMenu() below. // create "kiosk" menu m_kioskMenu->Append(IDT_TOGGLE_KIOSK, _("Start kiosk mode...")); // create "help" menu m_helpMenu->Append(IDO_ABOUT_OPEN_WWW, wxString::Format(_("%s on the web"), SJ_PROGRAM_NAME)+wxString(wxT("..."))); m_helpMenu->Append(IDO_ONLINE_HELP, _("All files")+wxString(wxT("..."))); m_helpMenu->AppendSeparator(); m_helpMenu->Append(IDO_CONSOLE); m_helpMenu->AppendSeparator(); m_helpMenu->Append(IDO_ABOUT, wxString::Format(_("About %s"), SJ_PROGRAM_NAME)+wxString(wxT("..."))); #ifdef SJHOOK_INIT_MAIN_MENU SJHOOK_INIT_MAIN_MENU #endif // append menus to menu bar // (wxMenuBar::Append() should be called with all items added to the menu to append; this allows eg. OS X to move menu items around) m_menuBar->Append(m_fileMenu, _os(_("File"))); m_menuBar->Append(m_editMenu, _("Edit")); m_menuBar->Append(m_viewMenu, _os(_("View"))); m_menuBar->Append(m_playbackMenu, _("Playback")); m_menuBar->Append(m_visMenu, _("Video screen")); m_menuBar->Append(m_kioskMenu, _("Kiosk mode")); m_menuBar->Append(m_helpMenu, _("Help")); } void SjMainFrame::UpdateMainMenu() { if( m_menuBar == NULL || m_fileMenu == NULL || m_libraryModule == NULL || m_editMenu == NULL || m_visMenu == NULL || g_visModule == NULL ) return; bool enableQueue = m_player.m_queue.GetCount()!=0; m_fileMenu->Enable(IDT_SAVE_PLAYLIST, enableQueue); m_fileMenu->Enable(IDT_UNQUEUE_ALL, enableQueue); m_libraryModule->UpdateMenuBar(); m_editMenu->Enable(IDO_REALLYENDSEARCH, HasAnySearch()); UpdateMenuBarQueue(); UpdateViewMenu(); g_visModule->UpdateVisMenu(m_visMenu); // update scripts menu m_editExtrasMenu->Clear(); AddScriptMenuEntries(*m_editExtrasMenu); if( m_editExtrasMenu->GetMenuItemCount() == 0 ) { m_editExtrasMenu->Append(IDO_SCRIPT_MENU99, _("None")); m_editExtrasMenu->Enable(IDO_SCRIPT_MENU99, false); } } void SjMainFrame::UpdateMenuBarValue(int targetId, const SjSkinValue& v) { // update the menu bar - if any if( m_menuBar == NULL ) return; switch( targetId ) { case IDT_PLAY: case IDT_PAUSE: case IDT_STOP: case IDT_MAIN_VOL_MUTE: case IDT_SHUFFLE: case IDT_PLAY_NOW_ON_DBL_CLICK: case IDT_ALWAYS_ON_TOP: m_menuBar->Check(targetId, v.value==1); break; case IDT_SAVE_PLAYLIST: case IDT_UNQUEUE_ALL: case IDT_MORE_FROM_CURR_ALBUM: case IDT_MORE_FROM_CURR_ARTIST: m_menuBar->Enable(targetId, v.value!=2); break; case IDT_STOP_AFTER_THIS_TRACK: m_menuBar->Check(IDT_STOP_AFTER_THIS_TRACK, v.value==1); break; case IDT_STOP_AFTER_EACH_TRACK: m_menuBar->Check(IDT_STOP_AFTER_EACH_TRACK, v.value==1); break; case IDT_PREV: case IDT_NEXT: case IDT_FADE_TO_NEXT: m_menuBar->Enable(targetId, v.value!=2); break; case IDT_REPEAT: if( m_playbackMenu ) { if( v.value==1 ) { m_playbackMenu->SetLabel(IDT_REPEAT, _("Repeat one")); } else if( v.value==2 ) { m_playbackMenu->SetLabel(IDT_REPEAT, _("Repeat all")); } else { m_playbackMenu->SetLabel(IDT_REPEAT, _("Repeat playlist")); } m_playbackMenu->Check(IDT_REPEAT, v.value!=0); } break; case IDT_WORKSPACE_ALBUM_VIEW: // IDT_WORKSPACE_ALBUM_VIEW, IDT_WORKSPACE_COVER_VIEW and IDT_WORKSPACE_LIST_VIEW always come "together"; so catching one event is sufficient here UpdateViewMenu(); UpdateMenuBarQueue(); if( m_libraryModule ) { m_libraryModule->UpdateMenuBar(); } break; case IDT_SEARCH_BUTTON: m_menuBar->Enable(IDO_REALLYENDSEARCH, HasAnySearch()); break; case IDT_TOGGLE_TIME_MODE: case IDO_TOGGLE_TIME_MODE2: UpdateMenuBarQueue(); break; case IDT_VIS_TOGGLE: if( g_visModule ) { g_visModule->UpdateVisMenu(m_visMenu); } break; } } void SjMainFrame::UpdateMenuBarQueue() { // update the menu bar - if any if( m_menuBar == NULL || m_viewMenu == NULL ) return; bool enableQueue = m_player.m_queue.GetCount()!=0; m_menuBar->Enable(IDT_GOTO_CURR, enableQueue); m_viewMenu->Check (IDT_TOGGLE_TIME_MODE, m_showRemainingTime); m_viewMenu->Check (IDO_TOGGLE_TIME_MODE2, !m_showRemainingTime); m_viewMenu->Check (IDO_DISPLAY_TOTAL_TIME, (m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TOTAL_TIME)!=0); m_viewMenu->Check (IDO_DISPLAY_TRACKNR, (m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TRACKNR)!=0); m_viewMenu->Check (IDO_DISPLAY_ARTIST, (m_skinFlags&SJ_SKIN_SHOW_DISPLAY_ARTIST)!=0); m_viewMenu->Check (IDO_DISPLAY_AUTOPLAY, (m_skinFlags&SJ_SKIN_SHOW_DISPLAY_AUTOPLAY)!=0); m_viewMenu->Check (IDO_DISPLAY_PREFERALBCV, (m_skinFlags&SJ_SKIN_PREFER_TRACK_COVER)==0); } /******************************************************************************* * The view menu ******************************************************************************/ void SjMainFrame::UpdateViewMenu() { if( m_viewMenu == NULL || m_viewColMenu == NULL ) return; bool enableQueue = m_player.m_queue.GetCount()!=0; m_viewMenu->Enable(IDT_GOTO_CURR, enableQueue); if( m_browser ) { int view = m_browser->GetView(); m_viewMenu->Check(IDT_WORKSPACE_ALBUM_VIEW, (view==SJ_BROWSER_ALBUM_VIEW)); m_viewMenu->Check(IDT_WORKSPACE_COVER_VIEW, (view==SJ_BROWSER_COVER_VIEW)); m_viewMenu->Check(IDT_WORKSPACE_LIST_VIEW, (view==SJ_BROWSER_LIST_VIEW)); m_viewColMenu->Clear(); m_viewColMenu->AppendCheckItem(IDT_WORKSPACE_SHOW_COVERS, (m_browser->GetView()==SJ_BROWSER_COVER_VIEW)? _("Show cover titles") : _("Show covers")); m_viewColMenu->Check(IDT_WORKSPACE_SHOW_COVERS, m_browser->AreCoversShown()); m_browser->AddItemsToColMenu(m_viewColMenu); } if( g_accelModule ) { m_viewMenu->Check(IDO_SAMEZOOMINALLVIEWS, (g_accelModule->m_flags&SJ_ACCEL_SAME_ZOOM_IN_ALL_VIEWS)!=0); } m_viewMenu->Check(IDT_ALWAYS_ON_TOP, IsAlwaysOnTop()); } /******************************************************************************* * The playback menu ******************************************************************************/ void SjMainFrame::CreatePlaybackMenu(SjMenu* playbackMenu) { bool anythingInQueue = GetQueueCount()>0; playbackMenu->Append(IDT_MORE_FROM_CURR_ALBUM); playbackMenu->Enable(IDT_MORE_FROM_CURR_ALBUM, anythingInQueue); playbackMenu->Append(IDT_MORE_FROM_CURR_ARTIST); playbackMenu->Enable(IDT_MORE_FROM_CURR_ARTIST, anythingInQueue); playbackMenu->AppendSeparator(); if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { playbackMenu->AppendRadioItem(IDT_PLAY); playbackMenu->Check(IDT_PLAY, m_player.IsPlaying()); playbackMenu->AppendRadioItem(IDT_PAUSE); playbackMenu->Check(IDT_PAUSE, m_player.IsPaused()); playbackMenu->AppendRadioItem(IDT_STOP); playbackMenu->Check(IDT_STOP, m_player.IsStopped()); playbackMenu->AppendCheckItem(IDT_STOP_AFTER_THIS_TRACK); playbackMenu->Check(IDT_STOP_AFTER_THIS_TRACK, m_player.StopAfterThisTrack()); playbackMenu->AppendCheckItem(IDT_STOP_AFTER_EACH_TRACK); playbackMenu->Check(IDT_STOP_AFTER_EACH_TRACK, m_player.StopAfterEachTrack()); } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { if( !IsOpAvailable(SJ_OP_PLAYPAUSE) ) playbackMenu->AppendSeparator(); playbackMenu->Append(IDT_PREV); playbackMenu->Enable(IDT_PREV, HasPrev()); bool hasNext = HasNextRegardAP(); playbackMenu->Append(IDT_NEXT, GetNextMenuTitle()); playbackMenu->Enable(IDT_NEXT, hasNext); playbackMenu->Append(IDT_FADE_TO_NEXT); playbackMenu->Enable(IDT_FADE_TO_NEXT, hasNext); } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) || IsOpAvailable(SJ_OP_REPEAT) || IsOpAvailable(SJ_OP_PLAYPAUSE) ) { playbackMenu->AppendSeparator(); if( IsOpAvailable(SJ_OP_REPEAT) ) { wxString repeatText; // default by SjAccelModule if( m_player.m_queue.GetRepeat()==1 ) repeatText = _("Repeat one"); if( m_player.m_queue.GetRepeat()==2 ) repeatText = _("Repeat all"); playbackMenu->AppendCheckItem(IDT_REPEAT, repeatText); playbackMenu->Check(IDT_REPEAT, m_player.m_queue.GetRepeat()!=0); } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { playbackMenu->AppendCheckItem(IDT_SHUFFLE); playbackMenu->Check(IDT_SHUFFLE, m_player.m_queue.GetShuffle()); } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) || IsOpAvailable(SJ_OP_PLAYPAUSE) ) { SjMenu* queueMenu = new SjMenu(playbackMenu->ShowShortcuts()); if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { queueMenu->AppendCheckItem(IDO_START_PB_ON_ENQUEUE, _("Start playback on first enqueue")); queueMenu->Check(IDO_START_PB_ON_ENQUEUE, (g_accelModule->m_flags&SJ_ACCEL_START_PLAYBACK_ON_ENQUEUE)!=0); } if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { queueMenu->AppendCheckItem(IDT_PLAY_NOW_ON_DBL_CLICK); queueMenu->Check(IDT_PLAY_NOW_ON_DBL_CLICK, (g_accelModule->m_flags&SJ_ACCEL_PLAY_NOW_ON_DBL_CLICK)!=0); } if( IsAllAvailable() ) { queueMenu->Append(IDO_SETTINGS_QUEUE, _("Further options")+wxString("...")); } playbackMenu->Append(0, _("Queue"), queueMenu); } } if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { playbackMenu->AppendSeparator(); SjMenu* volMenu = new SjMenu(playbackMenu->ShowShortcuts()); volMenu->Append(IDT_MAIN_VOL_UP); volMenu->Append(IDT_MAIN_VOL_DOWN); volMenu->AppendCheckItem(IDT_MAIN_VOL_MUTE); volMenu->Check(IDT_MAIN_VOL_MUTE, m_player.GetMainVolMute()); volMenu->AppendSeparator(); volMenu->Append(IDT_PRELISTEN_VOL_UP); volMenu->Append(IDT_PRELISTEN_VOL_DOWN); playbackMenu->Append(0, _("Volume"), volMenu); if( IsAllAvailable() ) { playbackMenu->Append(IDO_SETTINGS_AUTOVOL, _("Automatic control")+wxString("...")); } } } /******************************************************************************* * The context menus ******************************************************************************/ void SjMainFrame::AddScriptMenuEntries(SjMenu& m) { // add the menu entries creted by the scripts to the given menu; the function is used in the main menu and // for the context menus. Before any entry is added, a separator is added (if there are no entries, no separator is added) #if SJ_USE_SCRIPTS wxArrayString arrMenu = SjSee::GetGlobalEmbeddings(SJ_PERSISTENT_MENU_ENTRY); wxArrayString arrConfig = SjSee::GetGlobalEmbeddings(SJ_PERSISTENT_CONFIG_BUTTON); int iCountMenu = arrMenu.GetCount(); if( iCountMenu > (IDO_SCRIPT_MENU99-IDO_SCRIPT_MENU00)+1 ) { iCountMenu = IDO_SCRIPT_MENU99-IDO_SCRIPT_MENU00+1; } int iCountConfig = arrConfig.GetCount(); if( iCountConfig > (IDO_SCRIPTCONFIG_MENU99-IDO_SCRIPTCONFIG_MENU00)+1 ) { iCountConfig = IDO_SCRIPTCONFIG_MENU99-IDO_SCRIPTCONFIG_MENU00+1; } if( iCountMenu > 0 ) { for( int i = 0; i<iCountMenu; i++ ) { m.Append(IDO_SCRIPT_MENU00+i, arrMenu[i]); } if( iCountConfig > 0 ) { m.AppendSeparator(); } } if( iCountConfig > 0 ) { for( int i = 0; i<iCountConfig; i++ ) { m.Append(IDO_SCRIPTCONFIG_MENU00+i, arrConfig[i]); } } #endif } wxString SjMainFrame::GetNextMenuTitle() { if( !HasNextIgnoreAP() && HasNextRegardAP() ) { wxString from; if( m_autoCtrl.m_autoPlayMusicSelId == 0 ) { from = _("Current view"); } else { SjAdvSearch advSearch = g_advSearchModule->GetSearchById(m_autoCtrl.m_autoPlayMusicSelId); from = advSearch.GetName(); } return wxString::Format(_("Next track from \"%s\""), from.c_str()); } else { return _("Next track"); } } void SjMainFrame::CreateContextMenu_(SjMenu& mainMenu, bool embedFastSearch) { // search // -- as we have a normal menu bar since 15.1, the context menu can be more focused (search only added if embedFastSearch set, formally this was always the case) if( embedFastSearch && IsOpAvailable(SJ_OP_SEARCH) ) { // open adv. search dialog if( mainMenu.GetMenuItemCount() ) { mainMenu.AppendSeparator(); } if( IsAllAvailable() ) { mainMenu.Append(IDT_ADV_SEARCH); } // "fast search" if( embedFastSearch ) { CreateSearchMenu(mainMenu); } // end search mainMenu.Append(IDO_REALLYENDSEARCH, _("End search")); mainMenu.Enable(IDO_REALLYENDSEARCH, HasAnySearch()); } // help if( IsKioskStarted() ) { mainMenu.Append(IDO_ABOUT, wxString::Format(_("About %s"), SJ_PROGRAM_NAME)+wxString(wxT("..."))); } } void SjMainFrame::CreateUnqueueMenu(SjMenu& mainMenu) { long trackCount = m_player.m_queue.GetCount(); long markedCount = m_display.m_selectedIds.GetCount(); if( IsOpAvailable(SJ_OP_UNQUEUE) ) { mainMenu.Append(IDO_UNQUEUE_MARKED); mainMenu.Enable(IDO_UNQUEUE_MARKED, (markedCount>0)); mainMenu.Append(IDO_UNQUEUE_ALL_BUT_MARKED); mainMenu.Enable(IDO_UNQUEUE_ALL_BUT_MARKED, (markedCount>0 && trackCount>markedCount)); } } void SjMainFrame::CreateSearchMenu(SjMenu& m) { // History if( m_search.IsSet() && m_searchStat.m_totalResultCount > 0 ) { g_advSearchModule->AddToHistory(m_search); } int i, iCount = g_advSearchModule->GetHistoryCount(); SjSearchHistory currentSearch(m_search); if( iCount ) { for( i=iCount-1; i >= 0; i-- ) { const SjSearchHistory* item = g_advSearchModule->GetHistory(i); wxString title = item->GetTitle(); if( !title.IsEmpty() ) { if( *item == currentSearch ) { m.AppendCheckItem(IDO_SEARCHHISTORY00+i, title); m.Check(IDO_SEARCHHISTORY00+i, TRUE); } else { m.Append(IDO_SEARCHHISTORY00+i, title); } } } } if( IsOpAvailable(SJ_OP_MUSIC_SEL_GENRE) ) { // Direct genre selection wxArrayString data = m_libraryModule->GetUniqueValues(SJ_TI_GENRENAME); iCount = (int)data.GetCount(); if( iCount ) { #define MAX_SEARCH_GENRE_IN_MENU (IDO_SEARCHGENRE999-IDO_SEARCHGENRE000) if( iCount > MAX_SEARCH_GENRE_IN_MENU ) iCount = MAX_SEARCH_GENRE_IN_MENU; SjMenu* genreMenu = new SjMenu(m.ShowShortcuts()); for( i =0; i < iCount; i++ ) { genreMenu->Append(IDO_SEARCHGENRE000+i, data[i]); } m.Append(0, _("Search for genre"), genreMenu); } } if( IsOpAvailable(SJ_OP_MUSIC_SEL) ) { // Direct music selection iCount = g_advSearchModule->GetSearchCount(); if( iCount ) { #define MAX_MUSIC_SEL_IN_MENU (IDO_SEARCHMUSICSEL999-IDO_SEARCHMUSICSEL000) if( iCount > MAX_MUSIC_SEL_IN_MENU ) iCount = MAX_MUSIC_SEL_IN_MENU; SjMenu* advSearchMenu = new SjMenu(m.ShowShortcuts()); wxString name; for( i =0; i < iCount; i++ ) { name = g_advSearchModule->GetSearchByIndex(i, FALSE).GetName(); if( !name.IsEmpty() ) { advSearchMenu->Append(IDO_SEARCHMUSICSEL000+i, name); } } m.Append(0, _("Search for music selection"), advSearchMenu); } } } void SjMainFrame::OnSkinTargetContextMenu(int targetId, long x, long y) { SjMenu mainMenu(0); bool embedFastSearch = FALSE; long unmarkQueueId = 0; m_display.m_tagEditorJustOpened = FALSE; GotInputFromUser(); m_contextMenuClickedUrls.Clear(); m_contextMenuClickedId = 0; if( (targetId>=IDT_DISPLAY_LINE_FIRST && targetId<=IDT_DISPLAY_LINE_LAST) || targetId==IDT_CURR_TRACK || targetId==IDT_NEXT_TRACK ) { // queue menu items if( IsAllAvailable() ) { if( targetId==IDT_CURR_TRACK || targetId==IDT_NEXT_TRACK ) { long queuePos = m_player.m_queue.GetCurrPos()+(targetId==IDT_NEXT_TRACK?1:0); if( !IsStopped() && queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { if( targetId==IDT_CURR_TRACK || !GetShuffle() ) { m_contextMenuClickedUrls.Add(m_player.m_queue.GetUrlByPos(queuePos)); m_contextMenuClickedId = m_player.m_queue.GetIdByPos(queuePos); m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(m_contextMenuClickedId, 1); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = 60*60*1000; // long enough, i think after one hour, the context menu should be closed unmarkQueueId = m_contextMenuClickedId; UpdateDisplay(); } } } else { long trackCount = m_player.m_queue.GetCount(); if( trackCount > 0 ) { // mark the line under the mouse if it is not marked long queuePos = m_display.m_firstLineQueuePos + (targetId-IDT_DISPLAY_LINE_FIRST); if( queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { m_contextMenuClickedId = m_player.m_queue.GetIdByPos(queuePos); if( m_contextMenuClickedId != 0 ) { if( m_display.m_selectedIds.Lookup(m_contextMenuClickedId) == 0 ) { m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(m_contextMenuClickedId, 1); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = 60*60*1000; // long enough, i think after one hour, the context menu should be closed unmarkQueueId = m_contextMenuClickedId; UpdateDisplay(); } } } m_contextMenuClickedUrls = m_player.m_queue.GetUrlsByIds(m_display.m_selectedIds); if( m_contextMenuClickedUrls.GetCount() ) { mainMenu.Append(IDO_GOTO_CURR_MARK); } } } long markedCount = m_contextMenuClickedUrls.GetCount(); if( markedCount > 0 ) { CreateUnqueueMenu(mainMenu); mainMenu.AppendSeparator(); mainMenu.Append(IDO_EDITQUEUE, _("Edit tracks/Get info")+wxString(wxT("..."))); m_libraryModule->CreateRatingMenu(mainMenu, IDO_RATINGQUEUE00, m_contextMenuClickedUrls); m_libraryModule->CreateArtistInfoMenu(mainMenu, IDO_ARTISTINFQUEUE00, m_contextMenuClickedUrls); mainMenu.Append(IDO_EXPLOREQUEUE, _os(_("Show file"))); mainMenu.Enable(IDO_EXPLOREQUEUE, (markedCount==1)); SjMenu* submenu = new SjMenu(0); AddScriptMenuEntries(*submenu); if( submenu->GetMenuItemCount() ) { mainMenu.Append(0, _("Extensions"), submenu); } else { delete submenu; } } } } else { switch( targetId ) { case IDT_DISPLAY_COVER: if( m_player.m_queue.GetCount() ) { mainMenu.Append(IDO_DISPLAY_COVER, _("Cover editor")); if( IsAllAvailable() ) { mainMenu.Append(IDO_DISPLAY_COVER_EXPLR, _os(_("Show file"))); } } break; case IDT_OPEN_FILES: case IDT_APPEND_FILES: case IDT_SAVE_PLAYLIST: case IDT_UNQUEUE_ALL: case IDT_DISPLAY_UP: case IDT_DISPLAY_DOWN: case IDT_DISPLAY_V_SCROLL: CreateUnqueueMenu(mainMenu); break; case IDT_SEARCH: case IDT_SEARCH_BUTTON: case IDT_SEARCH_INFO: // "Search" menu if( IsAllAvailable() ) { embedFastSearch = TRUE; } else { CreateSearchMenu(mainMenu); } break; } } CreateContextMenu_(mainMenu, embedFastSearch); if( targetId == IDT_MAINMENU && !IsKioskStarted() ) { mainMenu.AppendSeparator(); mainMenu.Append(IDT_QUIT); } if( mainMenu.GetMenuItemCount() ) { PopupMenu(&mainMenu); } if( unmarkQueueId && !m_display.m_tagEditorJustOpened ) // if the tag editor is opened in between, the marked tracks in the display should stay { m_display.m_selectedIds.Remove(unmarkQueueId); UpdateDisplay(); } } ���������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/player.cpp�������������������������������������������������������������0000664�0000000�0000000�00000102610�12660066715�0020035�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2016 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: player.cpp * Authors: Björn Petersen * Purpose: Player basic handling for the player (user settings etc.) * ******************************************************************************* * * For a better overview, this file contains everything that is not directly * needed for playback but, however, belongs to SjPlayer. * * SjPlayer does a lot of parameter-range checking as it is also used * by some external modules and we don't know how they were programmed ;-) * * We DO NOT set any stats in SjMainFrame, this should be done by the caller. * We DO promote IDMODMSG_* messages to the module. * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/queue.h> #include <sjbase/player.h> #include <sjbase/columnmixer.h> #include <sjtools/volumecalc.h> #include <sjtools/volumefade.h> #include <sjmodules/vis/vis_module.h> #include <see_dom/sj_see.h> #if SJ_USE_GSTREAMER #include <sjbase/backend_gstreamer.h> #define BACKEND_CLASSNAME SjGstreamerBackend #elif SJ_USE_XINE #include <sjbase/backend_xine.h> #define BACKEND_CLASSNAME SjXineBackend #elif SJ_USE_BASS #include <sjbase/backend_bass.h> #define BACKEND_CLASSNAME SjBassBackend #endif /******************************************************************************* * SjPlayerModule ******************************************************************************/ // internal messages #define THREAD_END_OF_STREAM (IDPLAYER_FIRST+0) #define THREAD_AUTO_DELETE (IDPLAYER_FIRST+1) SjPlayerModule::SjPlayerModule(SjInterfaceBase* interf) : SjCommonModule(interf) { m_file = "memory:player.lib"; m_name = "Player"; } void SjPlayerModule::GetLittleOptions (SjArrayLittleOption& lo) { // prelisten options (they belong to the device options; all other stuff has explicit options in the dialog on different pages) wxString options = wxString::Format( "%i|", SJ_PL_MIX) + _("Mix") + wxString::Format("|%i|", SJ_PL_LEFT) + _("Left channel") + wxString::Format("|%i|", SJ_PL_RIGHT) + _("Right channel") + wxString::Format("|%i|", SJ_PL_OWNOUTPUT) + _("Explicit output"); lo.Add(new SjLittleEnumLong(_("Prelisten"), options, &g_mainFrame->m_player.m_prelistenDest, SJ_PL_DEFAULT, "player/prelistenDest", SJ_ICON_MODULE)); // backend settings wxString sysVolOptions = wxString::Format("%s|%s|%s", _("No") /*=0*/, _("Yes") /*=1=Use+Init*/, _("Only initialize system volume") /*=2*/); if( g_mainFrame->m_player.m_backend ) { SjLittleOption::SetSection(_("Output")); lo.Add(new SjLittleBit( _("Use system volume"), sysVolOptions, &g_mainFrame->m_player.m_useSysVol, SJ_SYSVOL_DEFAULT, 0, "player/useSysVol", SJ_ICON_MODULE)); g_mainFrame->m_player.m_backend->GetLittleOptions(lo); } if( g_mainFrame->m_player.m_prelistenBackend ) { SjLittleOption::SetSection(_("Prelisten")); lo.Add(new SjLittleBit( _("Use system volume"), sysVolOptions, &g_mainFrame->m_player.m_prelistenUseSysVol, SJ_SYSVOL_DEFAULT, 0, "player/prelistenUseSysVol", SJ_ICON_MODULE)); g_mainFrame->m_player.m_prelistenBackend->GetLittleOptions(lo); } } /******************************************************************************* * SjPlayer - Construct, Init etc. ******************************************************************************/ SjPlayer::SjPlayer() { m_isInitialized = FALSE; m_paused = FALSE; m_stopAfterThisTrack = FALSE; m_stopAfterEachTrack = false; m_inOpening = FALSE; m_mainVol = SJ_DEF_VOLUME; m_mainGain = 1.0F; m_mainBackupVol = -1; m_avEnabled = SJ_AV_DEF_STATE; m_avDesiredVolume = SJ_AV_DEF_DESIRED_VOLUME; m_avMaxGain = SJ_AV_DEF_MAX_GAIN; m_avUseAlbumVol = SJ_AV_DEF_USE_ALBUM_VOL; m_avCalculatedGain = 1.0F; m_autoCrossfade = SJ_DEF_AUTO_CROSSFADE_ENABLED; m_autoCrossfadeSubseqDetect = false; m_autoCrossfadeMs = SJ_DEF_CROSSFADE_MS; m_manCrossfadeMs = SJ_DEF_CROSSFADE_MS; m_crossfadeOffsetEndMs = SJ_DEF_CROSSFADE_OFFSET_END_MS; m_onlyFadeOut = false; // radio-like: only fade out, the new track starts with the full volume m_backend = NULL; m_streamA = NULL; m_useSysVol = SJ_SYSVOL_DEFAULT; m_prelistenBackend = NULL; m_prelistenDest = SJ_PL_DEFAULT; m_prelistenUseSysVol = SJ_SYSVOL_DEFAULT; } void SjPlayer::Init() { wxASSERT( wxThread::IsMain() ); if( m_isInitialized ) return; // init/create objects m_isInitialized = true; m_queue.Init(); m_backend = new BACKEND_CLASSNAME(SJBE_ID_STDOUTPUT); m_prelistenBackend = new BACKEND_CLASSNAME(SJBE_ID_PRELISTEN); // load settings wxConfigBase* c = g_tools->m_config; m_useSysVol =c->Read("player/useSysVol", SJ_SYSVOL_DEFAULT); // should be done before SetMainVol() SetMainVol (c->Read("player/volume", SJ_DEF_VOLUME)); m_queue.SetShuffle (c->Read("player/shuffle", SJ_DEF_SHUFFLE_STATE? 1L : 0L)!=0); m_queue.SetShuffleIntensity (c->Read("player/shuffleIntensity", SJ_DEF_SHUFFLE_INTENSITY)); m_queue.SetRepeat ((SjRepeat)c->Read("player/repeat", 0L)); m_queue.SetQueueFlags (c->Read("player/avoidBoredom", SJ_QUEUEF_DEFAULT), c->Read("player/boredomMinutes", SJ_DEF_BOREDOM_TRACK_MINUTES), c->Read("player/boredomArtistMinutes", SJ_DEF_BOREDOM_ARTIST_MINUTES)); SetAutoCrossfade (c->Read("player/crossfadeActive", SJ_DEF_AUTO_CROSSFADE_ENABLED? 1L : 0L)!=0); SetAutoCrossfadeSubseqDetect(c->Read("player/crossfadeSubseq", 0L/*defaults to off*/)!=0); m_autoCrossfadeMs =c->Read("player/crossfadeMs", SJ_DEF_CROSSFADE_MS); m_manCrossfadeMs =c->Read("player/crossfadeManMs", SJ_DEF_CROSSFADE_MS); m_crossfadeOffsetEndMs =c->Read("player/crossfadeOffsetEndMs",SJ_DEF_CROSSFADE_OFFSET_END_MS); SetOnlyFadeOut (c->Read("player/onlyFadeOut", 0L/*defaults to off*/)!=0); StopAfterEachTrack (c->Read("player/stopAfterEachTrack", 0L)!=0); AvEnable (c->Read("player/autovol", SJ_AV_DEF_STATE? 1L : 0L)!=0); AvSetUseAlbumVol (c->Read("player/usealbumvol", SJ_AV_DEF_USE_ALBUM_VOL? 1L : 0L)!=0); m_avDesiredVolume = (float)c->Read("player/autovoldes", (long)(SJ_AV_DEF_DESIRED_VOLUME*1000.0F)) / 1000.0F; m_avMaxGain = (float)c->Read("player/autovolmax", (long)(SJ_AV_DEF_MAX_GAIN*1000.0F)) / 1000.0F; m_prelistenDest =c->Read("player/prelistenDest", SJ_PL_DEFAULT); m_prelistenUseSysVol =c->Read("player/prelistenUseSysVol", SJ_SYSVOL_DEFAULT); } void SjPlayer::SaveSettings() const { // SaveSettings() is only called by the client, if needed. SjPlayer does not call SaveSettings() wxASSERT( wxThread::IsMain() ); wxConfigBase* c = g_tools->m_config; // save base - mute is not saved by design c->Write("player/volume", m_mainBackupVol==-1? m_mainVol : m_mainBackupVol); // save misc. c->Write("player/shuffle", m_queue.GetShuffle()? 1L : 0L); c->Write("player/shuffleIntensity", m_queue.GetShuffleIntensity()); { long queueFlags, boredomTrackMinutes, boredomArtistMinutes; m_queue.GetQueueFlags(queueFlags, boredomTrackMinutes, boredomArtistMinutes); c->Write("player/avoidBoredom", queueFlags); // the name "avoidBoredom" is historical ... c->Write("player/boredomMinutes", boredomTrackMinutes); c->Write("player/boredomArtistMinutes",boredomArtistMinutes); } c->Write("player/crossfadeActive", GetAutoCrossfade()? 1L : 0L); c->Write("player/crossfadeMs", m_autoCrossfadeMs); c->Write("player/crossfadeOffsetEndMs",m_crossfadeOffsetEndMs); c->Write("player/crossfadeManMs", m_manCrossfadeMs); c->Write("player/onlyFadeOut", GetOnlyFadeOut()? 1L : 0L); c->Write("player/stopAfterEachTrack", StopAfterEachTrack()? 1L : 0L); c->Write("player/crossfadeSubseq", GetAutoCrossfadeSubseqDetect()? 1L : 0L); c->Write("player/autovol", AvIsEnabled()? 1L : 0L); c->Write("player/usealbumvol", AvGetUseAlbumVol()? 1L : 0L); c->Write("player/autovoldes", (long)(m_avDesiredVolume*1000.0F)); c->Write("player/autovolmax", (long)(m_avMaxGain*1000.0F)); // save repeat - repeating a single track is not remembered by design if( m_queue.GetRepeat()!=1 ) { c->Write("player/repeat", (long)m_queue.GetRepeat()); } } void SjPlayer::Exit() { if( m_isInitialized ) { // SaveSettings() should be called by the caller, if needed m_isInitialized = false; DeleteStream(&m_streamA, 0); if( m_backend ) { delete m_backend; m_backend = NULL; } if( m_prelistenBackend ) { delete m_prelistenBackend; m_prelistenBackend = NULL; } m_queue.Exit(); } } /******************************************************************************* * SjPlayer - Misc. ******************************************************************************/ const SjExtList* SjPlayer::GetExtList() { static SjExtList s_exstList; bool s_extListInitialized = false; if( !s_extListInitialized ) { // TODO: return really supported extensions here - or simply define a global "default" list and allow the user to modify it // (instead of let the user define extensions to ignore) s_exstList.AddExt("16sv, 4xm, 669, 8svx, aac, ac3, aif, aiff, amf, anim, anim3, anim5, anim7, anim8, anx, asc, " "asf, ass, asx, au, aud, avi, axa, axv, cak, cin, cpk, dat, dif, dps, dts, dv, f4a, f4v, film, flac, flc, fli, flv, " "ik2, iki, ilbm, it, m2t, m2ts, m4a, m4b, mdl, med, mjpg, mkv, mng, mod, mov, mp+, mp2, mp3, mp4, mpa, mpc, mpeg, mpega, " "mpg, mpp, mpv, mts, mv8, mve, nsv, oga, ogg, ogm, ogv, ogx, pes, pva, qt, qtl, ra, rm, rmvb, roq, s3m, shn, smi, snd, " "spx, srt, ssa, stm, str, sub, svx, trp, ts, tta, vmd, vob, voc, vox, vqa, wav, wax, wbm, webm, wma, wmv, wv, wve, wvp, " "wvx, xa, xa1, xa2, xap, xas, xm, y4m"); // (list is from xine) } return &s_exstList; } bool SjPlayer::TestUrl(const wxString& url) { if( !m_isInitialized ) { return false; } wxString ext = SjTools::GetExt(url); if( ext.IsEmpty() ) { return false; } const SjExtList* extList = GetExtList(); if( extList && !extList->LookupExt(ext) ) { return false; } return true; // URL is fine } bool SjPlayer::IsAutoPlayOnAir() { if( !m_isInitialized ) { return false; } wxString urlOnAir = GetUrlOnAir(); if( !urlOnAir.IsEmpty() ) { long urlOnAirPos = m_queue.GetClosestPosByUrl(urlOnAir); if( urlOnAirPos != wxNOT_FOUND ) { if( m_queue.GetFlags(urlOnAirPos)&SJ_PLAYLISTENTRY_AUTOPLAY ) { return true; } } } return false; } void SjPlayer::SaveGatheredInfo(const wxString& url, unsigned long startingTime, SjVolumeCalc* volumeCalc, long realContinuousDecodedMs) { if( g_mainFrame && !SjMainApp::IsInShutdown() && !url.IsEmpty() ) { double newGain = -1.0L; if( volumeCalc && volumeCalc->IsGainWorthSaving() ) { newGain = volumeCalc->GetGain(); } g_mainFrame->m_libraryModule->PlaybackDone( url, startingTime, // 0 is okay here newGain, // -1 for unknown realContinuousDecodedMs); #if SJ_USE_SCRIPTS SjSee::Player_onPlaybackDone(url); #endif } } /******************************************************************************* * Resume ******************************************************************************/ wxString SjPlayer::GetResumeFile() const { wxSqltDb* db = wxSqltDb::GetDefault(); wxASSERT( db ); if( db == NULL ) return ""; wxFileName fn(db->GetFile()); fn.SetFullName("." + fn.GetFullName() + "-resume"); return fn.GetFullPath(); // results in ".filename.jukebox-resume", a hidden file } void SjPlayer::SaveToResumeFile() { // this function is called on shutdown, where our program may be _killed_ by the operating system. // so we do not risk to write larger data to the sqlite database but use a simple text file instead. // create header with common information unsigned long startMs = SjTools::GetMsTicks(); wxString content("resumeversion=2\n"); int i, iCount = m_queue.GetCount(), iPos = m_queue.GetCurrPos(); // collect all URLs bool addPlayed = (m_queue.GetQueueFlags()&SJ_QUEUEF_RESUME_LOAD_PLAYED)!=0; long playcount, entryflags; for( i = 0; i < iCount; i++ ) { SjPlaylistEntry& e = m_queue.GetInfo(i); playcount = e.GetPlayCount(); entryflags = e.GetFlags(); if( playcount==0 || addPlayed || i==iPos ) { if( playcount > 0 ) { content += "played=1\n"; // setting for the URL following } if( entryflags & SJ_PLAYLISTENTRY_AUTOPLAY ) { content += "autoplay=1\n"; // setting for the URL following } if( i==iPos ) { long totalMs, elapsedMs = -1/*stop or pause*/, remainingMs; if( IsPlaying() ) { GetTime(totalMs, elapsedMs/*may be -1 for 'unknown'*/, remainingMs); if( elapsedMs < 0 ) { elapsedMs = 0; // >=0: playing } } content += wxString::Format("playing=%i\n", (int)elapsedMs); // setting for the URL following, save independingly of SJ_QUEUEF_RESUME_START_PLAYBACK as we always init the queue positions } content += "url=" + e.GetUnverifiedUrl() + "\n"; // the unverified URL may contain Tabs! When we reload the information. If we load the file later, we treat all URLs as unverfied (eg. the files may have changed) } } // open file to write { wxLogNull null; wxFile file(GetResumeFile(), wxFile::write); if( !file.IsOpened() ) { return; // do not log any error, we're in shutdown } // add some footer information and write wxDateTime dt = wxDateTime::Now().ToUTC(); content += dt.Format("created=%Y-%m-%dT%H:%M:%S+00:00\n"); content += wxString::Format("ms=%i\n", (int)(SjTools::GetMsTicks()-startMs)); // speed is about 500 tracks per millisecond on my system from the year 2012 file.Write(content, wxConvUTF8); } } void SjPlayer::LoadFromResumeFile() { // load content from file // we do not delete the file physically after loading. // If the next shutdown fails it is better to load "too many" tracks with a repeated playing position than nothing. wxString content; wxString content; { wxString resumeFile = GetResumeFile(); wxFileSystem fileSystem; wxFSFile* fsFile = fileSystem.OpenFile(resumeFile, wxFS_READ); if( fsFile == NULL ) { return; // do not log any error, there is simply no resume file } wxLogInfo("Loading %s", resumeFile.c_str()); content = SjTools::GetFileContent(fsFile->GetStream(), &wxConvUTF8); delete fsFile; } // go through all lines of the content wxString istVersion; SjLineTokenizer tkz(content); wxChar* currLinePtr; wxString currLine, currKey, currValue; long currPlayed = 0, currAutoplay = 0; wxArrayString allUrls; wxArrayLong allPlayed; wxArrayLong allAutoplay; long allPos = -1, allElapsed = -1; while( (currLinePtr=tkz.GetNextLine()) ) { currLine = currLinePtr; currKey = currLine.BeforeFirst('='); currValue = currLine.AfterFirst('='); if( currKey == "played" ) { currPlayed = 1; } else if( currKey == "autoplay" ) { currAutoplay = 1; } else if( currKey == "playing" ) { allPos = allUrls.Count(); // the next added URL is our queue position if( !currValue.ToLong(&allElapsed) ) { allElapsed = -1; // stopped or paused, to not play } } else if( currKey == "url" ) { allUrls.Add(currValue); allPlayed.Add(currPlayed); allAutoplay.Add(currAutoplay); // prepare for next URL currPlayed = 0; currAutoplay = 0; } } // enqueue the urls g_mainFrame->Enqueue(allUrls, -1, false, NULL, 0); // start playback if( allPos >= 0 && allPos < m_queue.GetCount() ) { m_queue.SetCurrPos(allPos); if( m_queue.GetQueueFlags()&SJ_QUEUEF_RESUME_START_PLAYBACK && allElapsed >= 0 ) { g_mainFrame->Play(allElapsed); } } // mark URLs as autoplay/played wxASSERT( allUrls.Count() == allPlayed.Count() ); wxASSERT( allUrls.Count() == allAutoplay.Count() ); int i, iCount = m_queue.GetCount(); if( iCount > (int)allUrls.Count() ) { iCount = (int)allUrls.Count(); } // get min for( i = 0; i < iCount; i++ ) { SjPlaylistEntry& e = m_queue.GetInfo(i); if( allPlayed[i] ) { e.SetPlayCount(1); } else if( e.GetPlayCount() > 0 ) { e.SetPlayCount(0); // the Play() call above may have marked previous track as being played. fix that. } if( allAutoplay[i] ) { e.SetFlags(e.GetFlags()|SJ_PLAYLISTENTRY_AUTOPLAY); } } } /******************************************************************************* * DSP- and StreamInfo-Callback ******************************************************************************/ class SjBackendUserdata { public: SjBackendUserdata(SjPlayer* player, long onCreateFadeMs = 0) { m_player = player; m_onCreateFadeMs = onCreateFadeMs; m_isVideo = false; m_realMs = 0; m_autoDelete = false; // if set, the stream is deleted on EOS or if fading is done m_autoDeleteSend = false; } long m_onCreateFadeMs; SjPlayer* m_player; bool m_isVideo; long m_realMs; SjVolumeCalc m_volumeCalc; SjVolumeFade m_volumeFade; bool m_autoDelete; bool m_autoDeleteSend; wxCriticalSection m_autoDeleteCritical; }; void SjPlayer_BackendCallback(SjBackendCallbackParam* cbp) { // TAKE CARE: this function is called while processing the audio data, // just before the output. So please, do not do weird things here. SjBackendStream* stream = cbp->stream; if( stream == NULL ) { return; } SjBackendUserdata* userdata = stream->m_userdata; if( userdata == NULL ) { return; } SjPlayer* player = userdata->m_player; if( player == NULL ) { return; } float* buffer = cbp->buffer; // may be NULL long bytes = cbp->bytes; int samplerate = cbp->samplerate; int channels = cbp->channels; if( cbp->msg == SJBE_MSG_DSP ) { /* DSP ***********************************************************************/ if( buffer != NULL && bytes > 0 ) { // calculate the volume - we do this ALWAYS, if autovol is enabled or not userdata->m_volumeCalc.AddBuffer(buffer, bytes, samplerate, channels); // apply the calulated gain, if desired if( player->m_avEnabled ) { userdata->m_volumeCalc.AdjustBuffer(buffer, bytes, player->m_avDesiredVolume, player->m_avMaxGain); if( stream == player->m_streamA ) { player->m_avCalculatedGain = userdata->m_volumeCalc.GetGain(); } } // apply optional fadings, eg. for crossfading if( !userdata->m_volumeFade.AdjustBuffer(buffer, bytes, samplerate, channels) ) { userdata->m_autoDeleteCritical.Enter(); if( userdata->m_autoDelete && !userdata->m_autoDeleteSend ) { userdata->m_autoDeleteSend = true; player->SendSignalToMainThread(THREAD_AUTO_DELETE, (uintptr_t)stream); } userdata->m_autoDeleteCritical.Leave(); } // forward the data to the visualisation - // we do this last, so autovol, equalizers etc. is visible eg. in the spectrum analyzer if( g_visModule->IsVisStarted() && stream == player->m_streamA ) { g_visModule->AddVisData(buffer, bytes); } // finally, after the visualisation, apply the main volume if we shall not use the system device volume if( player->m_useSysVol != SJ_SYSVOL_USE ) // = SJ_SYSVOL_DONTUSE || SJ_SYSVOL_ONLYINIT { SjApplyVolume(buffer, bytes, player->m_mainGain); } } } else if( cbp->msg == SJBE_MSG_CREATE ) { /* Stream just created - send before any SJBE_MSG_DSP ***********************************************************************/ wxASSERT( wxThread::IsMain() ); userdata->m_volumeCalc.SetPrecalculatedGain( g_mainFrame->m_libraryModule->GetAutoVol(stream->GetUrl(), player->AvGetUseAlbumVol()) ); if( userdata->m_onCreateFadeMs ) { userdata->m_volumeFade.SetVolume(0.0); userdata->m_volumeFade.SlideVolume(1.0, userdata->m_onCreateFadeMs); } } else if( cbp->msg == SJBE_MSG_VIDEO_DETECTED ) { /* Video detected ***********************************************************************/ if( !userdata->m_isVideo ) { userdata->m_isVideo = true; player->SendSignalToMainThread(IDMODMSG_VIDEO_DETECTED); } } else if( cbp->msg == SJBE_MSG_END_OF_STREAM ) { /* End of stream ***********************************************************************/ // auto delete stream? bool sendEos = true; userdata->m_autoDeleteCritical.Enter(); if( userdata->m_autoDelete ) { if( !userdata->m_autoDeleteSend ) { userdata->m_autoDeleteSend = true; player->SendSignalToMainThread(THREAD_AUTO_DELETE, (uintptr_t)stream); } sendEos = false; } userdata->m_autoDeleteCritical.Leave(); // just send end-of-stream if( sendEos && stream == player->m_streamA ) { player->SendSignalToMainThread(THREAD_END_OF_STREAM, (uintptr_t)stream); } } else if( cbp->msg == SJBE_MSG_DESTROY_USERDATA ) { /* destroy ***********************************************************************/ wxASSERT( wxThread::IsMain() ); player->SaveGatheredInfo(stream->GetUrl(), stream->GetStartingTime(), &userdata->m_volumeCalc, userdata->m_realMs); delete userdata; stream->m_userdata = NULL; } } /******************************************************************************* * Common Player Functionality ******************************************************************************/ SjBackendStream* SjPlayer::CreateStream(const wxString& url, long explicitSeekMs, long fadeMs) { SjBackendUserdata* userdata = new SjBackendUserdata(this, fadeMs); if( userdata == NULL ) { return NULL; } // first, try to collect some information long startThisMs = 0; if( explicitSeekMs > 0 ) { startThisMs = explicitSeekMs; } // create the stream SjBackendStream* stream = m_backend->CreateStream(url, startThisMs, SjPlayer_BackendCallback, userdata); if( stream == NULL ) { return NULL; // userdata should be deleted via SJBE_MSG_DESTROY_USERDATA } return stream; } void SjPlayer::DeleteStream(SjBackendStream** streamPtr, long fadeMs) { wxASSERT( wxThread::IsMain() ); SjBackendStream* stream = *streamPtr; if( stream ) { *streamPtr = NULL; // do this very soon, we check eg. against m_streamA on various situations if( fadeMs > 0 ) { stream->m_userdata->m_autoDeleteCritical.Enter(); stream->m_userdata->m_volumeFade.SlideVolume(0.0, fadeMs); stream->m_userdata->m_autoDelete = true; // set this _after_ SlideVolume() - otherwise the other thread may have called AdjustBuffer() without adjusting and found m_autoDelete=true stream->m_userdata->m_autoDeleteCritical.Leave(); } else { delete stream; } } } void SjPlayer::Play(long seekMs) { if( !m_isInitialized || !m_backend ) { return; } // play! if( !m_streamA ) { // set source URI wxString url = m_queue.GetUrlByPos(-1); if( url.IsEmpty() ) { return; // error; } m_streamA = CreateStream(url, seekMs, 0); if( !m_streamA ) { return; // error; } } else { m_backend->SetDeviceState(SJBE_STATE_PLAYING); } // success m_paused = false; return; } void SjPlayer::Pause() { if( !m_isInitialized || !m_backend ) { return; } // if the player is stopped or if we are already paused, there is nothing to do if( !m_backend->IsDeviceOpened() || m_paused ) { return; } // real changing of the pause state in the implementation, this should also set the m_paused flag m_backend->SetDeviceState(SJBE_STATE_PAUSED); m_paused = true; } void SjPlayer::Stop(bool stopVisIfPlaying) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); if( !m_isInitialized ) { return; } m_stopAfterThisTrack = false; m_failedUrls.Clear(); // stop visualisation if( stopVisIfPlaying ) { g_visModule->StopVisIfOverWorkspace(); } // Do the "real stop" in the implementation part DeleteStream(&m_streamA, 0); if( m_backend ) { m_backend->SetDeviceState(SJBE_STATE_CLOSED); } m_paused = false; } void SjPlayer::GotoAbsPos(long queuePos, bool fadeToPos) // this is the only function, that _starts_ playback! { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); if( !m_isInitialized || !m_backend ) { return; } static bool inHere = false; if( !inHere ) { inHere = true; m_stopAfterThisTrack = false; // check offset if( queuePos < 0 || queuePos >= m_queue.GetCount() ) { inHere = false; // don't forget this! return; } // goto absolute track m_queue.SetCurrPos(queuePos); if( IsPaused() ) { // switch from pause to stop Stop(); } else if( IsPlaying() ) { // playing, realize the new position DeleteStream(&m_streamA, fadeToPos? m_manCrossfadeMs : 0); if( m_backend ) { wxString url = m_queue.GetUrlByPos(queuePos); if( !url.IsEmpty() ) { bool deviceOpendedBefore = m_backend->IsDeviceOpened(); m_streamA = CreateStream(url, 0, (fadeToPos && !m_onlyFadeOut)? m_manCrossfadeMs : 0); // may be NULL, we send the signal anyway! if( m_streamA ) { if( !deviceOpendedBefore ) { if( m_useSysVol==SJ_SYSVOL_USE ) { m_backend->SetDeviceVol(m_mainGain); } else if( m_useSysVol==SJ_SYSVOL_ONLYINIT ) { m_backend->SetDeviceVol(1.0); } } } } } } SendSignalToMainThread(IDMODMSG_TRACK_ON_AIR_CHANGED); inHere = false; } } void SjPlayer::SeekAbs(long seekMs) { if( !m_isInitialized ) { return; } if( m_streamA ) { m_streamA->SeekAbs(seekMs); } } void SjPlayer::GetTime(long& totalMs, long& elapsedMs, long& remainingMs) { wxASSERT( wxThread::IsMain() ); if( !m_isInitialized || !m_backend || !m_streamA ) { totalMs = 0; elapsedMs = 0; remainingMs = 0; return; // Init() not called, may happen on startup display updates } // calculate totalMs and elapsedMs, if unknown, -1 is returned. m_streamA->GetTime(totalMs, elapsedMs); if( totalMs > 0 ) { m_streamA->m_userdata->m_realMs = totalMs; } // remaining time remainingMs = -1; if( totalMs != -1 && elapsedMs != -1 ) { remainingMs = totalMs - elapsedMs; if( remainingMs < 0 ) { remainingMs = 0; } } } long SjPlayer::GetEnqueueTime() { // if the user enqueues a track NOW, // this function calculates the soonest time it can get played. // (if shuffle is enabled, this may be directly after the current track, otherwise this is the end of the playlist) #define EST_AVG_TRACK_LENGTH_MS 180000L // assume three minutes avg. length of a track wxASSERT( wxThread::IsMain() ); long totalRemainingMs = 0, entryRemainingMs, i; long queueCount = m_queue.GetCount(); if( queueCount > 0 ) { totalRemainingMs = GetRemainingTime(); if( !m_queue.GetShuffle() ) { for( i = m_queue.GetCurrPos()+1; i < queueCount; i++ ) { entryRemainingMs = m_queue.GetInfo(i).GetPlaytimeMs(); totalRemainingMs += entryRemainingMs>0? entryRemainingMs : EST_AVG_TRACK_LENGTH_MS; } } } return totalRemainingMs; } wxString SjPlayer::GetUrlOnAir() { if( !m_isInitialized || !m_backend || !m_backend->IsDeviceOpened() || !m_streamA ) { return wxEmptyString; } return m_streamA->GetUrl(); } bool SjPlayer::IsVideoOnAir() { if( m_streamA && m_streamA->m_userdata ) { return m_streamA->m_userdata->m_isVideo; } return false; } void SjPlayer::SetMainVol(int newVol) // 0..255 { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); if( newVol < 0 ) { newVol = 0; } if( newVol > 255 ) { newVol = 255; } m_mainVol = newVol; m_mainGain = ((double)newVol)/255.0F; if( m_backend && m_backend->IsDeviceOpened() ) { if( m_useSysVol==SJ_SYSVOL_USE ) { m_backend->SetDeviceVol((float)m_mainGain); } } } void SjPlayer::SetMainVolMute(bool mute) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); if( mute ) { if( m_mainBackupVol == -1 ) { m_mainBackupVol = m_mainVol; } SetMainVol(0); } else { SetMainVol(m_mainBackupVol > 8? m_mainBackupVol : SJ_DEF_VOLUME); m_mainBackupVol = -1; } } void SjPlayer::AvSetUseAlbumVol(bool useAlbumVol) { if( m_avUseAlbumVol != useAlbumVol ) { m_avUseAlbumVol = useAlbumVol; } } void SjPlayer::OneSecondTimer() { if( !m_autoCrossfade || m_streamA == NULL || m_streamA->m_userdata == NULL ) { return; // crossfading and silence detection disabled OR no stream } long totalMs = -1, elapsedMs = -1; m_streamA->GetTime(totalMs, elapsedMs); if( totalMs < m_autoCrossfadeMs*2 || elapsedMs < 0 || m_streamA->m_userdata->m_isVideo ) { return; // do not crossfade on very short tracks OR if the position is unknwon OR if the current stream is a video (may cause problems if the next stream is also a video) } #define HEADROOM_MS 50 // assumed time for stream creation long startNextMs = totalMs - HEADROOM_MS; if( m_autoCrossfade ) { startNextMs -= m_autoCrossfadeMs+m_crossfadeOffsetEndMs; } if( elapsedMs < startNextMs ) { return; // still waiting for the correct moment } // the correct moment is reached! if( m_stopAfterThisTrack || m_stopAfterEachTrack ) { return; // no crossfade, we shall just stop } // find out the next url to play wxString newUrl; long newQueuePos = m_queue.GetNextPos(SJ_PREVNEXT_REGARD_REPEAT); if( newQueuePos == -1 ) { // try to enqueue auto-play url g_mainFrame->m_autoCtrl.DoAutoPlayIfEnabled(false /*ignoreTimeouts*/); newQueuePos = m_queue.GetNextPos(SJ_PREVNEXT_REGARD_REPEAT); if( newQueuePos == -1 ) { return; // nothing more to play, stop when reaching THREAD_END_OF_STREAM } } newUrl = m_queue.GetUrlByPos(newQueuePos); if( m_failedUrls.Index( newUrl ) != wxNOT_FOUND ) { return; // the URL has just failed, handle this in THREAD_END_OF_STREAM } // try to create the next stream DeleteStream(&m_streamA, m_autoCrossfadeMs); m_streamA = CreateStream(newUrl, 0, m_onlyFadeOut? 0 : m_autoCrossfadeMs); m_queue.SetCurrPos(newQueuePos); // realize the new position in the UI if( m_streamA ) { SendSignalToMainThread(IDMODMSG_TRACK_ON_AIR_CHANGED); } else { SendSignalToMainThread(THREAD_END_OF_STREAM); // error - start over } } void SjPlayer::SendSignalToMainThread(int id, uintptr_t extraLong) const { if( g_mainFrame && m_isInitialized && !SjMainApp::IsInShutdown() ) // do not send the message on shutdown - it won't be received and there will be no memory leak as the OS normally free all program memory { wxCommandEvent* evt = new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, id); evt->SetClientData((void*)extraLong); g_mainFrame->GetEventHandler()->QueueEvent(evt); } } void SjPlayer::ReceiveSignal(int signal, uintptr_t extraLong) { if( !m_isInitialized || m_backend == NULL ) { return; } if( signal==THREAD_END_OF_STREAM && (((SjBackendStream*)extraLong)==m_streamA || extraLong==0) ) { // just stop after this track? - we're here if the DSP callback sends EOS or if we resend the signal outself if( m_stopAfterThisTrack || m_stopAfterEachTrack ) { g_mainFrame->Stop(); // Stop() clears the m_stopAfterThisTrack flag, and, as we go over g_mainFrame, this also sets haltedManually and stops autoPlay if( HasNextIgnoreAP() ) // make sure, the next hit on play goes to the next track { GotoNextIgnoreAP(false); g_mainFrame->UpdateDisplay(); } return; // done } // find out the next url to play wxString newUrl; long newQueuePos = m_queue.GetNextPos(SJ_PREVNEXT_REGARD_REPEAT); if( newQueuePos == -1 ) { // try to enqueue auto-play url g_mainFrame->m_autoCtrl.DoAutoPlayIfEnabled(false /*ignoreTimeouts*/); newQueuePos = m_queue.GetNextPos(SJ_PREVNEXT_REGARD_REPEAT); if( newQueuePos == -1 ) { // no chance, there is nothing more to play ... Stop(); SendSignalToMainThread(IDMODMSG_PLAYER_STOPPED_BY_EOQ); return; } } newUrl = m_queue.GetUrlByPos(newQueuePos); // has the URL just failed? try again in the next message loop if( m_failedUrls.Index( newUrl ) != wxNOT_FOUND ) { m_queue.SetCurrPos(newQueuePos); SendSignalToMainThread(THREAD_END_OF_STREAM, 0); // start over return; } // try to create the next stream DeleteStream(&m_streamA, 0); m_streamA = CreateStream(newUrl, 0, 0); m_queue.SetCurrPos(newQueuePos); // realize the new position in the UI if( m_streamA ) { SendSignalToMainThread(IDMODMSG_TRACK_ON_AIR_CHANGED); } else { SendSignalToMainThread(THREAD_END_OF_STREAM, 0); // start over } } else if( signal == THREAD_AUTO_DELETE ) { // just delete the given stream - the message is needed as we cannot do this from a working thream SjBackendStream* toDel = (SjBackendStream*)extraLong; if( toDel ) { delete toDel; } } } ������������������������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/player.h���������������������������������������������������������������0000664�0000000�0000000�00000023631�12660066715�0017507�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: player.h * Authors: Björn Petersen * Purpose: Silverjuke player * ******************************************************************************/ #ifndef __SJ_PLAYER_H__ #define __SJ_PLAYER_H__ class SjPlayerModule : public SjCommonModule { public: // SjPlayerModule is needed for the configuration only SjPlayerModule (SjInterfaceBase*); void GetLittleOptions (SjArrayLittleOption&); }; class SjBackend; class SjBackendStream; class SjBackendCallbackParam; class SjVolumeCalc; class SjPlayer { public: // Constructor/Destructor, Init/Exit, Load/Save settings. // for complete contruction call SjPlayer() _and_ Init(). SjPlayer (); void Init (); void Exit (); void SaveSettings () const; SjQueue m_queue; // resume void SaveToResumeFile (); void LoadFromResumeFile (); wxString GetResumeFile () const; // Check if a given file is playable bool TestUrl (const wxString& url); const SjExtList* GetExtList (); // Basic Player Control. // The playback is NOT started implicit by Goto() or Enqueue() functions. // To check if the operations were successfull, use the Is*()/Get*() functions. void Play (long ms=0); void Pause (); void PlayOrPause () { if(IsPlaying()) {Pause();} else {Play(0);} } void Stop (bool stopVisIfPlaying=true); void StopAfterThisTrack (bool s) { m_stopAfterThisTrack=s; } bool StopAfterThisTrack () const { return m_stopAfterThisTrack; } void StopAfterEachTrack (bool s) { m_stopAfterEachTrack=s; } bool StopAfterEachTrack () const { return m_stopAfterEachTrack; } bool IsPlaying () { return !GetUrlOnAir().IsEmpty() && !m_paused; } bool IsPaused () { return !GetUrlOnAir().IsEmpty() && m_paused; } bool IsStopped () { return GetUrlOnAir().IsEmpty(); } wxString GetUrlOnAir (); bool IsAutoPlayOnAir (); bool IsVideoOnAir (); // has the running title a video stream? bool AreTheseUrlsCurrentlyPrelistening(const wxArrayString&) { return false; } void TogglePrelisten (const wxArrayString& urls) {} // Handling the main volume slider and "mute", volumes between 0..255 are valid. // If you mute the volume, the returned main volume is 0. void SetMainVol (int v); int GetMainVol () const { return m_mainVol; } void SetMainVolMute (bool); bool GetMainVolMute () const { return (GetMainVol()==0); } void ToggleMainVolMute () { SetMainVolMute(!GetMainVolMute()); } // Goto specific tracks in the queue; if playing, this will stop the currently // playing song and start the new one. If pause, this will stop the player. // Playback is never started by any Goto() function. // GotoPrev()/GotoNextIgnoreAP() are NOT the same as GotoRelPos(-1/+1) as the former // regards shuffle settings and the latter does not. bool HasPrev () { return m_queue.GetPrevPos(SJ_PREVNEXT_LOOKUP_ONLY)!=-1; } void GotoPrev () { long p=m_queue.GetPrevPos(0); if(p!=-1) { GotoAbsPos(p); } } bool HasNextIgnoreAP () { return m_queue.GetNextPos(SJ_PREVNEXT_LOOKUP_ONLY)!=-1; } bool GotoNextIgnoreAP (bool fadeToNext) { long p=m_queue.GetNextPos(0); if(p!=-1) { GotoAbsPos(p, fadeToNext); return true; } else { return false; } } void GotoRelPos (long p) { GotoAbsPos(m_queue.GetCurrPos()+p); } void GotoUrl (const wxString& url) { long p=m_queue.GetClosestPosByUrl(url); if(p!=-1) { GotoAbsPos(p); } } void GotoAbsPos (long, bool fadeToPos=false); // Get Time Information, Seek inside the track void GetTime (long& totalMs, long& elapsedMs, long& remainingMs); long GetTotalTime () { long t1, t2, t3; GetTime(t1, t2, t3); return t1; } long GetElapsedTime () { long t1, t2, t3; GetTime(t1, t2, t3); return t2; } long GetRemainingTime () { long t1, t2, t3; GetTime(t1, t2, t3); return t3; } long GetEnqueueTime (); void SeekAbs (long ms); void SeekRel (long ms) { SeekAbs(GetElapsedTime()+ms); } // Automatic volume #define SJ_AV_DEF_STATE TRUE #define SJ_AV_DEF_DESIRED_VOLUME 1.0F #define SJ_AV_DEF_MAX_GAIN 5.0F #define SJ_AV_DEF_USE_ALBUM_VOL FALSE void AvEnable (bool s) { m_avEnabled = s; } bool AvIsEnabled () const { return m_avEnabled; } void AvSetUseAlbumVol (bool); bool AvGetUseAlbumVol () const { return m_avUseAlbumVol; } void AvSetDesiredVolume (float v) { m_avDesiredVolume = v; } float AvGetDesiredVolume () const { return m_avDesiredVolume; } void AvSetMaxGain (float m) { m_avMaxGain = m; } float AvGetMaxGain () const { return m_avMaxGain; } float AvGetCalculatedGain () const { return m_avCalculatedGain; } // this does not include the desired volume nor the max. gain! // Crossfade & Other fadings void SetAutoCrossfade (bool e) { m_autoCrossfade=e; } bool GetAutoCrossfade () const { return m_autoCrossfade; } void SetAutoCrossfadeSubseqDetect(bool r) { m_autoCrossfadeSubseqDetect=r; } bool GetAutoCrossfadeSubseqDetect() const { return m_autoCrossfadeSubseqDetect; } void SetOnlyFadeOut (bool e) { m_onlyFadeOut = e; } bool GetOnlyFadeOut () const { return m_onlyFadeOut; } // Crossfade & Other fadings: Time settings #define SJ_DEF_CROSSFADE_MS 10000L long m_autoCrossfadeMs; #define SJ_DEF_CROSSFADE_OFFSET_END_MS 3000L long m_crossfadeOffsetEndMs; long m_manCrossfadeMs; void OneSecondTimer (); // The IDP_* messages posted to the main module should // be given to ReceiveSignal(). This is to avoid using a separate // thread for this purpose. void ReceiveSignal (int id, uintptr_t extraLong); private: // The player's backend, normally selected by a define as SJ_USE_GSTREAMER or SJ_USE_XINE SjBackend* m_backend; SjBackendStream* m_streamA; SjBackendStream* CreateStream (const wxString& url, long seekMs, long fadeMs); void DeleteStream (SjBackendStream**, long fadeMs); // the given pointer must not be used by the caller after using this function! #define SJ_SYSVOL_DONTUSE 0 #define SJ_SYSVOL_USE 1 #define SJ_SYSVOL_ONLYINIT 2 #define SJ_SYSVOL_DEFAULT SJ_SYSVOL_USE long m_useSysVol; // prelisten #define SJ_PL_MIX 1 #define SJ_PL_LEFT 2 #define SJ_PL_RIGHT 3 #define SJ_PL_OWNOUTPUT 4 #define SJ_PL_DEFAULT SJ_PL_MIX long m_prelistenDest; SjBackend* m_prelistenBackend; long m_prelistenUseSysVol; // tools void SendSignalToMainThread(int id, uintptr_t extraLong=0) const; void SaveGatheredInfo (const wxString& url, unsigned long startingTime, SjVolumeCalc*, long realDecodedBytes); // main volume stuff int m_mainVol; double m_mainGain; // 0.0 - 1.0 int m_mainBackupVol; bool m_stopAfterThisTrack; bool m_stopAfterEachTrack; // auto volume stuff bool m_avEnabled; bool m_avUseAlbumVol; float m_avDesiredVolume; float m_avMaxGain; float m_avCalculatedGain; // crossfading etc. #define SJ_DEF_AUTO_CROSSFADE_ENABLED true bool m_autoCrossfade; bool m_autoCrossfadeSubseqDetect; bool m_onlyFadeOut; // Misc bool m_isInitialized; bool m_paused; // as we use sliding to/from pause, BASS_IsPaused() does not always reflect the correct state bool m_inOpening; void* m_visBuffer; long m_visBufferBytes; wxArrayString m_failedUrls; friend class SjPlayerModule; friend void SjPlayer_BackendCallback(SjBackendCallbackParam*); }; #endif // __SJ_PLAYER_H__ �������������������������������������������������������������������������������������������������������silverjuke-16.2.3/src/sjbase/playlist.cpp�����������������������������������������������������������0000664�0000000�0000000�00000113577�12660066715�0020420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/********************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: playlist.cpp * Authors: Björn Petersen * Purpose: Silverjuke playlist handling * ******************************************************************************* * * Some information about playlists: * - http://gonze.com/playlists/playlist-format-survey.html * * Further notes: * - Relative URLs supported on load * - We do a very lazy but _fast_ load: We just take the strings as given and * remember the containing playlist file (if any), later on, we verify the * entry as needed. This allows us to load playlists with thousands tracks * in a fragment of a second. * - We're using arist and title information in *.m3u and *.pls files if the URL * is not found. This allows moving playlists with relative paths if the * title is in the library. * - The playlistLocation/artist/album/track is added after a tab to the * unverified URL. We use the tab as a separator as it should cause less * problems with the information stored; using eg. the pipe ("|") may cause * problems with some URLs (although http://www.ietf.org/rfc/rfc2396.txt * stated the use of the pipe in URLs "unwise"). So, the tab is it. * - Nero does not like spaces in CUE filenames * ******************************************************************************/ #include <sjbase/base.h> #include <sjbase/playlist.h> #include <tagger/tg_a_tagger_frontend.h> #include <wx/html/htmlwin.h> #include <wx/arrimpl.cpp> // sic! WX_DEFINE_OBJARRAY(SjArrayPlaylistEntry); #undef DEBUG_VERIFY /******************************************************************************* * SjPlaylistEntry ******************************************************************************/ long SjPlaylistEntry::s_nextId = 1; void SjPlaylistEntry::LoadAddInfo(long what) { if( g_mainFrame == NULL ) { return; } // allocate add. information if( m_addInfo == NULL ) { m_addInfo = new SjPlaylistAddInfo(); } // for performance reasons, LoadAddInfo() should be called only if really needed; // use CheckAddInfo() if you are unsure wxASSERT( (m_addInfo->m_what & what) == 0 ); // handle playcount and timestamp if( what&SJ_ADDINFO_PLAYCOUNT ) { m_addInfo->m_what |= SJ_ADDINFO_PLAYCOUNT; } // load track, artist and album name, if needed if( (what&SJ_ADDINFO_MISC) && !(m_addInfo->m_what&SJ_ADDINFO_MISC) ) { // try to get them from the library if( !g_mainFrame->m_columnMixer.GetQuickInfo(GetUrl(), m_addInfo->m_trackName, m_addInfo->m_leadArtistName, m_addInfo->m_albumName, m_addInfo->m_playtimeMs) ) { // try to get them from the decoding module that will handle this file wxASSERT( m_urlVerified ); if( m_urlOk ) { wxString testUrl = GetUrl(); if( !testUrl.StartsWith(wxT("http:")) // this may be a steam - in this case (or in others) we get into an endless loop && !testUrl.StartsWith(wxT("https:")) && !testUrl.StartsWith(wxT("ftp:")) ) { SjTrackInfo trackInfo; wxFileSystem fs; wxFSFile* fsFile = fs.OpenFile(GetUrl(), wxFS_READ|wxFS_SEEKABLE); if( fsFile ) { if( SjGetTrackInfoFromID3Etc(fsFile, trackInfo, SJ_TI_QUICKINFO) == SJ_SUCCESS ) { m_addInfo->m_trackName = trackInfo.m_trackName; m_addInfo->m_leadArtistName = trackInfo.m_leadArtistName; m_addInfo->m_albumName = trackInfo.m_albumName; m_addInfo->m_playtimeMs = trackInfo.m_playtimeMs; if( m_addInfo->m_trackName.IsEmpty() ) { m_addInfo->m_trackName = GetUrl(); } } delete fsFile; } } } } // SjPlaylistEntry uses -1 as invalid playing times if( m_addInfo->m_playtimeMs <= 0 ) { m_addInfo->m_playtimeMs = -1; } // remember that these info are checked m_addInfo->m_what |= SJ_ADDINFO_MISC; } } wxString SjPlaylistEntry::GetLocalFile(const wxString& containerFile__) { wxFileName urlFn = wxFileSystem::URLToFileName(GetUrl()); if( !containerFile__.IsEmpty() ) { wxString containerFile(containerFile__); #ifdef __WXMSW__ containerFile.Replace(wxT("/"), wxT("\\")); #endif wxFileName containerFn(containerFile); urlFn.MakeRelativeTo(containerFn.GetPath(wxPATH_GET_VOLUME|wxPATH_GET_SEPARATOR)); } return urlFn.GetFullPath(); } void SjPlaylistEntry::SetRealtimeInfo(const wxString& info__) { // normalize the given info -- some broadcasting stations // use "--" as the artist/title separator, leave out the artist, show all in uppercase // and so on ... wxString info(info__); info.Replace(wxT("--"), wxT("-")); if( info.Upper() == info || info.Lower() == info ) { info = SjTools::Capitalize(info); } while( info.Len() > 0 && (info[0] == wxT('-') || info[0] == wxT(' ')) ) { info = info.Mid(1); } while( info.Len() > 0 && (info.Last() == wxT('-') || info.Last() == wxT(' ')) ) { info = info.Left(info.Len()-1); } // set the normalized info string as CheckAddInfo(SJ_ADDINFO_MISC); int p = info.Find(wxT(" - ")); if( p != -1 ) { wxString i1 = info.Left(p).Trim(); wxString i2 = info.Mid(p+3).Trim(false); if( !i1.IsEmpty() || !i2.IsEmpty() ) { if( i2.IsEmpty() ) { m_addInfo->m_trackName = i1; } else { m_addInfo->m_leadArtistName = i1; m_addInfo->m_trackName = i2; } } } else if( !info.IsEmpty() ) { m_addInfo->m_trackName = info; } } /******************************************************************************* * SjPlaylist - Handling URLs ******************************************************************************/ void SjPlaylistEntry::VerifyUrl() { // as we're verifing, don't log any errors wxLogNull null; // main frame available? without the main frame, we cannot verify any URLs. if( g_mainFrame == NULL ) { return; } // for speed reasons, the calling function should call // VerifyUrl() not without reason wxASSERT( !m_urlVerified ); m_urlVerified = TRUE; // the unverified URL has the format "url.mp3 \t playlist.m3u \t Artist \t Album \t Track" (without spaces around tabs); // copy the original url as it will be modified; the original url should only be overwritten on total success wxString url(m_url.BeforeFirst('\t')); // get the long and absolute version of the URL if( url.StartsWith(wxT("file:")) ) { wxFileName urlFn = wxFileSystem::URLToFileName(url); url = urlFn.GetLongPath(); } else if( !url.StartsWith(wxT("stub:")) ) { wxFileName urlFn(url, wxPATH_NATIVE); if( !urlFn.IsAbsolute() ) { // try relative paths from the second part of the unverified URL wxString containerPath = m_url.AfterFirst('\t').BeforeFirst('\t'); if( !containerPath.IsEmpty() ) { // re-assign the relatice path to urlFn - needed if for() has more than one iteration urlFn.Assign(url, wxPATH_NATIVE); // make urlFn absolute using MakeAbsolute(GetPath()) (GetPath() does not return the name, so this should work just fine) #ifdef __WXMSW__ containerPath.Replace(wxT("/"), wxT("\\")); // needed as wxPATH_NATIVE obviously expects native paths ... see http://www.silverjuke.net/forum/post.php?p=14207#14207 #endif wxFileName tempFn(containerPath, wxPATH_NATIVE); urlFn.MakeAbsolute(tempFn.GetPath(wxPATH_GET_VOLUME)); // success? if( urlFn.FileExists() ) { url = urlFn.GetLongPath(); } } } else { url = urlFn.GetLongPath(); } } // open file - as we also support eg. ZIP archives this is needed for validating // relative paths are not valid at this moment wxString fsFileLocation; { wxFSFile* fsFile = NULL; if( !url.StartsWith(wxT("..")) && !url.StartsWith(wxT("./")) && !url.StartsWith(wxT(".\\")) && !url.StartsWith(wxT("stub:")) ) { wxFileSystem fileSystem; fsFile = fileSystem.OpenFile(url); } if( fsFile == NULL ) { // try to lookup the URL by artist/album/track wxString artistName = m_url.AfterFirst('\t').AfterFirst('\t').BeforeFirst('\t'); wxString albumName = m_url.AfterFirst('\t').AfterFirst('\t').AfterFirst('\t').BeforeFirst('\t'); wxString trackName = m_url.AfterLast('\t'); if( !artistName.IsEmpty() && !trackName.IsEmpty() /*album may be empty, eg. for m3u*/) { url = g_mainFrame->m_libraryModule->GetUrl(artistName, albumName, trackName); if( !url.IsEmpty() ) { wxFileSystem fileSystem; fsFile = fileSystem.OpenFile(url); } } if( fsFile == NULL ) { m_url = m_url.BeforeFirst('\t'); return; // Url not found } } fsFileLocation = fsFile->GetLocation(); delete fsFile; } // convert the file name to a URL if( !fsFileLocation.StartsWith("file:") && !fsFileLocation.StartsWith("http:") && !fsFileLocation.StartsWith("https:") && !fsFileLocation.StartsWith("ftp:") ) { wxFileName fn(fsFileLocation); fsFileLocation = wxFileSystem::FileNameToURL(fsFileLocation); } // make sure, we're using the correct case, see // http://www.silverjuke.net/forum/topic-2406.html #ifdef __WXMSW__ { wxSqlt sql; sql.Query(wxT("SELECT url FROM tracks WHERE url='") + sql.QParam(fsFileLocation) + wxT("';")); if( !sql.Next() ) { sql.Query(wxT("SELECT url FROM tracks WHERE url LIKE '") + sql.QParam(fsFileLocation) + wxT("';")); while( sql.Next() ) // ^^^ LIKE is case-insensitive { // <<< use while() as the url may contain '%' wxString test = sql.GetString(0); if( test.Lower() == fsFileLocation.Lower() ) { fsFileLocation = test; break; } } } } #endif // file opened - save the location as the verified URL // and close the file if( m_playlist ) { m_playlist->RehashUrl(m_url/*really the original URL*/, fsFileLocation); } m_url = fsFileLocation; // file is okay - but is it playable by us? if( g_mainFrame->m_player.TestUrl(m_url) ) { m_urlOk = TRUE; // very fine ;-) } // done #ifdef DEBUG_VERIFY wxLogDebug(wxT("%s verified..."), m_url.c_str()); #endif } void SjPlaylist::RehashUrl(const wxString& oldUrl, const wxString& newUrl) { // Get the sum of occurences from old and new url // and insert both together as the new url. // // Before Silverjuke 1.10 there was a bad error here - instead of using // // " long count = m_urlCounts.Remove(oldUrl); " // " count += m_urlCounts.Lookup(newUrl); " // // we've used // // " long count = m_urlCounts.Remove(oldUrl) + m_urlCounts.Lookup(newUrl); " // // which leads to crashes only in the release version... remember, the order // the compiler sums the stuff up is undefined - this lead to problems if // oldUrl and newUrl were equal and Lookup() was processed first. // // The error was visible in Silverjuke: Already unqueued tracks were still // marked in the album view as IsInPlaylist() returns a bad value. Moreover, // this lead to crashes eg. if the tag editor was opened for these URLs. long count = m_urlCounts.Remove(oldUrl); count += m_urlCounts.Lookup(newUrl); wxASSERT( count > 0 ); m_urlCounts.Insert(newUrl, count); } void SjPlaylist::OnUrlChanged(const wxString& oldUrl, const wxString& newUrl) { if( IsInPlaylist(oldUrl) ) { // url renamed? if( !newUrl.IsEmpty() ) { long i, iCount = m_array.GetCount(); for( i = 0; i < iCount; i++ ) { m_array[i].RenameUrl(oldUrl, newUrl); } long count = m_urlCounts.Remove(oldUrl); if( count ) { m_urlCounts.Insert(newUrl, count); } } // force reloading information about this url long i, iCount = m_array.GetCount(); for( i = 0; i < iCount; i++ ) { if( m_array[i].GetUnverifiedUrl()==oldUrl ) { SjPlaylistEntry& e = m_array[i]; long playCount = e.GetPlayCount(); // as UrlChanged() simply forgets everything about the URL, preserve some data manually long flags = e.GetFlags(); e.UrlChanged(); e.SetPlayCount(playCount); e.SetFlags(flags); } } } } /******************************************************************************* * SjPlaylist - add'n'remove ******************************************************************************/ void SjPlaylist::Add(const wxArrayString& urls, bool urlsVerified) { long i, iCount = urls.GetCount(); for( i = 0; i < iCount; i++ ) { Add(urls[i], urlsVerified, 0); } } long SjPlaylist::RemoveAt(long index) { m_cacheFlags = 0; wxString url = m_array[index].GetUrl(); long restCount = m_urlCounts.Remove(url); if( restCount > 1 ) { m_urlCounts.Insert(url, restCount-1); } m_array.RemoveAt(index); return restCount-1; } void SjPlaylist::Remove(const wxArrayString& urls) { long u, urlsCount = urls.GetCount(), index; for( u = 0; u < urlsCount; u++ ) { while( (index=GetPosByUrl(urls[u])) != wxNOT_FOUND ) { RemoveAt(index); } } } long SjPlaylist::GetPosByUrl(const wxString& url) const { if( IsInPlaylist(url) ) { long i, iCount = m_array.GetCount(); for( i = 0; i < iCount; i++ ) { if( url.CmpNoCase(m_array[i].GetUrl())==0 ) { return i; } } } return wxNOT_FOUND; } long SjPlaylist::GetUnplayedCount(long currPos, long maxCnt) const { long unplayedCnt = 0; long i; if( currPos < 0 ) { currPos = 0; } // Count the unplayed titles; we're starting at the end of the list // as normally the unplayed titles are here, esp. in kiosk mode where // we use this function. for( i = (long)(m_array.GetCount())-1; i >= currPos; i-- ) { if( m_array[i].GetPlayCount() == 0 ) { unplayedCnt++; if( unplayedCnt >= maxCnt ) { wxASSERT( unplayedCnt == maxCnt ); break; } } } return unplayedCnt; } void SjPlaylist::MovePos(long srcPos, long destPos) { SjPlaylistEntry* entryToMove = m_array.Detach(srcPos); m_array.Insert(entryToMove, destPos); } void SjPlaylist::UpdateUrl(const wxString& url, bool urlVerified, long playtimeMs) { if( IsInPlaylist(url) ) { long i, iCount = m_array.GetCount(); for( i = 0; i < iCount; i++ ) { if( url.CmpNoCase(m_array[i].GetUrl())==0 ) { m_array[i].SetPlaytimeMs(playtimeMs); } } } } /******************************************************************************* * SjPlaylist - id -> index ******************************************************************************/ long SjPlaylist::GetPosById(long id) const { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); long queueCount = GetCount(), i; // search the id for( i = 0; i < queueCount; i++ ) { if( m_array.Item(i).GetId()==id ) { return i; } } // id not found return -1; } /******************************************************************************* * SjPlaylist - import / export basicss ******************************************************************************/ void SjPlaylist::LoadOverallNames() { // stuff already loaded? if( m_cacheFlags & SJ_CACHE_OVERALL_LOADED ) { return; } // load overall stuff m_cacheFlags |= SJ_CACHE_OVERALL_LOADED; long i, iCount = GetCount(); if( iCount > 0 ) { m_cacheFlags |= SJ_CACHE_LEAD_ARTIST_FINE|SJ_CACHE_ALBUM_FINE; m_overallLeadArtistName = Item(0).GetLeadArtistName(); m_overallAlbumName = Item(0).GetAlbumName(); for( i = 1; i < iCount; i++ ) { if( Item(i).GetLeadArtistName() != m_overallLeadArtistName ) { m_cacheFlags &= ~SJ_CACHE_LEAD_ARTIST_FINE; if( !(m_cacheFlags&SJ_CACHE_ALBUM_FINE) ) break; // nothing more we can find out } if( Item(i).GetAlbumName() != m_overallAlbumName ) { m_cacheFlags &= ~SJ_CACHE_ALBUM_FINE; if( !(m_cacheFlags&SJ_CACHE_LEAD_ARTIST_FINE) ) break; // nothing more we can find out } } } m_overallLeadArtistName.Trim(TRUE); m_overallLeadArtistName.Trim(FALSE); m_overallAlbumName.Trim(TRUE); m_overallAlbumName.Trim(FALSE); if( !(m_cacheFlags&SJ_CACHE_LEAD_ARTIST_FINE) || m_overallLeadArtistName.IsEmpty() ) m_overallLeadArtistName = _("Several artists"); if( !(m_cacheFlags&SJ_CACHE_ALBUM_FINE) || m_overallAlbumName.IsEmpty() ) m_overallAlbumName = _("Unknown title"); } wxString SjPlaylist::SuggestPlaylistName() { LoadOverallNames(); // try to use album or artist name wxString ret; if( !m_playlistName.IsEmpty() ) { ret = m_playlistName; } else if( (m_cacheFlags&SJ_CACHE_ALBUM_FINE) && (m_cacheFlags&SJ_CACHE_LEAD_ARTIST_FINE) ) { ret = m_overallLeadArtistName + wxT(" - ") + m_overallAlbumName; } else if( m_cacheFlags&SJ_CACHE_ALBUM_FINE ) { ret = m_overallAlbumName; } else if( m_cacheFlags&SJ_CACHE_LEAD_ARTIST_FINE ) { ret = m_overallLeadArtistName; } // done, so far return ret; } wxString SjPlaylist::SuggestPlaylistFileName() { return SjTools::EnsureValidFileNameChars(SuggestPlaylistName()); } void SjPlaylist::MergeMetaData(const SjPlaylist& o) { if( m_playlistName.IsEmpty() ) { m_playlistName = o.m_playlistName; } if( m_playlistUrl.IsEmpty() ) { m_playlistUrl = o.m_playlistUrl; } } /******************************************************************************* * SjPlaylist - Handling *.m3u Playlists ******************************************************************************/ bool SjPlaylist::AddFromM3uFile(const wxString& nativePath, long addMax, long flags) { // open file wxFileSystem fileSystem; wxFSFile* fsFile = fileSystem.OpenFile(nativePath, wxFS_READ|wxFS_SEEKABLE); if( fsFile == NULL ) { wxLogError(_("Cannot open \"%s\"."), nativePath.c_str()); return false; } // get file content wxString ext = SjTools::GetExt(nativePath); wxMBConv* fileContentMbConv = &wxConvISO8859_1; if( ext == wxT("m3u8") ) { fileContentMbConv = &wxConvUTF8; } wxString content = SjTools::GetFileContent(fsFile->GetStream(), fileContentMbConv); // GetFileContent() will also check for the BOM (Byte order mark) // process SjLineTokenizer tkz(content); wxChar* currLinePtr; wxString currTitle; long filesAdded = 0; while( (currLinePtr=tkz.GetNextLine()) ) { if( *currLinePtr == 0 ) { // skip empty lines continue; } else if( *currLinePtr == wxT('#') ) { // read comment - the comment is used by VerifyUrl() to find the track in the library if the URL cannot be found (bad path, bad name etc.) if( wxStrncmp(currLinePtr, wxT("#EXTINF:"), 8)==0 ) { currTitle = wxString(&currLinePtr[8]); currTitle = currTitle.AfterFirst(','); // skip seconds parameter from "#EXTINF:seconds,artiest ..." if( currTitle.Replace(wxT(" - "), wxT("\t\t")) < 1 )// normally, the format ist "Artist - Title" ... { // ... however, since 3.02, we also allow "Artist-Title" ... currTitle.Replace(wxT("-"), wxT("\t\t")); // ... and, later in VerifyUrl() also "Title - Artist" and "Title-Artist" :-) } } continue; } Add(wxString(currLinePtr) + "\t" + nativePath + "\t" + currTitle, FALSE, 0); currTitle.Empty(); filesAdded++; if( filesAdded >= addMax ) { break; } } delete fsFile; return TRUE; } wxString SjPlaylist::SaveAsM3u(const wxString& containerFile, long flags) { wxString ret; wxString linebreak = SjTools::GetLineBreak(); wxString urlToSave; if( !(flags & SJ_M3U_NO_EXT) ) { ret << wxT("#EXTM3U") << linebreak; } long i, iCount = GetCount(), seconds; for( i = 0; i < iCount; i++ ) { urlToSave = Item(i).GetLocalFile(containerFile); if( Item(i).IsUrlOk() ) { if( !(flags & SJ_M3U_NO_EXT) ) { seconds = Item(i).GetPlaytimeMs()/1000; ret << wxString::Format(wxT("#EXTINF:%i,%s - %s"), (int)(seconds==-1? 0 : seconds), Item(i).GetLeadArtistName().c_str(), Item(i).GetTrackName().c_str()) << linebreak; } ret << urlToSave + linebreak; } if( !SjBusyInfo::Set(urlToSave) ) break; } return ret; } /******************************************************************************* * SjPlaylist - Handling *.pls Playlists ******************************************************************************/ bool SjPlaylist::AddFromPlsFile(const wxString& nativePath, long addMax, long flags) { // open file wxFileSystem fileSystem; wxFSFile* fsFile = fileSystem.OpenFile(nativePath, wxFS_READ|wxFS_SEEKABLE); if( fsFile == NULL ) { wxLogError(_("Cannot open \"%s\"."), nativePath.c_str()); return false; } // parse file wxString content = SjTools::GetFileContent(fsFile->GetStream(), &wxConvISO8859_1); SjLineTokenizer tkz(content); wxChar* currLinePtr; wxString currLine, currBegin, currNumStr, currRest; long currNumLong; wxArrayString urls; long urlCount = 0, urlsAdded = 0, urlIndex; wxArrayString titles; long titleCount = 0; while( (currLinePtr=tkz.GetNextLine()) ) { if( *currLinePtr == 0 ) continue; // skip empty line // read line currLine = currLinePtr; // split line at '=' currBegin = currLine.BeforeFirst(wxT('=')); currBegin.Trim(TRUE); // beginning is already trimmed if( currBegin.IsEmpty() ) continue; currRest = currLine.AfterFirst(wxT('=')); currRest.Trim(FALSE); // end is already trimmed if( currRest.IsEmpty() ) continue; // does the line begin with 'file<num>' currBegin.MakeLower(); if( currBegin.StartsWith(wxT("file"), &currNumStr) ) { if( !currNumStr.ToLong(&currNumLong, 10) || currNumLong < 1 || currNumLong > 0xFFFFL ) continue; // add file if( currNumLong>urlCount ) urls.Insert(wxEmptyString, urlCount, currNumLong-urlCount); urls[currNumLong-1] = currRest; urlCount++; } else if( currBegin.StartsWith(wxT("title"), &currNumStr) ) { if( !currNumStr.ToLong(&currNumLong, 10) || currNumLong < 1 || currNumLong > 0xFFFFL ) continue; // set title, helpful for VerifyUrl(), see comments in AddFromM3u() if( currNumLong>titleCount ) titles.Insert(wxEmptyString, titleCount, currNumLong-titleCount); if( currRest.Replace(wxT(" - "), wxT("\t\t")) < 1 ) currRest.Replace(wxT("-"), wxT("\t\t")); titles[currNumLong-1] = currRest; titleCount++; } else { continue; } } urlCount = urls.GetCount(); for( urlIndex = 0; urlIndex < urlCount; urlIndex++ ) { currLine = urls[urlIndex]; if( !currLine.IsEmpty() ) { if( urlIndex < titleCount ) { currLine += "\t" + nativePath + "\t" + titles[urlIndex] /*may be empty*/; } Add(currLine, FALSE/*not verified*/, 0); urlsAdded++; if( urlsAdded >= addMax ) break; } } delete fsFile; return TRUE; } wxString SjPlaylist::SaveAsPls(const wxString& containerFile, long flags) { wxString ret; wxString linebreak = SjTools::GetLineBreak(); wxString num; wxString playlistName = SuggestPlaylistName(); wxString urlToSave; ret << wxT("[playlist]") << linebreak; if( !playlistName.IsEmpty() ) { ret << wxT("PlaylistName=") << playlistName << linebreak; } long i, iCount = GetCount(), savedCount = 0, seconds; for( i = 0; i < iCount; i++ ) { urlToSave = Item(i).GetLocalFile(wxEmptyString/*always save abs. path*/); if( Item(i).IsUrlOk() ) { num = wxString::Format(wxT("%i"), (int)i+1); seconds = Item(i).GetPlaytimeMs()/1000; ret << wxT("File") << num << wxT("=") << urlToSave << linebreak; ret << wxT("Title") << num << wxT("=") << Item(i).GetLeadArtistName() << wxT(" - ") << Item(i).GetTrackName() << linebreak; ret << wxT("Length") << num << wxT("=") << wxString::Format(wxT("%i"), seconds==-1? 0 : (int)seconds) << linebreak; savedCount++; } if( !SjBusyInfo::Set(urlToSave) ) break; } // these MUST be the last entries, // see http://docs.wasabidev.org/wasabi_developer_manual/winamp_playlists_and_playlist_directory.php#playlists_formats ret << wxString::Format(wxT("NumberOfEntries=%i"), (int)savedCount) << linebreak; ret << wxT("Version=2") << linebreak; return ret; } /******************************************************************************* * SjPlaylist - Handling Cue Sheets ******************************************************************************/ bool SjPlaylist::AddFromCueFile(const wxString& nativePath, long addMax, long flags) { // open file wxFileSystem fileSystem; wxFSFile* fsFile = fileSystem.OpenFile(nativePath, wxFS_READ|wxFS_SEEKABLE); if( fsFile == NULL ) { wxLogError(_("Cannot open \"%s\"."), nativePath.c_str()); return false; } // parse file wxString content = SjTools::GetFileContent(fsFile->GetStream(), &wxConvISO8859_1); SjLineTokenizer tkz(content); wxChar* currLinePtr; wxString currLine; long filesAdded = 0; while( (currLinePtr=tkz.GetNextLine()) ) { if( *currLinePtr == 0 ) continue; // skip empty line // read line currLine = currLinePtr; currLine.Replace(wxT("\t"), wxT(" ")); if( currLine.Left(5).Upper()!=wxT("FILE ") ) continue; // get stuff between quotes if( currLine.Find('"')!=-1 ) { currLine = currLine.AfterFirst('"').BeforeLast('"'); } else { currLine = currLine.Mid(4); currLine.Trim(FALSE); currLine = currLine.BeforeFirst(' '); } currLine.Trim(TRUE); currLine.Trim(FALSE); if( currLine.IsEmpty() ) continue; // file already added? - this is quite usual for cue-sheets as they may use a // large file and the INDEX parameter. however, we only want the referenced files if( GetPosByUrl(currLine) != wxNOT_FOUND ) continue; // add file Add(currLine + "\t" + nativePath, FALSE/*not verified*/, 0); filesAdded++; if( filesAdded >= addMax ) break; } delete fsFile; return TRUE; } wxString SjPlaylist::SaveAsCue(const wxString& containerFile, long flags) { wxString ret; wxString linebreak = SjTools::GetLineBreak(); wxString urlToSave; ret << wxT("PERFORMER \"") << GetLeadArtistName() << wxT("\"") << linebreak; ret << wxT("TITLE \"") << GetAlbumName() << wxT("\"") << linebreak; long i, iCount = GetCount(); for( i = 0; i < iCount; i++ ) { urlToSave = Item(i).GetLocalFile(wxEmptyString/*always save abs. path*/); if( Item(i).IsUrlOk() ) { #ifdef __WXMSW__ if( flags & SJ_CUE_SHORTPATHS ) { wxFileName fn(urlToSave); urlToSave = fn.GetShortPath(); } #endif ret << wxT("FILE \"") << urlToSave << wxT("\" WAVE") << linebreak; ret << wxT(" TRACK ") << wxString::Format(i<=99? wxT("%02i") : wxT("%i"), (int)i+1) << wxT(" AUDIO") << linebreak; ret << wxT(" TITLE \"") << Item(i).GetTrackName() << wxT("\"") << linebreak; ret << wxT(" PERFORMER \"") << Item(i).GetLeadArtistName() << wxT("\"") << linebreak; ret << wxT(" INDEX 01 00:00:00") << linebreak; } if( !SjBusyInfo::Set(urlToSave) ) break; } return ret; } /******************************************************************************* * SjPlaylist - Handling XSPF- and XML/iTunes-playlists ******************************************************************************/ bool SjPlaylist::AddFromXspfXmlWplFile(const wxString& nativePath, long addMax, long flags) { // open file wxFileSystem fileSystem; wxFSFile* fsFile = fileSystem.OpenFile(nativePath, wxFS_READ|wxFS_SEEKABLE); if( fsFile == NULL ) { wxLogError(_("Cannot open \"%s\"."), nativePath.c_str()); return false; } /* desired XSPF-Format ... <track> <creator>We Are Scientists</creator> <album>the album name</album> <title>Nobody Move, Nobody Get Hurt file:///mp3s/titel_1.mp3 ... */ wxString content = SjTools::GetFileContent(fsFile->GetStream(), &wxConvUTF8); content.Replace(wxT("\n"), wxT("")); // remove line-ends, this allows to put tags over several lines as content.Replace(wxT("\r"), wxT("")); // \n \n \n bla \n \n \n. // below, we will convert the character "<" to a linebreak ... /* ... convert the following XML/iTunes format to XSPF ... ArtistLed Zeppelin AlbumCoda NameOzone Baby Locationfile://localhost/Volumes/music/mp3/L/Led%20Zeppelin/1982%20Coda/05%20Ozone%20Baby.mp3 ... */ if( content.Replace(wxT("Name"), wxT("")) > 0 ) { content.Replace(wxT("<key>Artist</key><string>"), wxT("<creator>")); content.Replace(wxT("<key>Album</key><string>"), wxT("<album>")); content.Replace(wxT("<key>Location</key><string>"), wxT("<location>")); content.Replace(wxT("/dict"), wxT("/track")); } /* ... convert the following Windows Media Player/WPL format to XSPF ... <?wpl version="1.0"?> <smil> <head> <meta name="QInfo" content="..."/> ... <title>test ... */ if( content.Find(wxT("")) > 0 ) { content.Replace(wxT("\""), wxT("")); content.Replace(wxT("'"), wxT("'")); // ' is no real html entity. normal entities are handled below } } // treat "<" as a new line mark, this allows easy parsing without using a XML tree content.Replace(wxT("<"), wxT("\n")); // go through the content long filesAdded = 0; SjLineTokenizer tkz(content); wxChar* currLinePtr; wxString lastArtistName; wxString lastAlbumName; wxString lastTrackName; wxString lastLocation; wxHtmlEntitiesParser entPars; while( (currLinePtr=tkz.GetNextLine()) ) { if( *currLinePtr == 0 ) continue; // skip empty line // remove xspf prefix, if any (used by some apps, see http://wiki.xiph.org/List_of_known_XSPF_extensions ) if( wxStrncmp(currLinePtr, wxT("xspf:"), 5)==0 ) currLinePtr += 5; if( wxStrncmp(currLinePtr, wxT("creator"), 7)==0 ) { // set last artist name lastArtistName = currLinePtr; lastArtistName = lastArtistName.AfterFirst(wxT('>')); lastArtistName = entPars.Parse(lastArtistName); } else if( wxStrncmp(currLinePtr, wxT("album"), 5)==0 ) { // set last album name lastAlbumName = currLinePtr; lastAlbumName = lastAlbumName.AfterFirst(wxT('>')); lastAlbumName = entPars.Parse(lastAlbumName); } else if( wxStrncmp(currLinePtr, wxT("title"), 5)==0 ) { // set last track name lastTrackName = currLinePtr; lastTrackName = lastTrackName.AfterFirst(wxT('>')); lastTrackName = entPars.Parse(lastTrackName); } else if( wxStrncmp(currLinePtr, wxT("location"), 8)==0 ) { // set last location lastLocation = currLinePtr; lastLocation = lastLocation.AfterFirst(wxT('>')); lastLocation = entPars.Parse(lastLocation); } else if( wxStrncmp(currLinePtr, wxT("/track"), 6)==0 ) { // flush if( lastLocation.IsEmpty() && !lastTrackName.IsEmpty() && !lastArtistName.IsEmpty() ) { lastLocation = wxT("stub://") + SjTools::EnsureValidFileNameChars(lastArtistName) + wxT("-") + SjTools::EnsureValidFileNameChars(lastAlbumName) + wxT("-") + SjNormaliseString(lastTrackName, 0) + wxT(".mp3"); // in 99.99% of all cases, this stub location will fail, however, this creates a fine entry in the playlist } if( !lastLocation.IsEmpty() ) { Add(lastLocation + "\t" + nativePath + "\t" + lastArtistName + "\t" + lastAlbumName + "\t" + lastTrackName, FALSE/*not verified*/, 0); filesAdded++; if( filesAdded >= addMax ) break; } lastArtistName.Empty(); lastAlbumName.Empty(); lastTrackName.Empty(); lastLocation.Empty(); } } delete fsFile; return TRUE; } wxString SjPlaylist::SaveAsXspf(const wxString& containerFile, long flags) { wxString ret, url, realUrl; wxString linebreak = SjTools::GetLineBreak(); // prepare date wxDateTime dt = wxDateTime::Now().ToUTC(); wxString dtString = dt.Format(wxT("%Y-%m-%dT%H:%M:%S+00:00")); // write prologue ret << wxT("") << linebreak; ret << wxT("") << linebreak; ret << wxT("") << dtString << wxT("") << linebreak; ret << wxT("") << wxString::Format(wxT("%s %i.%i"), SJ_PROGRAM_NAME, SJ_VERSION_MAJOR, SJ_VERSION_MINOR) << wxT("") << linebreak; ret << wxT("") << linebreak; // write the tracks - the recommended order is location-title-creator-album, see http://wiki.xiph.org/index.php/XSPF_v1_Notes_and_Errata long i, iCount = GetCount(); for( i = 0; i < iCount; i++ ) { ret << wxT("\t") << linebreak; // write url ret << wxT("\t\t") << SjTools::Htmlentities(Item(i).GetUrl()) << wxT("") << linebreak; // write title ret << wxT("\t\t") << SjTools::Htmlentities(Item(i).GetTrackName()) << wxT("") << linebreak; // write artist ret << wxT("\t\t") << SjTools::Htmlentities(Item(i).GetLeadArtistName()) << wxT("") << linebreak; // write album ret << wxT("\t\t") << SjTools::Htmlentities(Item(i).GetAlbumName()) << wxT("") << linebreak; ret << wxT("\t") << linebreak; if( !SjBusyInfo::Set(url) ) break; } // write epilogue ret << wxT("") << linebreak; ret << wxT("") << linebreak; return ret; } /******************************************************************************* * SjPlaylist - Save Dialogs & Co. ******************************************************************************/ bool SjPlaylist::SaveAsDlg(wxWindow* parentWindow) { bool ret; SjBusyInfo* busyInfo = NULL; SJ_WINDOW_DISABLER (parentWindow); SjExtList extList = g_mainFrame->m_moduleSystem.GetAssignedExt(SJ_EXT_PLAYLISTS_WRITE); // create the dialog wxFileDialog dlg(parentWindow, _("Save playlist"), wxT(""), SuggestPlaylistFileName(), extList.GetFileDlgStr(wxFD_SAVE), wxFD_SAVE|wxFD_OVERWRITE_PROMPT|wxFD_CHANGE_DIR); // set the last extension used wxString lastPlaylistFormat = g_tools->m_config->Read(wxT("main/playlistFormat")); long filterIndex = extList.GetFileDlgIndex(lastPlaylistFormat); if( filterIndex == -1 ) filterIndex = extList.GetFileDlgIndex(wxT("m3u")); dlg.SetFilterIndex(filterIndex); // show the dialog if( dlg.ShowModal() != wxID_OK ) return FALSE; // postprocessing wxString selPath, selExt; extList.GetFileDlgPath(dlg, selPath, selExt); if( selExt != lastPlaylistFormat ) g_tools->m_config->Write(wxT("main/playlistFormat"), selExt); if( GetCount() > 500 ) { busyInfo = new SjBusyInfo(parentWindow, _("Save playlist")); } ret = SaveAsFile(selPath, selExt, 0); if( busyInfo ) { delete busyInfo; } return ret; } bool SjPlaylist::SaveAsFile(const wxString& path, const wxString& type, long flags) { wxString fileContent; wxMBConv* fileContentMbConv = &wxConvUTF8; wxBusyCursor busy; if( type == wxT("cue") ) { fileContent = SaveAsCue(path, flags); fileContentMbConv = &wxConvISO8859_1; } else if( type == wxT("pls") ) { fileContent = SaveAsPls(path, flags); fileContentMbConv = &wxConvISO8859_1; } else if( type == wxT("xspf") ) { fileContent = SaveAsXspf(path, flags); } else /* "m3u" or "m3u8" */ { fileContent = SaveAsM3u(path, flags); if( type != wxT("m3u8") /*else leave default*/ ) fileContentMbConv = &wxConvISO8859_1; } // for ISO 8859-1, convert every character > 0xFF to the character "?" if( fileContentMbConv == &wxConvISO8859_1 ) { if( SjTools::ReplaceNonISO88591Characters(fileContent) ) { /* wxLogWarning(wxT("Because of limitations of the file format, some characters could not be written to \"%s\"."), path.c_str()); */ } } // do write wxFile file(path, wxFile::write); if( !file.IsOpened() ) { // TRANSLATORS: %s will be replaced by a filename wxLogError(_("Cannot write \"%s\"."), path.c_str()); return false; } if( fileContentMbConv == &wxConvUTF8 ) { static const unsigned char utf8byteOrderMark[3] = {0xEF, 0xBB, 0xBF}; file.Write(utf8byteOrderMark, 3); } if( !file.Write(fileContent, *fileContentMbConv) ) { wxLogError(_("Cannot write \"%s\"."), path.c_str()); return false; } return true; } /******************************************************************************* * SjPlaylist - Add Dialogs & Co. ******************************************************************************/ bool SjPlaylist::AddFromFileDlg(wxWindow* parentWindow) { SJ_WINDOW_DISABLER(parentWindow); // create the dialog wxFileDialog dlg(parentWindow, _("Open playlist"), wxT(""), SuggestPlaylistFileName(), g_mainFrame->m_moduleSystem.GetAssignedExt(SJ_EXT_PLAYLISTS_READ).GetFileDlgStr(), wxFD_OPEN|wxFD_CHANGE_DIR); // show the dialog if( dlg.ShowModal() != wxID_OK ) return FALSE; // do add return AddFromFile(dlg.GetPath()); } bool SjPlaylist::AddFromFile(const wxString& nativePath, long addMax, long flags) { wxString ext = SjTools::GetExt(nativePath); bool ret; if( !g_mainFrame ) return FALSE; if( addMax <= 0 ) addMax = 0x7FFFFFFL; // load basic urls - the AddFrom*() function should not validate the files! if( ext == wxT("pls") ) { ret = AddFromPlsFile(nativePath, addMax, flags); } else if( ext == wxT("cue") ) { ret = AddFromCueFile(nativePath, addMax, flags); } else if( ext == wxT("xspf") || ext == wxT("xml") || ext == wxT("wpl") ) { ret = AddFromXspfXmlWplFile(nativePath, addMax, flags); } else /* "m3u", "m3u8" */ { ret = AddFromM3uFile(nativePath, addMax, flags); } if( !ret ) { wxLogError(_("Cannot open \"%s\"."), nativePath.c_str()); return FALSE; } return TRUE; } silverjuke-16.2.3/src/sjbase/playlist.h000066400000000000000000000243071266006671500200550ustar00rootroot00000000000000/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: playlist.h * Authors: Björn Petersen * Purpose: Silverjuke playlist handling * ******************************************************************************/ #ifndef __SJ_PLAYLIST_H__ #define __SJ_PLAYLIST_H__ class SjPlaylist; class SjPlaylistAddInfo { public: // SjPlaylistAddInfo is used for add. information about a // SjPlaylistEntry object. For performance reasons in huge playlists, // the data are loaded "just in time". SjPlaylistAddInfo () { m_what = 0; m_playtimeMs = -1; m_playCount = 0; m_flags = 0; } // what add. information are set // misc = track, artist, album and playtime #define SJ_ADDINFO_PLAYCOUNT 0x04 #define SJ_ADDINFO_MISC 0x08 long m_what; // the add. information wxString m_trackName; wxString m_leadArtistName; wxString m_albumName; long m_playtimeMs; // -1 for unknown long m_playCount; #define SJ_PLAYLISTENTRY_ERRONEOUS 0x01 #define SJ_PLAYLISTENTRY_AUTOPLAY 0x02 #define SJ_PLAYLISTENTRY_PLAYNEXT 0x04 // mainly for the queue #define SJ_PLAYLISTENTRY_MOVED_DOWN 0x20 // delayed due to avoid boredom long m_flags; }; class SjPlaylistEntry { public: // constructor / destructor SjPlaylistEntry (SjPlaylist* playlist, const wxString& url, bool verified, long flags) { m_playlist = playlist, m_url = url; m_urlVerified = verified; m_urlOk = verified; m_addInfo = NULL; m_id = s_nextId++; if( flags ) SetFlags(flags); } ~SjPlaylistEntry () { if(m_addInfo) { delete m_addInfo; } } // get various URL information bool IsUrlOk () { if(!m_urlVerified) { VerifyUrl(); } return m_urlOk; } wxString GetUrl () { if(!m_urlVerified) { VerifyUrl(); } return m_url; } wxString GetUnverifiedUrl () { return m_url; } void RenameUrl (const wxString& oldUrl, const wxString& newUrl) { if(m_url==oldUrl) m_url=newUrl; } void UrlChanged () { if(m_addInfo) { delete m_addInfo; m_addInfo=NULL; } } wxString GetLocalFile (const wxString& containerUrl); // get the ID, the ID is unique even for different URLs that are several times in the playlist // and they stay equal if the playlist is modified long GetId () const { return m_id; } // get/set the playcount long GetPlayCount () const { return m_addInfo? m_addInfo->m_playCount : 0; } void SetPlayCount (long cnt) { CheckAddInfo(SJ_ADDINFO_PLAYCOUNT); m_addInfo->m_playCount = cnt; } // get/set the flags long GetFlags () const { return m_addInfo? m_addInfo->m_flags : 0; } void SetFlags (long f) { CheckAddInfo(SJ_ADDINFO_PLAYCOUNT); m_addInfo->m_flags = f; } void SetFlag (long f) { SetFlags(GetFlags()|f); } // get information about the track wxString GetLeadArtistName () { CheckAddInfo(SJ_ADDINFO_MISC); return m_addInfo->m_leadArtistName; } wxString GetTrackName () { CheckAddInfo(SJ_ADDINFO_MISC); return m_addInfo->m_trackName; } wxString GetAlbumName () { CheckAddInfo(SJ_ADDINFO_MISC); return m_addInfo->m_albumName; } long GetPlaytimeMs () { CheckAddInfo(SJ_ADDINFO_MISC); return m_addInfo->m_playtimeMs; } // update some information void SetPlaytimeMs (long ms) { CheckAddInfo(SJ_ADDINFO_MISC); if(ms>0)m_addInfo->m_playtimeMs=ms; } void SetRealtimeInfo (const wxString& info); // make sure, the operator = is NOT used, // always use references for speed reasons instead #ifdef __WXDEBUG__ SjPlaylistEntry& operator = (const SjPlaylistEntry& o) { wxASSERT(0); return *this; } #endif private: // private stuff SjPlaylist* m_playlist; wxString m_url; bool m_urlVerified; bool m_urlOk; // For synchronizing eg. with the ringbuffer, // we need unique Queue IDs that // - do not change if the playlist is modified. // - differ if the same url is added twice long m_id; static long s_nextId; // additional information are loaded as needed SjPlaylistAddInfo* m_addInfo; void CheckAddInfo (long what) { if(m_addInfo==NULL||!(m_addInfo->m_what&what)) { LoadAddInfo(what); } } void LoadAddInfo (long what); void VerifyUrl (); }; WX_DECLARE_OBJARRAY(SjPlaylistEntry, SjArrayPlaylistEntry); class SjPlaylist { public: SjPlaylist () { m_cacheFlags=0; } // clear playlist void Clear () { m_cacheFlags=0; m_array.Clear(); m_urlCounts.Clear(); }; // adding URLs to playlist void Add (const wxArrayString& urls, bool urlsVerified); void Add (const wxString& url, bool urlVerified, long flags) { m_cacheFlags=0; m_array.Add(new SjPlaylistEntry(this, url, urlVerified, flags)); m_urlCounts.Insert(url, m_urlCounts.Lookup(url)+1); } void Insert (const wxString& url, long addBeforeThisIndex, bool urlVerified, long flags) { m_cacheFlags=0; m_array.Insert(new SjPlaylistEntry(this, url, urlVerified, flags), addBeforeThisIndex); m_urlCounts.Insert(url, m_urlCounts.Lookup(url)+1); } // Update some information, urlVerified should normally be TRUE as // this function is normally called after an continious playback. void UpdateUrl (const wxString& url, bool urlVerified, long playtimeMs); // removing URLs from playlist // RemoveAt() returns the number of the same URLs still in the playlist long RemoveAt (long index); void Remove (const wxArrayString&); // search a given URL and return the first match long GetPosByUrl (const wxString& url) const; long GetPosById (long id) const; // getting playlist information long GetCount () const { return m_array.GetCount(); } SjPlaylistEntry& Item (size_t index) const { return m_array.Item(index); } SjPlaylistEntry& operator[] (size_t index) const { return m_array.Item(index); } bool IsInPlaylist (const wxString& url) const { return m_urlCounts.Lookup(url)!=0; } long GetCountInPlaylist (const wxString& url) const { return m_urlCounts.Lookup(url); } // get the number of unplayed titles; if you just want to // check for a given border, you can set a border at which counting is aborted. long GetUnplayedCount (long currPos=-1, long maxCnt=-1) const; // import / export #define SJ_M3U_NO_EXT 0x01 #define SJ_CUE_SHORTPATHS 0x02 bool AddFromFileDlg (wxWindow* parent); bool AddFromFile (const wxString& nativePath, long addMax=0, long flags=0); bool SaveAsDlg (wxWindow* parent); bool SaveAsFile (const wxString& path, const wxString& type, long flags=0); wxString SaveAsM3u (const wxString& containerFile, long flags=0); wxString SaveAsPls (const wxString& containerFile, long flags=0); wxString SaveAsCue (const wxString& containerFile, long flags=0); wxString SaveAsXspf (const wxString& containerFile, long flags=0); // handling meta data, on merging, the meta data of the // given playlist have a higher priority. void MergeMetaData (const SjPlaylist&); wxString GetLeadArtistName () { LoadOverallNames(); return m_overallLeadArtistName; } wxString GetAlbumName () { LoadOverallNames(); return m_overallAlbumName; } wxString SuggestPlaylistName (); wxString SuggestPlaylistFileName (); void RehashUrl (const wxString& oldUrl, const wxString& newUrl); // OnUrlChanged() checks if the old url is in the playlist. If so, // all references are modified to use the new url. void OnUrlChanged (const wxString& oldUrl, const wxString& newUrl); // Move void MovePos (long srcPos, long destPos); private: // The playlist data - we hold the data as an sorted array // and as a hash for fast lookup a specific URL SjArrayPlaylistEntry m_array; SjSLHash m_urlCounts; // meta data wxString m_playlistName; wxString m_playlistUrl; // cache and overall names #define SJ_CACHE_OVERALL_LOADED 0x01 #define SJ_CACHE_LEAD_ARTIST_FINE 0x02 #define SJ_CACHE_ALBUM_FINE 0x04 int m_cacheFlags; wxString m_overallLeadArtistName; wxString m_overallAlbumName; void LoadOverallNames (); // import / export bool AddFromM3uFile (const wxString& nativePath, long addMax, long flags); bool AddFromPlsFile (const wxString& nativePath, long addMax, long flags); bool AddFromCueFile (const wxString& nativePath, long addMax, long flags); bool AddFromXspfXmlWplFile (const wxString& nativePath, long addMax, long flags); }; #endif // __SJ_PLAYLIST_H__ silverjuke-16.2.3/src/sjbase/queue.cpp000066400000000000000000000707501266006671500176760ustar00rootroot00000000000000/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: queue.cpp * Authors: Björn Petersen * Purpose: Silverjuke player * ******************************************************************************/ #include /******************************************************************************* * Constructor ******************************************************************************/ SjQueue::SjQueue() : m_dummyPlaylistInfo(&m_playlist, SJ_PROGRAM_NAME /*used. eg. by the vis.*/, TRUE, 0) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); m_pos = -1; m_shuffle = SJ_DEF_SHUFFLE_STATE; m_shuffleIntensity = SJ_DEF_SHUFFLE_INTENSITY; m_repeat = SJ_REPEAT_OFF; m_repeatRound = 1; m_playNextId = 0; m_queueFlags = SJ_QUEUEF_DEFAULT; m_boredomTrackMinutes = SJ_DEF_BOREDOM_TRACK_MINUTES; m_boredomArtistMinutes = SJ_DEF_BOREDOM_ARTIST_MINUTES; m_isInitialized = false; CleanupNextShufflePos(); } /******************************************************************************* * Previous / Next ******************************************************************************/ bool SjQueue::IsBoring(const wxString& artistName, const wxString& trackName, unsigned long currTimestamp) const { if( m_queueFlags&SJ_QUEUEF_BOREDOM_TRACKS ) { unsigned long itemTimestamp = m_historyTracks.Lookup(artistName+wxT("/")+trackName); if( itemTimestamp!=0 && SjTimestampDiff(itemTimestamp, currTimestamp) <= (unsigned long)(m_boredomTrackMinutes*60*1000) ) return true; // this is boring: track found in "boredom track list", position not allowed } if( m_queueFlags&SJ_QUEUEF_BOREDOM_ARTISTS ) { unsigned long itemTimestamp = m_historyArtists.Lookup(artistName); if( itemTimestamp!=0 && SjTimestampDiff(itemTimestamp, currTimestamp) <= (unsigned long)(m_boredomArtistMinutes*60*1000) ) return true; // this is boring: track found in "boredom artist list", position not allowed } return false; // this is not boring :-) position allowed } long SjQueue::GetNextShufflePos_GetPossibleTrack(bool regardBoredom, long repeatRound, unsigned long currTimestamp) { // get an array of possible tracks; this array still does not regard the boredom settings wxArrayLong possibleTracks; long i, cnt = GetCount(); for( i = 0; i < cnt; i++ ) { if( m_playlist[i].GetPlayCount() < repeatRound && i != m_pos ) { possibleTracks.Add(i); } } // select a track by random long nextPos = -1, maxRnd; while( 1 ) { // any tracks left possible? cnt = possibleTracks.GetCount(); if( cnt == 0 ) break; // nothing found :-( // regard the shuffle intensity and calculate the max. index maxRnd = cnt; if( m_shuffleIntensity >= 1 && m_shuffleIntensity <= 100 ) { maxRnd = (m_shuffleIntensity*cnt) / 100; if( maxRnd <= 3 ) maxRnd = 3; if( maxRnd > cnt ) maxRnd = cnt; } // calculate a random position i = SjTools::Rand(maxRnd); if( !regardBoredom || !IsBoring(possibleTracks[i], currTimestamp) ) { nextPos = possibleTracks[i]; break; // position found :-) } // position bad by boredom settings - remove this from the possible tracks possibleTracks.RemoveAt(i); } // done return nextPos; } long SjQueue::GetNextShufflePos(int flags, unsigned long currTimestamp) { wxASSERT( wxThread::IsMain() ); // if not yet done, calculate the next shuffle position // this does not alter the queue! if( m_nextShufflePosFor != m_pos ) { // collect all possible tracks and calculate the next shuffled track. // // as the new boredom methods compare the artist and track names, and retrieving this // may be very time consuming (database- and/or ID3-tag-access) we check this *very* last - // so, possibleTracks may still contain positions not possible due to boredom settings! m_nextShufflePosFor = m_pos; m_nextShufflePos = GetNextShufflePos_GetPossibleTrack(true, m_repeatRound, currTimestamp); if( m_nextShufflePos == -1 ) { if( m_repeat == SJ_REPEAT_ALL ) { m_nextShufflePos = GetNextShufflePos_GetPossibleTrack(true, m_repeatRound+1, currTimestamp); if( m_nextShufflePos != -1 ) { m_nextShuffleIncRepeatRound = true; } else { m_nextShufflePos = GetNextShufflePos_GetPossibleTrack(false, m_repeatRound, currTimestamp); if( m_nextShufflePos == -1 && GetCount() ) { m_nextShufflePos = GetNextShufflePos_GetPossibleTrack(false, m_repeatRound+1, currTimestamp); if( m_nextShufflePos != -1 ) { m_nextShuffleIncRepeatRound = true; } else { m_nextShufflePos = m_pos; } } } } else { m_nextShufflePos = GetNextShufflePos_GetPossibleTrack(false, m_repeatRound, currTimestamp); } } wxASSERT( m_nextShufflePosFor == m_pos ); } // return the next shuffle position, this may increase the repeat round long newPos = m_nextShufflePos; if( !(flags&SJ_PREVNEXT_LOOKUP_ONLY) ) { if( m_nextShuffleIncRepeatRound ) { IncRepeatRound(); } CleanupNextShufflePos(); } return newPos; } long SjQueue::GetNextPos(int flags) { wxASSERT( wxThread::IsMain() ); long queueCount = GetCount(); long newPos = -1; unsigned long currTimestamp = SjTools::GetMsTicks(); // First, check if we have a "play next" ID and setup "newPos" for this /////////////////////////////////////////////////////////////////////// if( m_playNextId ) { // Notes: m_playNextId is set if the enqueing option "play track next" is // used. As this does not work with the normal shuffle/repeat single/etc. modes, // we ignore these modes for this single ID and play this ID always next. If the // user selects "play track next" multiple times, only the last track ID is // remembered and used - if the user wants to have a special order, he should // really turn shuffle off. newPos = m_playlist.GetPosById(m_playNextId); if( newPos < 0 || m_playlist[newPos].GetPlayCount()>0 ) m_playNextId = 0; } // Second, see what to do /////////////////////////////////////////////////////////////////////// if( queueCount == 0 || (m_pos < 0 && !(flags&SJ_PREVNEXT_INIT)) ) { // queue is empty, there is no next position newPos = -1; } else if( m_playNextId != 0 ) { // play the track maked as "play next" - this overrules shuffle and repeat settings wxASSERT( newPos >= 0 && newPos < queueCount ); if( !(flags&SJ_PREVNEXT_LOOKUP_ONLY) ) m_playNextId = 0; } else if( m_repeat == SJ_REPEAT_SINGLE && m_pos >= 0 && (flags&SJ_PREVNEXT_REGARD_REPEAT) ) { // repeat the current position newPos = m_pos; } else if( m_shuffle ) { // shuffle to any position newPos = GetNextShufflePos(flags, currTimestamp); } else if( m_pos >= queueCount-1 ) { // at end of queue, repeat all? // We do not regard the boredom settings in this case (normally, all files are just played, // we cannot optimize the order to regard the boredom settings). if( m_repeat == SJ_REPEAT_ALL && (flags&SJ_PREVNEXT_REGARD_REPEAT) ) { if( !(flags&SJ_PREVNEXT_LOOKUP_ONLY) ) IncRepeatRound(); newPos = 0; } else { newPos = -1; } } else { // just the next position newPos = m_pos + 1; // regard the "avoid boredeom" settings, see http://www.silverjuke.net/forum/topic-2610.html if( !(flags&SJ_PREVNEXT_LOOKUP_ONLY) ) { long betterPos = newPos; while( betterPos < queueCount && IsBoring(betterPos, currTimestamp) ) { betterPos++; } if( betterPos < queueCount && betterPos != newPos ) { // we will alter the playlist: // // log some information about this, we had some trouble ourselves to understand this // behaviour, see http://www.silverjuke.net/forum/topic-2866.html // (note that wxLogInfo() should be placed _before_ MovePos() - after MovePos(), the betterPos is unusable ...) // // however, do not pop up a message box, this may disturb alot as this may happen _any_time, not only just after enqueing long markPosAsMoved; for( markPosAsMoved = newPos; markPosAsMoved < betterPos; markPosAsMoved++ ) { m_playlist.Item(markPosAsMoved).SetFlag(SJ_PLAYLISTENTRY_MOVED_DOWN); } wxLogInfo(wxT("%s moved up due to avoid bordedom settings"), m_playlist.Item(betterPos).GetUrl().c_str()); // move "betterPos" to "newPos", the returned "newPos" will not be changed wxASSERT( betterPos > newPos ); m_playlist.MovePos(betterPos, newPos); } } } wxASSERT( newPos == -1 || (newPos >= 0 && newPos < GetCount()) ); return newPos; } long SjQueue::GetPrevPos(int flags) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); long queueCount = GetCount(); long newPos; if( queueCount == 0 || m_pos < 0 ) { // queue is empty, there is no previous position newPos = -1; } else if( m_repeat == SJ_REPEAT_SINGLE && m_pos >= 0 && (flags&SJ_PREVNEXT_REGARD_REPEAT) ) { // repeat the current position newPos = m_pos; } else if( m_shuffle ) { // shuffle to any position newPos = PopFromHistory(flags); } else if( m_pos == 0 ) { // at start of queue if( m_repeat == SJ_REPEAT_ALL && (flags&SJ_PREVNEXT_REGARD_REPEAT) ) { newPos = queueCount-1; } else { newPos = -1; } } else { // just the previous position newPos = m_pos - 1; } return newPos; } /******************************************************************************* * Get / Set Information ******************************************************************************/ long SjQueue::GetClosestPosByUrl(const wxString& url) const { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); if( m_playlist.IsInPlaylist(url) ) { long queueCount = GetCount(), i; // first, search forward for( i = m_pos; i < queueCount; i++ ) { if( m_playlist.Item(i).GetUrl()==url ) { return i; } } // then, search backward for( i = queueCount-1; i >= 0; i-- ) { if( m_playlist.Item(i).GetUrl()==url ) { return i; } } } // url not found return wxNOT_FOUND; } long SjQueue::GetAllPosByUrl(const wxString& url, wxArrayLong& ret, bool unplayedOnly) const { // This function may only be called from the main thread. // // The returned array is not cleared here - by design - if this is wanted, the // caller is responsible for this. wxASSERT( wxThread::IsMain() ); long allUrlCount = m_playlist.GetCountInPlaylist(url); if( allUrlCount > 0 ) { long queueCount = GetCount(), i; // search all urls for( i = 0; i < queueCount; i++ ) { SjPlaylistEntry& item = m_playlist.Item(i); if( item.GetUrl()==url ) { if( !unplayedOnly || (item.GetPlayCount()==0 || i==m_pos) ) { ret.Add(i); if( (long)ret.GetCount() == allUrlCount ) { break; } } } } } wxASSERT( (long)ret.GetCount() == allUrlCount || unplayedOnly ); return (long)ret.GetCount(); } wxString SjQueue::GetUrlByPos(long pos) const { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); // use current queue position? if( pos < 0 ) { pos = m_pos; } // position valid? if( pos < 0 || pos >= GetCount() ) { return wxEmptyString; } // return URL return m_playlist.Item(pos).GetUrl(); } wxArrayString SjQueue::GetUrls() const { wxArrayString ret; long queueCount = GetCount(), i; for( i = 0; i < queueCount; i++ ) { ret.Add(m_playlist.Item(i).GetUrl()); } return ret; } wxArrayString SjQueue::GetUrlsByIds(const SjLLHash& ids) const { wxArrayString ret; long idsCount = ids.GetCount(); long queueCount = GetCount(), i; // I think, iterating the playlist and looking up all ids // is better than iterating the IDs and looking up the URLs. // Moreover, this preserves the order of the URLs. for( i = 0; i < queueCount && idsCount > 0; i++ ) { if( ids.Lookup(m_playlist.Item(i).GetId()) ) { ret.Add(m_playlist.Item(i).GetUrl()); idsCount--; } } return ret; } static int SjQueue_GetPosByIds_Sort(long* i1, long* i2) { return (*i1)-(*i2); } wxArrayLong SjQueue::GetPosByIds(const SjLLHash& ids) const { wxArrayLong ret; long idsCount = ids.GetCount(); long queueCount = GetCount(), i; for( i = 0; i < queueCount && idsCount > 0; i++ ) { if( ids.Lookup(m_playlist.Item(i).GetId()) ) { ret.Add(i); idsCount--; } } ret.Sort(SjQueue_GetPosByIds_Sort); return ret; } wxString SjQueue::GetUrlById(long id) const { long queueCount = GetCount(), i; for( i = 0; i < queueCount; i++ ) { if( m_playlist.Item(i).GetId() == id ) { return m_playlist.Item(i).GetUrl(); } } return wxEmptyString; } SjPlaylistEntry& SjQueue::GetInfo(long pos/*-1 for current*/) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); // use current queue position? if( pos < 0 ) { pos = m_pos; } // position valid? if( pos < 0 || pos >= GetCount() ) { return m_dummyPlaylistInfo; } return m_playlist[pos]; } void SjQueue::AddToHistory(long pos) { // position vaild? if( pos < 0 || pos >= GetCount() ) return; SjPlaylistEntry& item = m_playlist.Item(pos); // add the current position (if any) to the history if it // differs from the last long historyCount = m_historyIds.GetCount(); long lastPlayedId = (historyCount>0)? m_historyIds.Last() : -1; long newPlayedId = item.GetId(); if( lastPlayedId != newPlayedId ) { m_historyIds.Add(newPlayedId); } // Cleanup every ~ 100 tracks inserted ... #define MAX_HISTORY_SIZE 100 if( historyCount > MAX_HISTORY_SIZE ) // decrease the history size if it is "too large" { // (i think goin' back 100 tracks is enough - remember this is only used in shuffle mode) m_historyIds.RemoveAt(0, MAX_HISTORY_SIZE/10); } // moreover, add the current track artist and title - // this is needed for the boredom functions unsigned long currTimestamp = SjTools::GetMsTicks(); wxString trackName = item.GetTrackName(); wxString artistName = item.GetLeadArtistName(); m_historyTracks .Insert(artistName+wxT("/")+trackName, currTimestamp); m_historyArtists.Insert(artistName, currTimestamp); // Cleanup every ~ 100 tracks inserted ... if( (m_historyTracks.GetCount() % 100) == 0 ) { for( int cleanupRound = 0; cleanupRound <= 1; cleanupRound ++ ) { unsigned long stayMs = (cleanupRound == 0? m_boredomTrackMinutes : m_boredomArtistMinutes) * 60 * 1000; SjSLHash* hash = cleanupRound == 0? &m_historyTracks : &m_historyArtists; wxString itemString; unsigned long itemTimestamp; SjHashIterator iterator; while( (itemTimestamp=hash->Iterate(iterator, itemString)) != 0 ) { if( SjTimestampDiff(itemTimestamp, currTimestamp) > stayMs ) { // the iteration functionality allows us to remove the // current element hash->Remove(itemString); } } } } } long SjQueue::PopFromHistory(int flags) { long i; // must be signed! long id, index; for( i = (long)m_historyIds.GetCount()-2/*the last is the current*/; i>=0; i-- ) { id = m_historyIds[i]; index = m_playlist.GetPosById(id); if( index == -1 ) { // remove dead history items // (for speed reasons, we don't do this in unqueue) m_historyIds.RemoveAt(i); } else { if( !(flags&SJ_PREVNEXT_LOOKUP_ONLY) ) { m_historyIds.RemoveAt(i); m_historyIds.RemoveAt(i); // same index as the count is one less after RemoveAt() before } return index; } } return -1; } void SjQueue::SetCurrErroneous() { if( m_pos >= 0 && m_pos < m_playlist.GetCount() ) { m_playlist.Item(m_pos).SetFlag(SJ_PLAYLISTENTRY_ERRONEOUS); } } void SjQueue::SetCurrPos(long pos) { // set new position CleanupNextShufflePos(); m_pos = pos; // mark as played m_playlist.Item(pos).SetPlayCount(m_repeatRound); // add to history (needed for the "previous" button and for "avoid boredom") AddToHistory(pos); } void SjQueue::ToggleRepeat() { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); switch( GetRepeat() ) { case SJ_REPEAT_OFF: SetRepeat(SJ_REPEAT_ALL); break; case SJ_REPEAT_ALL: SetRepeat(SJ_REPEAT_SINGLE); break; case SJ_REPEAT_SINGLE: SetRepeat(SJ_REPEAT_OFF); break; } } long SjQueue::MoveByIds(const SjLLHash& idsToMove, long motionAmount) { // anything to move? if( motionAmount==0 || idsToMove.GetCount()==0 ) { return 0; } // get the postions of all IDs to move wxArrayLong posToMove = GetPosByIds(idsToMove); // correct the max. motion amount if( motionAmount < 0 ) { // move up long itemsBeforeFirstPosToMove = posToMove[0]; wxASSERT( itemsBeforeFirstPosToMove >= 0 ); if( motionAmount*-1 > itemsBeforeFirstPosToMove ) { motionAmount = itemsBeforeFirstPosToMove*-1; } } else { // move down long itemsAfterLastPosToMove = (GetCount()-posToMove.Last())-1; wxASSERT( itemsAfterLastPosToMove >= 0 ); if( motionAmount > itemsAfterLastPosToMove ) { motionAmount = itemsAfterLastPosToMove; } } // any amount left to move? if( motionAmount == 0 ) { return 0; } // remember the ID of the current postion to set it after the movement long currPosId = 0; if( m_pos >= 0 ) { currPosId = GetIdByPos(m_pos); } // move all requested items int i, iCount = posToMove.GetCount(); if( motionAmount < 0 ) { for( i = 0; i < iCount; i++ ) { m_playlist.MovePos(posToMove[i], posToMove[i]+motionAmount); } } else { for( i = iCount-1; i >= 0; i-- ) { m_playlist.MovePos(posToMove[i], posToMove[i]+motionAmount); } } // correct the current position as it may have changed by the movement if( m_pos >= 0 ) { m_pos = GetPosById(currPosId); } return motionAmount; } void SjQueue::EqualizeRepeatRound() { long maxPlayCount = 1, currPlayCount; long i, iCount = GetCount(); for( i = 0; i < iCount; i++ ) { currPlayCount = m_playlist.Item(i).GetPlayCount(); if( currPlayCount > maxPlayCount ) { maxPlayCount = currPlayCount; } } m_repeatRound = maxPlayCount; } /******************************************************************************* * Enqueue ******************************************************************************/ long SjQueue::EnqueueDo__(const wxString& url, long addBeforeThisPos, bool verified, SjLLHash* addedIds, long playlistEntryFlags) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); wxLogDebug(wxT("SjQueue::EnqueueDo__(): url=%s, verified=%i"), url.c_str(), (int)verified); long newPos; // add to array, check playing position if( addBeforeThisPos < 0 || addBeforeThisPos > GetCount() ) { newPos = m_playlist.GetCount(); m_playlist.Add(url, verified, playlistEntryFlags); if( addedIds ) { addedIds->Insert(m_playlist[m_playlist.GetCount()-1].GetId(), 1); } } else { newPos = addBeforeThisPos; m_playlist.Insert(url, addBeforeThisPos, verified/*bug fixed: before Silverjuke 1.00 we set this always to TRUE*/, playlistEntryFlags); if( addedIds ) { addedIds->Insert(m_playlist[newPos].GetId(), 1); } if( m_pos >= addBeforeThisPos ) { m_pos++; // does not change the physical position, so a call to // SetCurrPos() is not needed (and not good...) } } return newPos; } void SjQueue::EnqueueFinish__(long oldPos) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); CleanupNextShufflePos(); if( oldPos == -1 ) { long newPos = GetNextPos(SJ_PREVNEXT_INIT); if( newPos != -1 ) SetCurrPos(newPos); // in Silverjuke <= 2.52beta15, we set m_pos directly instead of calling SetCurrPos() -- // this results in a missing playing mark for the first track played -- s. http://www.silverjuke.net/forum/topic-2593.html } } long SjQueue::Enqueue(const wxArrayString& urls, long addBeforeThisPos, bool verified, SjLLHash* addedIds, long playlistEntryFlags) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); long newPos, oldPos = m_pos, currPos; long urlsCount = urls.GetCount(), i; bool markForPlayNext = false; if( playlistEntryFlags & SJ_PLAYLISTENTRY_PLAYNEXT ) { playlistEntryFlags &= ~SJ_PLAYLISTENTRY_PLAYNEXT; markForPlayNext = true; } if( addBeforeThisPos < 0 || addBeforeThisPos > GetCount() ) { newPos = urlsCount; for( i = 0; i < urlsCount; i++ ) { currPos = EnqueueDo__(urls.Item(i), -1, verified, addedIds, playlistEntryFlags); if( markForPlayNext ) { // m_playNextId is set if the enqueing option "play track next" is // used. As this does not work with the normal shuffle mode, we ignore // the shuffle mode for this single ID and play this ID always next. If the // user selects "play track next" multiple times, only the last track ID is // remembered and used - if the user wants to have a special order, he should // really turn shuffle of. m_playNextId = m_playlist[currPos].GetId(); markForPlayNext = false; } } } else { newPos = addBeforeThisPos; for( i = 0; i < urlsCount; i++ ) { currPos = EnqueueDo__(urls.Item(i), addBeforeThisPos+i, verified, addedIds, playlistEntryFlags); if( markForPlayNext ) { // See remark above. m_playNextId = m_playlist[currPos].GetId(); markForPlayNext = false; } } } EnqueueFinish__(oldPos); return newPos; } /******************************************************************************* * Unqueue ******************************************************************************/ void SjQueue::UnqueueReplay__(SjPlayer* player, int replayRet) { // This function is called if an unqueue is finished AND the currently // playing track is removed; SjQueue is already in the correct state, // however, we should check the shuffle and the repeat state of the player. // // If replayRet == 2, the LAST track was removed from the queue. if( m_pos == -1 ) return; // nothing to replay, may happed from a call of UnqueueByIds() wxASSERT( replayRet ); wxASSERT( player ); wxASSERT( m_pos >= 0 && m_pos < GetCount() ); // this is the new implementaton long oldPos = m_pos; if( m_shuffle ) { // Shuffle is ON -> select a new random track m_pos = -1; CleanupNextShufflePos(); long newPos = GetNextPos(SJ_PREVNEXT_INIT|SJ_PREVNEXT_REGARD_REPEAT|SJ_PREVNEXT_LOOKUP_ONLY); if( newPos != -1 ) { m_pos = newPos; CleanupNextShufflePos(); player->GotoAbsPos(GetCurrPos()); } else { m_pos = oldPos; CleanupNextShufflePos(); player->Stop(); return; // player stopped as ther's nothing more to play } } else { // Shuffle is OFF -> check if the removed track was the LAST one if( replayRet == 2 ) { // last track removed, set the position to the first track m_pos = 0; CleanupNextShufflePos(); if( m_repeat == SJ_REPEAT_ALL ) { player->GotoAbsPos(GetCurrPos()); } else { if( !MoveToTopOnEoq() ) { m_pos = oldPos; } player->GotoAbsPos(GetCurrPos()); player->Stop(); } } else { CleanupNextShufflePos(); player->GotoAbsPos(GetCurrPos()); } } // this was the old implementation /* CleanupNextShufflePos(); player->GotoAbsPos(GetCurrPos()); */ } long SjQueue::UnqueueByPos(long pos, SjPlayer* player, int* replayRet) { // This function may only be called from the main thread. // The function returns the number of items with the same URL // that are still in the queue. wxASSERT( wxThread::IsMain() ); long restUrls = m_playlist.RemoveAt(pos); int replayHere = 0; // correct the queue position if( pos < m_pos ) { m_pos--; // if the currently playing item is removed, // m_queue.pos points to the next item which // will have the same index. // a call to SetCurrPos() is not needed (and not good...) } else if( pos == m_pos ) { replayHere = 1; } if( m_pos >= (long)m_playlist.GetCount() ) { replayHere = 2; // last track removed! m_pos = m_playlist.GetCount()-1; // may result as -1 if( m_pos == -1 ) { if( player ) { player->Stop(); replayHere = 0; } } } // change playing position if( player && replayHere ) { if( replayRet ) { // UnqueueReplay__() called by the caller *replayRet = replayHere; } else { UnqueueReplay__(player, replayHere); } } CleanupNextShufflePos(); return restUrls; } void SjQueue::UnqueueByUrl(const wxString& url, SjPlayer* player, int* replayRet) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); int replayHere = 0; long queueArrayCount = m_playlist.GetCount(), i; for( i = 0; i < queueArrayCount; i++ ) { if( m_playlist[i].GetUrl() == url ) { if( UnqueueByPos(i, player, &replayHere) == 0 ) { break; // done, all URLs removed } i--; // as we removed one item, continue with the same position } } // change playing position if( player && replayHere ) { if( replayRet ) { // UnqueueReplay__() called by the caller *replayRet = replayHere; } else { UnqueueReplay__(player, replayHere); } } } void SjQueue::UnqueueByUrls(const wxArrayString& urls, SjPlayer* player) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); int replayHere = 0; long urlsCount = urls.GetCount(), i; wxString url; for( i = 0; i < urlsCount; i++ ) { url = urls[i]; if( m_playlist.IsInPlaylist(url) ) { UnqueueByUrl(url, player, &replayHere); } } // change playing position if( player && replayHere ) { UnqueueReplay__(player, replayHere); } } void SjQueue::UnqueueByIds(const SjLLHash& ids, long removeVal, SjPlayer* player) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); int replayHere = 0; long i, iCount = GetCount(); for( i = 0; i < iCount; i++ ) { if( ids.Lookup(m_playlist.Item(i).GetId()) == removeVal ) { UnqueueByPos(i, player, &replayHere); i--; iCount--; } } // change playing position if( player && replayHere ) { UnqueueReplay__(player, replayHere); } } void SjQueue::UnqueueAll(SjPlayer* player, bool stopVisIfPlaying) { // This function may only be called from the main thread. wxASSERT( wxThread::IsMain() ); if( player ) { player->Stop(stopVisIfPlaying); } m_pos = -1; m_playlist.Clear(); m_historyIds.Clear(); CleanupNextShufflePos(); } void SjQueue::UnqueuePlayed() { SjLLHash ids; long i, iLast = m_shuffle? (m_playlist.GetCount()-1) : m_pos, itemPlayCount; for( i = 0; i <= iLast; i++ ) { if( i != m_pos ) { itemPlayCount = m_playlist.Item(i).GetPlayCount(); if( itemPlayCount >= m_repeatRound ) ids.Insert(m_playlist.Item(i).GetId(), 1); } } if( ids.GetCount() ) UnqueueByIds(ids, 1, NULL); } bool SjQueue::MoveToTopOnEoq() const { // This function is normally called on the end of queue // and internally by SjQueue if the last available track in the // queue is unqueued. // // The function checks some states and returns TRUE if it seems to be best // to select the first queue item (this is useful eg. if the user hits "play" again) if( !m_isInitialized || !g_mainFrame->IsOpAvailable(SJ_OP_PLAYPAUSE) || GetCount()<=0 ) { return FALSE; // we recomment the caller to leave the queue position as is // (as "play" is not avalable the user cannot play the song again, // but he can enqueue a new song; this is true eg. for the kiosk mode) } if( (g_mainFrame->m_autoCtrl.m_flags&SJ_AUTOCTRL_AUTOPLAY_ENABLED) && g_mainFrame->m_autoCtrl.m_autoPlayWaitMinutes==0 ) { return FALSE; // we recomment the caller to leave the queue position as is // (autoplay will enqueue the next song at once) } return TRUE; // we recomment the caller to move the queue position to position #0 // (the user may hit "play" and does not want to hear the last // song again) } silverjuke-16.2.3/src/sjbase/queue.h000066400000000000000000000232751266006671500173430ustar00rootroot00000000000000/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: queue.h * Authors: Björn Petersen * Purpose: Silverjuke player * ******************************************************************************/ #ifndef __SJ_QUEUE_H__ #define __SJ_QUEUE_H__ enum SjRepeat { SJ_REPEAT_OFF = 0, SJ_REPEAT_SINGLE = 1, SJ_REPEAT_ALL = 2 }; class SjPlayer; class SjQueue { public: SjQueue (); void Init () { m_isInitialized = true; } void Exit () { m_isInitialized = false; } // enqueue / unqueue. The player object for unqueing is needed to stop the // playback if there is nothing left in the queue. long Enqueue (const wxArrayString& urls, long addBeforeThisPos, bool verified, SjLLHash* addedIds, long flags); long UnqueueByPos (long pos, SjPlayer*, int* replayRet=NULL); // returns the number of identical URLs still in the queue at other positions void UnqueueByUrl (const wxString& url, SjPlayer*, int* replayRet=NULL); void UnqueueByUrls (const wxArrayString& urls, SjPlayer*); void UnqueueByIds (const SjLLHash& ids, long removeVal, SjPlayer* player); void UnqueueAll (SjPlayer*, bool stopVisIfPlaying); void UnqueuePlayed (); // Update some information, urlVerified should normally be TRUE as // this function is normally called after an continious playback. void UpdateUrl (const wxString& url, bool urlVerified, long playtimeMs) { m_playlist.UpdateUrl(url, urlVerified, playtimeMs); } // queue information long GetCount () const { return m_playlist.GetCount(); } long GetWaitingCount (long maxCnt=-1) const { return m_playlist.GetUnplayedCount((m_shuffle||m_repeat==SJ_REPEAT_ALL)? -1/*count all*/ : m_pos/*count from current position*/, maxCnt); } long GetClosestPosByUrl (const wxString& url) const; long GetAllPosByUrl (const wxString& url, wxArrayLong& ret, bool unplayedOnly=false) const; // returns the count long GetPosById (long id) const { return m_playlist.GetPosById(id); } wxArrayLong GetPosByIds (const SjLLHash&) const; long GetIdByPos (long pos) const { return m_playlist.Item(pos).GetId(); } long GetIdByCurrPos () const { return m_pos<0? -1 : m_playlist.Item(m_pos).GetId(); } wxString GetUrlByPos (long pos) const; wxString GetUrlById (long id) const; wxArrayString GetUrlsByIds (const SjLLHash&) const; wxArrayString GetUrls () const; bool WasPlayed (long pos) const { return m_playlist.Item(pos).GetPlayCount()>0; } long GetPlayCount (long pos) const { return m_playlist.Item(pos).GetPlayCount(); } void ResetPlayCount (long pos) { m_playlist.Item(pos).SetPlayCount(0); CleanupNextShufflePos(); } long GetFlags (long pos) const { return m_playlist.Item(pos).GetFlags(); } void SetFlags (long pos, long flags) { m_playlist.Item(pos).SetFlags(flags); } void SetCurrErroneous (); SjPlaylistEntry& GetInfo (long pos/*-1 for current*/); bool IsEnqueued (const wxString& url) const { return m_playlist.IsInPlaylist(url); } bool IsPlaying (const wxString& url) const { return m_pos>=0? (m_playlist.Item(m_pos).GetUrl()==url) : FALSE; } bool MoveToTopOnEoq () const; // the current queue position long GetCurrPos () const { return m_pos; } void SetCurrPos (long pos); void IncRepeatRound () { m_repeatRound++; } // should be called after playback stop at end of playlist to allow the user manually restarting the playlist long GetRepeatRound () const { return m_repeatRound; } void EqualizeRepeatRound (); // should be called if auto-play tracks are added // getting the previous / next queue positions #define SJ_PREVNEXT_REGARD_REPEAT 0x01 #define SJ_PREVNEXT_LOOKUP_ONLY 0x02 #define SJ_PREVNEXT_INIT 0x04 long GetPrevPos (int flags); long GetNextPos (int flags); // shuffle - the intensity is a percentage between 2 and 100 #define SJ_DEF_SHUFFLE_STATE FALSE #define SJ_DEF_SHUFFLE_INTENSITY 50L void SetShuffle (bool s) { m_shuffle = s; CleanupNextShufflePos(); } void ToggleShuffle () { SetShuffle(!GetShuffle()); } bool GetShuffle () const { return m_shuffle; } void SetShuffleIntensity (int i) { m_shuffleIntensity = i; CleanupNextShufflePos(); } int GetShuffleIntensity () const { return m_shuffleIntensity; } // repeat void SetRepeat (SjRepeat r) { if(rSJ_REPEAT_ALL)r=SJ_REPEAT_OFF; m_repeat = r; CleanupNextShufflePos(); }; void ToggleRepeat (); SjRepeat GetRepeat () const { return m_repeat; } // queue flags / boredom #define SJ_QUEUEF_BOREDOM_TRACKS 0x0001L #define SJ_QUEUEF_BOREDOM_ARTISTS 0x0002L #define SJ_QUEUEF_REMOVE_PLAYED 0x0004L #define SJ_QUEUEF_RESUME 0x0010L #define SJ_QUEUEF_RESUME_LOAD_PLAYED 0x0020L #define SJ_QUEUEF_RESUME_START_PLAYBACK 0x0040L #define SJ_QUEUEF_DEFAULT 0x0000L #define SJ_DEF_BOREDOM_TRACK_MINUTES 30L #define SJ_DEF_BOREDOM_ARTIST_MINUTES 20L void SetQueueFlags (long flags, long t, long a) { m_queueFlags = flags; m_boredomTrackMinutes = t; m_boredomArtistMinutes = a; CleanupNextShufflePos(); } long GetQueueFlags () const { return m_queueFlags; } void GetQueueFlags (long& flags, long& t, long& a) const { flags = m_queueFlags; t = m_boredomTrackMinutes; a = m_boredomArtistMinutes; } // import / export void SaveAsDlg (wxWindow* parent) { m_playlist.SaveAsDlg(parent); } void MergeMetaData (const SjPlaylist& p) { m_playlist.MergeMetaData(p); } void OnUrlChanged (const wxString& oldUrl, const wxString& newUrl) { m_playlist.OnUrlChanged(oldUrl, newUrl); } // move tracks long MoveByIds (const SjLLHash& idsToMove, long motionAmount); // find out if a track is boring bool IsBoring (const wxString& artistName, const wxString& trackName, unsigned long currTimestamp) const; bool IsBoring (long pos, unsigned long currTimestamp) const { SjPlaylistEntry& entry = m_playlist.Item(pos); return IsBoring(entry.GetLeadArtistName(), entry.GetTrackName(), currTimestamp); } private: bool m_isInitialized; // The queue - SjPlaylist holds the data as an sorted array and as a hash // for fast lookup a specific URL SjPlaylist m_playlist; // the history holds the played IDs, needed esp. for going back in shuffle mode; // however, AddToHistory() and PopFromHistory() use the playlist positions for communication with // the caller void AddToHistory (long pos); long PopFromHistory (int flags); wxArrayLong m_historyIds; SjSLHash m_historyArtists; SjSLHash m_historyTracks; // calculated shuffle positions long m_nextShufflePos; long m_nextShufflePosFor; bool m_nextShuffleIncRepeatRound; long GetNextShufflePos (int flags, unsigned long currTimestamp); long GetNextShufflePos_GetPossibleTrack (bool regardBoredom, long repeatRound, unsigned long currTimestamp); void CleanupNextShufflePos () { m_nextShufflePos=-1; m_nextShufflePosFor=-2;/*-1 is okay*/ m_nextShuffleIncRepeatRound=FALSE; } // the current queue position, -1 = nothing in queue long m_pos; // shuffle / repeat bool m_shuffle; int m_shuffleIntensity; SjRepeat m_repeat; long m_repeatRound; // enqueueing long EnqueueDo__ (const wxString& url, long addBeforeThisPos, bool verified, SjLLHash* addedIds, long flags); void EnqueueFinish__ (long oldPos); void UnqueueReplay__ (SjPlayer* player, int replayRet); long m_playNextId; // queue flags / avoid boredom long m_queueFlags; int m_boredomTrackMinutes, m_boredomArtistMinutes; // Misc. SjPlaylistEntry m_dummyPlaylistInfo; }; #endif // __SJ_QUEUE_H__ silverjuke-16.2.3/src/sjbase/search.cpp000066400000000000000000001305231266006671500200120ustar00rootroot00000000000000/********************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: searchsj.cpp * Authors: Björn Petersen * Purpose: searching * ******************************************************************************/ #include #include #include // sic! WX_DEFINE_OBJARRAY(SjArrayRule); /******************************************************************************* * SjRule - Basic Operations ******************************************************************************/ SjRule::SjRule(SjField field, SjFieldOp op, const wxString& value0, const wxString& value1, SjUnit unit) { m_field = field; m_op = op; m_value[0] = value0; m_value[1] = value1; m_unit = unit; } void SjRule::Clear() { m_field = SJ_FIELD_DEFAULT; m_op = SJ_FIELDOP_DEFAULT; m_value[0].Empty(); m_value[1].Empty(); m_unit = SJ_UNIT_DEFAULT; } void SjRule::CopyFrom(const SjRule& o) { m_field = o.m_field; m_op = o.m_op; m_value[0]= o.m_value[0]; m_value[1]= o.m_value[1]; m_unit = o.m_unit; } bool SjRule::IsEqualTo(const SjRule& o) const { if( m_field != o.m_field || m_op != o.m_op || m_value[0] != o.m_value[0] || m_value[1] != o.m_value[1] || m_unit != o.m_unit ) { return FALSE; } return TRUE; } void SjRule::Serialize(SjStringSerializer& ser) const { ser.AddLong (5); // fields following, for future use ser.AddLong (m_field); ser.AddLong (m_op); ser.AddString (m_value[0]); ser.AddString (m_value[1]); ser.AddLong (m_unit); } bool SjRule::Unserialize(SjStringSerializer& ser) { long fieldsFollowing = ser.GetLong(); SjField field = (SjField)ser.GetLong(); SjFieldOp op = (SjFieldOp)ser.GetLong(); wxString value0 = ser.GetString(); wxString value1 = ser.GetString(); SjUnit unit = (SjUnit)ser.GetLong(); if( fieldsFollowing != 5 || field >= SJ_FIELD_COUNT || op >= SJ_FIELDOP_COUNT || unit >= SJ_UNIT_COUNT || ser.HasErrors() ) { return FALSE; } m_field = field; m_op = op; m_value[0]= value0; m_value[1]= value1; m_unit = unit; return TRUE; } SjFieldType SjRule::GetFieldType(SjField field) { switch( field ) { case SJ_FIELD_URL: case SJ_FIELD_TRACKNAME: case SJ_FIELD_LEADARTISTNAME: case SJ_FIELD_ORGARTISTNAME: case SJ_FIELD_COMPOSERNAME: case SJ_FIELD_ALBUMNAME: case SJ_FIELD_GENRENAME: case SJ_FIELD_GROUPNAME: case SJ_FIELD_COMMENT: case SJ_PSEUDOFIELD_SQL: case SJ_PSEUDOFIELD_TRACKARTISTALBUM: case SJ_PSEUDOFIELD_FILETYPE: return SJ_FIELDTYPE_STRING; case SJ_FIELD_TIMEADDED: case SJ_FIELD_TIMEMODIFIED: case SJ_FIELD_LASTPLAYED: return SJ_FIELDTYPE_DATE; case SJ_PSEUDOFIELD_LIMIT: case SJ_PSEUDOFIELD_QUEUEPOS: default: return SJ_FIELDTYPE_NUMBER; case SJ_PSEUDOFIELD_INCLUDE: case SJ_PSEUDOFIELD_EXCLUDE: return SJ_FIELDTYPE_LIST; case SJ_FIELD_COUNT: return SJ_FIELDTYPE_COUNT; } } bool SjRule::IsValidFieldOp(SjField field, SjFieldOp op) { SjFieldType fieldType = GetFieldType(field); if( field == SJ_FIELD_AUTOVOL ) { return (op==SJ_FIELDOP_IS_SET || op==SJ_FIELDOP_IS_UNSET); } else { switch( op ) { case SJ_FIELDOP_IS_EQUAL_TO: case SJ_FIELDOP_IS_UNEQUAL_TO: case SJ_FIELDOP_IS_SET: case SJ_FIELDOP_IS_UNSET: return TRUE; case SJ_FIELDOP_CONTAINS: case SJ_FIELDOP_DOES_NOT_CONTAIN: case SJ_FIELDOP_STARTS_WITH: case SJ_FIELDOP_DOES_NOT_START_WITH: case SJ_FIELDOP_ENDS_WITH: case SJ_FIELDOP_DOES_NOT_END_WITH: case SJ_FIELDOP_IS_SIMELAR_TO: case SJ_FIELDOP_STARTS_SIMELAR_TO: return (fieldType==SJ_FIELDTYPE_STRING); case SJ_FIELDOP_IS_GREATER_THAN: case SJ_FIELDOP_IS_LESS_THAN: case SJ_FIELDOP_IS_IN_RANGE: case SJ_FIELDOP_IS_NOT_IN_RANGE: return (fieldType==SJ_FIELDTYPE_NUMBER || fieldType==SJ_FIELDTYPE_DATE); case SJ_FIELDOP_IS_GREATER_OR_EQUAL: case SJ_FIELDOP_IS_LESS_OR_EQUAL: return (fieldType==SJ_FIELDTYPE_NUMBER); case SJ_FIELDOP_IS_IN_THE_LAST: case SJ_FIELDOP_IS_NOT_IN_THE_LAST: return (fieldType==SJ_FIELDTYPE_DATE); default: return FALSE; } } } wxString SjRule::GetFieldDescr(SjField field) { switch( field ) { case SJ_FIELD_TRACKNAME: return _("Title"); case SJ_FIELD_TRACKNR: return _("Track number"); case SJ_FIELD_TRACKCOUNT: return _("Track count"); case SJ_FIELD_DISKNR: return _("Disk number"); case SJ_FIELD_DISKCOUNT: return _("Disk count"); case SJ_FIELD_LEADARTISTNAME: return _("Artist"); case SJ_FIELD_ORGARTISTNAME: return _("Original artist"); case SJ_FIELD_COMPOSERNAME: return _("Composer"); case SJ_FIELD_ALBUMNAME: return _("Album"); case SJ_FIELD_GENRENAME: return _("Genre"); case SJ_FIELD_GROUPNAME: return _("Group"); case SJ_FIELD_COMMENT: return _("Comment"); case SJ_FIELD_BEATSPERMINUTE: return _("BPM"); case SJ_FIELD_RATING: return _("Rating"); case SJ_FIELD_YEAR: return _("Year"); case SJ_FIELD_PLAYTIME: return _("Duration"); case SJ_FIELD_AUTOVOL: return _("Volume"); case SJ_FIELD_CHANNELS: return _("Channels"); case SJ_FIELD_SAMPLERATE: return _("Samplerate"); case SJ_FIELD_BITRATE: return _("Bitrate"); case SJ_FIELD_URL: return _("File name"); case SJ_FIELD_DATABYTES: return _("File size"); case SJ_FIELD_TIMEADDED: return _("Date added"); case SJ_FIELD_TIMEMODIFIED: return _("Date modified"); case SJ_FIELD_LASTPLAYED: return _("Last played"); case SJ_FIELD_TIMESPLAYED: return _("Play count"); case SJ_PSEUDOFIELD_SQL: return _("SQL expression"); case SJ_PSEUDOFIELD_LIMIT: return _("Limit result to"); case SJ_PSEUDOFIELD_TRACKARTISTALBUM: return _("Title/artist/album"); case SJ_PSEUDOFIELD_FILETYPE: return _("File type"); case SJ_PSEUDOFIELD_QUEUEPOS: return _("Queue position"); case SJ_PSEUDOFIELD_INCLUDE: return _("Include tracks"); case SJ_PSEUDOFIELD_EXCLUDE: return _("Exclude tracks"); case SJ_PSEUDOFIELD_RANDOM: return _("Random"); default: return wxT("***"); } } wxString SjRule::GetFieldDbName(SjField field) { switch( field ) { case SJ_FIELD_TRACKNAME: return wxT("trackname"); case SJ_FIELD_TRACKNR: return wxT("tracknr"); case SJ_FIELD_TRACKCOUNT: return wxT("trackcount"); case SJ_FIELD_DISKNR: return wxT("disknr"); case SJ_FIELD_DISKCOUNT: return wxT("diskcount"); case SJ_FIELD_LEADARTISTNAME: return wxT("leadartistname"); case SJ_FIELD_ORGARTISTNAME: return wxT("orgartistname"); case SJ_FIELD_COMPOSERNAME: return wxT("composername"); case SJ_FIELD_ALBUMNAME: return wxT("albumname"); case SJ_FIELD_GENRENAME: return wxT("genrename"); case SJ_FIELD_GROUPNAME: return wxT("groupname"); case SJ_FIELD_COMMENT: return wxT("comment"); case SJ_FIELD_BEATSPERMINUTE: return wxT("beatsperminute"); case SJ_FIELD_RATING: return wxT("rating"); case SJ_FIELD_YEAR: return wxT("year"); case SJ_FIELD_PLAYTIME: return wxT("playtimems"); case SJ_FIELD_AUTOVOL: return wxT("autovol"); case SJ_FIELD_CHANNELS: return wxT("channels"); case SJ_FIELD_SAMPLERATE: return wxT("samplerate"); case SJ_FIELD_BITRATE: return wxT("bitrate"); case SJ_FIELD_URL: return wxT("url"); case SJ_PSEUDOFIELD_FILETYPE: return wxT("FILETYPE(url)"); case SJ_PSEUDOFIELD_QUEUEPOS: return wxT("QUEUEPOS(url)"); case SJ_FIELD_DATABYTES: return wxT("databytes"); case SJ_FIELD_TIMEADDED: return wxT("timeadded"); case SJ_FIELD_TIMEMODIFIED: return wxT("timemodified"); case SJ_FIELD_LASTPLAYED: return wxT("lastplayed"); case SJ_FIELD_TIMESPLAYED: return wxT("timesplayed"); default: return wxT(""); } } /******************************************************************************* * SjRule::IsOk() ******************************************************************************/ wxString SjRule::IsValueOk(const wxString& valueStr__, bool* addCaseWarning) const { wxString valueStr(valueStr__); long fieldType = GetFieldType(m_field); wxString error; bool errorPleaseEnterAValue = FALSE; valueStr.Trim(TRUE); valueStr.Trim(FALSE); if( fieldType == SJ_FIELDTYPE_LIST ) { if( GetInclExclCount() == 0 ) { error = wxString::Format(_("Press \"%s\" in the main window"), m_field==SJ_PSEUDOFIELD_INCLUDE? _("Insert") : _("Del")); } } else if( fieldType == SJ_FIELDTYPE_DATE ) { if( m_op == SJ_FIELDOP_IS_IN_THE_LAST || m_op == SJ_FIELDOP_IS_NOT_IN_THE_LAST ) { if( !SjTools::ParseNumber(valueStr) ) { errorPleaseEnterAValue = TRUE; } } else { if( !SjTools::ParseDate_(valueStr) ) { error = _("Please enter the date as \"dd.mm.yyyy\", you can also add \"hh:mm\" for the time."); } } } else if( fieldType == SJ_FIELDTYPE_NUMBER ) { // first, check fields that accepts characters beside 0-9 if( m_field == SJ_FIELD_YEAR ) { if( !SjTools::ParseYear(valueStr) ) { errorPleaseEnterAValue = TRUE; } } else if( m_field == SJ_FIELD_PLAYTIME && m_unit == SJ_UNIT_MINUTES ) { if( !SjTools::ParseTime(valueStr) ) { errorPleaseEnterAValue = TRUE; } } else if( m_field == SJ_PSEUDOFIELD_QUEUEPOS ) { if( valueStr != SJ_QUEUEPOS_CURR_STR && !SjTools::ParseNumber(valueStr) ) { errorPleaseEnterAValue = TRUE; } } // second, check if it is a number else if( !SjTools::ParseNumber(valueStr) ) { errorPleaseEnterAValue = TRUE; } } else if( valueStr.IsEmpty() ) { error = _("Please enter the text."); } else if( addCaseWarning && m_field != SJ_PSEUDOFIELD_SQL && (m_op==SJ_FIELDOP_IS_EQUAL_TO || m_op==SJ_FIELDOP_IS_UNEQUAL_TO) && (valueStr.Lower()==valueStr || valueStr.Upper()==valueStr) ) { *addCaseWarning = TRUE; } if( errorPleaseEnterAValue ) { error = valueStr.IsEmpty()? _("Please enter a value.") : _("Please enter a valid value."); } return error; } bool SjRule::IsOk(wxString& error1, wxString& error2, bool* addCaseWarning) const { error1.Clear(); error2.Clear(); if( m_op != SJ_FIELDOP_IS_SET && m_op != SJ_FIELDOP_IS_UNSET ) { error1 = IsValueOk(m_value[0], addCaseWarning); if( m_op == SJ_FIELDOP_IS_IN_RANGE || m_op == SJ_FIELDOP_IS_NOT_IN_RANGE ) { error2 = IsValueOk(m_value[1], addCaseWarning); } } return (error1.IsEmpty() && error2.IsEmpty()); } /******************************************************************************* * SjRule::*InclExcl*() ******************************************************************************/ long SjRule::GetInclExclCount() const { long count = m_value[0].Freq(',')-1; if( count < 0 || m_value[0].Len() < 3 || m_value[0].GetChar(0) != ',' || m_value[0].Last() != ',' ) { count = 0; } return count; } wxString SjRule::GetInclExclDescr() const { long count = GetInclExclCount(); if( count == 0 ) { return wxString::Format(_("Press \"%s\" in the main window"), m_field==SJ_PSEUDOFIELD_INCLUDE? _("Insert") : _("Del")); } else { wxString idsStr = m_value[0].BeforeLast(','), url, trackName, leadArtistName, albumName, descr; long id, idsPrinted = 0; while( idsPrinted <= 3 && !idsStr.IsEmpty() ) { if( !idsStr.AfterLast(',').ToLong(&id, 10) ) { id = 0; } idsStr = idsStr.BeforeLast(','); url = g_mainFrame->m_libraryModule->GetUrl(id); if( !url.IsEmpty() ) { g_mainFrame->m_columnMixer.GetQuickInfo(url, trackName, leadArtistName, albumName, id); if( !descr.IsEmpty() ) descr += wxT(", "); descr += trackName; } idsPrinted++; } if( count == 1 ) { return descr; } else { if( idsPrinted != count ) descr += wxT(", ..."); return wxString::Format(_("%s tracks"), SjTools::FormatNumber(count).c_str()) + wxT(": ") + descr; } } } void SjRule::AddToInclExcl(const wxString& idsToAdd) { if( m_value[0].IsEmpty() ) { m_value[0] = idsToAdd; } else { m_value[0] += idsToAdd.Mid(1);//skip first comma as it is the last char in m_value[0] } } void SjRule::AddToInclExcl(SjLLHash* ids) { wxString strToAdd; long id; SjHashIterator iterator; while( ids->Iterate(iterator, &id) ) { strToAdd.Printf(wxT("%i"), (int)id); if( m_value[0].Find(wxT(",")+strToAdd+wxT(",")) == -1 ) { if( m_value[0].IsEmpty() ) m_value[0] = wxT(","); m_value[0].Append(strToAdd+wxT(",")); } } } void SjRule::RemoveFromInclExcl(SjLLHash* ids) { wxString strToRemove; long id; SjHashIterator iterator; while( ids->Iterate(iterator, &id) ) { strToRemove.Printf(wxT(",%i,"), (int)id); m_value[0].Replace(strToRemove, wxT(",")); } if( m_value[0].Len()==1 ) { m_value[0].Clear(); } } /******************************************************************************* * SjRule::GetAsSql() ******************************************************************************/ wxString SjRule::GetAsSql(SjField field, SjFieldOp op, bool forceNumberSet) { switch( op ) { case SJ_FIELDOP_IS_SET: return field==SJ_PSEUDOFIELD_QUEUEPOS? wxT("$f IS NOT NULL") : wxT("$f!=$v"); case SJ_FIELDOP_IS_UNSET: return field==SJ_PSEUDOFIELD_QUEUEPOS? wxT("$f IS NULL") : wxT("$f=$v"); case SJ_FIELDOP_IS_EQUAL_TO: return wxT("$f=$v"); case SJ_FIELDOP_IS_UNEQUAL_TO: return wxT("$f!=$v"); case SJ_FIELDOP_IS_GREATER_THAN: return /* forceNumberSet? "($f!=0 AND $f>$v)" : not needed as we always use positive numbers : */ wxT("$f>$v"); case SJ_FIELDOP_IS_GREATER_OR_EQUAL:return /* forceNumberSet? "($f!=0 AND $f>=$v)" :*/ wxT("$f>=$v"); case SJ_FIELDOP_IS_LESS_THAN: return forceNumberSet? wxT("($f!=0 AND $f<$v)") : wxT("$f<$v"); case SJ_FIELDOP_IS_LESS_OR_EQUAL: return forceNumberSet? wxT("($f!=0 AND $f<=$v)") : wxT("$f<=$v"); case SJ_FIELDOP_CONTAINS: return wxT("$f LIKE '%$vu%'"); case SJ_FIELDOP_DOES_NOT_CONTAIN: return wxT("NOT($f LIKE '%$vu%')"); case SJ_FIELDOP_STARTS_WITH: return wxT("$f LIKE '$vu%'"); case SJ_FIELDOP_DOES_NOT_START_WITH:return wxT("NOT($f LIKE '$vu%')"); case SJ_FIELDOP_ENDS_WITH: return wxT("$f LIKE '%$vu'"); case SJ_FIELDOP_DOES_NOT_END_WITH: return wxT("NOT($f LIKE '%$vu')"); case SJ_FIELDOP_IS_SIMELAR_TO: return wxT("LEVENSTHEIN($f, $v)==1"); //return "SOUNDEX($f)=SOUNDEX('$vu')"; case SJ_FIELDOP_STARTS_SIMELAR_TO: return wxT("LEVENSTHEIN(SUBSTR($f, 1, $vl),$v)==1"); //return "SOUNDEX(SUBSTR($f,1,$vl))=SOUNDEX('$vu')"; default: return wxT("***"); } } wxString SjRule::GetAsSql(const wxString& value__, SjField field, SjFieldOp op, SjUnit unit, bool forceSet, bool recursiveCall) { wxString value(value__), unquotedValue; long fieldType = GetFieldType(field); bool forceNumberSet = FALSE; // // get correct - unquoted - value based on the field type and on the basic operation // if( field == SJ_PSEUDOFIELD_SQL ) { // // user defined SQL statement -- nothing more to do // return wxT("(") + value + wxT(")"); } else if( op == SJ_FIELDOP_IS_SET || op == SJ_FIELDOP_IS_UNSET ) { // // set/unset // value = fieldType==SJ_FIELDTYPE_STRING? wxT("''") : wxT("0"); } else if( field == SJ_FIELD_DATABYTES ) { // // convert KB/MB/GB to bytes // long longValue; SjTools::ParseNumber(value, &longValue); if( unit == SJ_UNIT_KB ) { longValue *= 1024; } else if( unit == SJ_UNIT_MB ) { longValue *= 1024*1024; } else if( unit == SJ_UNIT_GB ) { longValue *= 1024*1024*1024; } value = wxString::Format(wxT("%i"), (int)longValue); if( longValue != 0 ) { forceNumberSet = TRUE; } } else if( field == SJ_FIELD_YEAR ) { // // convert given year // long longValue; SjTools::ParseYear(value, &longValue); value = wxString::Format(wxT("%i"), (int)longValue); if( longValue != 0 ) { forceNumberSet = TRUE; } } else if( field == SJ_FIELD_PLAYTIME ) { // // convert given playing time to milliseconds // long longValue; if( unit == SJ_UNIT_MINUTES ) { SjTools::ParseTime(value, &longValue); } else { SjTools::ParseNumber(value, &longValue); } longValue *= 1000; value = wxString::Format(wxT("%i"), (int)longValue); if( longValue != 0 ) { forceNumberSet = TRUE; } } else if( fieldType == SJ_FIELDTYPE_DATE && (op==SJ_FIELDOP_IS_IN_THE_LAST || op==SJ_FIELDOP_IS_NOT_IN_THE_LAST) ) { // // convert relative date value to absolute value, the recursive call of SjRule::GetAsSql() will continue at (***) // long longValue; SjTools::ParseNumber(value, &longValue); op = op==SJ_FIELDOP_IS_IN_THE_LAST? SJ_FIELDOP_IS_GREATER_OR_EQUAL : SJ_FIELDOP_IS_LESS_THAN; switch( unit ) { case SJ_UNIT_MINUTES: return GetAsSql(wxString::Format(wxT("now -%i"), (int)longValue), field, op, unit, forceSet, TRUE); case SJ_UNIT_HOURS: return GetAsSql(wxString::Format(wxT("now -%i"), (int)longValue*60), field, op, unit, forceSet, TRUE); default: return GetAsSql(wxString::Format(wxT("today -%i"), (int)longValue), field, op, unit, forceSet, TRUE); } } else if( fieldType == SJ_FIELDTYPE_DATE ) { // // convert absolute date/time value to seconds, may be continued from (***) // bool timeSet; if( SjTools::ParseDate_(value, !recursiveCall, NULL, &timeSet) ) { if( timeSet ) { ; } else if( op == SJ_FIELDOP_IS_EQUAL_TO ) { // convert a concrete date to a timespan return wxT("(") + GetAsSql(value, field, SJ_FIELDOP_IS_GREATER_OR_EQUAL, unit, FALSE, TRUE) + wxT(" AND ") + GetAsSql(value+wxT(" +1"), field, SJ_FIELDOP_IS_LESS_THAN, unit, FALSE, TRUE) + wxT(")"); } else if( op == SJ_FIELDOP_IS_UNEQUAL_TO ) { // convert a concrete date to a timespan return wxT("(") + GetAsSql(value, field, SJ_FIELDOP_IS_LESS_THAN, unit, FALSE, TRUE) + wxT(" OR ") + GetAsSql(value+wxT(" +1"), field, SJ_FIELDOP_IS_GREATER_OR_EQUAL, unit, FALSE, TRUE) + wxT(")"); } else if( op == SJ_FIELDOP_IS_LESS_OR_EQUAL || op == SJ_FIELDOP_IS_GREATER_THAN ) { // move time to end of the day for "less or equal" or for "greater than" value += wxT(" 23:59:59"); } forceNumberSet = TRUE; wxString oldValue = value; value = wxString::Format(wxT("TIMESTAMP('%s')"), oldValue.c_str()); } } else if( field == SJ_PSEUDOFIELD_QUEUEPOS && value == SJ_QUEUEPOS_CURR_STR ) { // // current queue position - nothing to convert // ; } else if( fieldType == SJ_FIELDTYPE_NUMBER ) { // // convert a number to an exiting number // long longValue; SjTools::ParseNumber(value, &longValue); value = wxString::Format(wxT("%i"), (int)longValue); if( longValue != 0 && field != SJ_FIELD_TIMESPLAYED ) { forceNumberSet = TRUE; } } else { // // add quoted to string, preserve an unqoted copy // the second wxSqlt::QParam(value) was added doe to the report on http://www.silverjuke.net/forum/topic-2546.html // unquotedValue = wxSqlt::QParam(value); value = wxT("'") + wxSqlt::QParam(value) + wxT("'"); } // // apply operator // // get the correct operation string wxString retSql(GetAsSql(field, op, (forceSet&&forceNumberSet))); // first, replace the fields and the length of the unquoted value un the operation string... retSql.Replace(wxT("$fl"), wxString::Format(wxT("%i"), (int)GetFieldDbName(field).Len())); retSql.Replace(wxT("$f"), GetFieldDbName(field)); // ...after that, replace the unquoted or quoted value in the operation string // (this should be last, as the value may contain eg. "$f") retSql.Replace(wxT("$vl"), wxString::Format(wxT("%i"), (int)unquotedValue.Len())); if( retSql.Find(wxT("$vu")) != -1 ) { retSql.Replace(wxT("$vu"), unquotedValue); } else { retSql.Replace(wxT("$v"), value); } return retSql; } wxString SjRule::GetAsSql() const { if( m_field == SJ_PSEUDOFIELD_INCLUDE || m_field == SJ_PSEUDOFIELD_EXCLUDE ) { wxString ret; long count = GetInclExclCount(); if( count == 0 ) { ret = m_field == SJ_PSEUDOFIELD_INCLUDE? wxT("(0)") : wxT("(1)"); } else { ret = m_field == SJ_PSEUDOFIELD_INCLUDE? wxT("id IN (") : wxT("id NOT IN ("); ret += m_value[0].Mid(1, m_value[0].Len()-2); ret += wxT(")"); } return ret; } else if( m_field == SJ_PSEUDOFIELD_LIMIT ) { return wxT(""); } else if( m_field == SJ_PSEUDOFIELD_TRACKARTISTALBUM ) { return wxT("(") + GetAsSql(m_value[0], SJ_FIELD_TRACKNAME, m_op, m_unit, FALSE) + wxT(" OR ") + GetAsSql(m_value[0], SJ_FIELD_LEADARTISTNAME, m_op, m_unit, FALSE) + wxT(" OR ") + GetAsSql(m_value[0], SJ_FIELD_ALBUMNAME, m_op, m_unit, FALSE) + wxT(")"); } else { switch( m_op ) { case SJ_FIELDOP_IS_NOT_IN_RANGE: return wxT("(") + GetAsSql(m_value[0], m_field, SJ_FIELDOP_IS_LESS_THAN, m_unit, FALSE) + wxT(" OR ") + GetAsSql(m_value[1], m_field, SJ_FIELDOP_IS_GREATER_THAN, m_unit, FALSE) + wxT(")"); case SJ_FIELDOP_IS_IN_RANGE: return wxT("(") + GetAsSql(m_value[0], m_field, SJ_FIELDOP_IS_GREATER_OR_EQUAL, m_unit, FALSE) + wxT(" AND ") + GetAsSql(m_value[1], m_field, SJ_FIELDOP_IS_LESS_OR_EQUAL, m_unit, FALSE) + wxT(")"); default: return GetAsSql(m_value[0], m_field, m_op, m_unit, TRUE/*force that the value is set, if needed*/); } } } /******************************************************************************* * SjRule::Convert() ******************************************************************************/ bool SjRule::Convert(SjField newField) { // Convert the rule field. // This may modify the operator, the values and the unit. bool largerModifications = FALSE; long newFieldType = GetFieldType(newField); long _m_FieldType = GetFieldType(m_field); bool initUnitRequired = FALSE; bool initOperatorRequired = FALSE; if( newField != m_field ) { if( newField == SJ_PSEUDOFIELD_SQL ) { // if the new field is an SQL expression, // get the old field as SQL - done wxString sql= GetAsSql(); m_op = SJ_FIELDOP_IS_EQUAL_TO; m_value[0] = sql; m_value[1].Clear(); m_unit = SJ_UNIT_NA; largerModifications = TRUE; } else if( newField == SJ_FIELD_RATING ) { // init rating, the rating cannot be converted sensfully from anothe field m_value[0] = wxT("5"); m_value[1].Clear(); initUnitRequired = TRUE; initOperatorRequired = TRUE; } else if( m_field == SJ_PSEUDOFIELD_SQL || newField == SJ_FIELD_GENRENAME || newField == SJ_FIELD_GROUPNAME || newField == SJ_PSEUDOFIELD_FILETYPE || newField == SJ_PSEUDOFIELD_QUEUEPOS || newFieldType != _m_FieldType || (newFieldType == SJ_FIELDTYPE_NUMBER && _m_FieldType == SJ_FIELDTYPE_NUMBER) ) { // other fields that can never be converted sensefully // to other fields m_value[0].Clear(); m_value[1].Clear(); initUnitRequired = TRUE; initOperatorRequired = TRUE; } // init the operator, if required if( initOperatorRequired ) { if( newFieldType == SJ_FIELDTYPE_STRING ) { if( newField == SJ_FIELD_GENRENAME || newField == SJ_FIELD_GROUPNAME || newField == SJ_PSEUDOFIELD_FILETYPE ) { m_op = SJ_FIELDOP_IS_EQUAL_TO; } else { m_op = SJ_FIELDOP_CONTAINS; } } else if( newFieldType == SJ_FIELDTYPE_DATE ) { m_op = SJ_FIELDOP_IS_IN_THE_LAST; } else switch( newField ) { case SJ_FIELD_TIMESPLAYED: m_op = SJ_FIELDOP_IS_GREATER_THAN; break; case SJ_FIELD_DATABYTES: case SJ_FIELD_PLAYTIME: m_op = SJ_FIELDOP_IS_IN_RANGE; break; case SJ_FIELD_AUTOVOL: case SJ_PSEUDOFIELD_QUEUEPOS: m_op = SJ_FIELDOP_IS_SET; break; default: m_op = SJ_FIELDOP_IS_EQUAL_TO; break; } largerModifications = TRUE; } // init the unit, if required // (currently, we only set to unknown unit; SjAdvSearchDialog already does its best) if( initUnitRequired ) { m_unit = SJ_UNIT_NA; largerModifications = TRUE; } } // done m_field = newField; return largerModifications; } bool SjRule::Convert(SjFieldOp newOp) { // Convert the rule operator. // This may modify the values and the unit. bool largerModifications = FALSE; if( newOp != m_op ) { if( newOp == SJ_FIELDOP_IS_SET || newOp == SJ_FIELDOP_IS_UNSET ) { m_value[0].Clear(); m_value[1].Clear(); m_unit = SJ_UNIT_NA; largerModifications = TRUE; } else if( GetFieldType(m_field) == SJ_FIELDTYPE_DATE ) { bool newIsRel = (newOp==SJ_FIELDOP_IS_IN_THE_LAST||newOp==SJ_FIELDOP_IS_NOT_IN_THE_LAST)? TRUE : FALSE; bool oldisRel = (m_op ==SJ_FIELDOP_IS_IN_THE_LAST||m_op ==SJ_FIELDOP_IS_NOT_IN_THE_LAST)? TRUE : FALSE; if( newIsRel != oldisRel ) { m_value[0].Clear(); m_value[1].Clear(); m_unit = newIsRel? SJ_UNIT_DAYS : SJ_UNIT_NA; largerModifications = TRUE;; } } } // done m_op = newOp; return largerModifications; } /******************************************************************************* * SjAdvSearch - Basic Operations ******************************************************************************/ void SjAdvSearch::Init(const wxString& name, SjSelectScope selectScope, SjSelectOp selectOp) { m_id = 0; m_name = name; m_selectScope = selectScope; m_selectOp = selectOp; m_rules.Empty(); m_subset = SJ_SUBSET_NONE; m_subsetId = 0; } void SjAdvSearch::AddRule(SjField field, SjFieldOp op, const wxString& value0, const wxString& value1, SjUnit unit) { m_rules.Add(new SjRule(field, op, value0, value1, unit)); } void SjAdvSearch::AddRule(SjField field, SjFieldOp op, const wxString& value0, long value1, SjUnit unit) { m_rules.Add(new SjRule(field, op, value0, wxString::Format(wxT("%i"), (int)value1), unit)); } void SjAdvSearch::CopyFrom(const SjAdvSearch& o) { if( this != &o ) { m_id = o.m_id; m_name = o.m_name; m_selectScope = o.m_selectScope; m_selectOp = o.m_selectOp; m_subset = o.m_subset; m_subsetId = o.m_subsetId; m_rules.Empty(); int i, iCount = o.m_rules.GetCount(); for( i = 0; i < iCount; i++ ) { AddRule(o.m_rules[i]); } } } bool SjAdvSearch::IsEqualTo(const SjAdvSearch& o) const { int r, rulesCount = (int)m_rules.GetCount(); if( m_id != o.m_id || m_name != o.m_name || rulesCount != (int)o.m_rules.GetCount() || m_selectScope != o.m_selectScope || m_selectOp != o.m_selectOp || m_subset != o.m_subset || m_subsetId != o.m_subsetId ) { return FALSE; } wxASSERT( rulesCount == (int)m_rules.GetCount() ); wxASSERT( rulesCount == (int)o.m_rules.GetCount() ); for( r = 0; r < rulesCount; r++ ) { if( m_rules[r] != o.m_rules[r] ) { return FALSE; } } return TRUE; } long SjAdvSearch::IncludeExclude(SjLLHash* ids, int action) { // "action" values: // +1 - add "ids" to the first SJ_PSEUDOFIELD_INCLUDE, merge other includes to the first one, remove "ids" from all SJ_PSEUDOFIELD_EXCLUDE // -1 - add "ids" to the first SJ_PSEUDOFIELD_EXCLUDE, merge other excludes to the first one, remove "ids" from all SJ_PSEUDOFIELD_INCLUDE // 0 - remove "ids" from all SJ_PSEUDOFIELD_INCLUDE and SJ_PSEUDOFIELD_EXCLUDE int r; SjField fieldToAddTo = action==1? SJ_PSEUDOFIELD_INCLUDE : SJ_PSEUDOFIELD_EXCLUDE; SjField fieldToRemoveFrom = action==1? SJ_PSEUDOFIELD_EXCLUDE : SJ_PSEUDOFIELD_INCLUDE; long fieldToAddToIndex = -1; long fieldToRemoveFromIndex = -1; // include/exclude to the correct rules if( ids->GetCount() ) { for( r = 0; r < (int)m_rules.GetCount(); r++ ) { if( action == 0 ) { if( m_rules[r].m_field == SJ_PSEUDOFIELD_INCLUDE || m_rules[r].m_field == SJ_PSEUDOFIELD_EXCLUDE ) { m_rules[r].RemoveFromInclExcl(ids); if( fieldToAddToIndex == -1 ) fieldToAddToIndex = r; } } else { if( m_rules[r].m_field == fieldToAddTo ) { if( fieldToAddToIndex == -1 ) { // add IDs fieldToAddToIndex = r; m_rules[r].AddToInclExcl(ids); } else { // prepare for deletion; 19.11.2008: bug fixed, see http://www.silverjuke.net/forum/topic-2936.html m_rules[fieldToAddToIndex].AddToInclExcl(m_rules[r].m_value[0]); m_rules[r].m_value[0].Clear(); } } else if( m_rules[r].m_field == fieldToRemoveFrom ) { if( fieldToRemoveFromIndex == -1 ) { // remove IDs fieldToRemoveFromIndex = r; m_rules[r].RemoveFromInclExcl(ids); } else { // prepare for deletion m_rules[fieldToRemoveFromIndex].AddToInclExcl(m_rules[r].m_value[0]); m_rules[r].m_value[0].Clear(); } } } } // no include/exclude rule presend, add one if( action != 0 && fieldToAddToIndex == -1 ) { AddRule(fieldToAddTo, SJ_FIELDOP_IS_EQUAL_TO); fieldToAddToIndex = m_rules.GetCount()-1; m_rules[fieldToAddToIndex].AddToInclExcl(ids); } // remove all empty incl./excl. rules for( r = 0; r < (int)m_rules.GetCount(); r++ ) { if( (m_rules[r].m_field == SJ_PSEUDOFIELD_INCLUDE || m_rules[r].m_field == SJ_PSEUDOFIELD_EXCLUDE) && m_rules[r].GetInclExclCount() == 0 ) { m_rules.RemoveAt(r); r--; } } } // done return fieldToAddToIndex; } void SjAdvSearch::Serialize(SjStringSerializer& ser) const { int r, ruleCount = (int)m_rules.GetCount(); ser.AddLong (5); // fields following, for future use ser.AddLong (m_id); // just for verification, if unknown, please set this to 0 ser.AddString (m_name); // just for verification, if unknown, please set this to an empty string ser.AddLong (m_selectScope); ser.AddLong (m_selectOp); ser.AddLong (ruleCount); for( r = 0; r < ruleCount; r++ ) { m_rules[r].Serialize(ser); } } bool SjAdvSearch::Unserialize(SjStringSerializer& ser) { long fieldsFollowing= ser.GetLong (); m_id = ser.GetLong (); m_name = ser.GetString (); m_selectScope = (SjSelectScope)ser.GetLong (); m_selectOp = (SjSelectOp) ser.GetLong (); long rulesFollowing = ser.GetLong (); if( fieldsFollowing != 5 || m_selectScope >= SJ_SELECTSCOPE_COUNT || m_selectOp >= SJ_SELECTOP_COUNT || ser.HasErrors() ) { Clear(); return FALSE; } SjRule ruleToAdd; m_rules.Empty(); while( rulesFollowing ) { if( !ruleToAdd.Unserialize(ser) ) { Clear(); return FALSE; } AddRule(ruleToAdd); rulesFollowing--; } return TRUE; } /******************************************************************************* * SjAdvSearch::IsOk() ******************************************************************************/ bool SjAdvSearch::IsOk(wxString& retError, wxString& retWarning) const { wxString ruleError1, ruleError2; size_t r; int criteriaCount = 0; bool addCaseWarning = FALSE; retError.Clear(); retWarning.Clear(); for( r = 0; r < m_rules.GetCount(); r++ ) { m_rules[r].IsOk(ruleError1, ruleError2, &addCaseWarning); if( !ruleError1.IsEmpty() ) { retError += wxT("\n- ") + m_rules[r].GetFieldDescr() + wxT(": ") + ruleError1; } if( !ruleError2.IsEmpty() ) { retError += wxT("\n -") + m_rules[r].GetFieldDescr(); if( !ruleError1.IsEmpty() ) retError += wxString(wxT(" ")) + _("(second field)"); retError += wxT(": ") + ruleError2; } criteriaCount++; } if( criteriaCount == 0 ) { retError += wxT("\n -") + wxString(_("No valid criteria defined."));; } if( !retError.IsEmpty() ) { retError.Prepend(_("The search cannot be started; please check the following fields:")+wxString(wxT("\n"))); } if( addCaseWarning ) { retWarning = _("Note: The operators \"equal\" and \"unequal\" are case-sensitive."); } return retError.IsEmpty(); } /******************************************************************************* * SjAdvSearch::GetAsSql() and the SjLimitValues help class ******************************************************************************/ class LimitValues { public: LimitValues () { m_fieldIndex = 0; m_max = 0; m_curr = 0; } bool Set (int fieldIndex, long max__, long multiplier); bool IsSet () const { return (m_fieldIndex!=0); } int m_fieldIndex; wxLongLong m_max, m_curr; }; bool LimitValues::Set(int fieldIndex, long max__, long multiplier) { // function returns TRUE if the limit is initialized and FALSE if it is changed wxASSERT( fieldIndex ); wxLongLong max = max__; max *= multiplier; if( m_fieldIndex ) { if( max < m_max ) { m_max = max; } return FALSE; } else { m_max = max; m_fieldIndex = fieldIndex; return TRUE; } } SjSearchStat SjAdvSearch::GetAsSql(SjLLHash* retHash, wxString& retSql) const { SjSearchStat stat; // // init the return values // retHash->Clear(); if( !IsSet() ) { retSql = wxT("(1)"); // no filter - select all stat.m_advResultCount = -1; return stat; } // // go through all rules and collect the intermediate conditions // wxString fields = wxT("id"); int fieldsCount = 1; wxString where; wxString excl; wxString orderBy; #define LIMIT_BYTES 0 #define LIMIT_MS 1 #define LIMIT_TRACKS 2 #define LIMIT_ALBUMS 3 #define LIMIT_COUNT 4 LimitValues limit[LIMIT_COUNT]; { size_t r; SjRule* rule; wxArrayString orderByArray; wxString incl; for( r = 0; r < m_rules.GetCount(); r++ ) { rule = &m_rules[r]; if( rule->m_field == SJ_PSEUDOFIELD_INCLUDE ) { // // MANUAL INCLUDE/EXCLUDE track ids; this is handled separatly from the select // operation as these conditions should have a higher priority // if( !incl.IsEmpty() ) { incl += wxT(" OR "); } incl += rule->GetAsSql(); } else if( rule->m_field == SJ_PSEUDOFIELD_EXCLUDE ) { if( !excl.IsEmpty() ) { excl += wxT(" AND "); } excl += rule->GetAsSql(); } else if( rule->m_field == SJ_PSEUDOFIELD_LIMIT ) { // // Add a LIMIT / ORDER BY condition. // Several LIMIT / ORDER BY rules are okay: The smallest value of each unit // is taken as the limit and the fields are ordered using several conditions. // long ruleLimitAmount; SjTools::ParseNumber(rule->m_value[0], &ruleLimitAmount); long ruleOrderById; SjTools::ParseNumber(rule->m_value[1], &ruleOrderById); // apply LIMIT long multiplier = 1; switch( rule->m_unit ) { case SJ_UNIT_HOURS: multiplier = 60; case SJ_UNIT_MINUTES: if( limit[LIMIT_MS].Set(fieldsCount, ruleLimitAmount, multiplier*60*1000) ) { fields += wxT(",playtimems"); fieldsCount++; } break; case SJ_UNIT_GB: multiplier = 1024; case SJ_UNIT_MB: if( limit[LIMIT_BYTES].Set(fieldsCount, ruleLimitAmount, multiplier*1024*1024) ) { fields += wxT(",databytes"); fieldsCount++; } break; case SJ_UNIT_TRACKS: limit[LIMIT_TRACKS].Set(fieldsCount, ruleLimitAmount, 1); // no fields needed for this limit type break; case SJ_UNIT_ALBUMS: if( limit[LIMIT_ALBUMS].Set(fieldsCount, ruleLimitAmount, 1) ) { if( m_selectScope == SJ_SELECTSCOPE_TRACKS ) { fields += wxT(",albumid"); fieldsCount++; } // no else: when selecting albums (SJ_SELECTSCOPE_ALBUMS), } // the album limit is just counted in the outer loop, see below break; default: break; } // apply ORDER BY by adding the condition to the array, if not exists wxString ruleOrderByField; if( ruleOrderById == SJ_PSEUDOFIELD_RANDOM ) { ruleOrderByField = wxT("random()"); } else { ruleOrderByField = rule->GetFieldDbName((SjField)(ruleOrderById&~SJ_FIELDFLAG_DESC)) + wxString(ruleOrderById&SJ_FIELDFLAG_DESC? wxT(" DESC") : wxT("")); } if( orderByArray.Index(ruleOrderByField) == wxNOT_FOUND ) { orderByArray.Add(ruleOrderByField); } } else { // // Add a (from this point of view) simple WHERE condition. // if( !where.IsEmpty() ) { where += m_selectOp==SJ_SELECTOP_ALL? wxT(" AND ") : wxT(" OR "); } where += rule->GetAsSql(); } } // add include / exclude conditions to WHERE if( !incl.IsEmpty() ) { if( !where.IsEmpty() ) { where = wxT("(") + where + wxT(") OR "); } where += incl; } if( !excl.IsEmpty() ) { if( !where.IsEmpty() ) { where = wxT("(") + where + wxT(") AND "); } where += excl; } // serialize the ORDER BY array to a string for( r = 0; r < orderByArray.GetCount(); r++ ) { if( r ) { orderBy += wxT(","); } orderBy += orderByArray[r]; } } // // apply NOT on WHERE clause? // if( m_selectOp == SJ_SELECTOP_NONE && !where.IsEmpty() ) { where = wxT("NOT(") + where + wxT(")"); } // // limit macros for the select // #define CHECK_LIMIT(i) if( limit[(i)].m_fieldIndex ) \ { \ limit[(i)].m_curr += innerSql.GetLong(limit[(i)].m_fieldIndex); \ if( limit[(i)].m_curr > limit[(i)].m_max ) \ { \ limit[(i)].m_curr -= innerSql.GetLong(limit[(i)].m_fieldIndex); \ limitReached = TRUE; \ break; \ } \ } #define CHECK_LIMIT_INC(i) if( limit[(i)].m_fieldIndex ) \ { \ limit[(i)].m_curr++; \ if( limit[(i)].m_curr > limit[(i)].m_max ) \ { \ limit[(i)].m_curr--; \ limitReached = TRUE; \ break; \ } \ } // // do the select // { wxSqlt innerSql; bool limitReached = FALSE; if( m_selectScope == SJ_SELECTSCOPE_TRACKS ) { // // select single tracks // bool hasInnerLimit = (limit[LIMIT_BYTES].IsSet()||limit[LIMIT_MS].IsSet()||limit[LIMIT_ALBUMS].IsSet()); SjLLHash uniqueAlbumIds; // needed when limiting by albums // build inner query wxString query = wxT("SELECT ") + fields + wxT(" FROM tracks"); if( !where.IsEmpty() ) { query += wxT(" WHERE ") + where; } if( !orderBy.IsEmpty() ) { query += wxT(" ORDER BY ") + orderBy; } if( limit[LIMIT_TRACKS].IsSet() ) { query += wxString::Format(wxT(" LIMIT %i"), (int)limit[LIMIT_TRACKS].m_max.GetLo()); } query += wxT(";"); #ifdef __WXDEBUG__ { wxString queryDebug__(query); queryDebug__.Replace(wxT("%"), wxT("%%")); wxLogDebug(queryDebug__); } #endif // query innerSql.Query(query); while( innerSql.Next() ) { if( hasInnerLimit ) { // check limits (limiting by tracks is done by the LIMIT command in the SQL query) CHECK_LIMIT (LIMIT_BYTES); CHECK_LIMIT (LIMIT_MS); if( limit[LIMIT_ALBUMS].m_fieldIndex ) { // limiting for albums: tracks are okay as long as the maximum is not reached; // if the maximum is reached, only tracks with already existing album IDs are okay. if( limitReached ) { if( uniqueAlbumIds.Lookup(innerSql.GetLong(limit[LIMIT_ALBUMS].m_fieldIndex)) == 0 ) { continue; // don't add this track } } else if( uniqueAlbumIds.Insert(innerSql.GetLong(limit[LIMIT_ALBUMS].m_fieldIndex), 1) == 0 ) { limit[LIMIT_ALBUMS].m_curr++; if( limit[LIMIT_ALBUMS].m_curr >= limit[LIMIT_ALBUMS].m_max ) { limitReached = TRUE; // from now on, only tracks with existing album IDs are added } } } } // add the track to the result retHash->Insert(innerSql.GetLong(0), 1); } } else { // // select complete albums // bool hasInnerLimit = (limit[LIMIT_BYTES].IsSet()||limit[LIMIT_MS].IsSet()||limit[LIMIT_TRACKS].IsSet()); wxSqlt outerSql; // build outer query wxString outerQuery = wxT("SELECT DISTINCT albumid FROM tracks"); if( !where.IsEmpty() ) { outerQuery += wxT(" WHERE ") + where; } if( !orderBy.IsEmpty() ) { outerQuery += wxT(" ORDER BY ") + orderBy; } outerQuery += wxT(";"); #ifdef __WXDEBUG__ { wxString queryDebug__(outerQuery); queryDebug__.Replace(wxT("%"), wxT("%%")); wxLogDebug(queryDebug__); } #endif // build inner query wxString innerQuery = wxT("SELECT ") + fields + wxT(" FROM tracks WHERE albumid=%i"); if( !excl.IsEmpty() ) { innerQuery += wxT(" AND ") + excl; } innerQuery += wxT(";"); // outer query outerSql.Query(outerQuery); while( !limitReached && outerSql.Next() ) { CHECK_LIMIT_INC (LIMIT_ALBUMS); // inner query innerSql.Query(wxString::Format(innerQuery, (int)outerSql.GetLong(0))); while( innerSql.Next() ) { if( hasInnerLimit ) { CHECK_LIMIT (LIMIT_BYTES); CHECK_LIMIT (LIMIT_MS); CHECK_LIMIT_INC (LIMIT_TRACKS); } // add the track to the result retHash->Insert(innerSql.GetLong(0), 1); } } } } // // done so far // stat.m_advResultCount = retHash->GetCount(); if( limit[LIMIT_BYTES].IsSet() ) { limit[LIMIT_BYTES].m_curr /= (1024*1024); stat.m_mbytes = limit[LIMIT_BYTES].m_curr.GetLo(); } else { stat.m_mbytes = -1; } if( limit[LIMIT_MS].IsSet() ) { limit[LIMIT_MS].m_curr /= 1000; stat.m_seconds = limit[LIMIT_MS].m_curr.GetLo(); } else { stat.m_seconds = -1; } if( stat.m_advResultCount <= 0 ) { wxASSERT( stat.m_advResultCount == 0 ); retSql = wxT("(0)"); } /*else if( stat.m_advResultCount < 500 ) { // not used as we modify the given hash // for easy filter manipulation retSql = "tracks.id IN("+ retHash->GetKeysAsString() +")"; } else */ { retSql = wxT("INFILTER(tracks.id)"); } return stat; } wxString SjAdvSearch::GetRandomUrl() const { // advanced search valid? if( GetId() == 0 ) { return ""; // advanced search not valid. } // get all hash IDs SjLLHash trackIdsHash; { wxString dummySelectSql; GetAsSql(&trackIdsHash, dummySelectSql); if( trackIdsHash.GetCount()==0 ) { return ""; // no tracks at all. } } // select a random track ID long selectedTrackId; { long wantedIndex = SjTools::Rand(trackIdsHash.GetCount()); SjHashIterator iterator; while( (trackIdsHash.Iterate(iterator, &selectedTrackId)) ) { wantedIndex--; if( wantedIndex < 0 ) { break; } } } // get URL for this track ID, may be empty return g_mainFrame->m_libraryModule->GetUrl(selectedTrackId); } /******************************************************************************* * SjSearchStat ******************************************************************************/ void SjSearchStat::Clear() { m_totalResultCount = 0; m_advResultCount = 0; m_mbytes = 0; m_seconds = 0; } void SjSearchStat::Add(const SjSearchStat& o) { #define ADD_ELEM(a,b) if( (a)!=-1 && (b)!=-1 ) { (a) += (b); } ADD_ELEM(m_totalResultCount, o.m_totalResultCount); ADD_ELEM(m_advResultCount, o.m_advResultCount); ADD_ELEM(m_mbytes, o.m_mbytes); ADD_ELEM(m_seconds, o.m_seconds); } void SjSearchStat::CopyFrom(const SjSearchStat& o) { m_totalResultCount = o.m_totalResultCount; m_advResultCount = o.m_advResultCount; m_mbytes = o.m_mbytes; m_seconds = o.m_seconds; } silverjuke-16.2.3/src/sjbase/search.h000066400000000000000000000330461266006671500174610ustar00rootroot00000000000000/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: search.h * Authors: Björn Petersen * Purpose: searching * ******************************************************************************/ #ifndef __SJ_SEARCHSJ_H__ #define __SJ_SEARCHSJ_H__ /******************************************************************************* * Enums ******************************************************************************/ enum SjField { // do not modify the order of this enum as the values are stored to disk! // add new values to the end (before SJ_FIELD_COUNT)! SJ_PSEUDOFIELD_LIMIT = 0 ,SJ_PSEUDOFIELD_RANDOM ,SJ_PSEUDOFIELD_SQL ,SJ_PSEUDOFIELD_TRACKARTISTALBUM ,SJ_PSEUDOFIELD_FILETYPE ,SJ_PSEUDOFIELD_QUEUEPOS ,SJ_PSEUDOFIELD_INCLUDE ,SJ_PSEUDOFIELD_EXCLUDE ,SJ_FIELD_URL = 100 ,SJ_FIELD_TIMEADDED ,SJ_FIELD_TIMEMODIFIED ,SJ_FIELD_TIMESPLAYED ,SJ_FIELD_LASTPLAYED ,SJ_FIELD_DATABYTES ,SJ_FIELD_BITRATE ,SJ_FIELD_SAMPLERATE ,SJ_FIELD_CHANNELS ,SJ_FIELD_PLAYTIME ,SJ_FIELD_AUTOVOL ,SJ_FIELD_TRACKNAME = 200 ,SJ_FIELD_TRACKNR ,SJ_FIELD_TRACKCOUNT ,SJ_FIELD_DISKNR ,SJ_FIELD_DISKCOUNT ,SJ_FIELD_LEADARTISTNAME = 300 ,SJ_FIELD_ORGARTISTNAME ,SJ_FIELD_COMPOSERNAME ,SJ_FIELD_ALBUMNAME = 400 ,SJ_FIELD_GENRENAME = 500 ,SJ_FIELD_GROUPNAME ,SJ_FIELD_COMMENT ,SJ_FIELD_BEATSPERMINUTE ,SJ_FIELD_RATING ,SJ_FIELD_YEAR ,SJ_FIELD_COUNT ,SJ_FIELDFLAG_DESC = 0x10000000L }; enum SjFieldOp { // do not modify the order or the values of this enum as the values are stored to disk! // add new values to the end (before SJ_FIELDOP_COUNT)! SJ_FIELDOP_IS_EQUAL_TO = 0 ,SJ_FIELDOP_IS_UNEQUAL_TO ,SJ_FIELDOP_IS_SET ,SJ_FIELDOP_IS_UNSET ,SJ_FIELDOP_IS_GREATER_THAN ,SJ_FIELDOP_IS_GREATER_OR_EQUAL ,SJ_FIELDOP_IS_LESS_THAN ,SJ_FIELDOP_IS_LESS_OR_EQUAL ,SJ_FIELDOP_IS_IN_RANGE ,SJ_FIELDOP_IS_NOT_IN_RANGE ,SJ_FIELDOP_CONTAINS ,SJ_FIELDOP_DOES_NOT_CONTAIN ,SJ_FIELDOP_STARTS_WITH ,SJ_FIELDOP_DOES_NOT_START_WITH ,SJ_FIELDOP_ENDS_WITH ,SJ_FIELDOP_DOES_NOT_END_WITH ,SJ_FIELDOP_IS_IN_THE_LAST ,SJ_FIELDOP_IS_NOT_IN_THE_LAST ,SJ_FIELDOP_IS_SIMELAR_TO ,SJ_FIELDOP_STARTS_SIMELAR_TO ,SJ_FIELDOP_COUNT }; enum SjFieldType { SJ_FIELDTYPE_STRING = 0 ,SJ_FIELDTYPE_NUMBER ,SJ_FIELDTYPE_DATE ,SJ_FIELDTYPE_LIST ,SJ_FIELDTYPE_COUNT }; enum SjUnit { // do not modify the order of this enum as the values are stored to disk! // add new values to the end (before SJ_UNIT_COUNT)! SJ_UNIT_NA = 0 ,SJ_UNIT_SECONDS = 100 ,SJ_UNIT_MINUTES ,SJ_UNIT_HOURS ,SJ_UNIT_DAYS ,SJ_UNIT_BYTE = 200 ,SJ_UNIT_KB ,SJ_UNIT_MB ,SJ_UNIT_GB ,SJ_UNIT_TRACKS = 300 ,SJ_UNIT_ALBUMS ,SJ_UNIT_COUNT }; enum SjSelectScope { // do not modify the order of this enum as the values are stored to disk! // add new values to the end (before SJ_SELECT_COUNT)! SJ_SELECTSCOPE_ALBUMS = 0 ,SJ_SELECTSCOPE_TRACKS ,SJ_SELECTSCOPE_COUNT }; enum SjSelectOp { // do not modify the order of this enum as the values are stored to disk! // add new values to the end (before SJ_SELECTOP_COUNT)! SJ_SELECTOP_ALL = 0 ,SJ_SELECTOP_ANY ,SJ_SELECTOP_NONE ,SJ_SELECTOP_COUNT }; enum SjSubset { SJ_SUBSET_NONE = 0 ,SJ_SUBSET_INCLUDED_TRACKS ,SJ_SUBSET_EXCLUDED_TRACKS ,SJ_SUBSET_COUNT }; #define SJ_SELECTSCOPE_DEFAULT SJ_SELECTSCOPE_TRACKS #define SJ_SELECTOP_DEFAULT SJ_SELECTOP_ALL #define SJ_FIELD_DEFAULT SJ_PSEUDOFIELD_TRACKARTISTALBUM #define SJ_FIELDOP_DEFAULT SJ_FIELDOP_CONTAINS #define SJ_UNIT_DEFAULT SJ_UNIT_NA #define SJ_QUEUEPOS_CURR_STR wxT("QUEUEPOS()") /******************************************************************************* * SjSearchStat ******************************************************************************/ class SjSearchStat { public: SjSearchStat (const SjSearchStat& o) { CopyFrom(o); } SjSearchStat () { Clear(); } void Clear (); SjSearchStat& operator += (const SjSearchStat& o) { Add(o); return *this; } SjSearchStat& operator = (const SjSearchStat& o) { CopyFrom(o); return *this; } long m_totalResultCount; long m_advResultCount; // unknown adv. result count is set to -1 long m_mbytes; long m_seconds; private: void Add (const SjSearchStat& o); void CopyFrom (const SjSearchStat& o); }; /******************************************************************************* * SjRule ******************************************************************************/ class SjRule { public: // constructor SjRule () { Clear(); } SjRule (SjField field, SjFieldOp op, const wxString& value0 = wxT(""), const wxString& value1 = wxT(""), SjUnit unit = SJ_UNIT_DEFAULT); SjRule (const SjRule& o) { CopyFrom(o); } void Clear (); // copy / compare SjRule& operator = (const SjRule& o) { CopyFrom(o); return *this; } bool operator == (const SjRule& o) const { return IsEqualTo(o); } bool operator != (const SjRule& o) const { return !IsEqualTo(o); } // is the rule valid? bool IsOk (wxString& error1, wxString& error2, bool* addCaseWarning=NULL) const; // get information about the rule wxString GetFieldDescr () const { return GetFieldDescr(m_field); } /// get common information about rules static wxString GetFieldDescr (SjField); static SjFieldType GetFieldType (SjField); static bool IsValidFieldOp (SjField field, SjFieldOp op); static wxString GetFieldDbName (SjField); // Convert the field or the operator of the rule. // The function returns TRUE if the conversion does not change // any types -- otherwise, the conversion is also done but some // fields are initialized; in this case FALSE is returned. bool Convert (SjField newField); bool Convert (SjFieldOp newOp); // (un-)serialize void Serialize (SjStringSerializer&) const; bool Unserialize (SjStringSerializer&); // special stuff for include/exclude IDs // (internally, the IDs are stored in a string as ",123,456,78," (note the commas at start/end!) long GetInclExclCount () const; wxString GetInclExclDescr () const; void RemoveFromInclExcl (SjLLHash* ids); void AddToInclExcl (SjLLHash* ids); void AddToInclExcl (const wxString& idsToAdd); private: // private stuff SjField m_field; SjFieldOp m_op; wxString m_value[2]; SjUnit m_unit; wxString IsValueOk (const wxString& value, bool* addCaseWarning=NULL) const; static wxString GetAsSql (const wxString& value, SjField, SjFieldOp, SjUnit, bool forceSet, bool recursiveCall=FALSE); static wxString GetAsSql (SjField, SjFieldOp, bool forceSet); wxString GetAsSql () const; void CopyFrom (const SjRule& o); bool IsEqualTo (const SjRule& o) const; friend class SjRuleControls; friend class SjAdvSearch; }; WX_DECLARE_OBJARRAY(SjRule, SjArrayRule); /******************************************************************************* * SjAdvSearch ******************************************************************************/ class SjAdvSearch { public: // constructor SjAdvSearch () { Init(); } void Clear () { Init(); } void Init (const wxString& name=wxT(""), SjSelectScope selectScope=SJ_SELECTSCOPE_DEFAULT, SjSelectOp selectOp=SJ_SELECTOP_DEFAULT); void SetSubset (SjSubset subset, long subsetId) { m_subset=subset; m_subsetId=subsetId; } // copy / compare SjAdvSearch& operator = (const SjAdvSearch& o) { CopyFrom(o); return *this; } bool operator == (const SjAdvSearch& o) const { return IsEqualTo(o); } bool operator != (const SjAdvSearch& o) const { return !IsEqualTo(o); } // get information about the advanced search bool IsSet () const { return !m_rules.IsEmpty(); } bool IsOk (wxString& error, wxString& warning) const; wxString GetName () const { return m_name; } long GetId () const { return m_id; } // adding rules to the advanced search void AddRule (const SjRule& rule) { m_rules.Add(new SjRule(rule)); } void AddRule (SjField field=SJ_FIELD_DEFAULT, SjFieldOp op=SJ_FIELDOP_DEFAULT, const wxString& value0=wxT(""), const wxString& value1=wxT(""), SjUnit unit=SJ_UNIT_DEFAULT); void AddRule (SjField field, SjFieldOp op, const wxString& value0, long value1, SjUnit unit=SJ_UNIT_DEFAULT); // including/excluding IDs, // returns the first changed rule or -1 if nothing is changed long IncludeExclude (SjLLHash* ids, int action); // Get the advanved search as simple conditions for an SQL statement. // The given hash MAY be used in combination with the SQL-Function INFILTER() // which queries the hash and must be provided by the caller. // Normally, the function returns sth. like "(1)", "(0)" or "INFILTER(tracks.id)" SjSearchStat GetAsSql (SjLLHash*, wxString&) const; // Get concrete URLs wxString GetRandomUrl () const; // (un-)serialize void Serialize (SjStringSerializer&) const; bool Unserialize (SjStringSerializer&); private: // private stuff long m_id; wxString m_name; SjSelectScope m_selectScope; SjSelectOp m_selectOp; SjArrayRule m_rules; // subsets are used eg. to show the included or excluded tracks // as a separate search SjSubset m_subset; long m_subsetId; void CopyFrom (const SjAdvSearch& o); bool IsEqualTo (const SjAdvSearch& o) const; friend class SjAdvSearchDialog; friend class SjAdvSearchModule; }; /******************************************************************************* * SjSimpleSearch ******************************************************************************/ class SjSimpleSearch { public: // c'tor SjSimpleSearch (const wxString& words=wxT("")) { m_words = words; } void Clear () { m_words.Empty(); } // copy / compare SjSimpleSearch& operator = (const SjSimpleSearch& o) { CopyFrom(o); return *this; } bool operator == (const SjSimpleSearch& o) const { return IsEqualTo(o); } bool operator != (const SjSimpleSearch& o) const { return !IsEqualTo(o); } // get information about the simple search bool IsSet () const { return !m_words.IsEmpty(); } wxString GetWords () const { return m_words; } wxString GetHiliteWords () const { return m_words; } private: // private stuff wxString m_words; void CopyFrom (const SjSimpleSearch& o) { m_words = o.m_words; } bool IsEqualTo (const SjSimpleSearch& o) const { return (m_words==o.m_words); } }; /******************************************************************************* * SjSearch ******************************************************************************/ class SjSearch { public: // c'tor SjSearch () { } SjSearch (const wxString& words) : m_simple(words) { } // the search SjSimpleSearch m_simple; SjAdvSearch m_adv; // copy / compare // the search result count is NOT copied or compared! SjSearch& operator = (const SjSearch& o) { CopyFrom(o); return *this; } bool operator == (const SjSearch& o) const { return IsEqualTo(o); } bool operator != (const SjSearch& o) const { return !IsEqualTo(o); } // get information bool IsSet () const { return (m_simple.IsSet()||m_adv.IsSet()); } private: void CopyFrom (const SjSearch& o) { m_adv=o.m_adv; m_simple=o.m_simple; } bool IsEqualTo (const SjSearch& o) const { return (m_simple==o.m_simple && m_adv==o.m_adv); } }; #endif // __SJ_SEARCHSJ_H__ silverjuke-16.2.3/src/sjbase/sj_api.h000066400000000000000000000041361266006671500174570ustar00rootroot00000000000000/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: sj_api.h * Authors: Björn Petersen * Purpose: Silverjuke C-Interface for Plugins * ******************************************************************************/ #ifndef SJ_API_H #define SJ_API_H #ifdef __cplusplus extern "C" { #endif /* Includes, Basic types */ #ifdef WIN32 #include #define SJCALLBACK CALLBACK #define SJPARAM LPARAM #else #include #define SJCALLBACK #define SJPARAM intptr_t #endif /* Plugin initialization */ typedef SJPARAM (SJCALLBACK SJPROC)(struct SjInterface*, SJPARAM msg, SJPARAM param1, SJPARAM param2, SJPARAM param3); typedef struct SjInterface { SJPROC* CallPlugin; SJPROC* CallMaster; SJPARAM rsvd; SJPARAM user; } SjInterface; SjInterface* SjGetInterface(void); /* Messages Silverjuke -> Plugin */ #define SJ_PLUGIN_INIT 10000 #define SJ_PLUGIN_EXIT 10001 #define SJ_PLUGIN_CALL 10010 /* Messages Plugin -> Silverjuke */ #define SJ_GET_VERSION 20000 #define SJ_EXECUTE 20040 #ifdef __cplusplus } #endif #endif /* #ifndef SJ_API_H */ silverjuke-16.2.3/src/sjbase/skin.cpp000066400000000000000000002727771266006671500175330ustar00rootroot00000000000000/********************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: skin.cpp * Authors: Björn Petersen * Purpose: Silverjuke skins * ******************************************************************************* * * We have an official Apple creator code for Silverjuke Skin *.sjs files ... * Application: Silverjuke * Application Signatures: * SjSk (Hex) 536A536B * ...however, I'n not sure if we really need this. * ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include // sic! WX_DEFINE_LIST(SjSkinImageList); WX_DEFINE_LIST(SjSkinItemList); WX_DEFINE_LIST(SjSkinLayoutList); /******************************************************************************* * SjSkinItem ******************************************************************************/ SjSkinItem::SjSkinItem() { m_timer = NULL; m_itemType = SJ_UNKNOWNITEM; m_targetId = IDT_NONE; m_userId = NULL; #ifdef SJ_SKIN_USE_HIDE m_hidden = FALSE; #endif #ifdef SJ_SKIN_USE_BELONGSTO m_belongsToId = IDT_NONE; #endif m_targetFlags = 0; m_targetName = NULL; m_doubleClickTargetId = IDT_NONE; m_doubleClickTargetName = NULL; m_usesMouse = TRUE; m_usesPaint = TRUE; m_image = NULL; m_alwaysRedrawBackground= FALSE; m_skinWindow = NULL; m_colours = NULL; // set to SjSkinSkin::m_itemDefColours() m_parent = NULL; m_prop = 0; m_itemTooltip = NULL; } SjSkinItem::~SjSkinItem() { if( m_timer ) delete m_timer; if( m_userId ) delete m_userId; if( m_targetName ) delete m_targetName; if( m_doubleClickTargetName ) delete m_doubleClickTargetName; if( m_itemTooltip ) delete m_itemTooltip; } bool SjSkinItem::Create(const wxHtmlTag& tag, wxString& error) { // this function should not be called! wxASSERT_MSG(0, wxT("SjSkinItem::Create() is a virtual function and should only be called for derived objects!")); return FALSE; } void SjSkinItem::SetValue(const SjSkinValue& value) { // for derived classes } void SjSkinItem::CreateTimer(long ms) { if( ms > 0 ) { if( m_timer == NULL ) { m_timer = new SjSkinItemTimer(this); if( m_timer == NULL ) return; } m_timer->Start(ms); } else { if( m_timer ) { delete m_timer; m_timer = 0; } } } bool SjSkinItem::CheckImage(wxString& error) { if( !m_image ) { error = wxT("Image not found.")/*n/t*/; return FALSE; } return TRUE; } bool SjSkinItem::CheckTarget(wxString& error) { if( !m_targetId ) { // error = "Target not found."/*n/t*/; -- don't print an error as the targets may be expanded in future versions return FALSE; } return TRUE; } void SjSkinItem::OnSize() { // for derived classes } void SjSkinItem::OnMouseLeftDown(long x, long y, bool doubleClick, long accelFlags) { // for derived classes } SjMouseUsed SjSkinItem::OnMouseLeftUp(long x, long y, long accelFlags, bool captureLost) { // for derived classes return SJ_MOUSE_NOT_USED; // don't send a delayed event } void SjSkinItem::OnMouseMotion(long x, long y, bool leftDown) { // for derived classes } void SjSkinItem::OnMouseLeave() { // for derived classes } void SjSkinItem::OnTimer() { // for derived classes } void SjSkinItem::OnPaint(wxDC& dc) { // for derived classes wxASSERT_MSG(0, wxT("SjSkinItem::OnPaint() must be implemented in derived classes.")); } wxRect SjSkinItem::GetScreenRect() const { wxRect scrRect = m_rect; m_skinWindow->ClientToScreen(&scrRect.x, &scrRect.y); return scrRect; } static long s_globalDragImageHidden = 0; void SjSkinItem::HideDragImage() { if( m_skinWindow->m_dragImage || s_globalDragImageHidden ) { if( s_globalDragImageHidden == 0 && m_skinWindow->m_dragRect.Intersects(GetScreenRect()) ) { m_skinWindow->m_dragImage->Hide(); } // always increase the "hidden" counter - even if the drag image is not hidden at the moment; // this is needed as recursive paiting calls may go offscreen and have no chance to compare // their rectangle against any screen coordinated. the very outer call should // make sure to use screen coordinates! s_globalDragImageHidden++; } } void SjSkinItem::ShowDragImage() { if( s_globalDragImageHidden ) { s_globalDragImageHidden--; if( s_globalDragImageHidden == 0 && m_skinWindow->m_dragImage ) { m_skinWindow->m_dragImage->Show(); } } } void SjSkinItem::RedrawMe() { wxASSERT(m_skinWindow); wxClientDC dc(m_skinWindow); // anything to redraw? if( m_rect.width == 0 || m_rect.height == 0 || m_skinWindow == NULL || m_skinWindow->m_currLayout == NULL ) { return; } // check if there are items ABOVE this item if( m_hasOverlayingItems==-1 /*don't know yet*/ ) { m_hasOverlayingItems = 0; bool thisItemFound = FALSE; SjSkinItem* item; SjSkinItemList::Node* itemnode = m_skinWindow->m_currLayout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( thisItemFound ) { if( m_rect.Intersects(item->m_rect) ) { m_hasOverlayingItems = 1; break; } } else if( item == this ) { thisItemFound = TRUE; } itemnode = itemnode->GetNext(); } } // draw... if( m_alwaysRedrawBackground #ifdef SJ_SKIN_USE_HIDE || m_hidden #endif || m_hasOverlayingItems ) { // ...the item needs the background to be repainted first (maybe it // uses a mask) or the item has overlaying items. In any case, we'll // paint several items in the item rect... bool drawDone = FALSE; // ...drawing offscreen to avoid flickering wxBitmap memBitmap(m_rect.width, m_rect.height); wxMemoryDC memDc; memDc.SelectObject(memBitmap); if( memDc.IsOk() ) { HideDragImage(); m_skinWindow->RedrawAll(memDc, &m_rect, 0-m_rect.x, 0-m_rect.y); m_skinWindow->RedrawFinalLines(memDc, 0-m_rect.x, 0-m_rect.y); dc.Blit(m_rect.x, m_rect.y, m_rect.width, m_rect.height, &memDc, 0, 0); ShowDragImage(); drawDone = TRUE; } if( !drawDone ) { // ...drawing onscreen, faster but with flickering. // We do not call dc.SetClippingRegion(m_rect) as nested clippings via GetClippingBox() do not work well // and the dc.SetClippingRegion() is needed by the called classes // (dc.SetClippingRegion() should only be used in the last iteration before _really_ drawing). HideDragImage(); m_skinWindow->RedrawAll(dc, &m_rect); m_skinWindow->RedrawFinalLines(dc); ShowDragImage(); } } else { // ...very good and very fast: the item does not need the background // to be drawn first and the item has no overlaying items. We can // just call the drawing function. HideDragImage(); OnPaint(dc); m_skinWindow->RedrawFinalLines(dc); ShowDragImage(); } } /******************************************************************************* * SjSkinBoxItem - Constructor and Misc. ******************************************************************************/ bool SjSkinBoxItem::Create(const wxHtmlTag& tag, wxString& error) { wxString fontFace = SJ_DEF_FONT_FACE; if( tag.HasParam(wxT("FONT")) ) { wxArrayString tryFaces = SjTools::Explode(tag.GetParam(wxT("FONT")), wxT(','), 1); for( size_t t = 0; t < tryFaces.GetCount(); t++ ) { wxString tryFace = tryFaces.Item(t).Trim(true).Trim(false); if( g_tools->HasFacename(tryFace) ) { fontFace = tryFace; break; } } } m_runningMs = 0; m_totalMs = 0; m_flags = 0; m_font = wxFont(10/*size changed later*/, wxSWISS, wxNORMAL, wxNORMAL, FALSE, fontFace); m_fontHeight = 0; if( tag.HasParam(wxT("TEXT")) ) { m_text = tag.GetParam(wxT("TEXT")); } m_border = FALSE; int test; if( tag.GetParamAsInt(wxT("BORDER"), &test) && test ) { m_border = TRUE; } m_centerOffset = 0; if( tag.GetParamAsInt(wxT("CENTEROFFSET"), &test) && test ) { m_centerOffset = test; } if( m_targetId == IDT_CURR_CREDIT ) { int test; if( tag.GetParamAsInt(wxT("HIDECREDITINDISPLAY"), &test) ) { if( test == 1 ) m_prop |= SJ_SKIN_PROP_HIDE_CREDIT_IN_DISPLAY; } } wxString dummy; if( !CheckTarget(dummy) ) { m_usesMouse = FALSE; } m_itemType = SJ_BOXITEM; m_mouseSubitem = SJ_SUBITEM_NONE; m_mouseDownX = -10000; m_mouseDownY = -10000; m_mouseState = SJ_MOUSE_STATE_NORMAL; m_alwaysRedrawBackground = !m_colours[SJ_COLOUR_NORMAL].bgSet; if( !m_width.IsSet() ) { m_width.SetAbs(16); } if( !m_height.IsSet() ) { m_height.SetAbs(16); } return TRUE; } void SjSkinBoxItem::SetValue(const SjSkinValue& value) { long flags = value.value; long runningMs = (flags&SJ_VFLAG_VMIN_IS_TIME)? value.vmin : 0; long totalMs = (flags&SJ_VFLAG_VMAX_IS_TIME)? value.vmax : 0; if( m_runningMs != runningMs || m_totalMs != totalMs || m_flags != flags || m_text != value.string ) { m_text = value.string; m_flags = flags; m_runningMs = runningMs; m_totalMs = totalMs; RedrawMe(); } } int SjSkinBoxItem::FindSubitem(long x, long y, wxRect& subitemRect) { subitemRect = m_rect; subitemRect.height--; if( x >= m_rect.x && y >= m_rect.y && x < (m_rect.x + m_rect.width) && y < (m_rect.y + m_rect.height) ) { if( x > m_rect.x+m_timeXrel && x < m_rect.x+m_timeXrel+m_timeW && m_flags & SJ_VFLAG_TIME_CLICKABLE ) { subitemRect.x = m_rect.x+m_timeXrel; subitemRect.width = m_timeW; return SJ_SUBITEM_TIME; } else if( x > m_rect.x+m_iconRightXrel && x < m_rect.x+m_iconRightXrel+m_iconRightW ) { subitemRect.x = m_rect.x+m_iconRightXrel; subitemRect.width = m_iconRightW; return SJ_SUBITEM_ICONRIGHT; } else if( x < m_rect.x+m_iconLeftW ) { subitemRect.width = m_iconLeftW; return /*((m_flags&SJ_VFLAG_ICON_MASK) != SJ_VFLAG_ICON_EMPTY)? */SJ_SUBITEM_ICONLEFT /*: SJ_SUBITEM_NONE*/; } else { subitemRect.x += m_iconLeftW; subitemRect.width -= m_timeW+m_iconRightW; return SJ_SUBITEM_TEXT; } } else { return SJ_SUBITEM_NONE; } } bool SjSkinBoxItem::OnImageThere(wxDC& dc, SjImgThreadObj* obj) { bool ret = false; if( (m_flags & SJ_VFLAG_STRING_IS_IMAGE_URL) && obj->m_url == m_text ) { bool drawBg = true; if( obj->IsOk() && obj->GetWidth() == m_rect.width && obj->GetHeight() == m_rect.height ) { wxBitmap* bitmap = obj->CreateBitmap(); if( bitmap ) { dc.DrawBitmap(*bitmap, m_rect.x, m_rect.y, FALSE/*not transparent*/); delete bitmap; drawBg = false; } } if( drawBg ) { DrawBackground(dc); } ret = true; } return ret; } /******************************************************************************* * SjSkinBoxItem - Drawing ******************************************************************************/ void SjSkinBoxItem::DrawBackground(wxDC& dc) { if( (m_border && m_colours[SJ_COLOUR_NORMAL].fgSet) || m_colours[SJ_COLOUR_NORMAL].bgSet ) { dc.SetPen((m_border&&m_colours[SJ_COLOUR_NORMAL].fgSet)? m_colours[SJ_COLOUR_NORMAL].fgPen : *wxTRANSPARENT_PEN); dc.SetBrush(m_colours[SJ_COLOUR_NORMAL].bgSet? m_colours[SJ_COLOUR_NORMAL].bgBrush : *wxTRANSPARENT_BRUSH); dc.DrawRectangle(m_rect.x, m_rect.y, m_rect.width, m_rect.height); } } void SjSkinBoxItem::DrawIcon(wxDC& dc, const wxRect& rect, long icon, bool selected) { SjSkinColour* base = &m_colours[selected? SJ_COLOUR_SELECTION : SJ_COLOUR_NORMAL]; if( base->hiSet ) { dc.SetPen(base->hiPen); wxRect rectHilite(rect); rectHilite.x++; SjTools::DrawIcon(dc, rectHilite, icon); } dc.SetPen(base->fgPen); SjTools::DrawIcon(dc, rect, icon); } void SjSkinBoxItem::DrawText(wxDC& dc, const wxString& text, int x, int y, bool selected) { SjSkinColour* base = &m_colours[selected? SJ_COLOUR_SELECTION : SJ_COLOUR_NORMAL]; if( base->hiSet ) { dc.SetTextForeground(base->hiColour); dc.DrawText(text, x+base->offsetX, y+base->offsetY); } dc.SetTextForeground(base->fgColour); dc.DrawText(text, x, y); } void SjSkinBoxItem::DrawText(wxDC& dc) { wxCoord w, h; // change font if needed if( m_fontHeight != m_rect.height ) { m_fontHeight = m_rect.height; int fontPtSize = 32; while( 1 ) { m_font.SetPointSize(fontPtSize); dc.SetFont(m_font); dc.GetTextExtent(wxT("Ag"), &w, &h); dc.SetFont(*wxNORMAL_FONT); if( h<=m_fontHeight || fontPtSize<=6 ) { break; } fontPtSize--; } } // draw background if needed DrawBackground(dc); // set clipping #ifdef SJ_BOXTEXT_WITH_CLIPPING dc.SetClippingRegion(m_rect); #endif // set font dc.SetFont(m_font); // init rect wxRect drawRect = m_rect; // draw icons if( m_flags & SJ_VFLAG_ICONL_MASK ) { wxRect rect1(drawRect); rect1.width = rect1.height; int sub = rect1.width/7; rect1.width -= sub*2; wxRect rect2(rect1); rect2.y += sub; rect2.height -= sub*2; // left icon bool hilite = (m_mouseSubitem==SJ_SUBITEM_ICONLEFT && m_mouseState==SJ_MOUSE_STATE_CLICKED); switch( m_flags & SJ_VFLAG_ICONL_MASK ) { case SJ_VFLAG_ICONL_PLAY: DrawIcon(dc, rect2, SJ_DRAWICON_PLAY, hilite); break; case SJ_VFLAG_ICONL_PAUSE: DrawIcon(dc, rect2, SJ_DRAWICON_PAUSE, hilite); break; case SJ_VFLAG_ICONL_STOP: DrawIcon(dc, rect2, SJ_DRAWICON_STOP, hilite); break; case SJ_VFLAG_ICONL_PLAYED: DrawIcon(dc, rect2, SJ_DRAWICON_CHECK, hilite); break; case SJ_VFLAG_ICONL_ERRONEOUS: DrawIcon(dc, rect2, SJ_DRAWICON_DELETE, hilite); break; case SJ_VFLAG_ICONL_MOVED_DOWN: DrawIcon(dc, rect2, SJ_DRAWICON_MOVED_DOWN, hilite); break; case SJ_VFLAG_ICONL_VOLDOWN: DrawIcon(dc, rect2, SJ_DRAWICON_VOLDOWN, hilite); break; default: break; } m_iconLeftW = rect1.width; drawRect.x += m_iconLeftW; drawRect.width -= m_iconLeftW; // right icon rect2.x = (drawRect.x + drawRect.width) - rect1.width; if( m_flags & SJ_VFLAG_ICONR_MASK ) { hilite = (m_mouseSubitem==SJ_SUBITEM_ICONRIGHT && m_mouseState==SJ_MOUSE_STATE_CLICKED); switch( m_flags & SJ_VFLAG_ICONR_MASK ) { case SJ_VFLAG_ICONR_DELETE: DrawIcon(dc, rect2, SJ_DRAWICON_DELETE, hilite); break; case SJ_VFLAG_ICONR_VOLUP: DrawIcon(dc, rect2, SJ_DRAWICON_VOLUP, hilite); break; case SJ_VFLAG_ICONR_VOLDOWN: DrawIcon(dc, rect2, SJ_DRAWICON_VOLDOWN, hilite); break; } m_iconRightW = rect1.width + sub*2; m_iconRightXrel = (rect2.x - sub*2) - m_rect.x; drawRect.width -= m_iconRightW; } } // draw time if( m_flags & SJ_VFLAG_VMIN_IS_TIME ) { // calculate time string wxString playtimeMs = SjTools::FormatTime(m_runningMs<0? -1 : m_runningMs/1000, SJ_FT_ALLOW_ZERO); if( m_flags & SJ_VFLAG_VMIN_MINUS) { playtimeMs.Prepend(wxT('-')); } if( m_flags & SJ_VFLAG_VMAX_IS_TIME ) { playtimeMs.Append(wxT(" / ") + SjTools::FormatTime(m_totalMs<=0? -1 : m_totalMs/1000)); } // draw time string if it fits dc.GetTextExtent(playtimeMs, &m_timeW, &h); if( m_timeW < drawRect.width/2 ) { DrawText(dc, playtimeMs, drawRect.x + drawRect.width - m_timeW, drawRect.y, (m_flags&SJ_VFLAG_BOLD) || (m_mouseState==SJ_MOUSE_STATE_CLICKED)); m_timeXrel = (drawRect.x + drawRect.width - m_timeW) - m_rect.x; drawRect.width -= m_timeW+8; } } // draw image or text #define POINTS_STRING wxT("..") #define HIVENT_STRING wxT(" - ") if( m_flags & SJ_VFLAG_CENTER ) { // draw centered text - you may give two alternative texts as "longer text\tshort text" wxString text1 = m_text.BeforeFirst('\t'); wxCoord points1w = 0, quoter1w = 0, text1w; bool shortTextTried = FALSE; wxRect rect1(drawRect); if( !(m_flags & SJ_VFLAG_IGNORECENTEROFFSET) ) { if( m_centerOffset < 0 ) { rect1.width -= m_centerOffset*-2; } else { rect1.x += m_centerOffset; rect1.width -= m_centerOffset; } } while( 1 ) { dc.GetTextExtent(text1, &text1w, &h); if( (text1w + points1w + quoter1w) <= rect1.width || text1.IsEmpty() ) { // string that fits found; append points and // quotes if needed w = text1w; if( points1w ) { w += points1w; text1.Append(POINTS_STRING); } if( quoter1w && ((text1.Freq('"')%2)==1) ) { w += quoter1w; text1.Append('"'); } DrawText(dc, text1, rect1.x + rect1.width/2 - w/2, rect1.y, FALSE); break; // done } else if( !shortTextTried && m_text.Find('\t')!=-1 ) { text1 = m_text.AfterFirst('\t'); shortTextTried = TRUE; } else { if( m_text.Last()=='"' ) { // persever last quotes, a string like 'Search in "Random Selection"' // will become 'Search in "Random Sele.."' if( quoter1w==0 ) dc.GetTextExtent(POINTS_STRING, "er1w, &h); } text1.Truncate(text1.Len()>2? text1.Len()-2 : 0); text1.Trim(); if( points1w==0 ) dc.GetTextExtent(POINTS_STRING, &points1w, &h); } } } else { // draw left-aligned text. the text may be divided by a TAB which // will be replaced by " - "; the text BEFORE and AFTER text text may // be truncated wxString text1(m_text.BeforeFirst('\t').Trim()); wxString text2(m_text.AfterFirst('\t').Trim()); wxCoord points1w = 0, points2w = 0, hiventW = 0, text1w, text2w; if( !text2.IsEmpty() ) dc.GetTextExtent(HIVENT_STRING, &hiventW, &h); while( 1 ) { dc.GetTextExtent(text1, &text1w, &h); dc.GetTextExtent(text2, &text2w, &h); if( (text1w + points1w + hiventW + text2w + points2w) <= drawRect.width || (text1.IsEmpty() && text2.IsEmpty()) ) { if( points1w ) text1.Append(POINTS_STRING); if( !text2.IsEmpty() ) { text1.Append(HIVENT_STRING); text1.Append(text2); if( points2w ) text1.Append(POINTS_STRING); } // draw! DrawText(dc, text1, drawRect.x, drawRect.y, (m_flags&SJ_VFLAG_BOLD) || (m_mouseState==SJ_MOUSE_STATE_CLICKED && m_mouseSubitem!=SJ_SUBITEM_TIME)); break; // done } if( text1.Len() > text2.Len() ) { text1.Truncate(text1.Len() - (points1w? 1 : 3)); text1.Trim(); if( points1w==0 ) dc.GetTextExtent(POINTS_STRING, &points1w, &h); } else { text2.Truncate(text2.Len() - (points2w? 1 : 3)); text2.Trim(); if( points2w==0 ) dc.GetTextExtent(POINTS_STRING, &points2w, &h); } } } // strike? if( m_mouseSubitem==SJ_SUBITEM_ICONRIGHT && (m_flags&SJ_VFLAG_ICONR_DELETE) ) { dc.SetPen(m_colours[SJ_COLOUR_NORMAL].fgPen); int strikeY = drawRect.y + drawRect.height/2; dc.DrawLine(m_rect.x+m_iconLeftW-2, strikeY, m_rect.x+m_iconRightXrel+2, strikeY); } // restore clipping/font #ifdef SJ_BOXTEXT_WITH_CLIPPING dc.DestroyClippingRegion(); #endif // set normal font, release our font from DC dc.SetFont(*wxNORMAL_FONT); } void SjSkinBoxItem::DrawImage(wxDC& dc) { wxASSERT(m_skinWindow); SjImgThread* imgThread = m_skinWindow->m_imgThread; if( !imgThread ) return; imgThread->RequireStart(m_skinWindow); SjImgOp op; op.LoadFromDb(m_text); op.m_flags |= SJ_IMGOP_RESIZE|SJ_IMGOP_SMOOTH; op.m_resizeW = m_rect.width; op.m_resizeH = m_rect.height; SjImgThreadObj* obj = imgThread->RequireImage(m_skinWindow, m_text, op); if( obj ) { OnImageThere(dc, obj); imgThread->ReleaseImage(m_skinWindow, obj); } imgThread->RequireEnd(m_skinWindow); } void SjSkinBoxItem::OnPaint(wxDC& dc) { m_iconLeftW = 0; m_timeXrel = -600000; m_timeW = 0; m_iconRightXrel = -600000; m_iconRightW = 0; if( m_flags & SJ_VFLAG_STRING_IS_IMAGE_URL ) { DrawImage(dc); } else if( !m_text.IsEmpty() ) { DrawText(dc); } else { DrawBackground(dc); } } /******************************************************************************* * SjSkinBoxItem - Mouse Handling ******************************************************************************/ void SjSkinBoxItem::OnMouseLeftDown(long x, long y, bool doubleClick, long accelFlags) { if( m_mouseState != SJ_MOUSE_STATE_CLICKED ) { wxRect subitemRect; int newSubitem = FindSubitem(x, y, subitemRect); if( newSubitem != SJ_SUBITEM_NONE ) { m_mouseSubitem = newSubitem; m_mouseDownX = x; m_mouseDownY = y; if( doubleClick && m_mouseSubitem == SJ_SUBITEM_TEXT ) { m_mouseState = SJ_MOUSE_STATE_NORMAL; RedrawMe(); SjSkinValue value; value.value = SJ_SUBITEM_TEXT_DCLICK; m_skinWindow->OnSkinTargetEvent(m_targetId, value, accelFlags); } else if( m_mouseSubitem == SJ_SUBITEM_TEXT ) { m_mouseState = SJ_MOUSE_STATE_CLICKED; SjSkinValue value; value.value = SJ_SUBITEM_TEXT_MOUSEDOWN; value.vmin = accelFlags; m_skinWindow->OnSkinTargetEvent(m_targetId, value, accelFlags); RedrawMe(); } else { m_mouseState = SJ_MOUSE_STATE_CLICKED; RedrawMe(); } } } } SjMouseUsed SjSkinBoxItem::OnMouseLeftUp(long x, long y, long accelFlags, bool captureLost) { CreateTimer(0); int orgSubitem = m_mouseSubitem; SjMouseUsed ret = SJ_MOUSE_NOT_USED; // don't send a delayed event m_mouseState = SJ_MOUSE_STATE_NORMAL; m_mouseSubitem = SJ_SUBITEM_NONE; wxRect subitemRect; if( !captureLost && FindSubitem(x, y, subitemRect) == orgSubitem ) { if( m_skinWindow->m_mouseInDisplayMove ) { RedrawMe(); ret = SJ_MOUSE_USED; } else if( orgSubitem == SJ_SUBITEM_TIME ) { RedrawMe(); SjSkinValue dummy; m_skinWindow->OnSkinTargetEvent(IDT_TOGGLE_TIME_MODE, dummy, accelFlags); ret = SJ_MOUSE_USED; } else if( orgSubitem != SJ_SUBITEM_NONE ) { SjSkinValue value; value.value = orgSubitem; value.vmin = accelFlags; m_skinWindow->OnSkinTargetEvent(m_targetId, value, accelFlags); RedrawMe(); ret = SJ_MOUSE_USED; } else { RedrawMe(); } } else { RedrawMe(); } // always reset the cursor if( m_skinWindow->m_mouseInDisplayMove ) { m_skinWindow->m_mouseInDisplayMove = FALSE; } return ret; } bool SjSkinBoxItem::OnMouseMiddle(long x, long y) { SjSkinValue value; value.value = SJ_SUBITEM_TEXT_MIDDLECLICK; m_skinWindow->OnSkinTargetEvent(m_targetId, value, 0); return TRUE; } void SjSkinBoxItem::OnMouseMotion(long x, long y, bool leftDown) { wxRect subitemRect; int motionSubitem = FindSubitem(x, y, subitemRect); static bool inHere = FALSE; if( !inHere ) { inHere = TRUE; if( leftDown ) { SjSkinItem* motionItem = m_skinWindow->FindClickableItem(x, y); // may be NULL! #define MOVESTART_DELTA 4 long hDifference = x - m_mouseDownX; long vDifference = y - m_mouseDownY; if( m_skinWindow->m_mouseInDisplayMove ) { // report the derived class that the item is moved up/down if not yet done if( motionItem != this && !m_mouseMoveReported ) { m_mouseResumeX = x; m_mouseResumeY = y; if( CheckMovementTimer() ) { m_mouseMoveReported = TRUE; long lineDifference; if( m_targetId >= IDT_DISPLAY_LINE_FIRST && m_targetId <= IDT_DISPLAY_LINE_LAST && motionItem // may be NULL! && motionItem->m_targetId >= IDT_DISPLAY_LINE_FIRST && motionItem->m_targetId <= IDT_DISPLAY_LINE_LAST ) { lineDifference = motionItem->m_targetId - m_targetId; } else { lineDifference = vDifference>0? 1 : -1; } if( motionItem ) { CreateTimer(0); } m_skinWindow->OnSkinTargetMotion(m_targetId, lineDifference); m_timerLastMoveMs = SjTools::GetMsTicks(); // normally, contined in (***) } } else { CreateTimer(0); } } else if( ( m_mouseSubitem == SJ_SUBITEM_TEXT ) && ( m_flags & SJ_VFLAG_MOVABLE ) && ( motionItem != this || hDifference > MOVESTART_DELTA || hDifference < -MOVESTART_DELTA || vDifference > MOVESTART_DELTA || vDifference < -MOVESTART_DELTA ) ) { m_skinWindow->m_mouseInDisplayMove = TRUE; m_mouseMoveReported = FALSE; m_timerLastMoveMs = 0; } else if( motionSubitem == m_mouseSubitem ) { if( m_mouseState != SJ_MOUSE_STATE_CLICKED ) { m_mouseState = SJ_MOUSE_STATE_CLICKED; RedrawMe(); } } else { if( m_mouseState != SJ_MOUSE_STATE_NORMAL ) { m_mouseState = SJ_MOUSE_STATE_NORMAL; RedrawMe(); } } } else { if( motionSubitem != m_mouseSubitem || m_mouseState != SJ_MOUSE_STATE_HOVER ) { m_mouseSubitem = motionSubitem; m_mouseState = SJ_MOUSE_STATE_HOVER; RedrawMe(); #if SJ_USE_TOOLTIPS if( m_mouseSubitem ) { g_tools->m_toolTipManager.SetToolTipProvider(m_skinWindow->GetToolTipProvider(m_targetId, m_mouseSubitem, subitemRect)); } else { g_tools->m_toolTipManager.ClearToolTipProvider(); } #endif } } inHere = FALSE; } } void SjSkinWindow::ResumeSkinTargetMotion(int clickedTargetId, int resumeTargetId) { // contined from (***) if( clickedTargetId >= IDT_DISPLAY_LINE_FIRST && clickedTargetId <= IDT_DISPLAY_LINE_LAST && resumeTargetId >= IDT_DISPLAY_LINE_FIRST && resumeTargetId <= IDT_DISPLAY_LINE_LAST ) { SjSkinBoxItem* clickedItem = (SjSkinBoxItem*)FindFirstItemByTargetId(clickedTargetId); SjSkinBoxItem* resumeItem = (SjSkinBoxItem*)FindFirstItemByTargetId(resumeTargetId ); if( clickedItem && resumeItem ) { // set the clicked item to the normal state and give control // to the given resume target ID if( clickedItem == resumeItem ) { resumeItem->m_mouseMoveReported = FALSE; if( resumeItem->m_timer == NULL ) { resumeItem->CreateTimer(50); resumeItem->m_timerMoves = 0; } } else { resumeItem->m_mouseState = clickedItem->m_mouseState; resumeItem->m_mouseSubitem = clickedItem->m_mouseSubitem; resumeItem->m_mouseDownX = clickedItem->m_mouseResumeX; resumeItem->m_mouseDownY = clickedItem->m_mouseResumeY; resumeItem->m_mouseMoveReported = FALSE; clickedItem->m_mouseState = SJ_MOUSE_STATE_NORMAL; clickedItem->m_mouseSubitem = SJ_SUBITEM_NONE; clickedItem->m_mouseMoveReported= FALSE; m_mouseItem = resumeItem; clickedItem->CreateTimer(0); resumeItem->CreateTimer(0); } } } } void SjSkinBoxItem::OnTimer() { OnMouseMotion(m_mouseResumeX, m_mouseResumeY, TRUE); } bool SjSkinBoxItem::CheckMovementTimer() { unsigned long thisMs = SjTools::GetMsTicks(); unsigned long timeout = 100; if( m_timer == NULL || thisMs >= m_timerLastMoveMs+timeout ) { m_timerMoves++; return TRUE; } else { return FALSE; } } void SjSkinBoxItem::OnMouseLeave() { if( m_mouseState == SJ_MOUSE_STATE_HOVER ) { m_mouseState = SJ_MOUSE_STATE_NORMAL; m_mouseSubitem = SJ_SUBITEM_NONE; RedrawMe(); } } /******************************************************************************* * SjSkinImageItem ******************************************************************************/ /* A horizontal image must have the following subimages: +----------+------------+----------+ | prologue | repeatable | epilogue | | | part | | +----------+------------+----------+ Prologue and epilogue may be skipped. A vertival image looks like: +------------+ | prologue | +------------+ | repeatable | | part | +------------+ | epilogie | +------------+ Simple Images have only one horizonzally- and vertically-repeatable subimage: +---------------+ | repeatable | | part | +---------------+ Prologue and epilogue may be skipped. */ bool SjSkinImageItem::Create(const wxHtmlTag& tag, wxString& error) { if( !CheckImage(error) ) { return FALSE; } // hotizontal or vertical image? m_horizontal = TRUE; if( m_image->GetSubimageYCount() > m_image->GetSubimageXCount() ) { m_horizontal = FALSE; } // get the image bitmaps if( m_image->GetSubimageXCount() == m_image->GetSubimageYCount() ) { m_bitmapPrologue = NULL; m_bitmapRepeat = m_image->GetSubimage(0, 0); // never NULL m_bitmapEpilogue = NULL; } else { m_bitmapPrologue = m_image->GetSubimage(0, 0); // may be NULL if( m_horizontal ) { m_bitmapRepeat = m_image->GetSubimage(1, 0); // never NULL m_bitmapEpilogue = m_image->GetSubimage(2, 0); // may be NULL } else { m_bitmapRepeat = m_image->GetSubimage(0, 1); // never NULL m_bitmapEpilogue = m_image->GetSubimage(0, 2); // may be NULL } } if( m_bitmapRepeat == NULL ) { error = wxT("Invalid subimages. An image should have 1x1, 3x1 or 1x3 subimages.")/*n/t*/; return FALSE; } // init width, height and events if( !m_width.IsSet() ) { m_width.SetAbs(m_bitmapRepeat->GetWidth()); } if( !m_height.IsSet() ) { m_height.SetAbs(m_bitmapRepeat->GetHeight()); } m_usesMouse = FALSE; m_itemType = SJ_IMAGEITEM; return TRUE; } void SjSkinImageItem::OnPaint(wxDC& dc) { wxASSERT(m_skinWindow); wxASSERT(g_tools); if( m_horizontal ) { g_tools->DrawBitmapHBg(dc, m_bitmapPrologue, m_bitmapRepeat, m_bitmapEpilogue, m_rect); } else { g_tools->DrawBitmapVBg(dc, m_bitmapPrologue, m_bitmapRepeat, m_bitmapEpilogue, m_rect); } } /******************************************************************************* * SjSkinButtonItem ******************************************************************************/ /* A button image can have the following subimages: +------------------+ | normal | +------------------+ | normal hover | +------------------+ | normal clicked | +------------------+ | selected | +------------------+ | selected hover | +------------------+ | selected clicked | +------------------+ | other states | +------------------+ | . ... Most subimages may be skipped. The width and height defaults to the size of the "normal" subimage. If a larger sizer is set later, the image will be centered vertically and/or horizontally. */ #define BUTTON_BLINK_FREQ 990 bool SjSkinButtonItem::Create(const wxHtmlTag& tag, wxString& error) { long subimageX; if( !CheckImage(error) ) { return FALSE; } CheckTarget(error); // is this a repeat button? m_useEventRepeating = m_targetFlags&SJ_TARGET_REPEATBUTTON? TRUE : FALSE; // get subimage index, check for [1] subimageX = m_imageIndex; if( !m_image->GetSubimage(subimageX, 0) ) { error = wxString::Format(wxT("Invalid subimage-index %i.")/*n/t*/, (int)subimageX); return FALSE; } // get context menu width m_contextMenuWidth = 0; if( tag.HasParam(wxT("CMW")) ) { tag.GetParamAsInt(wxT("CMW"), &m_contextMenuWidth); } // store events if( tag.HasParam(wxT("ONCLICK")) ) { m_onclick = tag.GetParam(wxT("ONCLICK")); } // go through all possible button states int buttonState; for( buttonState = 0; buttonState < SJ_BUTTON_STATE_COUNT; buttonState++ ) { // get normal button (never NULL, checked at [1]) m_bitmaps[buttonState][0] = m_image->GetSubimage(subimageX, buttonState*SJ_BUTTON_STATE_COUNT+0); if( m_bitmaps[buttonState][0] == NULL ) { m_bitmaps[buttonState][0] = m_bitmaps[0][0]; } // get hover button (may be NULL) m_bitmaps[buttonState][1] = m_image->GetSubimage(subimageX, buttonState*SJ_BUTTON_STATE_COUNT+1); // get clicked button (never NULL) m_bitmaps[buttonState][2] = m_image->GetSubimage(subimageX, buttonState*SJ_BUTTON_STATE_COUNT+2); if( m_bitmaps[buttonState][2] == NULL ) { m_bitmaps[buttonState][2] = m_bitmaps[buttonState][0]; } } // set width and height if not yet done if( !m_width.IsSet() ) { m_width.SetAbs(m_bitmaps[0][0]->GetWidth()); } if( !m_height.IsSet() ) { m_height.SetAbs(m_bitmaps[0][0]->GetHeight()); } // set item clickable m_buttonState = SJ_BUTTON_STATE_NORMAL; m_mouseState = SJ_MOUSE_STATE_NORMAL; m_itemType = SJ_BUTTONITEM; m_inTimer = FALSE; m_delayedRedraw = FALSE; m_doBlink = false; m_doBlinkState = 0; return TRUE; } void SjSkinButtonItem::SetValue(const SjSkinValue& value) { int newDoBlink = 0; if( (value.vmax&SJ_VMAX_BLINK) && value.value == 0 && !m_useEventRepeating ) newDoBlink = 1; if( m_buttonState != value.value || m_delayedRedraw || m_doBlink != newDoBlink ) { if( m_doBlink != newDoBlink ) { m_doBlink = newDoBlink; m_doBlinkState = 0; if( m_doBlink ) CreateTimer(BUTTON_BLINK_FREQ); else CreateTimer(0); } m_buttonState = value.value; m_delayedRedraw = FALSE; RedrawMe(); } } void SjSkinButtonItem::OnMouseLeftDown(long x, long y, bool doubleClick, long accelFlags) { if( m_mouseState != SJ_MOUSE_STATE_CLICKED ) { m_mouseState = SJ_MOUSE_STATE_CLICKED; RedrawMe(); m_ldownInsideContextMenu = FALSE; if( m_contextMenuWidth > 0 && x > (m_rect.x+m_rect.width)-m_contextMenuWidth ) { m_ldownInsideContextMenu = TRUE; } if( m_useEventRepeating && !m_ldownInsideContextMenu ) { m_subsequentTimer = FALSE; OnTimer(); } } } SjMouseUsed SjSkinButtonItem::OnMouseLeftUp(long x, long y, long accelFlags, bool captureLost) { wxASSERT(m_skinWindow); SjMouseUsed ret = SJ_MOUSE_NOT_USED; if( m_mouseState == SJ_MOUSE_STATE_CLICKED || m_mouseState == SJ_MOUSE_STATE_HOVER ) { // First, set mouse state to "normal". m_mouseState = SJ_MOUSE_STATE_NORMAL; // Then, stop timer or send event and // redraw the item. Redrawing should be latest // to avoid button state flickering if( !captureLost && m_useEventRepeating && !m_ldownInsideContextMenu ) { ret = SJ_MOUSE_USED; CreateTimer(0); RedrawMe(); } else if( !captureLost && m_rect.Contains(x, y) ) { ret = SJ_MOUSE_USED; if( (m_targetId >= IDT_WORKSPACE_GOTO_A && m_targetId <= IDT_WORKSPACE_GOTO_0_9) || m_targetId == IDT_PLAY || m_targetId == IDT_PAUSE || m_targetId == IDT_STOP || m_targetId == IDT_PREV || m_targetId == IDT_NEXT || m_targetId == IDT_WORKSPACE_ALBUM_VIEW || m_targetId == IDT_WORKSPACE_COVER_VIEW || m_targetId == IDT_WORKSPACE_LIST_VIEW ) { m_delayedRedraw = TRUE; // Leave the button in the pressed state until the action // (which may take a second) is performed. The derived class // must call SetValue() to redraw the button in this case. } else { RedrawMe(); } if( m_ldownInsideContextMenu ) { m_skinWindow->OnSkinTargetContextMenu(m_targetId, m_rect.x, m_rect.y+m_rect.height); } else { ret = SJ_MOUSE_USE_DELAYED; #if SJ_USE_SCRIPTS SjSee* see = m_skinWindow->m_currSkin->m_see; if( see && !m_onclick.IsEmpty() ) { see->ExecuteAsFunction(m_onclick); // ExecuteAsFunction() is a little hack as long as we have no real DOM for the skinning tree // ExecuteAsFunction() allows to use eg. "return false;" from the handler - a simple // Execute() would throw a "not in function" error. if( see->IsResultDefined() ) { if( !see->GetResultLong() ) { ret = SJ_MOUSE_USED; } if( ret == SJ_MOUSE_USED && m_delayedRedraw ) { // no default processing - redraw now! m_delayedRedraw = false; RedrawMe(); } } } #endif } } else { RedrawMe(); } } return ret; } void SjSkinButtonItem::OnMouseMotion(long x, long y, bool leftDown) { if( leftDown ) { if( m_rect.Contains(x, y) ) { if( m_mouseState != SJ_MOUSE_STATE_CLICKED ) { m_mouseState = SJ_MOUSE_STATE_CLICKED; RedrawMe(); if( m_useEventRepeating && !m_ldownInsideContextMenu ) { m_subsequentTimer = FALSE; OnTimer(); } } } else { if( m_mouseState == SJ_MOUSE_STATE_CLICKED ) { m_mouseState = m_bitmaps[m_buttonState][SJ_MOUSE_STATE_HOVER]? SJ_MOUSE_STATE_HOVER : SJ_MOUSE_STATE_NORMAL; RedrawMe(); if( m_useEventRepeating && m_timer ) { m_timer->Stop(); } } } } else { if( m_mouseState != SJ_MOUSE_STATE_HOVER && m_bitmaps[m_buttonState][SJ_MOUSE_STATE_HOVER] ) { m_mouseState = SJ_MOUSE_STATE_HOVER; RedrawMe(); } } } void SjSkinButtonItem::OnMouseLeave() { if( m_mouseState == SJ_MOUSE_STATE_HOVER ) { m_mouseState = SJ_MOUSE_STATE_NORMAL; RedrawMe(); } } void SjSkinButtonItem::OnTimer() { wxASSERT(m_skinWindow); if( !m_inTimer ) { m_inTimer = TRUE; if( m_doBlink ) { m_doBlinkState = m_doBlinkState? 0 : 1; RedrawMe(); } else { if( m_timer ) { m_timer->Stop(); } SjSkinValue value; m_skinWindow->OnSkinTargetEvent(m_targetId, value, 0); CreateTimer(m_subsequentTimer? 50 : 500); m_subsequentTimer = TRUE; } m_inTimer = FALSE; } } void SjSkinButtonItem::OnPaint(wxDC& dc) { // draw the button regarding the state of the button and the mouse wxASSERT(g_tools); wxASSERT(m_buttonState >= SJ_BUTTON_STATE_NORMAL && m_buttonState < SJ_BUTTON_STATE_COUNT); wxASSERT(m_mouseState >= SJ_MOUSE_STATE_NORMAL && m_mouseState < SJ_MOUSE_STATE_COUNT); int buttonState = m_buttonState; int mouseState = m_mouseState; if( m_doBlink ) { buttonState = m_doBlinkState; } g_tools->DrawBitmap(dc, m_bitmaps[buttonState][mouseState], m_rect.x, m_rect.y, m_rect.width, m_rect.height); } /******************************************************************************* * SjSkinScrollbarItem ******************************************************************************/ /* An image for a vertival scrollbar looks like for following: +--------------+--------------+--------------+ | page up | page up | page up | | normal | hover | clicked | +--------------+--------------+--------------+ | thumb pro- | thumb pro- | . | logue normal | logue hover | . +--------------+--------------+....... . . . . | thumb repeat-| thumb repeat-. . | able part | able part . . | normal | hover . +--------------+....... . . . . . . | thumb epi- | . | logue normal | +--------------+. . . | page down | | normal | +--------------+. . The page up/down subimages must also be repeatable, the thumb will have a minimal height of prologue+epiloge height. If the repeatable part of the thumb is skipped, the thumb will have a fixed size. An image for a horizontal scrollbar looks like: +--------+---------+------------+----------+--------+ | page | thumb | thumb | thumb | page | | left | prologue| repeatable | epilogue | right | | normal | normal | normal | normal | normal | +--------+---------+------------+----------+--------+ | page | | . . . | left . . . . hover . ...... . . . . . . page . . left . clicked . Page left/right/up/down functionality is done by normal buttons if wanted. */ SjSkinScrollbarItem::SjSkinScrollbarItem() { // init scrollbar values, we're doing this in the constructor // for save overwriting Create() m_value = 0; m_vmin = 0; m_vmax = 0; m_vrange = 0; m_thumbSize = 0; m_itemType = SJ_SCROLLBARITEM; m_inTimer = FALSE; m_hoverPart = NULL; m_trackPart = NULL; m_flip = FALSE; m_horizontal= TRUE; m_hideIfUnused = FALSE; m_hideScrollbar = FALSE; } bool SjSkinScrollbarItem::Create(const wxHtmlTag& tag, wxString& error) { // check parameters if( !CheckImage(error) ) { return FALSE; } CheckTarget(error); int test; if( tag.GetParamAsInt(wxT("HIDEIFUNUSED"), &test) && test!=0 ) { m_hideIfUnused = TRUE; m_hideScrollbar = TRUE; } // hotizontal or vertical scrollbar? flip scrollbar? if( m_image->GetSubimageYCount() >= 5 ) { m_horizontal = FALSE; } if( !m_horizontal && (m_targetFlags&SJ_TARGET_NULLISBOTTOM) ) { m_flip = TRUE; } // load the images int mouseState, scrollbarPart; for( mouseState = 0; mouseState < 3; mouseState++ ) { scrollbarPart = 0; m_pageLeftPart.m_bitmapRepeat[mouseState] = m_image->GetSubimage(m_horizontal? scrollbarPart : mouseState, m_horizontal? mouseState : scrollbarPart); scrollbarPart++; m_thumbPart.m_bitmapPrologue[mouseState] = m_image->GetSubimage(m_horizontal? scrollbarPart : mouseState, m_horizontal? mouseState : scrollbarPart); scrollbarPart++; m_thumbPart.m_bitmapRepeat[mouseState] = m_image->GetSubimage(m_horizontal? scrollbarPart : mouseState, m_horizontal? mouseState : scrollbarPart); scrollbarPart++; m_thumbPart.m_bitmapEpilogue[mouseState] = m_image->GetSubimage(m_horizontal? scrollbarPart : mouseState, m_horizontal? mouseState : scrollbarPart); scrollbarPart++; m_pageRightPart.m_bitmapRepeat[mouseState] = m_image->GetSubimage(m_horizontal? scrollbarPart : mouseState, m_horizontal? mouseState : scrollbarPart); } if( /*m_pageLeftPart.m_bitmapRepeat[0] == NULL || */m_thumbPart.m_bitmapPrologue[0] == NULL ) { error = wxT("A scrollbar should have 5x3 or 3x5 subimages. Thumb prologue may not be skipped.")/*n/t*/; return FALSE; } // correct the images: if "page right" is unset, use bitmap of "page left" if( m_pageRightPart.m_bitmapRepeat[0] == NULL ) { m_pageRightPart.m_bitmapRepeat[0] = m_pageLeftPart.m_bitmapRepeat[0]; } // correct the images: if there is no normal thumb repeat/epilogue, disable hover and clicked thumb repeat/epilogue if( !m_thumbPart.m_bitmapRepeat[0] ) { m_thumbPart.m_bitmapRepeat[1] = NULL; m_thumbPart.m_bitmapRepeat[2] = NULL; } if( !m_thumbPart.m_bitmapEpilogue[0] ) { m_thumbPart.m_bitmapEpilogue[1] = NULL; m_thumbPart.m_bitmapEpilogue[2] = NULL; } // correct the images: if unset, set the clicked states to the normal states if unset if( !m_pageLeftPart.m_bitmapRepeat[2] ) { m_pageLeftPart.m_bitmapRepeat[2] = m_pageLeftPart.m_bitmapRepeat[0]; } if( !m_thumbPart.m_bitmapPrologue[2] ) { m_thumbPart.m_bitmapPrologue[2] = m_thumbPart.m_bitmapPrologue[0]; } if( !m_thumbPart.m_bitmapRepeat[2] ) { m_thumbPart.m_bitmapRepeat[2] = m_thumbPart.m_bitmapRepeat[0]; } if( !m_thumbPart.m_bitmapEpilogue[2] ) { m_thumbPart.m_bitmapEpilogue[2] = m_thumbPart.m_bitmapEpilogue[0]; } if( !m_pageRightPart.m_bitmapRepeat[2] ) { m_pageRightPart.m_bitmapRepeat[2]= m_pageRightPart.m_bitmapRepeat[0];} // set initial width and height long w, h; if( m_horizontal ) { w = m_thumbPart.m_bitmapPrologue[0]->GetWidth() + (m_thumbPart.m_bitmapEpilogue[0]? m_thumbPart.m_bitmapEpilogue[0]->GetWidth() : 0); h = m_thumbPart.m_bitmapPrologue[0]->GetHeight(); m_minThumbWidth = w; } else { w = m_thumbPart.m_bitmapPrologue[0]->GetWidth(); h = m_thumbPart.m_bitmapPrologue[0]->GetHeight() + (m_thumbPart.m_bitmapEpilogue[0]? m_thumbPart.m_bitmapEpilogue[0]->GetHeight() : 0); m_minThumbWidth = h; // swap width/height } if( !m_width.IsSet() ) { m_width.SetAbs(w); } if( !m_height.IsSet() ) { m_height.SetAbs(h); } return TRUE; } void SjSkinScrollbarItem::SetValue(const SjSkinValue& value) { wxASSERT(value.thumbSize >= 0); long newMin = value.vmin; long newMax = value.vmax; long newValue = value.value; // check max. agains min. if( newMax < newMin ) { newMax = newMin; } // force value to be between min. and max. if( newValue > newMax ) { newValue = newMax; } if( newValue < newMin ) { newValue = newMin; } // calculate range, make value zero-based (min./max. stay unchanged) long newRange = newMax - newMin; newValue -= newMin; // flip? if( m_flip ) { newValue = (newRange-value.thumbSize) - newValue; } // any changes? if( m_value != newValue || m_vmin != newMin || m_vmax != newMax || m_thumbSize != value.thumbSize ) { // save settings m_value = newValue; m_vmin = newMin; m_vmax = newMax; m_vrange = newRange; m_thumbSize = value.thumbSize; //wxLogDebug("min=%i max=%i range=%i value=%i thumbSize=%i", (int)m_vmin, (int)m_vmax, (int)m_vrange, (int)m_value, (int)m_thumbSize); if( m_thumbSize > m_vrange ) { m_thumbSize = m_vrange; } // redraw bool orgBgRedrawState = m_alwaysRedrawBackground; m_hideScrollbar = (m_hideIfUnused && newMin==newMax); if( m_hideScrollbar ) { m_alwaysRedrawBackground = TRUE; } OnSize(); RedrawMe(); m_alwaysRedrawBackground = orgBgRedrawState; } } void SjSkinScrollbarItem::OnSize() { wxASSERT(m_skinWindow); // get total size if( m_horizontal ) { m_allRect = m_rect; } else { m_allRect.x = m_rect.y; // swap x/y and width/height m_allRect.y = m_rect.x; m_allRect.width = m_rect.height; m_allRect.height = m_rect.width; } // get size of thumb if( m_thumbPart.m_bitmapRepeat[0] ) { if( m_vrange <= 0 ) { m_thumbPart.m_rect.width = m_allRect.width; } else { m_thumbPart.m_rect.width = (m_thumbSize * m_allRect.width) / m_vrange; } if( m_thumbPart.m_rect.width < m_minThumbWidth ) { m_thumbPart.m_rect.width = m_minThumbWidth; } } else { m_thumbPart.m_rect.width = m_minThumbWidth; } if( m_thumbPart.m_rect.width > m_allRect.width ) { m_thumbPart.m_rect.width = m_allRect.width; } // calculate "page left" rect long rest = m_allRect.width - m_thumbPart.m_rect.width; if( m_vrange - m_thumbSize <= 0 ) { m_pageLeftPart.m_rect.width = 0; } else { m_pageLeftPart.m_rect.width = (m_value * rest) / (m_vrange - m_thumbSize); } m_pageLeftPart.m_rect.x = m_allRect.x; m_pageLeftPart.m_rect.y = m_pageLeftPart.m_rect.width>0? m_allRect.y : -10000; m_pageLeftPart.m_rect.height = m_allRect.height; // calculate "thumb" rect m_thumbPart.m_rect.x = m_pageLeftPart.m_rect.x + m_pageLeftPart.m_rect.width; m_thumbPart.m_rect.y = m_allRect.y; m_thumbPart.m_rect.height = m_allRect.height; // calculate "page right" rect m_pageRightPart.m_rect.x = m_thumbPart.m_rect.x + m_thumbPart.m_rect.width; m_pageRightPart.m_rect.y = m_allRect.y; m_pageRightPart.m_rect.width = m_allRect.x + m_allRect.width - m_pageRightPart.m_rect.x; m_pageRightPart.m_rect.height = m_allRect.height; if( m_pageRightPart.m_rect.width <= 0 ) { m_pageRightPart.m_rect = wxRect(-10000, -10000, 10, 10); } } void SjSkinScrollbarItem::OnMouseLeftDown(long x, long y, bool doubleClick, long accelFlags) { if( m_hideScrollbar ) { return; } if( m_trackPart == NULL ) { m_trackPart = SwapNFindPart(x, y); if( m_trackPart ) { if( m_trackPart == &m_thumbPart || m_thumbSize ) { if( m_hoverPart ) { m_hoverPart->m_mouseState = 0; m_hoverPart = NULL; } m_trackPart->m_mouseState = 2; m_trackStartValue = m_value; m_trackStartX = x; m_trackStartY = y; RedrawMe(); if( m_trackPart != &m_thumbPart ) { m_subsequentTimer = FALSE; OnTimer(); } } else { m_trackPart = 0; } } } } SjMouseUsed SjSkinScrollbarItem::OnMouseLeftUp(long x, long y, long accelFlags, bool captureLost) { SjMouseUsed ret = SJ_MOUSE_NOT_USED; if( m_trackPart ) { m_trackPart->m_mouseState = 0; m_trackPart = NULL; if( !captureLost ) { OnMouseMotion(x, y, FALSE); } CreateTimer(0); if( !m_hoverPart ) { RedrawMe(); } ret = SJ_MOUSE_USED; // don't send a delayed event } return ret; } void SjSkinScrollbarItem::OnMouseMotion(long x, long y, bool leftDown) { if( m_hideScrollbar ) { return; } if( m_trackPart ) { if( m_trackPart == &m_thumbPart ) { long scrollX; if( m_horizontal ) { scrollX = x - m_trackStartX; } else { scrollX = y - m_trackStartY; } if( (m_allRect.width - m_thumbPart.m_rect.width)<=0 ) { return; // avoid division by zero } long scrollDiff = (scrollX*(m_vrange-m_thumbSize)) / (m_allRect.width - m_thumbPart.m_rect.width); CheckNSendValue(m_trackStartValue + scrollDiff); } } else { SjSkinScrollbarItemPart* newHoverPart = SwapNFindPart(x, y); if( newHoverPart != m_hoverPart ) { bool doRedraw = FALSE; if( m_hoverPart ) { m_hoverPart->m_mouseState = 0; m_hoverPart = 0; doRedraw = TRUE; } if( newHoverPart ) { if( newHoverPart->m_bitmapRepeat[1] ) { newHoverPart->m_mouseState = 1; m_hoverPart = newHoverPart; doRedraw = TRUE; } } if( doRedraw ) { RedrawMe(); } } } } void SjSkinScrollbarItem::OnMouseLeave() { if( m_hoverPart ) { m_hoverPart->m_mouseState = 0; m_hoverPart = 0; RedrawMe(); } } void SjSkinScrollbarItem::OnTimer() { if( m_trackPart == &m_pageLeftPart || m_trackPart == &m_pageRightPart ) { if( !m_inTimer ) { m_inTimer = TRUE; if( m_timer ) { m_timer->Stop(); } if( m_trackPart == &m_pageLeftPart ) { CheckNSendValue(m_value - m_thumbSize); } else { CheckNSendValue(m_value + m_thumbSize); } CreateTimer(m_subsequentTimer? 50 : 500); m_subsequentTimer = TRUE; m_inTimer = FALSE; } } else { CreateTimer(0); } } void SjSkinScrollbarItem::CheckNSendValue(long newValue) { wxASSERT(m_skinWindow); if( newValue < 0 ) { newValue = 0; } else if( newValue >= (m_vrange-m_thumbSize) ) { newValue = m_vrange-m_thumbSize; } if( newValue != m_value ) { SjSkinValue event; if( m_flip ) { newValue = (m_vrange-m_thumbSize) - newValue; } event.value = m_vmin + newValue; event.vmin = m_vmin; event.vmax = m_vmax; event.thumbSize = m_thumbSize; m_skinWindow->OnSkinTargetEvent(m_targetId, event, 0); } } void SjSkinScrollbarItem::OnPaint(wxDC& dc) { wxASSERT(m_skinWindow); if( !m_hideScrollbar ) { SwapNDrawPart(dc, m_thumbPart); SwapNDrawPart(dc, m_pageRightPart, TRUE); SwapNDrawPart(dc, m_pageLeftPart); // is there a but in wxMac's wxDC::DestroyClippingRegion()? Or is it // just me? If we draw the left part first, there are clipping bugs if the scrollbar is leftmost/topmost // then useing wxClientDC (wxPaintDC is fine). See also SjTools::DrawBitmapHBg() and SjTools::DrawBitmapVBg(). // If we encounter other errors, we should avoid clipping in these functions and use wxDC::GetSubBitmap() // instead. } } void SjSkinScrollbarItem::SwapNDrawPart(wxDC& dc, SjSkinScrollbarItemPart& part, bool alignMToR) { wxASSERT(g_tools); if( part.m_bitmapPrologue[part.m_mouseState] || part.m_bitmapRepeat [part.m_mouseState] || part.m_bitmapEpilogue[part.m_mouseState] ) { if( m_horizontal ) { g_tools->DrawBitmapHBg(dc, part.m_bitmapPrologue[part.m_mouseState], part.m_bitmapRepeat [part.m_mouseState], part.m_bitmapEpilogue[part.m_mouseState], part.m_rect, alignMToR); } else { wxRect rect(part.m_rect.y, part.m_rect.x, part.m_rect.height, part.m_rect.width); g_tools->DrawBitmapVBg(dc, part.m_bitmapPrologue[part.m_mouseState], part.m_bitmapRepeat [part.m_mouseState], part.m_bitmapEpilogue[part.m_mouseState], rect, alignMToR); // swap x/y and width/height } } } SjSkinScrollbarItemPart* SjSkinScrollbarItem::SwapNFindPart(long x, long y) { Swap(x, y); if( m_thumbPart.m_rect.Contains(x, y) ) { return &m_thumbPart; } else if( m_pageLeftPart.m_rect.Contains(x, y) ) { return &m_pageLeftPart; } else if( m_pageRightPart.m_rect.Contains(x, y) ) { return &m_pageRightPart; } return NULL; } /******************************************************************************* * SjSkinSliderItem ******************************************************************************/ /* A vertical slider looks like the following: +---------+---------+---------+---------+---------+... . . | thumb | thumb | thumb | not | not | not | normal | hover | clicked | used | used . used +---------+---------+---------+---------+--.. . . . . | bg pro- | bg pro- | bg pro- | bg pro- | bg pro- . | logue 0 | logue 1 | logue 2 | logue 3 | logue 4 . +---------+---------+---------+---------+.... . . . . | | | | | . | | | | | . | bg | bg | bg | bg | bg . | repeat 0| repeat 1| repeat 2| repeat 3| repeat 4 | | | | | | | | | | +---------+---------+---------+---------+.. . | bg epi- | bg epi- | bg epi- | bg epi- | | logue 0 | logue 1 | logue 2 | logue 3 | +---------+---------+---------+---------+ . The only clickable thing is the thumb. Depending of the value of the slider, one background is choosen - the first for the minimal value, the middle for the middle value etc. The hover, clicked, repeat and epilogue subimages may be skipped; you have to define at least one background. A horizonzal slider looks like: +---------+---------+-------------+---------+ | thumb | bg pro- | bg | bg epi- | | normal | logue 0 | repeat 0 | logue 0 | +---------+---------+-------------+---------+ | thumb | bg pro- | bg | bg epi- . | hover | logue 1 | repeat 1 | logue 1 . +---------+---------+...... . . . . . | thumb | bg pro- . . | clicked | logue 2 . +---------+. . | not . . used By the way, sliders and scrollbars have a compatible interface, you can use one of these items for any scrolling/sliding item. */ /******************************************************************************* * SjSkinWorkspaceItem ******************************************************************************/ bool SjSkinWorkspaceItem::Create(const wxHtmlTag& tag, wxString& error) { m_targetId = IDT_WORKSPACE; // init width, height and events if( !m_width.IsSet() ) { m_width.SetAbs(100); } if( !m_height.IsSet() ) { m_height.SetAbs(100); } m_usesMouse = FALSE; m_usesPaint = FALSE; m_itemType = SJ_WORKSPACEITEM; return TRUE; } void SjSkinWorkspaceItem::OnSize() { wxASSERT(m_skinWindow); if( m_skinWindow->m_workspaceWindow && !m_skinWindow->m_workspaceMovedAway ) { m_skinWindow->m_workspaceWindow->SetSize(m_rect); } } /******************************************************************************* * SjSkinInputItem ******************************************************************************/ bool SjSkinInputItem::Create(const wxHtmlTag& tag, wxString& error) { m_targetId = IDT_SEARCH; if( !m_width.IsSet() ) { m_width.SetAbs(64); } if( !m_height.IsSet() ) { m_height.SetAbs(16); } m_usesMouse = false; m_usesPaint = false; m_itemType = SJ_INPUTITEM; return TRUE; } void SjSkinInputItem::OnSize() { wxASSERT(m_skinWindow); wxWindow* iw = m_skinWindow->m_inputWindow; if( iw ) { // update colour if( m_skinWindow->m_inputWindowBgColour != m_colours[SJ_COLOUR_NORMAL].bgColour || m_skinWindow->m_inputWindowFgColour != m_colours[SJ_COLOUR_NORMAL].fgColour ) { iw->SetForegroundColour(m_colours[SJ_COLOUR_NORMAL].fgColour); iw->SetBackgroundColour(m_colours[SJ_COLOUR_NORMAL].bgColour); m_skinWindow->m_inputWindowBgColour = m_colours[SJ_COLOUR_NORMAL].bgColour; m_skinWindow->m_inputWindowFgColour = m_colours[SJ_COLOUR_NORMAL].fgColour; iw->Refresh(); } // update font if( m_skinWindow->m_inputWindowFontHeight != m_rect.height ) { if( !m_skinWindow->m_inputWindowDefFont.IsOk() ) { m_skinWindow->m_inputWindowDefFont = iw->GetFont(); } if( m_rect.height >= 18 || !m_skinWindow->m_inputWindowDefFont.IsOk() ) { wxClientDC dc(m_skinWindow); // use a larger font wxFont iwFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); SjVisBg::SetFontPixelH(dc, iwFont, m_rect.height-2); iw->SetFont(iwFont); } else { iw->SetFont(m_skinWindow->m_inputWindowDefFont); // use the default font for smaller controls } m_skinWindow->m_inputWindowFontHeight = m_rect.height; iw->Refresh(); } iw->SetSize(m_rect); } } void SjSkinInputItem::OnPaint(wxDC& dc) { wxASSERT(m_skinWindow); } /******************************************************************************* * SjSkinDivItem ******************************************************************************/ bool SjSkinDivItem::Create(const wxHtmlTag& tag, wxString& error) { // init width, height and events if( !m_width.IsSet() ) { m_width.SetRel(10000); } if( !m_height.IsSet() ) { m_height.SetRel(10000); } if( m_targetId == IDT_VIS_RECT ) { if( tag.HasParam(wxT("INDENT")) ) { wxString s = tag.GetParam(wxT("INDENT")); long l; if( !s.BeforeFirst(wxT(',')).ToLong(&l) ) { l = 0; } s = s.AfterFirst(wxT(',')); m_indent.x = l; if( !s.BeforeFirst(wxT(',')).ToLong(&l) ) { l = 0; } s = s.AfterFirst(wxT(',')); m_indent.y = l; if( !s.BeforeFirst(wxT(',')).ToLong(&l) ) { l = 0; } s = s.AfterFirst(wxT(',')); m_indent.width = l; if( !s.ToLong(&l) ) { l = 0; } m_indent.height = l; } int test; if( tag.GetParamAsInt(wxT("VISAUTOSTART"), &test) ) { if( test == 1 ) { m_prop |= SJ_SKIN_PROP_AUTO_START_VIS; } } } m_usesPaint = FALSE; m_itemType = SJ_DIVITEM; return TRUE; } /******************************************************************************* * SjSkin - Loading And Selecting Skins ******************************************************************************/ BEGIN_EVENT_TABLE(SjSkinWindow, wxFrame) EVT_SIZE (SjSkinWindow::OnSize ) EVT_MOVE (SjSkinWindow::OnMove ) EVT_SET_FOCUS (SjSkinWindow::OnSetFocus ) EVT_LEFT_DOWN (SjSkinWindow::OnMouseLeftDown ) EVT_LEFT_DCLICK (SjSkinWindow::OnMouseLeftDown ) EVT_LEFT_UP (SjSkinWindow::OnMouseLeftUp ) EVT_MOUSE_CAPTURE_LOST (SjSkinWindow::OnMouseCaptureLost ) EVT_CONTEXT_MENU (SjSkinWindow::OnMouseRight ) EVT_MIDDLE_UP (SjSkinWindow::OnMouseMiddleUp ) EVT_MOTION (SjSkinWindow::OnMouseMotion ) EVT_LEAVE_WINDOW (SjSkinWindow::OnMouseLeave ) EVT_PAINT (SjSkinWindow::OnPaint ) EVT_ERASE_BACKGROUND (SjSkinWindow::OnEraseBackground ) EVT_IMAGE_THERE (SjSkinWindow::OnImageThere ) #ifdef __WXGTK__ EVT_TIMER (IDTIMER_SETSIZEHACK, SjMainFrame::OnSetSizeHackTimer) #endif END_EVENT_TABLE() SjSkinWindow::SjSkinWindow(wxWindow* parent, wxWindowID id, long skinFlags, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxFrame(parent, id, title, pos, size, style | wxCLIP_CHILDREN | wxFULL_REPAINT_ON_RESIZE) { m_currSkin = NULL; m_currLayout = NULL; m_workspaceWindow = NULL; m_workspaceMovedAway = FALSE; m_workspaceColours = m_workspaceColours__; m_mouseItem = NULL; m_imgThread = NULL; m_dragImage = NULL; m_mouseInDisplayMove = false; m_inputWindowFontHeight = -1; m_skinFlags = skinFlags; } SjSkinWindow::~SjSkinWindow() { if( m_currSkin ) { delete m_currSkin; } } void SjSkinWindow::SetWorkspaceWindow(wxWindow* workspaceWindow) { wxASSERT(workspaceWindow); m_workspaceWindow = workspaceWindow; } void SjSkinWindow::MoveWorkspaceAway(bool moveAway) { // this function may not be used from within a thread // (the caller, normally SjMainFrame::SetVisEmbedded() // should ensure this) wxASSERT( wxThread::IsMain() ); if( m_workspaceMovedAway != moveAway ) { m_workspaceMovedAway = moveAway; if( m_workspaceWindow ) { if( moveAway ) { // move the window away; however, leave the size of the window // as this makes is easier for the workspace to track its state when shown again wxSize oldSize = m_workspaceWindow->GetSize(); m_workspaceWindow->SetSize(-1000-oldSize.x, 0, oldSize.x, oldSize.y, wxSIZE_ALLOW_MINUS_ONE); } else { SjSkinItemList::Node* itemnode = m_targets[IDT_WORKSPACE].m_itemList.GetFirst(); if ( itemnode ) { SjSkinItem* item = itemnode->GetData(); wxASSERT(item); m_workspaceWindow->SetSize(item->m_rect); } } // any Update() should be called by the caller who should know better the // exact moment to avoid flickering. A good idea are the following sequences : // // create workspace replacement window -> show it -> MoveWorkspaceAway(TRUE) -> Update() // or // MoveWorkspaceAway(FALSE) -> hide replacement -> Update() // // however, is some cases other directions may be better, esp. as MoveWorkspaceAway() // is not thread-safe (and probably will never be) } } } void SjSkinWindow::SetInputWindow(wxWindow* inputWindow) { wxASSERT(inputWindow); m_inputWindow = inputWindow; } void SjSkinWindow::SaveSizes() { if( m_currLayout ) { wxRect currRect = GetRect(); m_currLayout->m_currRect = currRect; // also save the size (or parts of it) to all layouts with the same usage int l, layoutCount = m_currSkin->GetLayoutCount(); for( l = 0; l < layoutCount; l++ ) { SjSkinLayout* dependingLayout = m_currSkin->GetLayout(l); if( dependingLayout && dependingLayout != m_currLayout ) { if( !dependingLayout->m_useWidth.IsEmpty() && dependingLayout->m_useWidth == m_currLayout->m_useWidth ) { dependingLayout->m_currRect.width = currRect.width; } if( !dependingLayout->m_useHeight.IsEmpty() && dependingLayout->m_useHeight == m_currLayout->m_useHeight ) { dependingLayout->m_currRect.height = currRect.height; } if( !dependingLayout->m_usePos.IsEmpty() && dependingLayout->m_usePos == m_currLayout->m_usePos ) { dependingLayout->m_currRect.x = currRect.x; dependingLayout->m_currRect.y = currRect.y; dependingLayout->m_alwaysOnTop = m_currLayout->m_alwaysOnTop; // in 2.51beta2 hinzugefuegt, s. http://www.silverjuke.net/forum/topic-2392.html } } } } } void SjSkinWindow::LoadLayout(SjSkinLayout* newLayout /*may be NULL*/, SjLoadLayoutFlag sizeChangeFlag) /*esp. set when switching to/from kiosk mode as the kiosk state is undefined during this time*/ { // unset item clicked or entered with the mouse if( HasCapture() ) { ReleaseMouse(); } if( m_mouseItem ) { m_mouseItem->OnMouseLeave(); m_mouseItem = NULL; } // init workspace colours m_workspaceColours = m_workspaceColours__; // remove all timers of the old layout SjSkinItem* item; SjSkinItemList::Node* itemnode; if( m_currLayout ) { SjSkinItem* item; SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); item->CreateTimer(0); itemnode = itemnode->GetNext(); } } // save the old size SaveSizes(); // <<<<<<<<<<<<<<<<<< // set the new layout // >>>>>>>>>>>>>>>>>> m_currLayout = newLayout; // m_currLayout may be NULL now // create an item list for every target int i; for( i = 0/*don't use IDT_FIRST here!*/; i <= IDT_LAST; i++ ) { m_targets[i].m_itemList.Clear(); } if( m_currLayout ) { itemnode = m_currLayout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( item->m_targetId ) { m_targets[item->m_targetId].m_itemList.Append(item); #ifdef SJ_SKIN_USE_HIDE if( m_targets[item->m_targetId].m_hidden ) { HideSkinTarget(item->m_targetId, TRUE/*hide*/, FALSE/*redraw*/); } #endif item->SetValue(m_targets[item->m_targetId].m_value); } itemnode = itemnode->GetNext(); } } #ifdef SJ_SKIN_USE_HIDE HidingSkinTargetsDone(FALSE/*redraw*/); #endif // create a direct link to the workspace colours; // if the current layout has no workspace, we leave the pointer unchanged. // it defaults to a dummy item with black and white colours wxASSERT(m_targets); wxASSERT(IDT_WORKSPACE <= IDT_LAST); itemnode = m_targets[IDT_WORKSPACE].m_itemList.GetFirst(); if( itemnode ) { item = itemnode->GetData(); wxASSERT(item); m_workspaceColours = item->m_colours; } // set the new size and position if( sizeChangeFlag != SJ_NO_SIZE_CHANGE ) { bool doSizeChange = (sizeChangeFlag==SJ_FORCE_SIZE_CHANGE || g_kioskModule==NULL || !g_kioskModule->KioskStarted()); wxRect wantedRect = GetRect(); if( m_currLayout ) { if( m_currLayout->m_currRect.width>0 && m_currLayout->m_currRect.height>0 ) { // use saved rect, this may be the same rect as before if defined by the // layout using the "use*" attributes. wantedRect = m_currLayout->m_currRect; } else { // use default size if( m_currLayout->m_defSize.x ) wantedRect.width = m_currLayout->m_defSize.x; if( m_currLayout->m_defSize.y ) wantedRect.height = m_currLayout->m_defSize.y; } // set the new tooltip colours #if SJ_USE_TOOLTIPS if( m_currSkin->HasTooltipColours() ) { g_tools->m_toolTipManager.SetColours(m_currSkin->GetTooltipFgColour(), m_currSkin->GetTooltipBgColour(), m_currSkin->GetTooltipBorderColour()); } else { g_tools->m_toolTipManager.SetDefColours(); } #endif // set "always on top" if( doSizeChange ) { ShowAlwaysOnTop(m_currLayout->m_alwaysOnTop); } } if( doSizeChange ) { SjDialog::EnsureRectDisplayVisibility(wantedRect); wxRect rectToSet = CheckLayoutWindowRect(m_currLayout, wantedRect); SetSize(rectToSet); #ifdef __WXGTK__ m_setSizeHackRect = rectToSet; // SETSIZEHACK, Hack the bad SetSize() implementation m_setSizeHackCnt = 0; m_setSizeHackTimer.SetOwner(this, IDTIMER_SETSIZEHACK); m_setSizeHackTimer.Start(50); #endif } } // calculate the item rectangles wxSize clientSize = GetClientSize(); CalcItemRectangles(clientSize.x, clientSize.y); // set minimal size - the maximal size is ignored there seems not to be a good reason for this (eg. maximizing the window should always be possible) if( m_currLayout ) { wxSize skinMinSize, skinMaxSize; GetLayoutMinMax(m_currLayout, skinMinSize, skinMaxSize); SetMinSize(skinMinSize); } // redraw the window if( IsShown() ) { Refresh(); } } #ifdef __WXGTK__ void SjSkinWindow::OnSetSizeHackTimer(wxTimerEvent& event) { // the first moments, GetRect() is simelar to the wanted rect, but after realisation, it is different. // exactly, at this moment, we call SetSize() again with the wanted rect. // if all this takes longer than 1 seconds, we give up (and we do not want to disturb systems that have no bug). if( GetRect() != m_setSizeHackRect ) { m_setSizeHackTimer.Stop(); SetSize(m_setSizeHackRect); return; } m_setSizeHackCnt++; if( m_setSizeHackCnt > 20 ) { m_setSizeHackTimer.Stop(); } } #endif void SjSkinWindow::ShowAlwaysOnTop(bool alwaysOnTop) { if( m_currLayout ) { m_currLayout->m_alwaysOnTop = alwaysOnTop; if( alwaysOnTop ) { SetWindowStyle(GetWindowStyle() | wxSTAY_ON_TOP); } else { SetWindowStyle(GetWindowStyle() & ~wxSTAY_ON_TOP); } if( g_visModule ) { g_visModule->ShowVisAlwaysOnTop(alwaysOnTop); } SetSkinTargetValue(IDT_ALWAYS_ON_TOP, IsAlwaysOnTop()? 1 : 0); } } bool SjSkinWindow::LoadSkin(const wxString& path, long conditions, const wxString& skinSettings, bool reloadScripts, wxWindow* askForScriptExecution) { SjSkinMlParser parser(NULL, conditions); // update the list of fonts g_tools->UpdateFacenames(); // load the new skin - if reloadScripts is false, SjSee of the current skin is reused and the scripts are not parsed again. SjSkinSkin* newSkin = parser.ParseFile(path, false); if( !newSkin ) { wxLogError(_("Cannot open \"%s\"."), path.c_str()); return FALSE; } #if SJ_USE_SCRIPTS if( reloadScripts || m_currSkin == NULL ) { // this is the normal case, just load a new skin with a new scripting engine if( newSkin->m_hasScripts ) { if( askForScriptExecution ) { if( SjMessageBox(wxString::Format(_("Do you want to execute the scripts embedded in the skin \"%s\"?")+"\n\n"+ _("CAUTION: Scripts may slow down Silverjuke or damage your data. Please use only scripts you trust."), newSkin->GetName().c_str()), SJ_PROGRAM_NAME, wxYES_NO|wxNO_DEFAULT|wxICON_QUESTION, askForScriptExecution) != wxYES ) { delete newSkin; return false; } } newSkin->m_see = new SjSee(); newSkin->m_see->SetExecutionScope(path); if( !newSkin->m_globalScript.IsEmpty() ) // if m_globalScript is unset, m_hasScripts may be true due to onclick-handlers { newSkin->m_see->Execute(newSkin->m_globalScript); } } } else { // re-use the existing scripting engine, if any newSkin->m_see = m_currSkin->m_see; m_currSkin->m_see = NULL; } #endif // deselect the old layout (if any) LoadLayout(NULL); // select the new skin delete m_currSkin; m_currSkin = newSkin; m_currSkin->ConnectToSkinWindow(this); // load the skin settings, if given bool loadDefaultLayout = TRUE; if( !skinSettings.IsEmpty() ) { // remember, m_currLayout is not yet set; therefore functions as // this->GetLayoutCount() do not work - use m_currSkin->GetLayoutCount() instead #define SAVABLE_SETTINGS_VER 0L SjStringSerializer ser(skinSettings); long serVersion = ser.GetLong(); wxString serSkinName = ser.GetString(); long serLayoutCount = ser.GetLong(); wxString serDefLayoutName = ser.GetString(); if( serVersion == SAVABLE_SETTINGS_VER && serSkinName == m_currSkin->GetName() && serLayoutCount == m_currSkin->GetLayoutCount() && !ser.HasErrors() ) { // load settings as saved from GetSavableSkinSettings() int l; wxString serLayoutName; wxRect serRect; SjSkinLayout* serLayout; bool serBadSize; for( l = 0; l < serLayoutCount; l++ ) { serLayout = m_currSkin->GetLayout(l); serLayoutName = ser.GetString(); serRect = SjTools::ParseRect(ser.GetString()); if( serLayout && serLayoutName == serLayout->GetName() && !ser.HasErrors() ) { if( serRect.width > 0 && serRect.height > 0 ) { serRect = CheckLayoutWindowRect(serLayout, serRect, &serBadSize); if( !serBadSize ) { serLayout->m_currRect = serRect; } } if( serDefLayoutName == serLayoutName ) { LoadLayout(serLayout); loadDefaultLayout = FALSE; } } } } } // select the default layout (a successfully loaded // skin has at least one selectable layout) if( loadDefaultLayout ) { wxASSERT(m_currSkin->GetLayout(0)); LoadLayout(m_currSkin->GetLayout(0)); } return SkinOk(); } wxString SjSkinWindow::GetSavableSkinSettings() { SjStringSerializer ser; ser.AddLong(SAVABLE_SETTINGS_VER); // version/flag - for future use if( m_currLayout ) { int l, layoutCount = GetLayoutCount(); SaveSizes(); ser.AddString(GetSkinName()); ser.AddLong(GetLayoutCount()); ser.AddString(m_currLayout->GetName()); for( l = 0; l < layoutCount; l++ ) { SjSkinLayout* layout = m_currSkin->GetLayout(l); ser.AddString(layout->GetName()); ser.AddString(SjTools::FormatRect(layout->m_currRect)); } } return ser.GetResult(); } wxRect SjSkinWindow::CheckLayoutWindowRect(const SjSkinLayout* layout, const wxRect& r__, bool* retBadSize) const { wxRect r(r__); // init "bad size"; a size is only bad if it does not align to the layout sizes // (otherwise, the user may just have changed the screen resolution between two calls of Silverjuke)s bool dummy; bool* badSize = retBadSize? retBadSize : &dummy; *badSize = FALSE; // check agains skin wxSize skinMinSize, skinMaxSize; GetLayoutMinMax(layout, skinMinSize, skinMaxSize); if( r.width < skinMinSize.x ) { r.width = skinMinSize.x; *badSize = TRUE; } if( r.width > skinMaxSize.x ) { r.width = skinMaxSize.x; *badSize = TRUE; } if( r.height < skinMinSize.y ) { r.height = skinMinSize.y; *badSize = TRUE; } if( r.height > skinMaxSize.y ) { r.height = skinMaxSize.y; *badSize = TRUE; } SjDialog::EnsureRectDisplayVisibility(r); return r; } void SjSkinWindow::ReloadSkin(long conditions, bool reloadScripts, SjLoadLayoutFlag sizeChangeFlag) { if( m_currLayout ) { wxString oldUrl = m_currSkin->GetUrl(); wxString oldLayoutName = m_currLayout->m_name; LoadSkin(oldUrl, conditions, wxT(""), reloadScripts); LoadLayout(GetLayout(oldLayoutName), sizeChangeFlag); Refresh(); } } void SjSkinWindow::CalcChildItemRectangles(SjSkinItem* parent) { // pass 1: calculate width / height SjSkinItemList::Node *childNode = parent->m_children.GetFirst(); SjSkinItem *child, *prevChild = NULL; while( childNode ) { child = childNode->GetData(); wxASSERT(child); if( prevChild == NULL ) { child->m_rect.width = child->m_width .CalcAbs(parent->m_rect.width, 0, 0); child->m_rect.height = child->m_height.CalcAbs(parent->m_rect.height, 0, 0); if( child->m_width.IsSpecial() == SJ_SKINPOS_OPPOSITE ) child->m_rect.width = child->m_width .CalcAbs(child->m_rect.height, 0, 0); else if( child->m_height.IsSpecial() == SJ_SKINPOS_OPPOSITE ) child->m_rect.height = child->m_height.CalcAbs(child->m_rect.width, 0, 0); child->m_rect.x = parent->m_rect.x + child->m_x.CalcAbs(parent->m_rect.width, 0, 0); child->m_rect.y = parent->m_rect.y + child->m_y.CalcAbs(parent->m_rect.height, 0, 0); } else { child->m_rect.width = child->m_width .CalcAbs(parent->m_rect.width, prevChild->m_rect.width, 0); child->m_rect.height = child->m_height.CalcAbs(parent->m_rect.height, prevChild->m_rect.height, 0); if( child->m_width.IsSpecial() == SJ_SKINPOS_OPPOSITE ) child->m_rect.width = child->m_width .CalcAbs(child->m_rect.height, 0, 0); else if( child->m_height.IsSpecial() == SJ_SKINPOS_OPPOSITE ) child->m_rect.height = child->m_height.CalcAbs(child->m_rect.width, 0, 0); child->m_rect.x = parent->m_rect.x + child->m_x.CalcAbs(parent->m_rect.width, prevChild->m_rect.x-parent->m_rect.x, prevChild->m_rect.width ); child->m_rect.y = parent->m_rect.y + child->m_y.CalcAbs(parent->m_rect.height, prevChild->m_rect.y-parent->m_rect.y, prevChild->m_rect.height); } child->m_hasOverlayingItems = -1; // don't know - really, even if an item has no children, // if may be overlapped by its siblings // set item size child->OnSize(); // recursive call CalcChildItemRectangles(child); // next child prevChild = child; childNode = childNode->GetNext(); } } void SjSkinWindow::CalcItemRectangles(long width, long height) { // skin okay? if( !m_currLayout ) { return; } // set root item size and start recursion SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetFirst(); if( itemnode ) { SjSkinItem* item = itemnode->GetData(); wxASSERT(item); item->m_rect.x = 0; item->m_rect.y = 0; item->m_rect.width = width; item->m_rect.height = height; item->m_hasOverlayingItems = 1; // jupp CalcChildItemRectangles(item); } // move away unused windows if( m_workspaceWindow && ( !m_currLayout->m_hasWorkspace #ifdef SJ_SKIN_USE_HIDE || m_targets[IDT_WORKSPACE].m_hidden #endif || m_workspaceMovedAway ) ) { wxSize oldSize = m_workspaceWindow->GetSize(); m_workspaceWindow->SetSize(-1000-oldSize.x, 0, oldSize.x, oldSize.y, wxSIZE_ALLOW_MINUS_ONE); } if( m_inputWindow && ( !m_currLayout->m_hasInput #ifdef SJ_SKIN_USE_HIDE || m_targets[IDT_SEARCH].m_hidden #endif ) ) { m_inputWindow->SetSize(-1000, -1000, 100, 100, wxSIZE_ALLOW_MINUS_ONE); } // notify derived class about the sizing SjSkinValue dummy; OnSkinTargetEvent(IDMODMSG_WINDOW_SIZED_MOVED, dummy, 0); } SjSkinItem* SjSkinWindow::FindClickableItem(long x, long y) const { // try all other items (from last to first as the last // item is atop) if( m_currLayout ) { SjSkinItem* item; SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetLast(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( item->m_usesMouse #ifdef SJ_SKIN_USE_HIDE && !item->m_hidden #endif ) { if( x >= item->m_rect.x && y >= item->m_rect.y && x < (item->m_rect.x + item->m_rect.width) && y < (item->m_rect.y + item->m_rect.height) ) { return item; } } itemnode = itemnode->GetPrevious(); } } return NULL; } SjSkinItem* SjSkinWindow::FindFirstItemByTargetId(int targetId) const { // currently, there is no FindNextItemByTargetId() function, for this purpose, // use the target list directly. SjSkinItemList::Node* itemnode = m_targets[targetId].m_itemList.GetFirst(); return itemnode? itemnode->GetData() : NULL; } bool SjSkinWindow::HasSkinTarget(int targetId) const { return FindFirstItemByTargetId(targetId) != NULL; } void SjSkinWindow::SetSkinTargetValue(int targetId, const SjSkinValue& value, bool onlyIfPossible) { SjSkinItem* item; SjSkinItemList::Node* itemnode; if(targetId <= 0 || targetId > IDT_LAST ) { wxLogDebug(wxT("Invalid target ID %i")/*n/t*/, (int)targetId); return; } // check if there are intersections with the drag image, if any if( onlyIfPossible && m_dragImage ) { itemnode = m_targets[targetId].m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( m_dragRect.Intersects(item->GetScreenRect()) ) { return; // currently, this will not look smart } itemnode = itemnode->GetNext(); } } // save the value m_targets[targetId].m_value = value; // promote the value to all items using this targets itemnode = m_targets[targetId].m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); item->SetValue(value); itemnode = itemnode->GetNext(); } UpdateMenuBarValue(targetId, value); } void SjSkinWindow::SetSkinText(const wxString& userId, const wxString& text) { // go through all items int l, layoutCount = m_currSkin->GetLayoutCount(); SjSkinLayout* layout; SjSkinItem* item; for( l = 0; l < layoutCount; l++ ) { layout = m_currSkin->GetLayout(l); if( layout ) { SjSkinItemList::Node* itemnode = layout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( item->m_userId && *item->m_userId == userId ) { if( item->m_itemType == SJ_BOXITEM ) { // set the value of a tag SjSkinValue value; value.string = text; item->SetValue(value); } } itemnode = itemnode->GetNext(); } } } } #ifdef SJ_SKIN_USE_HIDE bool SjSkinWindow::HideSkinTarget(int targetId, bool hide, bool redraw) { if(targetId <= 0 || targetId > IDT_LAST ) { wxLogDebug("Invalid target ID %i"/*n/t*/, (int)targetId); return FALSE; } if( !redraw/*=init*/ || m_targets[targetId].m_hidden != hide ) { // save the value m_targets[targetId].m_hidden = hide; // hide all item with the given id SjSkinItem* item; SjSkinItemList::Node* itemnode = m_targets[targetId].m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); item->m_hidden = hide; if( redraw ) { item->RedrawMe(); } itemnode = itemnode->GetNext(); } return TRUE; // state changed - you should call HidingSkinTargetsDone() afterwards } return FALSE; } #endif #ifdef SJ_SKIN_USE_HIDE void SjSkinWindow::HidingSkinTargetsDone(bool redraw) { #ifdef SJ_SKIN_USE_BELONGSTO // hide all items belonging to other item targets if( m_currLayout /*may be NULL when calling eg. from LoadLayout()*/ ) { SjSkinItem* item; SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( item->m_belongsToId != IDT_NONE ) { wxASSERT( item->m_belongsToId > 0 && item->m_belongsToId <= IDT_LAST ); if( !redraw/*=init*/ || item->m_hidden != m_targets[item->m_belongsToId].m_hidden ) { item->m_hidden = m_targets[item->m_belongsToId].m_hidden; if( redraw ) { item->RedrawMe(); } } } itemnode = itemnode->GetNext(); } } #endif } #endif void SjSkinWindow::OnSetFocus(wxFocusEvent& event) { if( m_workspaceWindow ) { m_workspaceWindow->SetFocus(); } } void SjSkinWindow::OnSize(wxSizeEvent& event_doNotUse_mayBeUnsetByOurForwardings) { wxSize clientSize = GetClientSize(); CalcItemRectangles(clientSize.x, clientSize.y); // also create a motion event as the item under the mouse may change wxMouseEvent mouseEvent; wxPoint mousePos = ::wxGetMousePosition(); ScreenToClient(mousePos); mouseEvent.m_x = mousePos.x; mouseEvent.m_y = mousePos.y; OnMouseMotion(mouseEvent); // we added these line for wx2.x/Silverjuke2.x, however, it seems as if they're no longer needed in wx3.x/Sj15.x //#ifdef __WXMAC__ // Refresh(FALSE /*eraseBackground*/); // Update(); //#endif } void SjSkinWindow::OnMove(wxMoveEvent& event) { SjSkinValue dummy; OnSkinTargetEvent(IDMODMSG_WINDOW_SIZED_MOVED, dummy, 0); } void SjSkinWindow::OnMouseLeftDown(wxMouseEvent& event) { bool dClick = event.LeftDClick(); /* left down */ long x = event.GetX(), y = event.GetY(); long accelFlags = (event.ShiftDown()? wxACCEL_SHIFT : 0) | (event.ControlDown()? wxACCEL_CTRL : 0); if( m_mouseItem == NULL ) { OnMouseMotion(event); } #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif if( m_mouseItem ) { CaptureMouse(); m_mouseItem->OnMouseLeftDown(x, y, dClick? TRUE : FALSE, accelFlags); } } static int findCorner(const wxRect& r, const wxSize& delta, int x, int y) { if( x >= r.x && x < r.x+delta.x ) { if( y > r.y && y < r.y+delta.y ) { return 1; } // top-left else if( y >= r.y+r.height-delta.y && y < r.y+r.height ) { return 3; } // bottom-left } else if( x >= r.x+r.width-delta.x && x < r.x+r.width ) { if( y > r.y && y < r.y+delta.y ) { return 2; } // top-right else if( y >= r.y+r.height-delta.y && y < r.y+r.height ) { return 4; } // bottom-right } return 0; } void SjSkinWindow::OnMouseLeftUp(wxMouseEvent& event) { long x = event.GetX(), y = event.GetY(); long accelFlags = (event.ShiftDown()? wxACCEL_SHIFT : 0) | (event.ControlDown()? wxACCEL_CTRL : 0); // normal clicks SjMouseUsed mouseUsed = SJ_MOUSE_NOT_USED; if( HasCapture() ) { ReleaseMouse(); if( m_mouseItem != NULL ) { SjSkinItem* mi = m_mouseItem; // backup to "mi" as m_mouseItem may change eg. through scripts mouseUsed = mi->OnMouseLeftUp(x, y, accelFlags, false); if( mouseUsed == SJ_MOUSE_USE_DELAYED ) { // post a delayed event as some (button) events may destroy the layout SjSkinValue value; value.value = m_targets[mi->m_targetId].m_value.value; OnSkinTargetEvent(mi->m_targetId, value, accelFlags); } } } #ifdef __WXDEBUG__ switch(mouseUsed) { case SJ_MOUSE_NOT_USED: wxLogDebug(wxT("SJ_MOUSE_NOT_USED")); break; case SJ_MOUSE_USED: wxLogDebug(wxT("SJ_MOUSE_USED")); break; case SJ_MOUSE_USE_DELAYED: wxLogDebug(wxT("SJ_MOUSE_USE_DELAYED")); break; default: wxASSERT(0); break; } #endif // check for "corner clicks" // // with Silverjuke 2.52beta2 we have optimized the corner click as follows: // // HHHH--------HHHH H = Always "hot" part or corner // HH%% %%HH % = Partly "hot" part (only hot if the click was not consumed before) // | | // HH%% %%HH // HHHH--------HHHH // // see http://www.silverjuke.net/forum/topic-1475.html for details wxRect clientRect = GetClientRect(); wxSize cornerSize(clientRect.width/8, clientRect.height/8); static int lastCorner = 0; int thisCorner = findCorner(clientRect, cornerSize, x, y); if( thisCorner ) { bool hotPartOfCorner = (findCorner(clientRect.Deflate(10), cornerSize, x, y)==0); if( hotPartOfCorner || mouseUsed == SJ_MOUSE_NOT_USED ) { #define CORNER_TIMEOUT_MS 3500 static unsigned long lastCornerTime = 0; unsigned long thisCornerTime = SjTools::GetMsTicks(); if( thisCornerTime < lastCornerTime+CORNER_TIMEOUT_MS && thisCorner != lastCorner && lastCorner != 0 ) { SjSkinValue value; OnSkinTargetEvent(IDO_CORNERCLICK, value, accelFlags); lastCornerTime = 0; } else { lastCornerTime = thisCornerTime; } } } lastCorner = thisCorner; } void SjSkinWindow::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { wxLogDebug(wxT("+++++++++++++++ CAPTURE LOST!")); if( m_mouseItem ) { m_mouseItem->OnMouseLeftUp(0, 0, 0, true); m_mouseItem = NULL; } } void SjSkinWindow::OnMouseRight(wxContextMenuEvent& event) { if( !HasCapture() ) { wxPoint clickPoint = ScreenToClient(event.GetPosition()); #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif SjSkinItem* item = FindClickableItem(clickPoint.x, clickPoint.y); if( item ) { OnSkinTargetContextMenu(item->m_targetId, clickPoint.x, clickPoint.y); } else { OnSkinTargetContextMenu(IDT_NONE, clickPoint.x, clickPoint.y); } } } void SjSkinWindow::OnMouseMiddleUp(wxMouseEvent& event) { if( !HasCapture() ) { long x = event.GetX(), y = event.GetY(); #if SJ_USE_TOOLTIPS g_tools->m_toolTipManager.ClearToolTipProvider(); #endif SjSkinItem* item = FindClickableItem(x, y); if( item ) { if( item->OnMouseMiddle(x, y) ) { return; } } } event.Skip(); } void SjSkinWindow::OnMouseMotion(wxMouseEvent& event) { long x = event.GetX(), y = event.GetY(); if( HasCapture() ) { if( m_mouseItem ) { m_mouseItem->OnMouseMotion(x, y, TRUE); } } else { SjSkinItem* item = FindClickableItem(x, y); if( m_mouseItem && m_mouseItem == item ) { m_mouseItem->OnMouseMotion(x, y, FALSE); } else { if( m_mouseItem ) { m_mouseItem->OnMouseLeave(); m_mouseItem = NULL; } if( item ) { m_mouseItem = item; m_mouseItem->OnMouseMotion(x, y, FALSE); #if SJ_USE_TOOLTIPS if( item->m_itemType == SJ_BOXITEM ) { ; // nothing to do, the box items handle the tooltips theirselved, // however, this should be checked before the other conditions } else if( item->m_targetId>=IDT_LAYOUT_FIRST && item->m_targetId<=IDT_LAYOUT_LAST ) { m_skinWindowToolTipProvider.m_item = item; g_tools->m_toolTipManager.SetToolTipProvider(&m_skinWindowToolTipProvider); } else if( item->m_targetId ) { g_tools->m_toolTipManager.SetToolTipProvider(GetToolTipProvider(item->m_targetId, 0, item->m_rect)); } else { g_tools->m_toolTipManager.ClearToolTipProvider(); } #endif } #if SJ_USE_TOOLTIPS else { g_tools->m_toolTipManager.ClearToolTipProvider(); } #endif } } } void SjSkinWindow::OnMouseLeave(wxMouseEvent& event) { //wxLogDebug("...leaving skin window..."); if( !HasCapture() ) { if( m_mouseItem ) { m_mouseItem->OnMouseLeave(); m_mouseItem = NULL; } } } void SjSkinWindow::OnPaint(wxPaintEvent& event) { // start painting, this MUST be done for validating the window list wxPaintDC dc(this); bool drawDone = FALSE; // draw offscreen #if 0 // simple but slow, not using the update region wxSize size = GetClientSize(); wxBitmap memBitmap(size.x, size.y); wxMemoryDC memDc; memDc.SelectObject(memBitmap); if( memDc.IsOk() ) { RedrawAll(memDc); RedrawFinalLines(memDc); dc.Blit(0, 0, size.x, size.y, &memDc, 0, 0); drawDone = TRUE; } #else // more complex and fast using the update region wxRegion updateRegion = GetUpdateRegion(); wxRect updateRect = updateRegion.GetBox(); wxBitmap memBitmap(updateRect.width, updateRect.height); wxMemoryDC memDc; memDc.SelectObject(memBitmap); if( memDc.IsOk() ) { RedrawAll(memDc, &updateRect, 0-updateRect.x, 0-updateRect.y); RedrawFinalLines(memDc, 0-updateRect.x, 0-updateRect.y); dc.Blit(updateRect.x, updateRect.y, updateRect.width, updateRect.height, &memDc, 0, 0); drawDone = TRUE; } #endif // draw onscreen if( !drawDone ) { RedrawAll(dc); RedrawFinalLines(dc); } } void SjSkinWindow::OnImageThere(SjImageThereEvent& event) { wxClientDC dc(this); SjSkinItem* item; SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetFirst(); SjImgThreadObj* obj = event.GetObj(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( item->m_usesPaint ) { item->OnImageThere(dc, obj); } itemnode = itemnode->GetNext(); } m_imgThread->ReleaseImage(this, obj); } void SjSkinWindow::RedrawAll(wxDC& dc, const wxRect* rect /*may be NULL*/, long finalMoveX, long finalMoveY) { // layout okay? if( !m_currLayout ) { wxSize size = GetClientSize(); dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawRectangle(0, 0, size.x, size.y); return; // error } // draw all items SjSkinItem* item; SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); // paint item if( item->m_usesPaint ) { if( rect == NULL || rect->Intersects(item->m_rect) ) { if( finalMoveX || finalMoveY ) { item->m_rect.x += finalMoveX; item->m_rect.y += finalMoveY; item->OnSize(); } #ifdef SJ_SKIN_USE_HIDE if( !item->m_hidden ) { #endif item->HideDragImage(); item->OnPaint(dc); item->ShowDragImage(); #ifdef SJ_SKIN_USE_HIDE } #endif if( finalMoveX || finalMoveY ) { item->m_rect.x -= finalMoveX; item->m_rect.y -= finalMoveY; item->OnSize(); } } } itemnode = itemnode->GetNext(); } } void SjSkinWindow::RedrawFinalLines(wxDC& dc, long finalMoveX, long finalMoveY) { // draw debug outline if( m_currLayout ) { if( m_currSkin->GetDebugOutline() ) { wxPen greenPen(wxColour(0x00,0xFF,0x00), 1, wxSOLID); wxPen redPen(wxColour(0xFF,0x00,0x00), 1, wxSOLID); dc.SetBrush(*wxTRANSPARENT_BRUSH); SjSkinItem* item; SjSkinItemList::Node* itemnode = m_currLayout->m_itemList.GetFirst(); while( itemnode ) { item = itemnode->GetData(); wxASSERT(item); if( item->m_usesPaint && (item->m_alwaysRedrawBackground || item->m_hasOverlayingItems==1/*not:-1*/) ) { dc.SetPen(redPen); // red to indicate complex and slow drawing } else { dc.SetPen(greenPen); // green to indicate simple and fast drawing } item->HideDragImage(); dc.DrawRectangle(item->m_rect.x+finalMoveX, item->m_rect.y+finalMoveY, item->m_rect.width, item->m_rect.height); item->ShowDragImage(); itemnode = itemnode->GetNext(); } } #ifdef SJHOOK_FINALIZE_PAINTING SJHOOK_FINALIZE_PAINTING #endif } } void SjSkinWindow::OnEraseBackground(wxEraseEvent&) { // we won't erease the background explcitly, this is done on // indirectly by OnPaint(). } long SjSkinWindow::GetTargetProp(int targetId) { long retProp = 0; SjSkinItemList::Node* itemnode = m_targets[targetId].m_itemList.GetFirst(); while( itemnode ) { SjSkinItem* item = itemnode->GetData(); wxASSERT(item); retProp |= item->m_prop; itemnode = itemnode->GetNext(); } return retProp; } void SjSkinWindow::GetVisEmbedRect(wxRect* retRect, bool* retIsOverWorkspace, bool* retVisAutoStart) const { wxRect dummy1; if( retRect == NULL ) retRect = &dummy1; bool dummy2; if( retVisAutoStart == NULL ) retVisAutoStart = &dummy2; bool retRectOk = FALSE; // "visrect" target set? *retVisAutoStart = false; if( !retRectOk ) { SjSkinItemList::Node* itemnode = m_targets[IDT_VIS_RECT].m_itemList.GetFirst(); if( itemnode ) { SjSkinDivItem* item = (SjSkinDivItem*)itemnode->GetData(); wxASSERT(item); if( item && item->m_itemType == SJ_DIVITEM ) { *retRect = item->m_rect; *retVisAutoStart = (item->m_prop&SJ_SKIN_PROP_AUTO_START_VIS)!=0; wxRect indent = item->GetIndent(); retRect->x += indent.x; retRect->y += indent.y; retRect->width -= indent.x+indent.width; retRect->height -= indent.y+indent.height; retRectOk = TRUE; } } } // use workspace as vis. rect if( !retRectOk ) { if( m_currLayout->m_hasWorkspace && m_workspaceWindow ) { SjSkinItemList::Node* itemnode = m_targets[IDT_WORKSPACE].m_itemList.GetFirst(); if ( itemnode ) { SjSkinItem* item = itemnode->GetData(); wxASSERT(item); *retRect = item->m_rect; retRectOk = TRUE; } } } // is over workspace? if( retIsOverWorkspace ) { *retIsOverWorkspace = false; if( retRectOk && m_currLayout->m_hasWorkspace && m_workspaceWindow ) { SjSkinItemList::Node* itemnode = m_targets[IDT_WORKSPACE].m_itemList.GetFirst(); if ( itemnode ) { SjSkinItem* item = itemnode->GetData(); wxASSERT(item); *retIsOverWorkspace = item->m_rect.Intersects(*retRect); } } } // just use upper left right part if( !retRectOk ) { retRect->x = 0; retRect->y = 0; retRect->width = 160; retRect->height = 90; } } silverjuke-16.2.3/src/sjbase/skin.h000066400000000000000000001011121266006671500171460ustar00rootroot00000000000000/******************************************************************************* * * Silverjuke * Copyright (C) 2015 Björn Petersen Software Design and Development * Contact: r10s@b44t.com, http://b44t.com * * 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 3 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, see http://www.gnu.org/licenses/ . * ******************************************************************************* * * File: skin.h * Authors: Björn Petersen * Purpose: Silverjuke skins * ******************************************************************************/ #ifndef __SJ_SKIN_H__ #define __SJ_SKIN_H__ class wxHtmlTag; class SjSkinSkin; class SjSkinWindow; class SjSkinItemTimer; class SjSkinLayout; class SjSkinImage; class SjImgThread; class SjImageThereEvent; #if SJ_USE_SCRIPTS class SjSee; #endif // Currently the following options are not needed, but we may need them // (esp. hiding items) in future. So I've just undef'd the functionality // as it was hard enough to implement. Please leave the functionality -- // I've programmed the hiding functionality already two times because I removed // it as I thought I will never need it. Björn. #undef SJ_SKIN_USE_BELONGSTO #undef SJ_SKIN_USE_HIDE #define SJ_OP_KIOSKON 0x00000001L #define SJ_OP_MAIN_VOL 0x00000002L #define SJ_OP_PLAYPAUSE 0x00000004L #define SJ_OP_EDIT_QUEUE 0x00000008L // this includes SJ_OP_SHUFFLE #define SJ_OP_SEARCH 0x00000010L #define SJ_OP_STARTVIS 0x00000020L #define SJ_OP_TOGGLE_ELEMENTS 0x00000040L #define SJ_OP_MUSIC_SEL 0x00000100L #define SJ_OP_ALBUM_VIEW 0x00000200L #define SJ_OP_COVER_VIEW 0x00000400L #define SJ_OP_LIST_VIEW 0x00000800L #define SJ_OP_TOGGLE_VIEW__ 0x00001000L // will not be saved, only calcualted #define SJ_OP_PRELISTEN 0x00002000L #define SJ_OP_CREDIT_SYS__ 0x00004000L // will not be saved, only calcualted #define SJ_OP_MULTI_ENQUEUE 0x00008000L #define SJ_OP_UNQUEUE 0x00010000L #define SJ_OP_MUSIC_SEL_GENRE 0x00020000L #define SJ_OP_ZOOM 0x00040000L #define SJ_OP_TOGGLE_TIME_MODE 0x00080000L #define SJ_OP_REPEAT 0x00100000L #define SJ_OP_ALL 0x00800000L #define SJ_OP_DEF_KIOSK (SJ_OP_KIOSKON|SJ_OP_SEARCH|SJ_OP_TOGGLE_ELEMENTS|SJ_OP_TOGGLE_TIME_MODE|SJ_OP_ALBUM_VIEW|SJ_OP_ZOOM) #define SJ_OP_DEF_NONKIOSK (0x00FFFFFFL&~SJ_OP_KIOSKON) #define SJ_OP_OS_MAC 0x01000000L #define SJ_OP_OS_WIN 0x02000000L #define SJ_OP_OS_GTK 0x04000000L #define SJ_OP_OS_MASK (SJ_OP_OS_MAC|SJ_OP_OS_WIN|SJ_OP_OS_GTK) class SjSkinPos { public: SjSkinPos () { Init(); } void Init () { m_relTo10000=0; m_absPixels=0; m_special=0; } bool Parse (const wxString&); void SetAbs (long absPixels) { m_relTo10000=0; m_absPixels=absPixels; m_special=0; } void SetRel (long relTo10000) { m_relTo10000=relTo10000; m_absPixels=0; m_special=0; } long CalcAbs (long totalAbsPixels, long prevAbsPos, long prevAbsSize) const; bool IsSet () const { return (m_special==0 && m_relTo10000==0 && m_absPixels==0)? FALSE : TRUE; } int IsSpecial () const { return m_special; } private: // both values may be given, in this case the relative position / size // is taken first and the pixel value is added or substracted. long m_relTo10000; long m_absPixels; // 0 or one of SKINPOS_* #define SJ_SKINPOS_NEXT 'n' #define SJ_SKINPOS_SAME 's' #define SJ_SKINPOS_OPPOSITE 'o' int m_special; }; class SjSkinColour { public: SjSkinColour (); void SetFromTag (const wxHtmlTag& tag); wxColour bgColour; wxPen bgPen; wxBrush bgBrush; bool bgSet; wxColour fgColour; wxPen fgPen; //wxBrush fgBrush; -- not needed bool fgSet; wxColour hiColour; wxPen hiPen; //wxBrush hiBrush; -- not needed bool hiSet; int offsetX, // the offsets are used when using "hiColour" as a shadow, offsetY; // defaults to +1/0 }; class SjSkinValue { public: SjSkinValue () { value = 0; vmin = 0; vmax = 0; thumbSize = 0; } SjSkinValue& operator = (const SjSkinValue& o) { value = o.value; vmin = o.vmin; vmax = o.vmax; thumbSize = o.thumbSize; string = o.string; return *this; } long value; // - 0/1/2/... for